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

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



Und so funktionierts sogar mit dem Speicher.

meminfo[1 + i * 3 + 3] = memarea->size;
wird zu
meminfo[1 + i * 3 + 2] = memarea->size;

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 + 2] = memarea->size;
+        }
+    }
+    
+    int result = vm86_int(&regs, meminfo);
+    free(meminfo);
+    return result - 1;
+}
+
-- 
1.5.4.3