Deleted Added
full compact
biosmem.c (53207) biosmem.c (55342)
1/*
2 * mjs copyright
1/*-
2 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
3 * All rights reserved.
3 *
4 *
4 * $FreeBSD: head/sys/boot/pc98/libpc98/biosmem.c 53207 1999-11-16 00:42:18Z nyan $
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/boot/pc98/libpc98/biosmem.c 55342 2000-01-03 15:43:52Z nyan $
5 */
6
7/*
8 * Obtain memory configuration information from the BIOS
27 */
28
29/*
30 * Obtain memory configuration information from the BIOS
9 *
10 * Note that we don't try too hard here; knowing the size of
11 * base memory and extended memory out to 16 or 64M is enough for
12 * the requirements of the bootstrap.
13 *
14 * We also maintain a pointer to the top of physical memory
15 * once called to allow rangechecking of load/copy requests.
16 */
17#include <stand.h>
18#include "btxv86.h"
19
20vm_offset_t memtop;
31 */
32#include <stand.h>
33#include "btxv86.h"
34
35vm_offset_t memtop;
36u_int32_t bios_basemem, bios_extmem;
21
37
22/*
23 * Return base memory size in kB.
24 */
25int
26getbasemem(void)
27{
28#ifdef PC98
29 return ((*(u_char *)PTOV(0xA1501)&0x07)+1)*128;
30#else
31 v86.ctl = 0;
32 v86.addr = 0x12; /* int 0x12 */
33 v86int();
38#ifndef PC98
39#define SMAPSIG 0x534D4150
34
40
35 return(v86.eax & 0xffff);
41struct smap {
42 u_int64_t base;
43 u_int64_t length;
44 u_int32_t type;
45} __attribute__ ((packed));
46
47static struct smap smap;
36#endif
48#endif
37}
38
49
39/*
40 * Return extended memory size in kB
41 */
42int
43getextmem(void)
50void
51bios_getmem(void)
44{
52{
45 int extkb;
46
53
47#ifdef PC98
54#ifdef PC98
48 extkb = *(u_char *)PTOV(0xA1401)*128 + *(unsigned short *)PTOV(0xA1594)*1024;
49#else
50 v86.ctl = 0;
51 v86.addr = 0x15; /* int 0x15 function 0x88*/
52 v86.eax = 0x8800;
53 v86int();
54 extkb = v86.eax & 0xffff;
55 bios_basemem = ((*(u_char *)PTOV(0xA1501) & 0x07) + 1) * 128 * 1024;
56 bios_extmem = *(u_char *)PTOV(0xA1401) * 128 * 1024 +
57 *(u_int16_t *)PTOV(0xA1594) * 1024 * 1024;
58#else
59 /* Parse system memory map */
60 v86.ebx = 0;
61 do {
62 v86.ctl = V86_FLAGS;
63 v86.addr = 0x15; /* int 0x15 function 0xe820*/
64 v86.eax = 0xe820;
65 v86.ecx = sizeof(struct smap);
66 v86.edx = SMAPSIG;
67 v86.es = VTOPSEG(&smap);
68 v86.edi = VTOPOFF(&smap);
69 v86int();
70 if ((v86.efl & 1) || (v86.eax != SMAPSIG))
71 break;
72 /* look for a low-memory segment that's large enough */
73 if ((smap.type == 1) && (smap.base == 0) && (smap.length >= (512 * 1024)))
74 bios_basemem = smap.length;
75 /* look for the first segment in 'extended' memory */
76 if ((smap.type == 1) && (smap.base == 0x100000)) {
77 bios_extmem = smap.length;
78 }
79 } while (v86.ebx != 0);
80
81 /* Fall back to the old compatibility function for base memory */
82 if (bios_basemem == 0) {
83 v86.ctl = 0;
84 v86.addr = 0x12; /* int 0x12 */
85 v86int();
86
87 bios_basemem = (v86.eax & 0xffff) * 1024;
88 }
89
90 /* Fall back through several compatibility functions for extended memory */
91 if (bios_extmem == 0) {
92 v86.ctl = V86_FLAGS;
93 v86.addr = 0x15; /* int 0x15 function 0xe801*/
94 v86.eax = 0xe801;
95 v86int();
96 if (!(v86.efl & 1)) {
97 bios_extmem = ((v86.ecx & 0xffff) + ((v86.edx & 0xffff) * 64)) * 1024;
98 }
99 }
100 if (bios_extmem == 0) {
101 v86.ctl = 0;
102 v86.addr = 0x15; /* int 0x15 function 0x88*/
103 v86.eax = 0x8800;
104 v86int();
105 bios_extmem = (v86.eax & 0xffff) * 1024;
106 }
55#endif
56
107#endif
108
57 /* Set memtop to actual top or 16M, whicheve is less */
58 memtop = min((0x100000 + (extkb * 1024)), (16 * 1024 * 1024));
59
60 return(extkb);
61}
109 /* Set memtop to actual top of memory */
110 memtop = 0x100000 + bios_extmem;
62
111
112}
113