153855Simp/* 253855Simp * Copyright 2009 Jonas Sundstr��m, jonas@kirilla.com 353855Simp * Copyright 2007 Fran��ois Revol, revol@free.fr 453855Simp * Distributed under the terms of the MIT License. 553855Simp * 653855Simp * Copyright 2001, Travis Geiselbrecht. All rights reserved. 753855Simp * Distributed under the terms of the NewOS License. 853855Simp */ 953855Simp 1053855Simp 1153855Simp#include <KernelExport.h> 1253855Simp 1353855Simp#include <arch_thread.h> 1453855Simp#include <arch/cpu.h> 1553855Simp#include <boot/kernel_args.h> 1653855Simp#include <commpage.h> 1753855Simp#include <elf.h> 1853855Simp 1953855Simp 2053855Simpint arch_cpu_type; 2153855Simpint arch_fpu_type; 2253855Simpint arch_mmu_type; 2353855Simpint arch_platform; 2453855Simp 2553855Simpstatus_t 2653855Simparch_cpu_preboot_init_percpu(kernel_args* args, int curr_cpu) 2753855Simp{ 2853855Simp#warning IMPLEMENT arch_cpu_preboot_init_percpu 2959272Simp 30129798Simp // The current thread must be NULL for all CPUs till we have threads. 3197613Stakawata // Some boot code relies on this. 3259272Simp arch_thread_set_current_thread(NULL); 3353855Simp 3453855Simp return B_ERROR; 3574636Simp} 3674636Simp 3774636Simp 3853855Simpstatus_t 3953855Simparch_cpu_init_percpu(kernel_args* args, int curr_cpu) 4053855Simp{ 4153855Simp#warning IMPLEMENT arch_cpu_init_percpu 4253855Simp //detect_cpu(curr_cpu); 4353855Simp 4453855Simp // we only support one anyway... 4553855Simp return 0; 4653855Simp} 4759193Simp 4853855Simp 4953855Simpstatus_t 5059193Simparch_cpu_init(kernel_args* args) 5158581Simp{ 5259193Simp#warning IMPLEMENT arch_cpu_init 5353855Simp arch_cpu_type = args->arch_args.cpu_type; 5453855Simp arch_fpu_type = args->arch_args.fpu_type; 5559193Simp arch_mmu_type = args->arch_args.mmu_type; 5653855Simp arch_platform = args->arch_args.platform; 5753855Simp arch_platform = args->arch_args.machine; 5859193Simp 5953855Simp return B_ERROR; 6059193Simp} 6153855Simp 6259193Simp 6361779Simpstatus_t 6461779Simparch_cpu_init_post_vm(kernel_args* args) 6561779Simp{ 6661779Simp#warning IMPLEMENT arch_cpu_init_post_vm 6759193Simp return B_ERROR; 6859193Simp} 6959193Simp 7082376Sjon 7182376Sjonstatus_t 7282376Sjonarch_cpu_init_post_modules(kernel_args* args) 7359193Simp{ 7459193Simp#warning IMPLEMENT arch_cpu_init_post_modules 7564544Simp return B_ERROR; 7664544Simp} 7764544Simp 7882376Sjon 7982376Sjonvoid 8064544Simparch_cpu_sync_icache(void* address, size_t len) 8164544Simp{ 8261779Simp#warning IMPLEMENT arch_cpu_sync_icache 8361779Simp} 8461779Simp 8559193Simp 8659193Simpvoid 8759193Simparch_cpu_memory_read_barrier(void) 8859193Simp{ 8961779Simp#warning IMPLEMENT arch_cpu_memory_read_barrier 9061779Simp asm volatile ("nop;" : : : "memory"); 9161779Simp} 9259193Simp 9359193Simp 9459193Simpvoid 9559193Simparch_cpu_memory_write_barrier(void) 9661779Simp{ 9761779Simp#warning IMPLEMENT arch_cpu_memory_write_barrier 9861779Simp asm volatile ("nop;" : : : "memory"); 9961779Simp} 10061779Simp 10161779Simp 10261779Simpvoid 10361779Simparch_cpu_invalidate_TLB_range(addr_t start, addr_t end) 10461779Simp{ 10561779Simp#warning IMPLEMENT arch_cpu_invalidate_TLB_range 10661779Simp} 10761779Simp 10861779Simp 10961779Simpvoid 11061779Simparch_cpu_invalidate_TLB_list(addr_t pages[], int num_pages) 11161779Simp{ 11261779Simp#warning IMPLEMENT arch_cpu_invalidate_TLB_list 11361779Simp} 11461779Simp 11561779Simp 11661779Simpvoid 11761779Simparch_cpu_global_TLB_invalidate(void) 11861779Simp{ 11966058Simp#warning IMPLEMENT arch_cpu_global_TLB_invalidate 12066058Simp} 12166058Simp 12266058Simp 12366058Simpvoid 12466058Simparch_cpu_user_TLB_invalidate(void) 12566058Simp{ 12666058Simp#warning IMPLEMENT arch_cpu_user_TLB_invalidate 12766058Simp} 12866058Simp 12966058Simp 13066058Simpstatus_t 13166058Simparch_cpu_user_memcpy(void* to, const void* from, size_t size, 13266058Simp addr_t* faultHandler) 13366058Simp{ 13466058Simp#warning IMPLEMENT arch_cpu_user_memcpy 13566058Simp return B_BAD_ADDRESS; 13666058Simp} 13766058Simp 13866058Simp 13966058Simpssize_t 14066058Simparch_cpu_user_strlcpy(char* to, const char* from, size_t size, 14166058Simp addr_t* faultHandler) 14266058Simp{ 14374636Simp#warning IMPLEMENT arch_cpu_user_strlcpy 14474636Simp return B_BAD_ADDRESS; 14574636Simp} 14674636Simp 14766058Simp 14866058Simpstatus_t 14966058Simparch_cpu_user_memset(void* s, char c, size_t count, addr_t* faultHandler) 15066058Simp{ 15166058Simp#warning IMPLEMENT arch_cpu_user_memset 15266058Simp return B_BAD_ADDRESS; 15366058Simp} 15466058Simp 15574636Simp 15674636Simpstatus_t 15774636Simparch_cpu_shutdown(bool reboot) 15874636Simp{ 15974636Simp#warning IMPLEMENT arch_cpu_shutdown 16074636Simp return B_ERROR; 16174636Simp} 16274636Simp 16374636Simp 16474636Simpvoid 16574636Simparch_cpu_idle(void) 16674636Simp{ 16774636Simp#warning IMPLEMENT arch_cpu_idle 16874636Simp} 16974636Simp 170100218Simp// The purpose of this function is to trick the compiler. When setting the 17174636Simp// page_handler to a label that is obviously (to the compiler) never used, 17274636Simp// it may reorganize the control flow, so that the labeled part is optimized 17374636Simp// away. 17474636Simp// By invoking the function like this 17574636Simp// 17674636Simp// if (mipsel_set_fault_handler(faultHandler, (addr_t)&&error)) 177100218Simp// goto error; 178100218Simp// 179100218Simp// the compiler has to keep the labeled code, since it can't guess the return 18097613Stakawata// value of this (non-inlinable) function. At least in my tests it worked that 18197613Stakawata// way, and I hope it will continue to work like this in the future. 18297613Stakawata// 18397613Stakawatabool 18497613Stakawatamipsel_set_fault_handler(addr_t *handlerLocation, addr_t handler) 18597613Stakawata{ 18697613Stakawata// TODO: This doesn't work correctly with gcc 4 anymore! 187100218Simp *handlerLocation = handler; 18866058Simp return false; 18966058Simp} 19066058Simp 19166058Simp