source: mainline/arch/ia32/src/boot/memmap.s@ 34c71ead

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 34c71ead was 34c71ead, checked in by Martin Decky <martin@…>, 20 years ago

(ignore this :))

  • Property mode set to 100644
File size: 2.9 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_SMAP = 0x534d4150
33
34.global memmap_arch_init
[5d721f0]35.global e801memorysize
[2998046]36
37.code16
[874e312a]38.section K_TEXT_START_2, "ax"
[2998046]39
[14def1f6]40memmap_arch_init:
[2998046]41e820begin:
[b1cf98c]42 xorl %ebx,%ebx # during first call, ebx must be 0
[32f6e1bd]43 movw $e820table_boot,%di
[339e053]44 movb $MEMMAP_E820_MAX_RECORDS,e820counter_boot
[2998046]45e820loop:
[b1cf98c]46 movl $E820_SMAP,%edx # control sequence "SMAP"
[2998046]47
[b1cf98c]48 movl $0x0000e820,%eax # service
[339e053]49 movl $MEMMAP_E820_RECORD_SIZE,%ecx
[2998046]50 int $0x15
[5d721f0]51 jc e820err
[2998046]52
[b1cf98c]53 cmpl $E820_SMAP,%eax # verifying BIOS
[5d721f0]54 jne e820err
55
[339e053]56 cmpl $MEMMAP_E820_RECORD_SIZE,%ecx
[b1cf98c]57 jne e820err # bad record size - bug in bios
[2998046]58
[b1cf98c]59 movw %di,%ax # next record
[339e053]60 addw $MEMMAP_E820_RECORD_SIZE,%ax
[2998046]61 movw %ax,%di
62
[b1cf98c]63 decb e820counter_boot # buffer is full
[87cb9e2]64 jz e820end
65
[b1cf98c]66 testl %ebx,%ebx
67 jnz e820loop
[2998046]68
69e820end:
[339e053]70 movb $MEMMAP_E820_MAX_RECORDS,%al
[32f6e1bd]71 subb e820counter_boot,%al
[b1cf98c]72 movb %al,e820counter_boot # store # of valid entries in e820counter
[5d721f0]73
74 jmp e801begin
75
76e820err:
[32f6e1bd]77 movb $0,e820counter_boot
[5d721f0]78
79# method e801 - get size of memory
80
81e801begin:
82 xorw %dx,%dx
83 xorw %cx,%cx
84 xorw %bx,%bx
85 movw $0xe801,%ax
86 stc
87 int $0x15
88
89 jc e801end
[2998046]90
[b1cf98c]91 # fix problem with some BIOSes which use ax:bx rather than cx:dx
[5d721f0]92 testw %cx,%cx
93 jnz e801cxdx
94 testw %dx,%dx
95 jnz e801cxdx
96
97 movw %ax,%cx
98 movw %bx,%dx
99
100e801cxdx:
101 andl $0xffff,%edx
102 shll $6,%edx
103 andl $0xffff,%ecx
104 addl %ecx,%edx
[b1cf98c]105 addl $0x0400,%edx # add lower 1 MB - it's not included by e801 method
[11485dec]106 movl %edx,e801memorysize
[5d721f0]107e801end:
[2998046]108 ret
109
[b1cf98c]110
[874e312a]111.section K_DATA_START, "aw", @progbits
[b1cf98c]112
113#memory size in 1 kb chunks
[5d721f0]114e801memorysize:
115 .long 0
Note: See TracBrowser for help on using the repository browser.