summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhpa <hpa>2001-12-12 03:39:52 +0000
committerhpa <hpa>2001-12-12 03:39:52 +0000
commitd893da1c297819fc309772ceb6c716064fb23d42 (patch)
treed091fc8b981614094ffd0dc9226d501ccb09341b
parent210bd8c3a671905cd9e4756bde8ffce90ff346c9 (diff)
downloadsyslinux-d893da1c297819fc309772ceb6c716064fb23d42.tar.gz
Make the memory configuration calls actually work properly, especiallysyslinux-1.65-pre6
E820.
-rw-r--r--memdisk/memdisk.asm13
-rw-r--r--memdisk/msetup.c18
-rw-r--r--memdisk/setup.c33
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)