/*
* Copyright 2003, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#include <arch/m68k/arch_cpu.h>
#include <asm_defs.h>
.text
// ToDo: fixme -- platform dependant ?
FUNCTION(reboot):
reset
rts
FUNCTION_END(reboot)
/* void arch_int_enable_interrupts(void) */
FUNCTION(arch_int_enable_interrupts):
andi #0xf8ff,%sr
rts
FUNCTION_END(arch_int_enable_interrupts)
/* int arch_int_disable_interrupts(void)
*/
FUNCTION(arch_int_disable_interrupts):
clr.l %d0
move %sr,%d0
move.l %d0,%d1
ori.w #0x0700,%d1
move %d1,%sr
// return value: previous IPM
lsr.l #8,%d0
andi.l #7,%d0
rts
FUNCTION_END(arch_int_disable_interrupts)
/* void arch_int_restore_interrupts(int oldState)
*/
FUNCTION(arch_int_restore_interrupts):
move.l (4,%a7),%d0
// make sure we only have IPM bits
andi.w #7,%d0
lsl.w #8,%d0
move %sr,%d1
andi.w #0xf8ff,%d1
or.w %d0,%d1
move %d1,%sr
rts
FUNCTION_END(arch_int_restore_interrupts)
/* bool arch_int_are_interrupts_enabled(void) */
FUNCTION(arch_int_are_interrupts_enabled):
clr.l %d0
move %sr,%d1
andi.w #0x0700,%d1
bne arch_int_are_interrupts_enabled_no
moveq.l #1,%d0
arch_int_are_interrupts_enabled_no:
rts
FUNCTION_END(arch_int_are_interrupts_enabled)
// ToDo: fixme
FUNCTION(dbg_save_registers):
#warning M68K: implement dbx_save_registers!
rts
FUNCTION_END(dbg_save_registers)
/* long long get_time_base(void) */
FUNCTION(get_time_base):
#warning M68K: implement get_time_base!
clr.l %d0
clr.l %d1
//passed through a0 or d0:d1 ?
rts
FUNCTION_END(get_time_base)
#warning M68K: FIX m68k_context_switch
// XXX:sync with arch_thread.c:arch_thread_init_kthread_stack
// void m68k_context_switch(addr_t *old_sp, addr_t new_sp)
FUNCTION(m68k_context_switch):
// save fp ?
//move.w %sr,-(%sp)
movem.l %d0-%d7/%a0-%a7,-(%sp)
fmovem %fp0-%fp7,-(%sp)
fsave -(%sp)
#warning M68K: use fixed size for fsave
// XXX
frestore (%sp)+
fmovem (%sp)+,%fp0-%fp7
movem.l (%sp)+,%d0-%d7/%a0-%a7
//move.w (%sp)+,%sr
rts
FUNCTION_END(m68k_context_switch)
// m68k_kernel_thread_root(): parameters in r13-r15, the functions to call
// (in that order). The function is used when spawing threads. It usually calls
// an initialization function, the actual thread function, and a function that
// destroys the thread.
FUNCTION(m68k_kernel_thread_root):
#warning M68K: check
move.l 4(%sp),%a0
jsr (%a0)
move.l 8(%sp),%a0
jsr (%a0)
move.l 12(%sp),%a0
jsr (%a0)
// We should never get here. If we do, it's time to enter the kernel
// debugger (without a message at the moment).
clr.l -(%sp)
jmp kernel_debugger
FUNCTION_END(m68k_kernel_thread_root)