summaryrefslogtreecommitdiffstats
path: root/sys/boot/i386/libi386/biosmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/i386/libi386/biosmem.c')
-rw-r--r--sys/boot/i386/libi386/biosmem.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/sys/boot/i386/libi386/biosmem.c b/sys/boot/i386/libi386/biosmem.c
new file mode 100644
index 0000000..8322654
--- /dev/null
+++ b/sys/boot/i386/libi386/biosmem.c
@@ -0,0 +1,52 @@
+/*
+ * mjs copyright
+ */
+
+/*
+ * Obtain memory configuration information from the BIOS
+ *
+ * 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.
+ */
+#include <stand.h>
+#include "btxv86.h"
+
+vm_offset_t memtop;
+
+/*
+ * Return base memory size in kB.
+ */
+int
+getbasemem(void)
+{
+ v86.ctl = 0;
+ v86.addr = 0x1a; /* int 0x12 */
+ v86int();
+
+ return(v86.eax & 0xffff);
+}
+
+/*
+ * Return extended memory size in kB
+ */
+int
+getextmem(void)
+{
+ int extkb;
+
+ v86.ctl = 0;
+ v86.addr = 0x15; /* int 0x12 function 0x88*/
+ v86.eax = 0x8800;
+ v86int();
+ extkb = v86.eax & 0xffff;
+
+ /* Set memtop to actual top or 16M, whicheve is less */
+ memtop = min((0x100000 + (extkb + 1024)), (16 * 1024 * 1024));
+
+ return(extkb);
+}
+
OpenPOWER on IntegriCloud