/SPARTAN/trunk/arch/ia32/include/pm.h |
---|
137,7 → 137,7 |
extern void pm_init(void); |
extern void gdt_setbase(struct descriptor *d, __address base); |
extern void gdt_setlimit(struct descriptor *d, __address limit); |
extern void gdt_setlimit(struct descriptor *d, __u32 limit); |
extern void idt_init(void); |
extern void idt_setoffset(struct idescriptor *d, __address offset); |
/SPARTAN/trunk/arch/ia32/include/mm/page.h |
---|
34,8 → 34,8 |
#define PAGE_SIZE FRAME_SIZE |
#define KA2PA(x) (x) |
#define PA2KA(x) (x) |
#define KA2PA(x) ((x) - 0x80000000) |
#define PA2KA(x) ((x) + 0x80000000) |
struct page_specifier { |
unsigned present : 1; |
/SPARTAN/trunk/arch/ia32/include/mm/vm.h |
---|
31,13 → 31,13 |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0x0 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0x3fffffff |
#define USER_ADDRESS_SPACE_START_ARCH (__address) 0x40000000 |
#define USER_ADDRESS_SPACE_END_ARCH (__address) 0xffffffff |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0x80000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffff |
#define USER_ADDRESS_SPACE_START_ARCH (__address) 0x00000000 |
#define USER_ADDRESS_SPACE_END_ARCH (__address) 0x7fffffff |
#define UTEXT_ADDRESS_ARCH 0x40000000 |
#define USTACK_ADDRESS_ARCH 0xfffff000 |
#define UDATA_ADDRESS_ARCH 0x41000000 |
#define UTEXT_ADDRESS_ARCH 0x00001000 |
#define USTACK_ADDRESS_ARCH (0x7fffffffUL-(PAGE_SIZE-1)) |
#define UDATA_ADDRESS_ARCH 0x21000000 |
#endif |
/SPARTAN/trunk/arch/ia32/Makefile.inc |
---|
47,5 → 47,3 |
arch/boot/boot.S \ |
arch/boot/memmap.S\ |
arch/fpu_context.c |
/SPARTAN/trunk/arch/ia32/src/pm.c |
---|
66,17 → 66,17 |
struct tss *tss_p = NULL; |
/* gdtr is changed by kmp before next CPU is initialized */ |
struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = (__address) gdt }; |
struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START")))= { .limit = sizeof(idt), .base = (__address) idt }; |
struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) }; |
struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) }; |
void gdt_setbase(struct descriptor *d, __address base) |
{ |
d->base_0_15 = base & 0xffff; |
d->base_16_23 = (base >> 16) & 0xff; |
d->base_24_31 = (base >> 24) & 0xff; |
d->base_0_15 = KA2PA(base) & 0xffff; |
d->base_16_23 = (KA2PA(base) >> 16) & 0xff; |
d->base_24_31 = (KA2PA(base) >> 24) & 0xff; |
} |
void gdt_setlimit(struct descriptor *d, __address limit) |
void gdt_setlimit(struct descriptor *d, __u32 limit) |
{ |
d->limit_0_15 = limit & 0xffff; |
d->limit_16_19 = (limit >> 16) & 0xf; |
84,8 → 84,8 |
void idt_setoffset(struct idescriptor *d, __address offset) |
{ |
d->offset_0_15 = offset & 0xffff; |
d->offset_16_31 = offset >> 16; |
d->offset_0_15 = KA2PA(offset) & 0xffff; |
d->offset_16_31 = KA2PA(offset) >> 16; |
} |
void tss_initialize(struct tss *t) |
/SPARTAN/trunk/arch/ia32/src/boot/boot.S |
---|
39,8 → 39,8 |
# switch to protected mode. |
# |
kernel_image_start: |
cli |
call memmap_arch_init |
cli |
xorw %ax,%ax |
movw %ax,%ds |
lgdt gdtr |
62,8 → 62,39 |
lidt idtr |
call main_bsp # never returns |
# |
# Here we setup mapping for both the unmapped and mapped sections of the kernel. |
# For simplicity, we set only one 4M page for 0x00000000 and one for 0x80000000. |
# |
movl %cr4, %ecx |
orl $(1<<4), %ecx |
movl %ecx, %cr4 # turn PSE on |
movl $((1<<7)|(1<<0)), %eax |
movl %eax, page_directory # mapping 0x00000000 => 0x00000000 |
movl $(page_directory+(4096/2)), %edx |
movl %eax, (%edx) # mapping 0x80000000 => 0x00000000 |
leal page_directory, %eax |
movl %eax, %cr3 |
# turn on paging |
movl %cr0, %ebx |
orl $(1<<31), %ebx |
movl %ebx, %cr0 |
movl $_hardcoded_ktext_size, hardcoded_ktext_size |
movl $_hardcoded_kdata_size, hardcoded_kdata_size |
movl $_hardcoded_load_address, hardcoded_load_address |
call main_bsp # never returns |
cli |
hlt |
.section K_DATA_START |
.align 4096 |
page_directory: |
.space 4096, 0 |
/SPARTAN/trunk/arch/ia32/src/boot/memmap.S |
---|
29,12 → 29,6 |
#include <arch/boot/memmap.h> |
.global memmap_arch_init |
.code16 |
.section K_TEXT_START |
E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE |
E820_MAX_RECORDS = MEMMAP_E820_MAX_RECORDS |
E820_SMAP = 0x534d4150 |
/SPARTAN/trunk/arch/ia32/src/mm/frame.c |
---|
37,11 → 37,8 |
void frame_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
__u32 kernel_frames_max; |
kernel_frames_max = ((KERNEL_ADDRESS_SPACE_END+1)/FRAME_SIZE); |
kernel_frames_free = kernel_frames = frames < kernel_frames_max ? frames : kernel_frames_max; |
kernel_frames = frames; |
kernel_frames_free = frames_free; |
frame_kernel_bitmap = frame_bitmap; |
frame_not_free(0x0); |
/SPARTAN/trunk/arch/ia32/src/mm/page.c |
---|
53,19 → 53,22 |
__u32 i; |
if (config.cpu_active == 1) { |
dba = frame_alloc(FRAME_KA | FRAME_PANIC); |
dba = KA2PA(frame_alloc(FRAME_KA | FRAME_PANIC)); |
memsetb(dba, PAGE_SIZE, 0); |
cpu_write_dba(dba); |
bootstrap_dba = dba; |
/* |
* Identity mapping for all but 0th page. |
* PA2KA(identity) mapping for all but 0th page. |
*/ |
for (i = 1; i < frames; i++) |
for (i = 1; i < frames; i++) { |
map_page_to_frame(i * PAGE_SIZE, i * PAGE_SIZE, PAGE_CACHEABLE, 0); |
map_page_to_frame(PA2KA(i * PAGE_SIZE), i * PAGE_SIZE, PAGE_CACHEABLE, 0); |
} |
trap_register(14, page_fault); |
cpu_write_dba(dba); |
} |
else { |
104,7 → 107,9 |
__address dba, newpt; |
int pde, pte; |
dba = cpu_read_dba(); |
// TODO: map_page_to_frame should take dba as a parameter |
// dba = cpu_read_dba(); |
dba = bootstrap_dba; |
pde = page >> 22; /* page directory entry */ |
pte = (page >> 12) & 0x3ff; /* page table entry */ |
116,7 → 121,7 |
* There is currently no page table for this address. Allocate |
* frame for the page table and clean it. |
*/ |
newpt = frame_alloc(FRAME_KA); |
newpt = KA2PA(frame_alloc(FRAME_KA)); |
pd[pde].frame_address = newpt >> 12; |
memsetb(newpt, PAGE_SIZE, 0); |
pd[pde].present = 1; |
123,7 → 128,7 |
pd[pde].uaccessible = 1; |
} |
if (copy) { |
newpt = frame_alloc(FRAME_KA); |
newpt = KA2PA(frame_alloc(FRAME_KA)); |
memcopy(pd[pde].frame_address << 12, newpt, PAGE_SIZE); |
pd[pde].frame_address = newpt >> 12; |
} |
/SPARTAN/trunk/arch/ia32/_link.ld |
---|
1,8 → 1,11 |
/** IA-32 linker script |
* |
* kernel text |
* kernel data |
* |
* umapped section: |
* kernel text |
* kernel data |
* mapped section: |
* kernel text |
* kernel data |
*/ |
OUTPUT_FORMAT(binary) |
9,12 → 12,17 |
ENTRY(kernel_image_start) |
SECTIONS { |
.image 0x8000: AT (0x8000) { |
ktext_start = .; |
.unmapped 0x8000: AT (0x8000) { |
unmapped_ktext_start = .; |
*(K_TEXT_START); |
delta_start = .; |
unmapped_ktext_end = .; |
unmapped_kdata_start = .; |
*(K_DATA_START); |
delta_end = .; |
unmapped_kdata_end = .; |
} |
.mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) { |
ktext_start = .; |
*(.text); |
ktext_end = .; |
27,19 → 35,8 |
kdata_end = .; |
} |
. = ABSOLUTE(hardcoded_ktext_size); |
.patch_1 : { |
LONG(ktext_end - ktext_start - (delta_end - delta_start)); |
} |
_hardcoded_ktext_size = ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start); |
_hardcoded_kdata_size = kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start); |
_hardcoded_load_address = 0x80008000; |
. = ABSOLUTE(hardcoded_kdata_size); |
.patch_2 : { |
LONG(kdata_end - kdata_start + (delta_end - delta_start)); |
} |
. = ABSOLUTE(hardcoded_load_address); |
.patch_3 : { |
LONG(0x8000); |
} |
} |