/SPARTAN/trunk/arch/ia32/include/boot/memmap.h |
---|
29,19 → 29,20 |
#ifndef __ia32_MEMMAP_H__ |
#define __ia32_MEMMAP_H__ |
/* E820h memory range types - other values*/ |
#define MEMMAP_MEMORY_AVAILABLE 1 |
/* Not available for OS */ |
#define MEMMAP_MEMORY_RESERVED 2 |
/* OS may use it after reading ACPI table */ |
#define MEMMAP_MEMORY_ACPI 3 |
/* Unusable, required to be saved and restored across an NVS sleep */ |
#define MEMMAP_MEMORY_NVS 4 |
/* Corrupted memory */ |
#define MEMMAP_MEMORY_UNUSABLE 5 |
/* size of one entry */ |
#define MEMMAP_E820_RECORD_SIZE 20 |
/* maximum entries */ |
#define MEMMAP_E820_MAX_RECORDS 32 |
#include <arch/boot/memmapasm.h> |
#include <arch/types.h> |
struct e820memmap_ { |
__u64 base_address; |
__u64 size; |
__u32 type; |
} __attribute__ ((packed)); |
extern struct e820memmap_ e820table[MEMMAP_E820_MAX_RECORDS]; |
extern __u8 e820counter; |
extern __u32 e801memorysize; // size of memory in KB |
#endif |
/SPARTAN/trunk/arch/ia32/include/boot/memmapasm.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __ia32_MEMMAPASM_H__ |
#define __ia32_MEMMAPASM_H__ |
/* E820h memory range types - other values*/ |
/* Free memory */ |
#define MEMMAP_MEMORY_AVAILABLE 1 |
/* Not available for OS */ |
#define MEMMAP_MEMORY_RESERVED 2 |
/* OS may use it after reading ACPI table */ |
#define MEMMAP_MEMORY_ACPI 3 |
/* Unusable, required to be saved and restored across an NVS sleep */ |
#define MEMMAP_MEMORY_NVS 4 |
/* Corrupted memory */ |
#define MEMMAP_MEMORY_UNUSABLE 5 |
/* size of one entry */ |
#define MEMMAP_E820_RECORD_SIZE 20 |
/* maximum entries */ |
#define MEMMAP_E820_MAX_RECORDS 32 |
#endif |
/SPARTAN/trunk/arch/ia32/include/asm.h |
---|
33,6 → 33,7 |
#include <typedefs.h> |
#include <mm/page.h> |
#include <synch/spinlock.h> |
#include <arch/boot/memmap.h> |
extern __u32 interrupt_handler_size; |
/SPARTAN/trunk/arch/ia32/src/boot/boot.S |
---|
39,8 → 39,8 |
# switch to protected mode. |
# |
kernel_image_start: |
call memmap_arch_init |
cli |
call memmap_arch_init |
xorw %ax,%ax |
movw %ax,%ds |
lgdt gdtr |
/SPARTAN/trunk/arch/ia32/src/boot/memmap.S |
---|
27,7 → 27,7 |
*/ |
#include <arch/boot/memmap.h> |
#include <arch/boot/memmapasm.h> |
E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE |
E820_MAX_RECORDS = MEMMAP_E820_MAX_RECORDS |
34,6 → 34,9 |
E820_SMAP = 0x534d4150 |
.global memmap_arch_init |
.global e820counter |
.global e820table |
.global e801memorysize |
.code16 |
.section K_TEXT_START_2 |
42,23 → 45,24 |
e820begin: |
xorl %ebx,%ebx # during first call, ebx must be 0 |
movw %bx,%ds |
movw %bx,%es |
movw $e820table,%di |
movb $E820_MAX_RECORDS,(e820counter) |
e820loop: |
movl $E820_SMAP,%edx # constrol sequence "SMAP" |
pushw %ds |
popw %es # e820 buffer address |
movl $E820_SMAP,%edx # control sequence "SMAP" |
movl $0xe820,%eax # service |
movl $0x0000e820,%eax # service |
movl $E820_RECORD_SIZE,%ecx |
int $0x15 |
jc e820end |
jc e820err |
cmpl $E820_SMAP,%eax # verifying BIOS |
jne e820end |
jne e820err |
cmpl $E820_RECORD_SIZE,%ecx |
jne e820err # bad record size - bug in bios |
movw %di,%ax # next record |
addw $E820_RECORD_SIZE,%ax |
movw %ax,%di |
70,17 → 74,52 |
jne e820loop |
e820end: |
movb (e820counter),%al |
negb %al |
addb $32,%al |
movb $E820_MAX_RECORDS,%al |
subb (e820counter),%al |
movb %al,(e820counter) # store # of valid entries in e820counter |
jmp e801begin |
e820err: |
movb $0,(e820counter) |
# method e801 - get size of memory |
e801begin: |
xorw %dx,%dx |
xorw %cx,%cx |
xorw %bx,%bx |
movw $0xe801,%ax |
stc |
int $0x15 |
jc e801end |
# fix problem with some BIOSes which use ax:bx rather than cx:dx |
testw %cx,%cx |
jnz e801cxdx |
testw %dx,%dx |
jnz e801cxdx |
movw %ax,%cx |
movw %bx,%dx |
e801cxdx: |
andl $0xffff,%edx |
shll $6,%edx |
andl $0xffff,%ecx |
addl %ecx,%edx |
addl $0x0400,%edx # add lower 1 MB - its not count by e801 method |
movl %edx,(e801memorysize) |
e801end: |
ret |
#memory size in 1 kb chunks |
e801memorysize: |
.long 0 |
e820counter: |
.byte 0 |
.byte 0xff |
e820table: |
.space (32*E820_RECORD_SIZE),0 # space for 32 records, each E820_RECORD_SIZE bytes long |
.space (32*E820_RECORD_SIZE),0xff # space for 32 records, each E820_RECORD_SIZE bytes long |
/SPARTAN/trunk/arch/ia32/src/mm/frame.c |
---|
30,16 → 30,28 |
#include <arch/mm/frame.h> |
#include <mm/vm.h> |
#include <config.h> |
#include <arch/boot/memmap.h> |
#include <print.h> |
/* |
* TODO: use the memory map obtained from BIOS |
*/ |
void frame_arch_init(void) |
{ |
__u8 i; |
if (config.cpu_active == 1) { |
frame_not_free(0x0); |
frame_region_not_free(0xa0000,0xff000); |
frame_region_not_free(0xfec00000,0xffffffff); |
for (i=e820counter;i>0;i--) { |
//printf("E820 base: %Q size: %Q type: %L \n",e820table[i-1].base_address,e820table[i-1].size,e820table[i-1].type); |
if (e820table[i-1].type!=MEMMAP_MEMORY_AVAILABLE) { |
frame_region_not_free(e820table[i-1].base_address,e820table[i-1].size); |
} |
} |
} |
} |