diff --git a/src/kernel/core/arch/ppc/arch_cpu.c b/src/kernel/core/arch/ppc/arch_cpu.c index 8635583d6d..a0a09cc513 100755 --- a/src/kernel/core/arch/ppc/arch_cpu.c +++ b/src/kernel/core/arch/ppc/arch_cpu.c @@ -1,7 +1,10 @@ /* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -9,24 +12,24 @@ #include -int -arch_cpu_preboot_init(kernel_args *ka) +status_t +arch_cpu_preboot_init(kernel_args *args) { - return 0; + return B_OK; } -int -arch_cpu_init(kernel_args *ka) +status_t +arch_cpu_init(kernel_args *args) { - return 0; + return B_OK; } -int -arch_cpu_init2(kernel_args *ka) +status_t +arch_cpu_init_post_vm(kernel_args *args) { - return 0; + return B_OK; } #define CACHELINE 32 @@ -121,13 +124,13 @@ system_time(void) #endif -int -arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr *fault_handler) +status_t +arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr_t *fault_handler) { char *tmp = (char *)to; char *s = (char *)from; - *fault_handler = (addr)&&error; + *fault_handler = (addr_t)&&error; while (size--) *tmp++ = *s++; @@ -151,12 +154,12 @@ error: * \return strlen(\a from). */ -int -arch_cpu_user_strlcpy(char *to, const char *from, size_t size, addr *faultHandler) +ssize_t +arch_cpu_user_strlcpy(char *to, const char *from, size_t size, addr_t *faultHandler) { int from_length = 0; - *faultHandler = (addr)&&error; + *faultHandler = (addr_t)&&error; if (size > 0) { to[--size] = '\0'; @@ -179,12 +182,12 @@ error: } -int -arch_cpu_user_memset(void *s, char c, size_t count, addr *fault_handler) +status_t +arch_cpu_user_memset(void *s, char c, size_t count, addr_t *fault_handler) { char *xs = (char *)s; - *fault_handler = (addr)&&error; + *fault_handler = (addr_t)&&error; while (count--) *xs++ = c; diff --git a/src/kernel/core/arch/ppc/arch_dbg_console.c b/src/kernel/core/arch/ppc/arch_dbg_console.c index b51fbc23d4..44348c1d09 100755 --- a/src/kernel/core/arch/ppc/arch_dbg_console.c +++ b/src/kernel/core/arch/ppc/arch_dbg_console.c @@ -1,7 +1,10 @@ /* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -210,34 +213,18 @@ arch_dbg_putchar(char c) #endif -int -arch_dbg_con_init(kernel_args *ka) +void +arch_dbg_con_early_boot_message(const char *string) { -#if FRAMEBUFFER_DBG_CONSOLE - framebuffer = (unsigned char *)ka->fb.mapping.start; - screen_size_x = ka->fb.x_size; - screen_size_y = ka->fb.y_size; - - back_color = 0x0; - draw_color = 0xff; - char_x = 0; - char_y = ka->cons_line; - screen_depth = ka->fb.bit_depth; - - num_cols = screen_size_x / CHAR_WIDTH; - num_rows = screen_size_y / CHAR_HEIGHT; - -#endif - - return B_NO_ERROR; + // this function will only be called in fatal situations } -int -arch_dbg_con_init2(kernel_args *ka) +status_t +arch_dbg_con_init(kernel_args *args) { -#if 0 #if FRAMEBUFFER_DBG_CONSOLE +#if 0 region_id fb_region; void *new_framebuffer; @@ -249,38 +236,50 @@ arch_dbg_con_init2(kernel_args *ka) dprintf("framebuffer now at %p, phys addr 0x%x\n", new_framebuffer, ka->fb.phys_addr.start); dprintf("compare %d\n", memcmp(framebuffer, new_framebuffer, ka->fb.phys_addr.size)); +#endif + + // ToDo: this has to be mapped before it can be used! + framebuffer = (unsigned char *)args->frame_buffer.physical_buffer.start; + + screen_size_x = args->frame_buffer.width; + screen_size_y = args->frame_buffer.height; + + back_color = 0x0; + draw_color = 0xff; + char_x = 0; + char_y = args->cons_line; + screen_depth = args->frame_buffer.depth; + + num_cols = screen_size_x / CHAR_WIDTH; + num_rows = screen_size_y / CHAR_HEIGHT; #endif -#endif + return B_NO_ERROR; } -char arch_dbg_con_read() + +char +arch_dbg_con_read() { - for(;;); + for (;;); return 0; } -char arch_dbg_con_putch(const char c) + +char +arch_dbg_con_putch(const char c) { return c; } -void arch_dbg_con_puts(const char *str) + +void +arch_dbg_con_puts(const char *str) { - while(*str) { + while (*str) { arch_dbg_putchar(*str); str++; } } -ssize_t arch_dbg_con_write(const void *buf, ssize_t len) -{ - ssize_t i; - - for(i = 0; i < len; i++) - arch_dbg_putchar(((char *)buf)[i]); - - return 0; -} - diff --git a/src/kernel/core/arch/ppc/arch_int.c b/src/kernel/core/arch/ppc/arch_int.c index 3841a0f91b..d3d5cdff61 100755 --- a/src/kernel/core/arch/ppc/arch_int.c +++ b/src/kernel/core/arch/ppc/arch_int.c @@ -1,7 +1,10 @@ /* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -150,23 +153,23 @@ ppc_exception_entry(int vector, struct iframe *iframe) } -int -arch_int_init(kernel_args *ka) +status_t +arch_int_init(kernel_args *args) { - return 0; + return B_OK; } -int -arch_int_init2(kernel_args *ka) +status_t +arch_int_init_post_vm(kernel_args *args) { region_id exception_region; void *handlers; // create a region to map the irq vector code into (physical address 0x0) - handlers = (void *)ka->arch_args.exception_handlers.start; + handlers = (void *)args->arch_args.exception_handlers.start; exception_region = vm_create_anonymous_region(vm_get_kernel_aspace_id(), "exception_handlers", - &handlers, B_EXACT_ADDRESS, ka->arch_args.exception_handlers.size, + &handlers, B_EXACT_ADDRESS, args->arch_args.exception_handlers.size, B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); if (exception_region < 0) panic("arch_int_init2: could not create exception handler region\n"); @@ -174,9 +177,9 @@ arch_int_init2(kernel_args *ka) dprintf("exception handlers at %p\n", handlers); // copy the handlers into this area - memcpy(handlers, &__irqvec_start, ka->arch_args.exception_handlers.size); + memcpy(handlers, &__irqvec_start, args->arch_args.exception_handlers.size); arch_cpu_sync_icache(0, 0x1000); - return 0; + return B_OK; } diff --git a/src/kernel/core/arch/ppc/arch_thread.c b/src/kernel/core/arch/ppc/arch_thread.c index 6ccefe6279..f6396ab147 100755 --- a/src/kernel/core/arch/ppc/arch_thread.c +++ b/src/kernel/core/arch/ppc/arch_thread.c @@ -1,7 +1,10 @@ -/* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ +/* + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -11,24 +14,31 @@ #include -int -arch_team_init_team_struct(struct team *team, bool kernel) +status_t +arch_thread_init(struct kernel_args *args) { - return 0; + return B_OK; } -int +status_t +arch_team_init_team_struct(struct team *team, bool kernel) +{ + return B_OK; +} + + +status_t arch_thread_init_thread_struct(struct thread *t) { // set up an initial state (stack & fpu) memset(&t->arch_info, 0, sizeof(t->arch_info)); - return 0; + return B_OK; } -int +status_t arch_thread_init_kthread_stack(struct thread *t, int (*start_func)(void), void (*entry_func)(void), void (*exit_func)(void)) { addr_t *kstack = (addr_t *)t->kernel_stack_base; @@ -45,7 +55,7 @@ arch_thread_init_kthread_stack(struct thread *t, int (*start_func)(void), void ( // save this stack position t->arch_info.sp = (void *)kstack_top; - return 0; + return B_OK; } @@ -81,9 +91,9 @@ arch_thread_context_switch(struct thread *t_from, struct thread *t_to) asm("mtear %0" :: "g"(t_to->kernel_stack_base + KSTACK_SIZE - 8)); // switch the asids if we need to - if (t_to->team->_aspace_id >= 0) { + if (t_to->team->aspace != NULL) { // the target thread has is user space - if (t_from->team->_aspace_id != t_to->team->_aspace_id) { + if (t_from->team != t_to->team) { // switching to a new address space ppc_translation_map_change_asid(&t_to->team->aspace->translation_map); } @@ -103,7 +113,7 @@ arch_thread_dump_info(void *info) void -arch_thread_enter_uspace(struct thread *thread, addr entry, void *arg1, void *arg2) +arch_thread_enter_uspace(struct thread *thread, addr_t entry, void *arg1, void *arg2) { panic("arch_thread_enter_uspace(): not yet implemented\n"); } @@ -129,3 +139,27 @@ arch_check_syscall_restart(struct thread *thread) } +/** Saves everything needed to restore the frame in the child fork in the + * arch_fork_arg structure to be passed to arch_restore_fork_frame(). + * Also makes sure to return the right value. + */ + +void +arch_store_fork_frame(struct arch_fork_arg *arg) +{ +} + + +/** Restores the frame from a forked team as specified by the provided + * arch_fork_arg structure. + * Needs to be called from within the child team, ie. instead of + * arch_thread_enter_uspace() as thread "starter". + * This function does not return to the caller, but will enter userland + * in the child team at the same position where the parent team left of. + */ + +void +arch_restore_fork_frame(struct arch_fork_arg *arg) +{ +} + diff --git a/src/kernel/core/arch/ppc/arch_vm.cpp b/src/kernel/core/arch/ppc/arch_vm.cpp index 4a897bb693..2bf766500f 100644 --- a/src/kernel/core/arch/ppc/arch_vm.cpp +++ b/src/kernel/core/arch/ppc/arch_vm.cpp @@ -1,7 +1,10 @@ /* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -11,15 +14,15 @@ #include -int -arch_vm_init(kernel_args *ka) +status_t +arch_vm_init(kernel_args *args) { - return 0; + return B_OK; } -int -arch_vm_init2(kernel_args *ka) +status_t +arch_vm_init2(kernel_args *args) { // int bats[8]; // int i; @@ -76,27 +79,24 @@ arch_vm_init2(kernel_args *ka) bats[0] = bats[1] = 0; setdbats(bats); #endif - return 0; + return B_OK; } -int -arch_vm_init_existing_maps(kernel_args *ka) +status_t +arch_vm_init_post_area(kernel_args *args) { - void *temp = (void *)ka->fb.mapping.start; - - // create a region for the framebuffer - vm_create_anonymous_region(vm_get_kernel_aspace_id(), "framebuffer", &temp, B_EXACT_ADDRESS, - ka->fb.mapping.size, B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); - - return B_NO_ERROR; + return B_OK; } -int -arch_vm_init_endvm(kernel_args *ka) +status_t +arch_vm_init_end(kernel_args *args) { - return B_NO_ERROR; + // throw away anything in the kernel_args.pgtable[] that's not yet mapped + //vm_free_unused_boot_loader_range(KERNEL_BASE, 0x400000 * args->arch_args.num_pgtables); + + return B_OK; } diff --git a/src/kernel/core/arch/ppc/arch_vm_translation_map.cpp b/src/kernel/core/arch/ppc/arch_vm_translation_map.cpp index c76a4d5bbb..5c07b9dcb0 100644 --- a/src/kernel/core/arch/ppc/arch_vm_translation_map.cpp +++ b/src/kernel/core/arch/ppc/arch_vm_translation_map.cpp @@ -1,7 +1,10 @@ /* -** Copyright 2001, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + * + * Copyright 2001, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #include @@ -35,11 +38,31 @@ spinlock asid_bitmap_lock; (((map)->arch_data->asid_base << ASID_SHIFT) + ((vaddr) / 0x10000000)) // vm_translation object stuff -typedef struct vm_translation_map_arch_info_struct { +typedef struct vm_translation_map_arch_info { int asid_base; // shift left by ASID_SHIFT to get the base asid to use } vm_translation_map_arch_info; +void +ppc_translation_map_change_asid(vm_translation_map *map) +{ +// this code depends on the kernel being at 0x80000000, fix if we change that +#if KERNEL_BASE != 0x80000000 +#error fix me +#endif + int asid_base = map->arch_data->asid_base; + + asm("mtsr 0,%0" : : "g"(asid_base)); + asm("mtsr 1,%0" : : "g"(asid_base + 1)); + asm("mtsr 2,%0" : : "g"(asid_base + 2)); + asm("mtsr 3,%0" : : "g"(asid_base + 3)); + asm("mtsr 4,%0" : : "g"(asid_base + 4)); + asm("mtsr 5,%0" : : "g"(asid_base + 5)); + asm("mtsr 6,%0" : : "g"(asid_base + 6)); + asm("mtsr 7,%0" : : "g"(asid_base + 7)); +} + + static status_t lock_tmap(vm_translation_map *map) { @@ -331,25 +354,40 @@ static vm_translation_map_ops tmap_ops = { }; -int -vm_translation_map_create(vm_translation_map *new_map, bool kernel) +// #pragma mark - +// VM API + + +status_t +arch_vm_translation_map_init_map(vm_translation_map *map, bool kernel) { // initialize the new object - new_map->ops = &tmap_ops; - new_map->map_count = 0; - if (recursive_lock_init(&new_map->lock, "map lock") < B_OK) - return B_NO_MEMORY; + map->ops = &tmap_ops; + map->map_count = 0; - new_map->arch_data = (vm_translation_map_arch_info *)malloc(sizeof(vm_translation_map_arch_info)); - if (new_map->arch_data == NULL) + if (!kernel) { + // During the boot process, there are no semaphores available at this + // point, so we only try to create the translation map lock if we're + // initialize a user translation map. + // vm_translation_map_init_kernel_map_post_sem() is used to complete + // the kernel translation map. + if (recursive_lock_init(&map->lock, "translation map") < B_OK) + return map->lock.sem; + } + + map->arch_data = (vm_translation_map_arch_info *)malloc(sizeof(vm_translation_map_arch_info)); + if (map->arch_data == NULL) { + if (!kernel) + recursive_lock_destroy(&map->lock); return B_NO_MEMORY; + } cpu_status state = disable_interrupts(); acquire_spinlock(&asid_bitmap_lock); // allocate a ASID base for this one if (kernel) { - new_map->arch_data->asid_base = 0; // set up by the bootloader + map->arch_data->asid_base = 0; // set up by the bootloader asid_bitmap[0] |= 0x1; } else { int i = 0; @@ -368,18 +406,28 @@ vm_translation_map_create(vm_translation_map *new_map, bool kernel) } if (i >= MAX_ASIDS) panic("vm_translation_map_create: out of ASIDs\n"); - new_map->arch_data->asid_base = i; + map->arch_data->asid_base = i; } release_spinlock(&asid_bitmap_lock); restore_interrupts(state); - return 0; + return B_OK; } -int -vm_translation_map_module_init(kernel_args *args) +status_t +arch_vm_translation_map_init_kernel_map_post_sem(vm_translation_map *map) +{ + if (recursive_lock_init(&map->lock, "translation map") < B_OK) + return map->lock.sem; + + return B_OK; +} + + +status_t +arch_vm_translation_map_init(kernel_args *args) { sPageTable = (page_table_entry_group *)args->arch_args.page_table.start; sPageTableSize = args->arch_args.page_table.size; @@ -389,14 +437,15 @@ vm_translation_map_module_init(kernel_args *args) } -void -vm_translation_map_module_init_post_sem(kernel_args *ka) +status_t +arch_vm_translation_map_init_post_sem(kernel_args *args) { + return B_OK; } -int -vm_translation_map_module_init2(kernel_args *ka) +status_t +arch_vm_translation_map_init_post_area(kernel_args *args) { // create a region to cover the page table sPageTableRegion = vm_create_anonymous_region(vm_get_kernel_aspace_id(), @@ -457,7 +506,7 @@ vm_translation_map_module_init2(kernel_args *ka) */ status_t -vm_translation_map_quick_map(kernel_args *ka, addr_t virtualAddress, addr_t physicalAddress, +arch_vm_translation_map_early_map(kernel_args *ka, addr_t virtualAddress, addr_t physicalAddress, uint8 attributes, addr_t (*get_free_page)(kernel_args *)) { uint32 virtualSegmentID = get_sr((void *)virtualAddress) & 0xffffff; @@ -491,31 +540,11 @@ vm_translation_map_quick_map(kernel_args *ka, addr_t virtualAddress, addr_t phys // XXX currently assumes this translation map is active -int -vm_translation_map_quick_query(addr_t va, addr_t *out_physical) +status_t +arch_vm_translation_map_early_query(addr_t va, addr_t *out_physical) { //PANIC_UNIMPLEMENTED(); panic("vm_translation_map_quick_query(): not yet implemented\n"); - return 0; -} - - -void -ppc_translation_map_change_asid(vm_translation_map *map) -{ -// this code depends on the kernel being at 0x80000000, fix if we change that -#if KERNEL_BASE != 0x80000000 -#error fix me -#endif - int asid_base = map->arch_data->asid_base; - - asm("mtsr 0,%0" :: "g"(asid_base)); - asm("mtsr 1,%0" :: "g"(asid_base+1)); - asm("mtsr 2,%0" :: "g"(asid_base+2)); - asm("mtsr 3,%0" :: "g"(asid_base+3)); - asm("mtsr 4,%0" :: "g"(asid_base+4)); - asm("mtsr 5,%0" :: "g"(asid_base+5)); - asm("mtsr 6,%0" :: "g"(asid_base+6)); - asm("mtsr 7,%0" :: "g"(asid_base+7)); + return B_OK; }