[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [PATCH] + cdi: Funktion fuer den int10h und Implementation fuer Lost



Am Freitag, 10. Oktober 2008 23:33:20 schrieb Mathias Gottschlag:
> Das hier definiert eine Funktion bios_call_int10, mit der Treiber auf
> VESA zugreifen können. Funktioniert so, wies jetzt implementiert ist,
> erstmal nur unter x86, wenn wir irgendwann dann mal amd64 haben, muss ne
> andere Lösung her.

Ist es sinnvoll, so eine Funktion einzubauen statt einer allgemeinen 
cdi_bios_int()? Wer einen int 10h aufrufen kann, sollte doch auch jeden 
anderen BIOS-Interrupts aufrufen können?

>  src/modules/cdi/include/cdi/bios.h |   63
> ++++++++++++++++++++++++++++++++++++ src/modules/cdi/lib/bios.c         |  
> 50 ++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 0
> deletions(-)
>  create mode 100644 src/modules/cdi/include/cdi/bios.h
>  create mode 100644 src/modules/cdi/lib/bios.c
>
> diff --git a/src/modules/cdi/include/cdi/bios.h
> b/src/modules/cdi/include/cdi/bios.h new file mode 100644
> index 0000000..18a5de4
> --- /dev/null
> +++ b/src/modules/cdi/include/cdi/bios.h
> @@ -0,0 +1,63 @@
> +/*
> + * Copyright (c) 2008 Mathias Gottschlag
> + *
> + * This program is free software. It comes without any warranty, to
> + * the extent permitted by applicable law. You can redistribute it
> + * and/or modify it under the terms of the Do What The Fuck You Want
> + * To Public License, Version 2, as published by Sam Hocevar. See
> + * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
> + */  
> +
> +#ifndef _CDI_BIOS_H_
> +#define _CDI_BIOS_H_
> +
> +#include <stdint.h>
> +
> +#include "cdi/lists.h"
> +
> +struct cdi_bios_registers {
> +    uint16_t ax;
> +    uint16_t bx;
> +    uint16_t cx;
> +    uint16_t dx;
> +    uint16_t si;
> +    uint16_t di;
> +    uint16_t ds;
> +    uint16_t es;
> +};
> +
> +/**
> + * Struktur zum Zugriff auf Speicherbereiche des 16bit-Prozesses
> + */
> +struct cdi_bios_memory {
> +    /**
> +     * Virtuelle Addresse im Speicher des 16bit-Prozesses. Muss unterhalb
> von +     * 0xC0000 liegen.
> +     */
> +    uintptr_t dest;
> +    /**
> +     * Pointer auf reservierten Speicher für die Daten des
> Speicherbereichs. Wird +     * beim Start des Tasks zum Initialisieren des
> Bereichs benutzt und erhaelt +     * auch wieder die Daten nach dem
> BIOS-Aufruf.
> +     */
> +    void *src;
> +    /**
> +     * Laenge des Speicherbereichs
> +     */
> +    uint16_t size;
> +};
> +
> +/**
> + * Ruft den BIOS-Interrupt 0x10 auf.
> + * @param registers Pointer auf eine Register-Struktur. Diese wird beim
> Aufruf + * in die Register des Tasks geladen und bei Beendigung des Tasks
> wieder mit den + * Werten des Tasks gefuellt.
> + * @param memory Speicherbereiche, die in den Bios-Task kopiert und bei
> Beendigung + * des Tasks wieder zurueck kopiert werden sollen. Die Liste
> ist vom Typ struct + * cdi_bios_memory.
> + * @return 0, wenn der Aufruf erfolgreich war, -1 bei Fehlern
> + */
> +int cdi_bios_int10(struct cdi_bios_registers *registers, cdi_list_t
> memory); +
> +#endif
> +
> diff --git a/src/modules/cdi/lib/bios.c b/src/modules/cdi/lib/bios.c
> new file mode 100644
> index 0000000..740d68d
> --- /dev/null
> +++ b/src/modules/cdi/lib/bios.c
> @@ -0,0 +1,50 @@
> +/*
> + * Copyright (c) 2008 Mathias Gottschlag
> + *
> + * This program is free software. It comes without any warranty, to
> + * the extent permitted by applicable law. You can redistribute it
> + * and/or modify it under the terms of the Do What The Fuck You Want
> + * To Public License, Version 2, as published by Sam Hocevar. See
> + * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
> + */  
> +
> +#include <cdi/bios.h>
> +#include <syscall.h>
> +#include <stdlib.h>
> +
> +/**
> + * Ruft den BIOS-Interrupt 0x10 auf.
> + * @param registers Pointer auf eine Register-Struktur. Diese wird beim
> Aufruf + * in die Register des Tasks geladen und bei Beendigung des Tasks
> wieder mit den + * Werten des Tasks gefuellt.
> + * @param memory Speicherbereiche, die in den Bios-Task kopiert und bei
> Beendigung + * des Tasks wieder zurueck kopiert werden sollen. Die Liste
> ist vom Typ struct + * cdi_bios_memory.
> + * @return 0, wenn der Aufruf erfolgreich war, -1 bei Fehlern
> + */
> +int cdi_bios_int10(struct cdi_bios_registers *registers, cdi_list_t
> memory) +{
> +    // Register kopieren
> +    vm86_regs_t regs;
> +    memcpy(&regs, registers, sizeof(regs));

Du arbeitet ab hier nur noch auf einer Kopie, d.h. in registers werden nicht 
die Werte zurückgegeben, die der Task am Ende in den Registern hatte. Das ist 
im Kommentar anders spezifiziert.

> +    
> +    // Speicherbereiche kopieren
> +    dword *meminfo = 0;
> +    if (memory) {
> +        int memcount = cdi_list_size(memory);
> +        meminfo = malloc(sizeof(dword) * memcount * 3 + 1);

Das könnte man eigentlich auch auf dem Stack anlegen.

> +        meminfo[0] = memcount;
> +        int i;
> +        for (i = 0; i < memcount; i++) {
> +            struct cdi_bios_memory *memarea = cdi_list_get(memory, i);
> +            meminfo[1 + i * 3] = memarea->dest;
> +            meminfo[1 + i * 3 + 1] = (dword)memarea->src;
> +            meminfo[1 + i * 3 + 3] = memarea->size;
> +        }
> +    }
> +    
> +    int result = vm86_int(&regs, meminfo);
> +    free(meminfo);
> +    return result - 1;
> +}
> +
> --
> 1.5.4.3
>
>   _______________________________________________
> Lost mailing list
> Lost@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/lost

--