diff --git a/sys/arch/i386/stand/lib/biosmem.S b/sys/arch/i386/stand/lib/biosmem.S index cc0df6d1d2f3..15b99d56b9fd 100644 --- a/sys/arch/i386/stand/lib/biosmem.S +++ b/sys/arch/i386/stand/lib/biosmem.S @@ -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 diff --git a/sys/arch/i386/stand/lib/biosmemx.S b/sys/arch/i386/stand/lib/biosmemx.S new file mode 100644 index 000000000000..d21dc86421e3 --- /dev/null +++ b/sys/arch/i386/stand/lib/biosmemx.S @@ -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 + +#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 diff --git a/sys/arch/i386/stand/lib/getextmemx.c b/sys/arch/i386/stand/lib/getextmemx.c new file mode 100644 index 000000000000..1cb66ad2ca6b --- /dev/null +++ b/sys/arch/i386/stand/lib/getextmemx.c @@ -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 +#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); +} diff --git a/sys/arch/i386/stand/lib/libi386.h b/sys/arch/i386/stand/lib/libi386.h index 7ec1946d3e7c..c4ed544af642 100644 --- a/sys/arch/i386/stand/lib/libi386.h +++ b/sys/arch/i386/stand/lib/libi386.h @@ -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));