Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 104 → Rev 105

/SPARTAN/trunk/include/config.h
32,7 → 32,7
#include <arch/types.h>
#include <typedefs.h>
 
#define CONFIG_MEMORY_SIZE 16*1024*1024
#define CONFIG_MEMORY_SIZE 4*1024*1024
#define CONFIG_HEAP_SIZE 300*1024
#define CONFIG_STACK_SIZE 32*1024
 
/SPARTAN/trunk/doc/AUTHORS
2,4 → 2,4
Jakub Vana
Martin Decky
Josef Cejka
Sergey Bondari
Sergey Bondari
/SPARTAN/trunk/src/main/main.c
63,7 → 63,8
 
/*
* These 'hardcoded' variables will be intialised by
* the linker with appropriate sizes and addresses.
* the linker or the low level assembler code with
* appropriate sizes and addresses.
*/
__address hardcoded_load_address = 0;
__u32 hardcoded_ktext_size = 0;
114,7 → 115,6
arch_post_mm_init();
 
printf("%s\n%s\n", project, copyright);
 
printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n",
config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024);
 
/SPARTAN/trunk/arch/ia64/include/mm/vm.h
37,7 → 37,7
#define USER_ADDRESS_SPACE_END_ARCH (__address) 0x7fffffffffffffff
 
#define UTEXT_ADDRESS_ARCH 0x0000000000001000
#define USTACK_ADDRESS_ARCH 0x7ffffffffffff000
#define USTACK_ADDRESS_ARCH (0x7fffffffffffffff-(PAGE_SIZE-1))
#define UDATA_ADDRESS_ARCH 0x0000000001001000
 
#endif
/SPARTAN/trunk/arch/mips/include/mm/vm.h
37,7 → 37,7
#define USER_ADDRESS_SPACE_END_ARCH (__address) 0x7fffffff
 
#define UTEXT_ADDRESS_ARCH 0x00001000
#define USTACK_ADDRESS_ARCH 0x7ffff000
#define USTACK_ADDRESS_ARCH (0x7fffffff-(PAGE_SIZE-1))
#define UDATA_ADDRESS_ARCH 0x01001000
 
#endif
/SPARTAN/trunk/arch/mips/src/asm.s
148,6 → 148,11
j _memsetb
nop
 
.global memcopy
memcopy:
j _memcopy
nop
 
# THIS IS USERSPACE CODE
.global utext
utext:
/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);
}
 
}