source: mainline/arch/amd64/src/boot/memmap.S@ d9f81af3

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

Fixed bad type in frame.c.
Amd64 prints banner.

  • Property mode set to 100644
File size: 3.1 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 e820counter
38.global e820table
39.global e801memorysize
40
41.code16
42.section K_TEXT_START_2
43
44memmap_arch_init:
45
46e820begin:
47 xorl %ebx,%ebx # during first call, ebx must be 0
48 movw %bx,%ds
49 movw %bx,%es
50 movw $e820table,%di
51 movb $E820_MAX_RECORDS,e820counter
52e820loop:
53 movl $E820_SMAP,%edx # control sequence "SMAP"
54
55 movl $0x0000e820,%eax # service
56 movl $E820_RECORD_SIZE,%ecx
57 int $0x15
58 jc e820err
59
60 cmpl $E820_SMAP,%eax # verifying BIOS
61 jne e820err
62
63 cmpl $E820_RECORD_SIZE,%ecx
64 jne e820err # bad record size - bug in bios
65
66 movw %di,%ax # next record
67 addw $E820_RECORD_SIZE,%ax
68 movw %ax,%di
69
70 decb e820counter # buffer is full
71 jz e820end
72
73 cmpl $0,%ebx
74 jne e820loop
75
76e820end:
77 movb $E820_MAX_RECORDS,%al
78 subb e820counter,%al
79 movb %al,e820counter # store # of valid entries in e820counter
80
81 jmp e801begin
82
83e820err:
84 movb $0,e820counter
85
86# method e801 - get size of memory
87
88e801begin:
89 xorw %dx,%dx
90 xorw %cx,%cx
91 xorw %bx,%bx
92 movw $0xe801,%ax
93 stc
94 int $0x15
95
96 jc e801end
97
98 # fix problem with some BIOSes which use ax:bx rather than cx:dx
99 testw %cx,%cx
100 jnz e801cxdx
101 testw %dx,%dx
102 jnz e801cxdx
103
104 movw %ax,%cx
105 movw %bx,%dx
106
107e801cxdx:
108 andl $0xffff,%edx
109 shll $6,%edx
110 andl $0xffff,%ecx
111 addl %ecx,%edx
112 addl $0x0400,%edx # add lower 1 MB - it's not included by e801 method
113 movl %edx,e801memorysize
114e801end:
115 ret
116
117 #memory size in 1 kb chunks
118e801memorysize:
119 .long 0
120
121e820counter:
122 .byte 0x0
123
124e820table:
125 .space (32*E820_RECORD_SIZE),0x0 # space for 32 records, each E820_RECORD_SIZE bytes long
Note: See TracBrowser for help on using the repository browser.