Am Mo, den 14.02.2005 schrieb Oliver Fromme um 15:14:
[...]
> Für die Definition von sysctls gibt es schon eine Reihe von
> fertigen Makros. Du müßtest mit SYSCTL_OID einen readonly-
> sysctl definieren und einen eigenen String-Handler schreiben
> (bei sysctl_handle_string() abgucken). Dieser Handler würde
> dann Deine BIOS-Funktion aufrufen.
Also das einbauen nd aufrufen klappt prima, aber ich bekomme die zu
übertragene Variable nicht gesetzt. Vorgabe ist, den Zeiger auf die
Zielvariable für 10 Zeichen(char) in ES:BX zu übergeben:
static struct vm86context a_vmcontext;
int
sysctl_a_sernum(SYSCTL_HANDLER_ARGS) {
struct vm86frame vmf;
u_char *p;
char s[10] = "0123456789";
vm86_initialize();
bzero(&vmf, sizeof(vmf));
vmf.vmf_ah = 0xEA;
vmf.vmf_al = 0x01;
vmf.vmf_edx = 0x4648;
vmf.vmf_cl = 1;
p = (u_char *)vm86_getpage(&a_vmcontext, 1);
error = vm86_getptr(&a_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_bx);
if (error != 0) {
snprintf(s, sizeof(s),"getpointer");
error = SYSCTL_OUT(req, &s, max);
return 0;
}
error = vm86_datacall(0x15, &vmf, &a_vmcontext);
snprintf(s, sizeof(s), "0: %x %x %x %x", vmf.vmf_cl, vmf.vmf_es, vmf.vmf_bx, vmf.vmf_dx);
error = SYSCTL_OUT(req, &s, max);
return 0;
}
Ausgabe bei "sysctl hw.sernum":
hw.sernum: 0: 0 0 0 6b6f
Der Inhalt von DX ist 6B6F bei Erfolg. Nur die Adresse ES:BX ist immer
0x0000, damit kann ich natürlich nichts anfangen, außer durch
dereferenzieren den Kernel in Panik zu versetzen.
Sieht jemand den Fehler?
Gruß,
Marc
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 15 Feb 2005 - 08:22:38 CET