- missing ppc stub

- kernel_m68K almost links now, jsut bails out on the linker script...


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26096 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol 2008-06-23 03:28:18 +00:00
parent 38ff098d80
commit 1fd024be6a
12 changed files with 134 additions and 27 deletions

View File

@ -15,6 +15,9 @@
#define SR_IP_MASK 0x0700 #define SR_IP_MASK 0x0700
#define SR_S 0x2000 #define SR_S 0x2000
#define M68K_SR_T_MASK 0xC000
#define M68K_SR_T0 14
#define M68K_SR_T1 15
#ifndef _ASSEMBLER #ifndef _ASSEMBLER

View File

@ -25,6 +25,7 @@ struct m68k_vm_ops {
status_t (*arch_vm_translation_map_early_map)(kernel_args *ka, addr_t virtualAddress, addr_t physicalAddress, status_t (*arch_vm_translation_map_early_map)(kernel_args *ka, addr_t virtualAddress, addr_t physicalAddress,
uint8 attributes, addr_t (*get_free_page)(kernel_args *)); uint8 attributes, addr_t (*get_free_page)(kernel_args *));
status_t (*arch_vm_translation_map_early_query)(addr_t va, addr_t *out_physical); status_t (*arch_vm_translation_map_early_query)(addr_t va, addr_t *out_physical);
void (*m68k_set_pgdir)(void *);
#if 0 /* ppc stuff only ? */ #if 0 /* ppc stuff only ? */
status_t (*m68k_map_address_range)(addr_t virtualAddress, addr_t physicalAddress, status_t (*m68k_map_address_range)(addr_t virtualAddress, addr_t physicalAddress,
size_t size); size_t size);
@ -33,5 +34,17 @@ struct m68k_vm_ops {
#endif #endif
}; };
#ifdef __cplusplus
extern "C" {
#endif
extern struct m68k_vm_ops *get_vm_ops();
extern void *m68k_translation_map_get_pgdir(vm_translation_map *map);
extern void m68k_set_pgdir(void *rt);
#ifdef __cplusplus
}
#endif
#endif /* ARCH_M68K_VM_H */ #endif /* ARCH_M68K_VM_H */

View File

@ -10,12 +10,28 @@
#include <arch_030_mmu.h> #include <arch_030_mmu.h>
#define ARCH_M68K_MMU_TYPE MMU_68030 #define ARCH_M68K_MMU_TYPE 68030
#include "arch_vm_translation_map_impl.cpp" #include "arch_vm_translation_map_impl.cpp"
static void
set_pgdir(void *rt)
{
long_page_directory_entry entry;
*(uint64 *)&entry = DFL_PAGEENT_VAL;
entry.type = DT_ROOT;
entry.addr = TA_TO_PREA(((addr_t)rt));
asm volatile( \
"pmove (%0),%%srp\n" \
"pmove (%0),%%crp\n" \
: : "a"((uint64 *)&entry));
}
struct m68k_vm_ops m68030_vm_ops = { struct m68k_vm_ops m68030_vm_ops = {
m68k_translation_map_get_pgdir, _m68k_translation_map_get_pgdir,
m68k_vm_translation_map_init_map, m68k_vm_translation_map_init_map,
m68k_vm_translation_map_init_kernel_map_post_sem, m68k_vm_translation_map_init_kernel_map_post_sem,
m68k_vm_translation_map_init, m68k_vm_translation_map_init,
@ -23,6 +39,7 @@ struct m68k_vm_ops m68030_vm_ops = {
m68k_vm_translation_map_init_post_sem, m68k_vm_translation_map_init_post_sem,
m68k_vm_translation_map_early_map, m68k_vm_translation_map_early_map,
/*m68k_vm_translation_map_*/early_query, /*m68k_vm_translation_map_*/early_query,
set_pgdir,
#if 0 #if 0
m68k_map_address_range, m68k_map_address_range,
m68k_unmap_address_range, m68k_unmap_address_range,

View File

@ -19,6 +19,9 @@
* Slow, using spinlocks... * Slow, using spinlocks...
*/ */
#warning M68K: detect 060 here
#if 0
static spinlock atomic_lock = 0; static spinlock atomic_lock = 0;
int64 int64
@ -241,3 +244,4 @@ access_violation:
// XXX kill application // XXX kill application
return -1; return -1;
} }
#endif

View File

@ -14,18 +14,12 @@
#include <smp.h> #include <smp.h>
// user syscall assembly stubs
extern "C" void _user_syscall_int(void);
extern unsigned int _user_syscall_int_end;
extern "C" void _user_syscall_sysenter(void);
extern unsigned int _user_syscall_sysenter_end;
status_t status_t
arch_commpage_init(void) arch_commpage_init(void)
{ {
panic("WRITEME"); /* no optimized memcpy or anything yet */
return B_NO_INIT; /* we don't use it for syscall yet either */
return B_OK; return B_OK;
} }

View File

@ -42,6 +42,16 @@ arch_cpu_preboot_init_percpu(kernel_args *args, int curr_cpu)
} }
status_t
arch_cpu_init_percpu(kernel_args *args, int curr_cpu)
{
//detect_cpu(curr_cpu);
// we only support one anyway...
return 0;
}
status_t status_t
arch_cpu_init(kernel_args *args) arch_cpu_init(kernel_args *args)
{ {

View File

@ -18,7 +18,9 @@
#include <boot/stage2.h> #include <boot/stage2.h>
#include <kernel.h> #include <kernel.h>
#include <thread.h> #include <thread.h>
#include <vm_address_space.h>
#include <vm_types.h> #include <vm_types.h>
#include <arch_vm.h>
//#include <arch/vm_translation_map.h> //#include <arch/vm_translation_map.h>
#include <string.h> #include <string.h>
@ -90,6 +92,28 @@ m68k_get_user_iframe(void)
} }
void *
m68k_next_page_directory(struct thread *from, struct thread *to)
{
if (from->team->address_space != NULL && to->team->address_space != NULL) {
// they are both user space threads
if (from->team == to->team) {
// dont change the pgdir, same address space
return NULL;
}
// switching to a new address space
return m68k_translation_map_get_pgdir(&to->team->address_space->translation_map);
} else if (from->team->address_space == NULL && to->team->address_space == NULL) {
// they must both be kernel space threads
return NULL;
} else if (to->team->address_space == NULL) {
// the one we're switching to is kernel space
return m68k_translation_map_get_pgdir(&vm_kernel_address_space()->translation_map);
}
return m68k_translation_map_get_pgdir(&to->team->address_space->translation_map);
}
// #pragma mark - // #pragma mark -
@ -181,24 +205,17 @@ arch_thread_switch_kstack_and_call(struct thread *t, addr_t newKstack,
void void
arch_thread_context_switch(struct thread *t_from, struct thread *t_to) arch_thread_context_switch(struct thread *from, struct thread *to)
{ {
#warning M68K: WRITEME addr_t newPageDirectory;
// set the new kernel stack in the EAR register.
// this is used in the exception handler code to decide what kernel stack to
// switch to if the exception had happened when the processor was in user mode
//asm("mtear %0" :: "g"(t_to->kernel_stack_base + KERNEL_STACK_SIZE - 8));
// switch the asids if we need to newPageDirectory = (addr_t)m68k_next_page_directory(from, to);
if (t_to->team->address_space != NULL) {
// the target thread has is user space
if (t_from->team != t_to->team) {
// switching to a new address space
m68k_translation_map_change_asid(&t_to->team->address_space->translation_map);
}
}
m68k_context_switch(&t_from->arch_info.sp, t_to->arch_info.sp); if ((newPageDirectory % B_PAGE_SIZE) != 0)
panic("arch_thread_context_switch: bad pgdir 0x%lx\n", newPageDirectory);
#warning M68K: export from arch_vm.c
m68k_set_pgdir(newPageDirectory);
m68k_context_switch(&from->arch_info.sp, to->arch_info.sp);
} }

View File

@ -13,6 +13,7 @@
#include <arch/user_debugger.h> #include <arch/user_debugger.h>
#warning M68K: WRITEME
void void
arch_clear_team_debug_info(struct arch_team_debug_info *info) arch_clear_team_debug_info(struct arch_team_debug_info *info)
{ {
@ -39,6 +40,28 @@ arch_destroy_thread_debug_info(struct arch_thread_debug_info *info)
} }
void
arch_update_thread_single_step()
{
if (struct iframe* frame = m68k_get_user_iframe()) {
struct thread* thread = thread_get_current_thread();
// set/clear T1 in SR depending on if single stepping is desired
// T1 T0
// 0 0 no tracing
// 0 1 trace on flow
// 1 0 single step
// 1 1 undef
if (thread->debug_info.flags & B_THREAD_DEBUG_SINGLE_STEP) {
frame->cpu.sr &= ~(M68K_SR_T_MASK);
frame->cpu.sr |= (1 << M68K_SR_T1);
} else {
frame->cpu.sr &= ~(M68K_SR_T_MASK);
}
}
}
void void
arch_set_debug_cpu_state(const struct debug_cpu_state *cpuState) arch_set_debug_cpu_state(const struct debug_cpu_state *cpuState)
{ {
@ -78,3 +101,8 @@ arch_clear_watchpoint(void *address)
return B_ERROR; return B_ERROR;
} }
bool
arch_has_breakpoints(struct arch_team_debug_info *info)
{
return false;
}

View File

@ -15,6 +15,7 @@
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <vm.h> #include <vm.h>
#include <vm_types.h>
#include <arch/vm.h> #include <arch/vm.h>
#include <arch_mmu.h> #include <arch_mmu.h>
@ -103,6 +104,8 @@ arch_vm_init_post_modules(kernel_args *args)
void void
arch_vm_aspace_swap(vm_address_space *aspace) arch_vm_aspace_swap(vm_address_space *aspace)
{ {
m68k_set_pgdir(m68k_translation_map_get_pgdir(
&aspace->translation_map));
} }

View File

@ -33,7 +33,8 @@ extern struct m68k_vm_ops m68030_vm_ops;
//extern struct m68k_vm_ops m68030_vm_ops; //extern struct m68k_vm_ops m68030_vm_ops;
//extern struct m68k_vm_ops m68030_vm_ops; //extern struct m68k_vm_ops m68030_vm_ops;
static m68k_vm_ops *get_vm_ops() #warning M68K: use a static!
m68k_vm_ops *get_vm_ops()
{ {
int mmu = arch_mmu_type; int mmu = arch_mmu_type;
@ -126,6 +127,11 @@ arch_vm_translation_map_early_query(addr_t va, addr_t *out_physical)
// #pragma mark - // #pragma mark -
void
m68k_set_pgdir(void *rt)
{
return get_vm_ops()->m68k_set_pgdir(rt);
}
#if 0 #if 0
status_t status_t

View File

@ -132,8 +132,9 @@ static status_t put_physical_page_tmap(addr_t va);
static void flush_tmap(vm_translation_map *map); static void flush_tmap(vm_translation_map *map);
#warning M68K: RENAME
static void * static void *
m68k_translation_map_get_pgdir(vm_translation_map *map) _m68k_translation_map_get_pgdir(vm_translation_map *map)
{ {
return map->arch_data->rtdir_phys; return map->arch_data->rtdir_phys;
} }

View File

@ -36,6 +36,12 @@ arch_destroy_thread_debug_info(struct arch_thread_debug_info *info)
} }
void
arch_update_thread_single_step()
{
}
void void
arch_set_debug_cpu_state(const struct debug_cpu_state *cpuState) arch_set_debug_cpu_state(const struct debug_cpu_state *cpuState)
{ {
@ -75,3 +81,8 @@ arch_clear_watchpoint(void *address)
return B_ERROR; return B_ERROR;
} }
bool
arch_has_breakpoints(struct arch_team_debug_info *info)
{
return false;
}