[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(®s, 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(®s, meminfo);
+ free(meminfo);
+ return result - 1;
+}
+
--
1.5.4.3