Make the memory configuration calls actually work properly, especially
authorhpa <hpa>
Wed, 12 Dec 2001 03:39:52 +0000 (03:39 +0000)
committerhpa <hpa>
Wed, 12 Dec 2001 03:39:52 +0000 (03:39 +0000)
E820.

memdisk/memdisk.asm
memdisk/msetup.c
memdisk/setup.c

index 1dd41b6..9bc453d 100644 (file)
@@ -250,7 +250,6 @@ int15_e820:
                push ds
                push cs
                pop ds
-               push edx                ; "SMAP"
                and ebx,ebx
                jne .renew
                mov ebx,E820Table
@@ -274,7 +273,7 @@ int15_e820:
                jne .notdone
                xor ebx,ebx             ; Done with table
 .notdone:
-               pop eax                 ; "SMAP"
+               mov eax,edx             ; "SMAP"
                pop ds
                mov ecx,20              ; Bytes loaded
 int15_success:
@@ -306,14 +305,14 @@ int15_e801:
                mov ax,[cs:Mem1MB]
                mov cx,ax
                mov bx,[cs:Mem16MB]
-               mov dx,ax
+               mov dx,bx
                jmp short int15_success
 
 int15_e881:
                mov eax,[cs:Mem1MB]
                mov ecx,eax
                mov ebx,[cs:Mem16MB]
-               mov edx,eax
+               mov edx,ebx
                jmp short int15_success
 
 int15_88:
@@ -415,8 +414,6 @@ Mover_dst1: db 0, 0, 0              ; Low 24 bits of target addy
 Mover_dst2:    db 0                    ; High 8 bits of source addy
 Mover_dummy2:  dd 0, 0, 0, 0           ; More space for the BIOS
 
-LastStatus     db 0                    ; Last return status
-
                alignb 4, db 0
 PatchArea      equ $                   ; This gets filled in by the installer
 
@@ -428,11 +425,11 @@ DiskBuf           dd 0                    ; Linear address of high memory disk
 
 Mem1MB         dd 0                    ; 1MB-16MB memory amount (1K)
 Mem16MB                dd 0                    ; 16MB-4G memory amount (64K)
-MemInt1588     dd 0                    ; 1MB-65MB memory amount (1K)
 
 OldInt13       dd 0                    ; INT 13h in chain
 OldInt15       dd 0                    ; INT 15h in chain
 
+MemInt1588     dw 0                    ; 1MB-65MB memory amount (1K)
 OldDosMem      dw 0                    ; Old position of DOS mem end
 
 DriveNo                db 0                    ; Our drive number
@@ -446,6 +443,8 @@ Stack               dd 0                    ; Saved SS:ESP on invocation
                dw 0
 SavedAX                dw 0                    ; AX saved on invocation
 
+LastStatus     db 0                    ; Last return status
+
                alignb 4, db 0          ; We *MUST* end on a dword boundary
 
 E820Table      equ $                   ; The installer loads the E820 table here
index ccb4352..24282dd 100644 (file)
@@ -35,7 +35,6 @@ static inline int get_e820(void)
   int range_count = 0;
   
   do {
-    puts("Calling INT 15 E820...\n");
     asm volatile("int $0x15 ; "
                 "jc 1f ; "
                 "cmpl $0x534d4150, %%eax ; "
@@ -51,13 +50,6 @@ static inline int get_e820(void)
     if ( copied < 20 )
       break;
 
-    printf("BIOS e820: %08x%08x %08x%08x %u\n",
-          (uint32_t)(buf.base >> 32),
-          (uint32_t)buf.base,
-          (uint32_t)(buf.len >> 32),
-          (uint32_t)buf.len,
-          buf.type);
-
     insertrange(buf.base, buf.len, buf.type);
     range_count++;
 
@@ -70,12 +62,9 @@ static inline void get_dos_mem(void)
 {
   uint16_t dos_kb;
 
-  puts("Calling INT 12...\n");
   asm volatile("int $0x12" : "=a" (dos_kb)
               :: "ebx", "ecx", "edx", "esi", "edi", "ebp");
 
-  printf("BIOS 12:   %u K DOS memory\n", dos_kb);
-  
   insertrange(0, (uint64_t)((uint32_t)dos_kb << 10), 1);
 }
 
@@ -85,7 +74,6 @@ static inline int get_e801(void)
   uint16_t high_mem;
   uint8_t err;
 
-  puts("Calling INT 15 E801...\n");
   asm volatile("movw $0xe801, %%ax ; "
               "int $0x15 ; "
               "setc %2"
@@ -93,9 +81,6 @@ static inline int get_e801(void)
               :: "ecx", "esi", "edi", "ebp");
 
   if ( !err ) {
-    printf("BIOS e801: %u K low mem, %u K high mem\n",
-          low_mem, high_mem << 6);
-
     if ( low_mem ) {
       insertrange(0x100000, (uint64_t)((uint32_t)low_mem << 10), 1);
     }
@@ -112,7 +97,6 @@ static inline int get_88(void)
   uint16_t low_mem;
   uint8_t err;
 
-  puts("Calling INT 15 88...\n");
   asm volatile("movb $0x88,%%ah ; "
               "int $0x15 ; "
               "setc %1"
@@ -120,8 +104,6 @@ static inline int get_88(void)
               :: "ebx", "ecx", "esi", "edi", "ebp");
 
   if ( !err ) {
-    printf("BIOS 88:    %u K extended memory\n", low_mem);
-
     if ( low_mem ) {
       insertrange(0x100000, (uint64_t)((uint32_t)low_mem << 10), 1);
     }
index 1ae49df..b91597f 100644 (file)
@@ -34,11 +34,11 @@ struct patch_area {
 
   uint32_t mem1mb;
   uint32_t mem16mb;
-  uint32_t memint1588;
 
   uint32_t oldint13;
   uint32_t oldint15;
 
+  uint16_t memint1588;
   uint16_t olddosmem;
 
   uint8_t  driveno;
@@ -285,9 +285,17 @@ uint32_t setup(void)
 
   pptr->mem1mb     = low_mem  >> 10;
   pptr->mem16mb    = high_mem >> 16;
-  pptr->memint1588 = (low_mem == 0xf00000)
-    ? ((high_mem > 0x30ffc00) ? 0xffff : (high_mem >> 10)+0x3c00)
-    : (low_mem >> 10);
+  if ( low_mem == (15 << 20) ) {
+    /* lowmem maxed out */
+    uint32_t int1588mem = (high_mem >> 10)+(low_mem >> 10);
+    pptr->memint1588 = (int1588mem > 0xffff) ? 0xffff: int1588mem;
+  } else {
+    pptr->memint1588 = low_mem >> 10;
+  }
+
+  printf("mem1mb  = %5u (0x%04x)\n", pptr->mem1mb, pptr->mem1mb);
+  printf("mem16mb = %5u (0x%04x)\n", pptr->mem16mb, pptr->mem16mb);
+  printf("mem1588 = %5u (0x%04x)\n", pptr->memint1588, pptr->memint1588);
 
   driverseg = driveraddr >> 4;
   driverptr = driverseg  << 16;
@@ -306,18 +314,29 @@ uint32_t setup(void)
     ranges[--nranges].type = -1;
   }
 
+  /* Dump the ranges table for debugging */
+  {
+    uint32_t *r = (uint32_t *)&ranges;
+    while ( 1 ) {
+      printf("%08x%08x %d\n", r[1], r[0], r[2]);
+      if ( r[2] == (uint32_t)-1 )
+       break;
+      r += 3;
+    }
+  }
+
   /* Copy driver followed by E820 table */
   asm volatile("pushw %%es ; "
               "movw %0,%%es ; "
               "cld ; "
               "rep ; movsl %%ds:(%%si), %%es:(%%di) ; "
-              "movw %2,%%cx ; "
-              "movw %1,%%si ; "
+              "movw %1,%%cx ; "
+              "movw %2,%%si ; "
               "rep ; movsl %%ds:(%%si), %%es:(%%di) ; "
               "popw %%es"
               :: "r" (driverseg),
               "r" ((uint16_t)((nranges+1)*3)), /* 3 dwords/range */
-              "r" ((uint16_t)ranges),
+              "r" ((uint16_t)&ranges),
               "c" (bin_size >> 2),
               "S" (&_binary_memdisk_bin_start),
               "D" (0)