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

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



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.

Mathias
From d2191ca7c15959155f6c744b987f8371faaf8584 Mon Sep 17 00:00:00 2001
From: Mathias Gottschlag <mathias-go@xxxxxx>
Date: Fri, 10 Oct 2008 23:25:54 +0200
Subject: [PATCH] + cdi: Funktion fuer den int10h und Implementation fuer Lost

---
 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));
+    
+    // Speicherbereiche kopieren
+    dword *meminfo = 0;
+    if (memory) {
+        int memcount = cdi_list_size(memory);
+        meminfo = malloc(sizeof(dword) * memcount * 3 + 1);
+        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