memdisk: pass in the address of the real-mode code
authorH. Peter Anvin <hpa@zytor.com>
Sun, 7 Jun 2009 21:36:07 +0000 (14:36 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 7 Jun 2009 21:37:30 +0000 (14:37 -0700)
Pass in the address of the real-mode code instead of hard-coding it in
two separate places.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
memdisk/memdisk.h
memdisk/memdisk16.asm
memdisk/setup.c

index 1ab2c00..cf4a1e9 100644 (file)
@@ -24,9 +24,6 @@
 /* We use the com32 interface for calling 16-bit code */
 #include <com32.h>
 
-/* The real-mode segment */
-#define LOW_SEG 0x0800
-
 #define __cdecl __attribute__((cdecl,regparm(0)))
 
 typedef void (*syscall_t) (uint8_t, com32sys_t *, com32sys_t *);
index d43404e..4f0659b 100644 (file)
@@ -614,6 +614,7 @@ call32_call_start:
 
                ; Now everything is set up for interrupts...
 
+               push dword CS_BASE              ; Segment base
                push dword (BOUNCE_SEG << 4)    ; Bounce buffer address
                push dword call32_syscall+CS_BASE ; Syscall entry point
                sti                             ; Interrupts OK now
index 7e0ebc9..82ab23e 100644 (file)
@@ -153,7 +153,7 @@ struct setup_header {
     uint32_t edx;
 };
 
-struct setup_header *const shdr = (struct setup_header *)(LOW_SEG << 4);
+struct setup_header *shdr;
 
 /* Access to high memory */
 
@@ -701,7 +701,7 @@ static uint32_t pnp_install_check(void)
 __cdecl syscall_t syscall;
 void *sys_bounce;
 
-__cdecl void setup(__cdecl syscall_t cs_syscall, void *cs_bounce)
+__cdecl void setup(__cdecl syscall_t cs_syscall, void *cs_bounce, void *base)
 {
     unsigned int bin_size;
     char *memdisk_hook;
@@ -722,6 +722,7 @@ __cdecl void setup(__cdecl syscall_t cs_syscall, void *cs_bounce)
     /* Set up global variables */
     syscall = cs_syscall;
     sys_bounce = cs_bounce;
+    shdr = base;
 
     /* Show signs of life */
     printf("%s  %s\n", memdisk_version, copyright);