source: mainline/arch/ia32/src/boot/memmap.S@ 6401f79

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6401f79 was 51022e9b, checked in by Josef Cejka <malyzelenyhnus@…>, 20 years ago

E option in printf added.

  • Property mode set to 100644
File size: 3.0 KB
RevLine 
[2998046]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 */
[14def1f6]28
29
[5d721f0]30#include <arch/boot/memmapasm.h>
[14def1f6]31
[2998046]32E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE
33E820_MAX_RECORDS = MEMMAP_E820_MAX_RECORDS
34E820_SMAP = 0x534d4150
35
36.global memmap_arch_init
[5d721f0]37.global e801memorysize
[2998046]38
39.code16
[d47f0e1]40.section K_TEXT_START_2
[2998046]41
[14def1f6]42memmap_arch_init:
[5d721f0]43
[2998046]44e820begin:
[fc9c4e1]45 xorl %ebx,%ebx # during first call, ebx must be 0
[5d721f0]46 movw %bx,%ds
47 movw %bx,%es
[32f6e1bd]48 movw $e820table_boot,%di
49 movb $E820_MAX_RECORDS,e820counter_boot
[2998046]50e820loop:
[5d721f0]51 movl $E820_SMAP,%edx # control sequence "SMAP"
[2998046]52
[5d721f0]53 movl $0x0000e820,%eax # service
[2998046]54 movl $E820_RECORD_SIZE,%ecx
55 int $0x15
[5d721f0]56 jc e820err
[2998046]57
[fc9c4e1]58 cmpl $E820_SMAP,%eax # verifying BIOS
[5d721f0]59 jne e820err
60
61 cmpl $E820_RECORD_SIZE,%ecx
62 jne e820err # bad record size - bug in bios
[2998046]63
64 movw %di,%ax # next record
65 addw $E820_RECORD_SIZE,%ax
66 movw %ax,%di
67
[32f6e1bd]68 decb e820counter_boot # buffer is full
[87cb9e2]69 jz e820end
70
71 cmpl $0,%ebx
72 jne e820loop
[2998046]73
74e820end:
[5d721f0]75 movb $E820_MAX_RECORDS,%al
[32f6e1bd]76 subb e820counter_boot,%al
77 movb %al,e820counter_boot # store # of valid entries in e820counter
[5d721f0]78
79 jmp e801begin
80
81e820err:
[32f6e1bd]82 movb $0,e820counter_boot
[5d721f0]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
[2998046]95
[5d721f0]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
[11485dec]110 addl $0x0400,%edx # add lower 1 MB - it's not included by e801 method
111 movl %edx,e801memorysize
[5d721f0]112e801end:
[2998046]113 ret
114
[5d721f0]115 #memory size in 1 kb chunks
116e801memorysize:
117 .long 0
[51022e9b]118
Note: See TracBrowser for help on using the repository browser.