Re: segmentierte Addressierung

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Tue, 15 Feb 2005 08:20:55 +0100

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

search this site