Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 105 → Rev 106

/SPARTAN/trunk/src/main/main.c
55,6 → 55,8
#include <arch.h>
#include <arch/faddr.h>
 
#include <typedefs.h>
 
char *project = "SPARTAN kernel";
char *copyright = "Copyright (C) 2001-2005 Jakub Jermar\nCopyright (C) 2005 HelenOS project";
 
67,8 → 69,8
* appropriate sizes and addresses.
*/
__address hardcoded_load_address = 0;
__u32 hardcoded_ktext_size = 0;
__u32 hardcoded_kdata_size = 0;
size_t hardcoded_ktext_size = 0;
size_t hardcoded_kdata_size = 0;
 
void main_bsp(void);
void main_ap(void);
/SPARTAN/trunk/arch/ia64/src/start.S
27,8 → 27,6
#
 
.section K_TEXT_START
.global k_text_start
k_text_start:
 
.global kernel_image_start
 
49,40 → 47,25
add r12 = - 16, r12 /* allocate a scratch area on the stack */
 
# initialize gp (Global Pointer) register
movl r1=k_text_start
movl r1 = _hardcoded_load_address
;;
 
#
# Initialize hardcoded_* variables.
# (IA-64 port doesn't get these values from linker.)
#
movl r8 = k_text_start ;;
movl r9 = k_text_end ;;
sub r8 = r9, r8
addl r10 = @gprel(hardcoded_ktext_size), gp;;
st4 [r10] = r8 ;;
 
movl r8 = k_data_start ;;
movl r9 = k_data_end ;;
sub r8 = r9, r8
addl r10 = @gprel(hardcoded_kdata_size), gp;;
st4 [r10] = r8 ;;
movl r14 = _hardcoded_ktext_size
movl r15 = _hardcoded_kdata_size
movl r16 = _hardcoded_load_address
addl r17 = @gprel(hardcoded_ktext_size), gp
addl r18 = @gprel(hardcoded_kdata_size), gp
addl r19 = @gprel(hardcoded_load_address), gp
;;
st4 [r17] = r14
st4 [r18] = r15
st8 [r19] = r16
addl r10 = @gprel(hardcoded_load_address), gp;;
st8 [r10] = r1
br.call.sptk.many b0=main_bsp
 
0:
br 0b
 
.section K_TEXT_END
.global k_text_end
k_text_end:
 
.section K_DATA_START
.global k_data_start
k_data_start:
 
.section K_DATA_END
.global k_data_end
k_data_end:
/SPARTAN/trunk/arch/ia64/_link.ld
11,77 → 11,82
ENTRY(kernel_image_start)
 
SECTIONS {
.image 0x0000000000001000: AT (0x0000000000001000) {
*(K_TEXT_START)
*(.text .stub .text.* .gnu.linkonce.t.*)
*(.interp)
*(.hash)
*(.dynsym)
*(.dynstr)
*(.rel.init)
*(.rela.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rel.fini)
*(.rela.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rel.got)
*(.rela.got)
*(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
*(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
*(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
*(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
*(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
*(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
*(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
*(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
*(.rel.plt)
*(.rela.plt)
*(.rela.IA_64.pltoff)
*(.init)
*(.plt)
*(.fini)
*(K_TEXT_END)
*(K_DATA_START)
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1)
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
*(.opd)
*(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*)
*(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
*(.eh_frame_hdr)
*(.preinit_array)
*(.init_array)
*(.fini_array)
*(.data .data.* .gnu.linkonce.d.*)
*(.data1)
*(.tdata .tdata.* .gnu.linkonce.td.*)
*(.tcommon)
*(.eh_frame)
*(.gcc_except_table)
*(.dynamic)
*(.jcr)
*(.got)
*(.IA_64.pltoff)
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON);
*(K_DATA_END)
}
.image 0x0000000000001000: AT (0x0000000000001000) {
ktext_start = .;
*(K_TEXT_START);
*(.text .stub .text.* .gnu.linkonce.t.*)
*(.interp)
*(.hash)
*(.dynsym)
*(.dynstr)
*(.rel.init)
*(.rela.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rel.fini)
*(.rela.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rel.got)
*(.rela.got)
*(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
*(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
*(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
*(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
*(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
*(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
*(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
*(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
*(.rel.plt)
*(.rela.plt)
*(.rela.IA_64.pltoff)
*(.init)
*(.plt)
*(.fini)
ktext_end = .;
kdata_start = .;
*(K_DATA_START)
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1)
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
*(.opd)
*(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*)
*(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
*(.eh_frame_hdr)
*(.preinit_array)
*(.init_array)
*(.fini_array)
*(.data .data.* .gnu.linkonce.d.*)
*(.data1)
*(.tdata .tdata.* .gnu.linkonce.td.*)
*(.tcommon)
*(.eh_frame)
*(.gcc_except_table)
*(.dynamic)
*(.jcr)
*(.got)
*(.IA_64.pltoff)
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON);
kdata_end = .;
}
 
_hardcoded_ktext_size = ktext_end - ktext_start;
_hardcoded_kdata_size = kdata_end - kdata_start;
_hardcoded_load_address = 0x0000000000001000;
}
/SPARTAN/trunk/arch/mips/_link.ld
10,38 → 10,38
ENTRY(kernel_image_start)
 
SECTIONS {
.image 0x80000000: AT (0x80000000) {
ktext_start = .;
*(.text);
ktext_end = .;
.image 0x80000000: AT (0x80000000) {
ktext_start = .;
*(.text);
ktext_end = .;
 
kdata_start = .;
*(.rdata);
*(.data); /* initialized data */
*(.lit8);
*(.lit4);
*(.sdata);
*(.sbss);
*(.bss); /* uninitialized static variables */
*(.scommon);
*(COMMON); /* global variables */
kdata_end = .;
kdata_start = .;
*(.rdata);
*(.data); /* initialized data */
*(.lit8);
*(.lit4);
*(.sdata);
*(.sbss);
*(.bss); /* uninitialized static variables */
*(.scommon);
*(COMMON); /* global variables */
kdata_end = .;
 
} = 0x00000000
} = 0x00000000
 
. = ABSOLUTE(hardcoded_ktext_size);
.patch_1 : {
LONG(ktext_end - ktext_start);
}
. = ABSOLUTE(hardcoded_ktext_size);
.patch_1 : {
LONG(ktext_end - ktext_start);
}
 
. = ABSOLUTE(hardcoded_kdata_size);
.patch_2 : {
LONG(kdata_end - kdata_start);
}
. = ABSOLUTE(hardcoded_kdata_size);
.patch_2 : {
LONG(kdata_end - kdata_start);
}
 
. = ABSOLUTE(hardcoded_load_address);
.patch_3 : {
LONG(0x80000000);
}
. = ABSOLUTE(hardcoded_load_address);
.patch_3 : {
LONG(0x80000000);
}
 
}
/SPARTAN/trunk/arch/ia32/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 (0x7fffffffUL-(PAGE_SIZE-1))
#define USTACK_ADDRESS_ARCH (0x7fffffff-(PAGE_SIZE-1))
#define UDATA_ADDRESS_ARCH 0x21000000
 
#endif
/SPARTAN/trunk/arch/ia32/src/asm.s
444,7 → 444,7
.long utext_end - utext
 
 
.section K_DATA_START
#.section K_DATA_START
.global interrupt_handler_size
 
interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
/SPARTAN/trunk/arch/ia32/src/mm/page.c
35,6 → 35,7
#include <arch/interrupt.h>
#include <arch/asm.h>
#include <synch/spinlock.h>
#include <debug.h>
 
/*
* Note.
53,7 → 54,7
__u32 i;
 
if (config.cpu_active == 1) {
dba = KA2PA(frame_alloc(FRAME_KA | FRAME_PANIC));
dba = frame_alloc(FRAME_KA | FRAME_PANIC);
memsetb(dba, PAGE_SIZE, 0);
bootstrap_dba = dba;
68,7 → 69,7
}
 
trap_register(14, page_fault);
cpu_write_dba(dba);
cpu_write_dba(KA2PA(dba));
}
else {
 
81,7 → 82,7
 
dba = frame_alloc(FRAME_KA | FRAME_PANIC);
memcopy(bootstrap_dba, dba, PAGE_SIZE);
cpu_write_dba(dba);
cpu_write_dba(KA2PA(dba));
}
 
paging_on();
121,16 → 122,16
* There is currently no page table for this address. Allocate
* frame for the page table and clean it.
*/
newpt = KA2PA(frame_alloc(FRAME_KA));
pd[pde].frame_address = newpt >> 12;
newpt = frame_alloc(FRAME_KA);
pd[pde].frame_address = KA2PA(newpt) >> 12;
memsetb(newpt, PAGE_SIZE, 0);
pd[pde].present = 1;
pd[pde].uaccessible = 1;
}
if (copy) {
newpt = KA2PA(frame_alloc(FRAME_KA));
newpt = frame_alloc(FRAME_KA);
memcopy(pd[pde].frame_address << 12, newpt, PAGE_SIZE);
pd[pde].frame_address = newpt >> 12;
pd[pde].frame_address = KA2PA(newpt) >> 12;
}
pt = (struct page_specifier *) (pd[pde].frame_address << 12);
/SPARTAN/trunk/arch/ia32/src/userspace.c
52,7 → 52,7
"pushl %3\n"
"pushl %4\n"
"iret"
: : "i" (selector(UDATA_DES) | PL_USER), "i" (USTACK_ADDRESS+THREAD_STACK_SIZE-1000), "r" (pri), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS));
: : "i" (selector(UDATA_DES) | PL_USER), "i" (USTACK_ADDRESS+(THREAD_STACK_SIZE-1)), "r" (pri), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS));
/* Unreachable */
for(;;);
/SPARTAN/trunk/arch/ia32/src/drivers/ega.c
47,7 → 47,7
{
__u8 hi, lo;
 
map_page_to_frame(VIDEORAM, VIDEORAM, PAGE_NOT_CACHEABLE, 0);
map_page_to_frame(PA2KA(VIDEORAM), VIDEORAM, PAGE_NOT_CACHEABLE, 0);
outb(0x3d4,0xe);
hi = inb(0x3d5);
outb(0x3d4,0xf);
58,7 → 58,7
 
void ega_display_char(char ch)
{
__u8 *vram = (__u8 *) VIDEORAM;
__u8 *vram = (__u8 *) PA2KA(VIDEORAM);
vram[ega_cursor*2] = ch;
}
71,8 → 71,8
if (ega_cursor < SCREEN)
return;
 
memcopy(VIDEORAM + ROW*2, VIDEORAM, (SCREEN - ROW)*2);
memsetw(VIDEORAM + (SCREEN - ROW)*2, ROW, 0x0720);
memcopy(PA2KA(VIDEORAM) + ROW*2, PA2KA(VIDEORAM), (SCREEN - ROW)*2);
memsetw(PA2KA(VIDEORAM) + (SCREEN - ROW)*2, ROW, 0x0720);
ega_cursor = ega_cursor - ROW;
}
 
/SPARTAN/trunk/arch/ia32/_link.ld
12,31 → 12,31
ENTRY(kernel_image_start)
 
SECTIONS {
.unmapped 0x8000: AT (0x8000) {
unmapped_ktext_start = .;
*(K_TEXT_START);
unmapped_ktext_end = .;
unmapped_kdata_start = .;
*(K_DATA_START);
unmapped_kdata_end = .;
}
.mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
ktext_start = .;
*(.text);
ktext_end = .;
.unmapped 0x8000: AT (0x8000) {
unmapped_ktext_start = .;
*(K_TEXT_START);
unmapped_ktext_end = .;
unmapped_kdata_start = .;
*(K_DATA_START);
unmapped_kdata_end = .;
}
 
kdata_start = .;
*(.data); /* initialized data */
*(.rodata*); /* string literals */
*(COMMON); /* global variables */
*(.bss); /* uninitialized static variables */
*(K_DATA_END);
kdata_end = .;
}
.mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
ktext_start = .;
*(.text);
ktext_end = .;
 
_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;
kdata_start = .;
*(.data); /* initialized data */
*(.rodata*); /* string literals */
*(COMMON); /* global variables */
*(.bss); /* uninitialized static variables */
*(K_DATA_END);
kdata_end = .;
}
 
_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;
 
}