/SPARTAN/trunk/src/build.amd64 |
---|
9,13 → 9,17 |
set -e |
cd ../arch |
for a in drivers bios mm/frame.c mm/tlb.c mm/memory_init.c boot/memmap.S; do |
echo ln -sf `pwd`/ia32/src/$a amd64/src/$a |
ln -sf `pwd`/ia32/src/$a amd64/src/$a |
if [ \! -e amd64/src/$a ]; then |
echo ln -sf `pwd`/ia32/src/$a amd64/src/$a |
ln -sf `pwd`/ia32/src/$a amd64/src/$a |
fi |
done |
for a in ega.h i8042.h i8259.h i8254.h interrupt.h bios mm/memory_init.h; do |
echo ln -sf `pwd`/ia32/include/$a amd64/include/$a |
ln -sf `pwd`/ia32/include/$a amd64/include/$a |
if [ \! -e amd64/include/$a ]; then |
echo ln -sf `pwd`/ia32/include/$a amd64/include/$a |
ln -sf `pwd`/ia32/include/$a amd64/include/$a |
fi |
done |
) |
make dist-clean ARCH=ia32 |
/SPARTAN/trunk/arch/amd64/_link.ld |
---|
24,6 → 24,7 |
.mapped (0xffffffff80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) { |
ktext_start = .; |
*(BOOT_DATA); |
*(.text); |
ktext_end = .; |
42,4 → 43,7 |
*(K_DATA_END); |
kdata_end = .; |
} |
_map_address = 0xffffffff80000000; |
e820table_boot = e820table - _map_address; |
e820counter_boot = e820counter - _map_address; |
} |
/SPARTAN/trunk/arch/ia32/src/boot/memmap.S |
---|
34,8 → 34,6 |
E820_SMAP = 0x534d4150 |
.global memmap_arch_init |
.global e820counter |
.global e820table |
.global e801memorysize |
.code16 |
47,8 → 45,8 |
xorl %ebx,%ebx # during first call, ebx must be 0 |
movw %bx,%ds |
movw %bx,%es |
movw $e820table,%di |
movb $E820_MAX_RECORDS,e820counter |
movw $e820table_boot,%di |
movb $E820_MAX_RECORDS,e820counter_boot |
e820loop: |
movl $E820_SMAP,%edx # control sequence "SMAP" |
67,7 → 65,7 |
addw $E820_RECORD_SIZE,%ax |
movw %ax,%di |
decb e820counter # buffer is full |
decb e820counter_boot # buffer is full |
jz e820end |
cmpl $0,%ebx |
75,13 → 73,13 |
e820end: |
movb $E820_MAX_RECORDS,%al |
subb e820counter,%al |
movb %al,e820counter # store # of valid entries in e820counter |
subb e820counter_boot,%al |
movb %al,e820counter_boot # store # of valid entries in e820counter |
jmp e801begin |
e820err: |
movb $0,e820counter |
movb $0,e820counter_boot |
# method e801 - get size of memory |
117,9 → 115,4 |
#memory size in 1 kb chunks |
e801memorysize: |
.long 0 |
e820counter: |
.byte 0xff |
e820table: |
.space (32*E820_RECORD_SIZE),0xff # space for 32 records, each E820_RECORD_SIZE bytes long |
/SPARTAN/trunk/arch/ia32/src/mm/memory_init.c |
---|
31,6 → 31,9 |
#include <arch/mm/page.h> |
#include <print.h> |
__u8 e820counter __attribute__ ((section ("BOOT_DATA"))) = 0xff; |
struct e820memmap_ e820table[MEMMAP_E820_MAX_RECORDS] __attribute__ ((section ("BOOT_DATA"))) ; |
size_t get_memory_size(void) |
{ |
return e801memorysize*1024; |
40,16 → 43,9 |
{ |
__u8 i; |
/* |
* We must not work with the original addresses for they are not mapped anymore. |
*/ |
struct e820memmap_ *memtable = (struct e820memmap_ *) PA2KA(e820table); |
__u32 *counter_p = (__u32 *) PA2KA(&e820counter); |
for (i=*counter_p;i>0;i--) { |
printf("E820 base: %Q size: %Q type: ", memtable[i-1].base_address, memtable[i-1].size); |
switch (memtable[i-1].type) { |
for (i=e820counter;i>0;i--) { |
printf("E820 base: %Q size: %Q type: ", e820table[i-1].base_address, e820table[i-1].size); |
switch (e820table[i-1].type) { |
case MEMMAP_MEMORY_AVAILABLE: |
printf("available memory\n"); |
break; |
/SPARTAN/trunk/arch/ia32/_link.ld |
---|
24,6 → 24,7 |
.mapped (0x80100000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) { |
ktext_start = .; |
*(BOOT_DATA) |
*(.text); |
ktext_end = .; |
43,5 → 44,8 |
} |
_hardcoded_kernel_size = (ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start) + (kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start); |
_map_address = 0x80100000; |
e820table_boot = e820table - _map_address; |
e820counter_boot = e820counter - _map_address; |
} |