New, optional, method to get size of extended memory.

It will be used for getextmem() if EXTENDED_MEMDETECT is defined.
Worked on all tested machines.
Thanks to all testers, especially Martin Husemann!
This commit is contained in:
drochner 1997-08-14 15:22:00 +00:00
parent 80b4ae52e8
commit 2092d92ef2
4 changed files with 207 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: biosmem.S,v 1.3 1997/06/13 13:43:05 drochner Exp $ */
/* $NetBSD: biosmem.S,v 1.4 1997/08/14 15:22:01 drochner Exp $ */
/*
* Copyright (c) 1996
@ -69,7 +69,7 @@ ENTRY(getbasemem)
/* get mem above 1M, in kByte */
ENTRY(getextmem)
ENTRY(getextmem1)
pushl %ebp
movl %esp,%ebp
pushl %ebx

View File

@ -0,0 +1,131 @@
/* $NetBSD: biosmemx.S,v 1.1 1997/08/14 15:22:00 drochner Exp $ */
/*
* Copyright (c) 1997
* Matthias Drochner. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project
* by Matthias Drochner.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <machine/asm.h>
#define data32 .byte 0x66
.text
/* int getextmem2(int buffer[2])
return: 0=OK, -1=error
buffer[0]: extmem kBytes below 16M (max 15M/1024)
buffer[1]: extmem above 16M, in 64k units
*/
ENTRY(getextmem2)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %ecx
pushl %edx
push %esi
push %edi
call _C_LABEL(prot_to_real)
data32
movl $0xe801, %eax
int $0x15
jc err2
data32
movl $0, %ecx
jmp ok2
err2:
data32
movl $-1, %ecx
ok2:
data32
movl %eax, %edx
data32
call _C_LABEL(real_to_prot)
movl 8(%ebp), %eax
movl %edx, (%eax)
movl %ebx, 4(%eax)
movl %ecx, %eax
pop %edi
pop %esi
popl %edx
popl %ecx
popl %ebx
popl %ebp
ret
/* int getmementry(int iterator, buffer[5])
return: new iterator, 0=end of list or error
buffer[0]: start of memory chunk
buffer[2]: length (bytes)
buffer[4]: type
*/
ENTRY(getmementry)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %ecx
pushl %edx
push %esi
push %edi
movl 8(%ebp), %ebx
movl $20, %ecx
movl $0x534d4150, %edx # "SMAP"
movl 12(%ebp), %edi
call _C_LABEL(prot_to_real)
data32
movl $0xe820, %eax
int $0x15
jnc ok
data32
movl $0, %ebx
ok:
data32
call _C_LABEL(real_to_prot)
movl %ebx, %eax
pop %edi
pop %esi
popl %edx
popl %ecx
popl %ebx
popl %ebp
ret

View File

@ -0,0 +1,66 @@
/* $NetBSD: getextmemx.c,v 1.1 1997/08/14 15:22:00 drochner Exp $ */
/*
* Copyright (c) 1997
* Matthias Drochner. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project
* by Matthias Drochner.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/* Try 2 more fancy BIOS calls to get the size of extended
memory besides the classical int15/88, take maximum.
needs lowlevel parts from biosmemx.S and biosmem.S
*/
#include <lib/libsa/stand.h>
#include "libi386.h"
extern int getextmem2 __P((int*));
extern int getmementry __P((int, int*));
int getextmemx()
{
int buf[5], i;
int extmem = getextmem1();
if(!getextmem2(buf) && buf[0] <= 15 * 1024) {
int help = buf[0];
if(help == 15 * 1024)
help += buf[1] * 64;
if(extmem < help)
extmem = help;
}
for(i = 0; (i = getmementry(i, buf)) != 0;) {
if((buf[4] == 1 && buf[0] == 0x100000)
&& extmem < buf[2] / 1024)
extmem = buf[2] / 1024;
}
return(extmem);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: libi386.h,v 1.3 1997/06/13 17:49:25 drochner Exp $ */
/* $NetBSD: libi386.h,v 1.4 1997/08/14 15:22:01 drochner Exp $ */
/*
* Copyright (c) 1996
@ -48,7 +48,13 @@ int netbsd_opt __P((char));
void delay __P((int));
int getbasemem __P((void));
int getextmem __P((void));
int getextmemx __P((void));
int getextmem1 __P((void));
#ifdef EXTENDED_MEMDETECT
#define getextmem() getextmemx()
#else
#define getextmem() getextmem1()
#endif
void reboot __P((void));
void gateA20 __P((void));