diff options
author | hpa <hpa> | 2001-12-12 03:39:52 +0000 |
---|---|---|
committer | hpa <hpa> | 2001-12-12 03:39:52 +0000 |
commit | d893da1c297819fc309772ceb6c716064fb23d42 (patch) | |
tree | d091fc8b981614094ffd0dc9226d501ccb09341b | |
parent | 210bd8c3a671905cd9e4756bde8ffce90ff346c9 (diff) | |
download | syslinux-d893da1c297819fc309772ceb6c716064fb23d42.tar.gz |
Make the memory configuration calls actually work properly, especiallysyslinux-1.65-pre6
E820.
-rw-r--r-- | memdisk/memdisk.asm | 13 | ||||
-rw-r--r-- | memdisk/msetup.c | 18 | ||||
-rw-r--r-- | memdisk/setup.c | 33 |
3 files changed, 32 insertions, 32 deletions
diff --git a/memdisk/memdisk.asm b/memdisk/memdisk.asm index 1dd41b6a..9bc453d9 100644 --- a/memdisk/memdisk.asm +++ b/memdisk/memdisk.asm @@ -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 diff --git a/memdisk/msetup.c b/memdisk/msetup.c index ccb43521..24282dd1 100644 --- a/memdisk/msetup.c +++ b/memdisk/msetup.c @@ -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); } diff --git a/memdisk/setup.c b/memdisk/setup.c index 1ae49df0..b91597f8 100644 --- a/memdisk/setup.c +++ b/memdisk/setup.c @@ -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) |