Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 266 → Rev 267

/SPARTAN/trunk/arch/ia32/src/ia32.c
57,7 → 57,7
 
if (config.cpu_active == 1) {
bios_init();
i8042_init(); /* a20 bit */
i8042_init(); /* keyboard controller */
i8259_init(); /* PIC */
i8254_init(); /* hard clock */
/SPARTAN/trunk/arch/ia32/src/pm.c
70,7 → 70,9
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 = KA2PA((__address) gdt - BOOT_OFFSET) };
struct ptr_16_32 bsp_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt - BOOT_OFFSET) };
struct ptr_16_32 ap_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
struct ptr_16_32 gdtr = { .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)
170,7 → 172,7
/*
* Update addresses in GDT and IDT to their virtual counterparts.
*/
gdtr.base = KA2PA(gdtr.base);
gdtr.base = (__address) gdt;
idtr.base = (__address) idt;
__asm__ volatile ("lgdt %0\n" : : "m" (gdtr));
__asm__ volatile ("lidt %0\n" : : "m" (idtr));
/SPARTAN/trunk/arch/ia32/src/smp/ap.S
47,27 → 47,33
ap_boot:
.code16
cli
xorw %ax,%ax
movw %ax,%ds
xorw %ax, %ax
movw %ax, %ds
 
lgdt gdtr # initialize Global Descriptor Table register
lgdt ap_bootstrap_gdtr # initialize Global Descriptor Table register
movl %cr0,%eax
orl $1,%eax
movl %eax,%cr0 # switch to protected mode
jmpl $KTEXT,$jump_to_kernel
movl %cr0, %eax
orl $1, %eax
movl %eax, %cr0 # switch to protected mode
jmpl $KTEXT, $jump_to_kernel
jump_to_kernel:
.code32
movw $KDATA,%ax
movw %ax,%ds
movw %ax,%es
movw %ax,%ss
movl $(ctx-0x80000000),%eax # KA2PA((__address) &ctx)
movl (%eax),%esp
subl $0x80000000,%esp # KA2PA(ctx.sp)
movw $KDATA, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
movl $(ctx-0x80000000), %eax # KA2PA((__address) &ctx)
movl (%eax), %esp
subl $0x80000000, %esp # KA2PA(ctx.sp)
 
call map_kernel # map kernel and turn paging on
call map_kernel # map kernel and turn paging on
movb $0xd1, %al # enable A20 using the keyboard controller
outb %al, $0x64
movb $0xdf, %al
outb %al, $0x60
 
jmpl $KTEXT,$main_ap
jmpl $KTEXT, $main_ap
 
#endif /* __SMP__ */
/SPARTAN/trunk/arch/ia32/src/boot/boot.S
31,6 → 31,9
.section K_TEXT_START
.global kernel_image_start
 
KTEXT=8
KDATA=16
 
.code16
#
# This is where we require any SPARTAN-kernel-compatible boot loader
44,18 → 47,18
cli
xorw %ax, %ax
movw %ax, %ds
movw %ax, %ss # initialize stack segment register
movl $0x7c00, %esp # initialize stack pointer
movw %ax, %ss # initialize stack segment register
movl $BOOTSTRAP_OFFSET - 0x400, %esp # initialize stack pointer
call memmap_arch_init
lgdt gdtr # initialize Global Descriptor Table register
lgdt bsp_bootstrap_gdtr # initialize Global Descriptor Table register
movl %cr0, %eax
orl $0x1, %eax
movl %eax, %cr0 # switch to protected mode
movl %eax, %cr0 # switch to protected mode
jmpl $8, $boot_image_start
jmpl $KTEXT, $boot_image_start
.code32
.align 4
70,7 → 73,7
.long multiboot_image_start + BOOT_OFFSET
boot_image_start:
movw $16, %ax
movw $KDATA, %ax
movw %ax, %es
movw %ax, %gs
movw %ax, %fs
84,8 → 87,8
movb $0xdf, %al
outb %al, $0x60
movl $0x8000, %esi
movl $0x8000 + BOOT_OFFSET, %edi
movl $BOOTSTRAP_OFFSET, %esi
movl $BOOTSTRAP_OFFSET + BOOT_OFFSET, %edi
movl $_hardcoded_kernel_size, %ecx
cld
rep movsb
93,21 → 96,21
jmp protected
multiboot_image_start:
movl $0x7c00, %esp # initialize stack pointer
movl BOOTSTRAP_OFFSET - 0x400, %esp # initialize stack pointer
lgdt gdtr
lgdt gdtr # initialize Global Descriptor Table register
 
movw $16, %ax
movw $KDATA, %ax
movw %ax, %es
movw %ax, %gs
movw %ax, %fs
movw %ax, %ds # kernel data + stack
movw %ax, %ds # kernel data + stack
movw %ax, %ss
call map_kernel # map kernel and turn paging on
call map_kernel # map kernel and turn paging on
protected:
call main_bsp # never returns
call main_bsp # never returns
 
cli
hlt
/SPARTAN/trunk/arch/ia32/src/mm/frame.c
30,9 → 30,11
#include <arch/mm/frame.h>
#include <mm/vm.h>
#include <config.h>
#include <arch/boot/boot.h>
#include <arch/boot/memmap.h>
 
#include <print.h>
size_t hardcoded_unmapped_ktext_size = 0;
size_t hardcoded_unmapped_kdata_size = 0;
 
void frame_arch_init(void)
{
39,13 → 41,15
__u8 i;
if (config.cpu_active == 1) {
/* Reserve the NULL frame */
frame_not_free(0x0);
 
/* Reserve well-known memory regions */
frame_region_not_free(0xa0000,0xff000);
frame_region_not_free(0xfec00000,0xffffffff);
/* This is a nasty hack, which should be fixed soon */
frame_region_not_free(0x0, 0xfffff);
/* Reserve real mode bootstrap memory */
frame_region_not_free(BOOTSTRAP_OFFSET, BOOTSTRAP_OFFSET + hardcoded_unmapped_ktext_size + hardcoded_unmapped_kdata_size);
for (i=e820counter;i>0;i--) {
if (e820table[i-1].type!=MEMMAP_MEMORY_AVAILABLE) {