Deleted Added
full compact
1,2c1,3
< /*
< * mjs copyright
---
> /*-
> * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
> * All rights reserved.
4c5,26
< * $FreeBSD: head/sys/boot/pc98/libpc98/biosmem.c 53207 1999-11-16 00:42:18Z nyan $
---
> * 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.
> *
> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
> *
> * $FreeBSD: head/sys/boot/pc98/libpc98/biosmem.c 55342 2000-01-03 15:43:52Z nyan $
9,15d30
< *
< * Note that we don't try too hard here; knowing the size of
< * base memory and extended memory out to 16 or 64M is enough for
< * the requirements of the bootstrap.
< *
< * We also maintain a pointer to the top of physical memory
< * once called to allow rangechecking of load/copy requests.
20a36
> u_int32_t bios_basemem, bios_extmem;
22,33c38,39
< /*
< * Return base memory size in kB.
< */
< int
< getbasemem(void)
< {
< #ifdef PC98
< return ((*(u_char *)PTOV(0xA1501)&0x07)+1)*128;
< #else
< v86.ctl = 0;
< v86.addr = 0x12; /* int 0x12 */
< v86int();
---
> #ifndef PC98
> #define SMAPSIG 0x534D4150
35c41,47
< return(v86.eax & 0xffff);
---
> struct smap {
> u_int64_t base;
> u_int64_t length;
> u_int32_t type;
> } __attribute__ ((packed));
>
> static struct smap smap;
37d48
< }
39,43c50,51
< /*
< * Return extended memory size in kB
< */
< int
< getextmem(void)
---
> void
> bios_getmem(void)
45,46c53
< int extkb;
<
---
>
48,54c55,106
< extkb = *(u_char *)PTOV(0xA1401)*128 + *(unsigned short *)PTOV(0xA1594)*1024;
< #else
< v86.ctl = 0;
< v86.addr = 0x15; /* int 0x15 function 0x88*/
< v86.eax = 0x8800;
< v86int();
< extkb = v86.eax & 0xffff;
---
> bios_basemem = ((*(u_char *)PTOV(0xA1501) & 0x07) + 1) * 128 * 1024;
> bios_extmem = *(u_char *)PTOV(0xA1401) * 128 * 1024 +
> *(u_int16_t *)PTOV(0xA1594) * 1024 * 1024;
> #else
> /* Parse system memory map */
> v86.ebx = 0;
> do {
> v86.ctl = V86_FLAGS;
> v86.addr = 0x15; /* int 0x15 function 0xe820*/
> v86.eax = 0xe820;
> v86.ecx = sizeof(struct smap);
> v86.edx = SMAPSIG;
> v86.es = VTOPSEG(&smap);
> v86.edi = VTOPOFF(&smap);
> v86int();
> if ((v86.efl & 1) || (v86.eax != SMAPSIG))
> break;
> /* look for a low-memory segment that's large enough */
> if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024)))
> bios_basemem = smap.length;
> /* look for the first segment in 'extended' memory */
> if ((smap.type == 1) && (smap.base == 0x100000)) {
> bios_extmem = smap.length;
> }
> } while (v86.ebx != 0);
>
> /* Fall back to the old compatibility function for base memory */
> if (bios_basemem == 0) {
> v86.ctl = 0;
> v86.addr = 0x12; /* int 0x12 */
> v86int();
>
> bios_basemem = (v86.eax & 0xffff) * 1024;
> }
>
> /* Fall back through several compatibility functions for extended memory */
> if (bios_extmem == 0) {
> v86.ctl = V86_FLAGS;
> v86.addr = 0x15; /* int 0x15 function 0xe801*/
> v86.eax = 0xe801;
> v86int();
> if (!(v86.efl & 1)) {
> bios_extmem = ((v86.ecx & 0xffff) + ((v86.edx & 0xffff) * 64)) * 1024;
> }
> }
> if (bios_extmem == 0) {
> v86.ctl = 0;
> v86.addr = 0x15; /* int 0x15 function 0x88*/
> v86.eax = 0x8800;
> v86int();
> bios_extmem = (v86.eax & 0xffff) * 1024;
> }
57,61c109,110
< /* Set memtop to actual top or 16M, whicheve is less */
< memtop = min((0x100000 + (extkb * 1024)), (16 * 1024 * 1024));
<
< return(extkb);
< }
---
> /* Set memtop to actual top of memory */
> memtop = 0x100000 + bios_extmem;
62a112,113
> }
>