source: mainline/arch/ia32/src/boot/memmap.S@ 32f6e1bd

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 32f6e1bd was 32f6e1bd, checked in by Ondrej Palkovsky <ondrap@…>, 20 years ago

Resolved mapping of e820 boot area, so that it can be accessed as
e820table from 32-bit mode and e820table_boot from real mode.

  • Property mode set to 100644
File size: 3.0 KB
Line 
1/*
2 * Copyright (C) 2005 Josef Cejka
3 * All rights reserved.
4 *
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 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29
30#include <arch/boot/memmapasm.h>
31
32E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE
33E820_MAX_RECORDS = MEMMAP_E820_MAX_RECORDS
34E820_SMAP = 0x534d4150
35
36.global memmap_arch_init
37.global e801memorysize
38
39.code16
40.section K_TEXT_START_2
41
42memmap_arch_init:
43
44e820begin:
45 xorl %ebx,%ebx # during first call, ebx must be 0
46 movw %bx,%ds
47 movw %bx,%es
48 movw $e820table_boot,%di
49 movb $E820_MAX_RECORDS,e820counter_boot
50e820loop:
51 movl $E820_SMAP,%edx # control sequence "SMAP"
52
53 movl $0x0000e820,%eax # service
54 movl $E820_RECORD_SIZE,%ecx
55 int $0x15
56 jc e820err
57
58 cmpl $E820_SMAP,%eax # verifying BIOS
59 jne e820err
60
61 cmpl $E820_RECORD_SIZE,%ecx
62 jne e820err # bad record size - bug in bios
63
64 movw %di,%ax # next record
65 addw $E820_RECORD_SIZE,%ax
66 movw %ax,%di
67
68 decb e820counter_boot # buffer is full
69 jz e820end
70
71 cmpl $0,%ebx
72 jne e820loop
73
74e820end:
75 movb $E820_MAX_RECORDS,%al
76 subb e820counter_boot,%al
77 movb %al,e820counter_boot # store # of valid entries in e820counter
78
79 jmp e801begin
80
81e820err:
82 movb $0,e820counter_boot
83
84# method e801 - get size of memory
85
86e801begin:
87 xorw %dx,%dx
88 xorw %cx,%cx
89 xorw %bx,%bx
90 movw $0xe801,%ax
91 stc
92 int $0x15
93
94 jc e801end
95
96 # fix problem with some BIOSes which use ax:bx rather than cx:dx
97 testw %cx,%cx
98 jnz e801cxdx
99 testw %dx,%dx
100 jnz e801cxdx
101
102 movw %ax,%cx
103 movw %bx,%dx
104
105e801cxdx:
106 andl $0xffff,%edx
107 shll $6,%edx
108 andl $0xffff,%ecx
109 addl %ecx,%edx
110 addl $0x0400,%edx # add lower 1 MB - it's not included by e801 method
111 movl %edx,e801memorysize
112e801end:
113 ret
114
115 #memory size in 1 kb chunks
116e801memorysize:
117 .long 0
118
Note: See TracBrowser for help on using the repository browser.