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