#include <linux/sys.h>
#include <linux/linkage.h>
#include <asm/entry.h>
#include <asm/current.h>
#include <asm/processor.h>
#include <asm/exceptions.h>
#include <asm/asm-offsets.h>
#include <asm/thread_info.h>
#include <asm/page.h>
#include <asm/unistd.h>
#include <asm/xilinx_mb_manager.h>
#include <linux/errno.h>
#include <asm/signal.h>
#include <asm/mmu.h>
#undef DEBUG
#ifdef DEBUG
.section .data
.global syscall_debug_table
.align 4
syscall_debug_table:
.space (__NR_syscalls * 4)
#endif
#define C_ENTRY(name) .globl name; .align 4; name
#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
.macro clear_bip
msrclr r0, MSR_BIP
.endm
.macro set_bip
msrset r0, MSR_BIP
.endm
.macro clear_eip
msrclr r0, MSR_EIP
.endm
.macro set_ee
msrset r0, MSR_EE
.endm
.macro disable_irq
msrclr r0, MSR_IE
.endm
.macro enable_irq
msrset r0, MSR_IE
.endm
.macro set_ums
msrset r0, MSR_UMS
msrclr r0, MSR_VMS
.endm
.macro set_vms
msrclr r0, MSR_UMS
msrset r0, MSR_VMS
.endm
.macro clear_ums
msrclr r0, MSR_UMS
.endm
.macro clear_vms_ums
msrclr r0, MSR_VMS | MSR_UMS
.endm
#else
.macro clear_bip
mfs r11, rmsr
andi r11, r11, ~MSR_BIP
mts rmsr, r11
.endm
.macro set_bip
mfs r11, rmsr
ori r11, r11, MSR_BIP
mts rmsr, r11
.endm
.macro clear_eip
mfs r11, rmsr
andi r11, r11, ~MSR_EIP
mts rmsr, r11
.endm
.macro set_ee
mfs r11, rmsr
ori r11, r11, MSR_EE
mts rmsr, r11
.endm
.macro disable_irq
mfs r11, rmsr
andi r11, r11, ~MSR_IE
mts rmsr, r11
.endm
.macro enable_irq
mfs r11, rmsr
ori r11, r11, MSR_IE
mts rmsr, r11
.endm
.macro set_ums
mfs r11, rmsr
ori r11, r11, MSR_VMS
andni r11, r11, MSR_UMS
mts rmsr, r11
.endm
.macro set_vms
mfs r11, rmsr
ori r11, r11, MSR_VMS
andni r11, r11, MSR_UMS
mts rmsr, r11
.endm
.macro clear_ums
mfs r11, rmsr
andni r11, r11, MSR_UMS
mts rmsr,r11
.endm
.macro clear_vms_ums
mfs r11, rmsr
andni r11, r11, (MSR_VMS|MSR_UMS)
mts rmsr,r11
.endm
#endif
#define VM_ON \
set_ums; \
rted r0, 2f; \
nop; \
2:
#define VM_OFF \
clear_vms_ums; \
rted r0, TOPHYS(1f); \
nop; \
1:
#define SAVE_REGS \
swi r2, r1, PT_R2; \
swi r3, r1, PT_R3; \
swi r4, r1, PT_R4; \
swi r5, r1, PT_R5; \
swi r6, r1, PT_R6; \
swi r7, r1, PT_R7; \
swi r8, r1, PT_R8; \
swi r9, r1, PT_R9; \
swi r10, r1, PT_R10; \
swi r11, r1, PT_R11; \
swi r12, r1, PT_R12; \
swi r13, r1, PT_R13; \
swi r14, r1, PT_PC; \
swi r15, r1, PT_R15; \
swi r16, r1, PT_R16; \
swi r17, r1, PT_R17; \
swi r18, r1, PT_R18; \
swi r19, r1, PT_R19; \
swi r20, r1, PT_R20; \
swi r21, r1, PT_R21; \
swi r22, r1, PT_R22; \
swi r23, r1, PT_R23; \
swi r24, r1, PT_R24; \
swi r25, r1, PT_R25; \
swi r26, r1, PT_R26; \
swi r27, r1, PT_R27; \
swi r28, r1, PT_R28; \
swi r29, r1, PT_R29; \
swi r30, r1, PT_R30; \
swi r31, r1, PT_R31; \
mfs r11, rmsr; \
swi r11, r1, PT_MSR;
#define RESTORE_REGS_GP \
lwi r2, r1, PT_R2; \
lwi r3, r1, PT_R3; \
lwi r4, r1, PT_R4; \
lwi r5, r1, PT_R5; \
lwi r6, r1, PT_R6; \
lwi r7, r1, PT_R7; \
lwi r8, r1, PT_R8; \
lwi r9, r1, PT_R9; \
lwi r10, r1, PT_R10; \
lwi r11, r1, PT_R11; \
lwi r12, r1, PT_R12; \
lwi r13, r1, PT_R13; \
lwi r14, r1, PT_PC; \
lwi r15, r1, PT_R15; \
lwi r16, r1, PT_R16; \
lwi r17, r1, PT_R17; \
lwi r18, r1, PT_R18; \
lwi r19, r1, PT_R19; \
lwi r20, r1, PT_R20; \
lwi r21, r1, PT_R21; \
lwi r22, r1, PT_R22; \
lwi r23, r1, PT_R23; \
lwi r24, r1, PT_R24; \
lwi r25, r1, PT_R25; \
lwi r26, r1, PT_R26; \
lwi r27, r1, PT_R27; \
lwi r28, r1, PT_R28; \
lwi r29, r1, PT_R29; \
lwi r30, r1, PT_R30; \
lwi r31, r1, PT_R31;
#define RESTORE_REGS \
lwi r11, r1, PT_MSR; \
mts rmsr , r11; \
RESTORE_REGS_GP
#define RESTORE_REGS_RTBD \
lwi r11, r1, PT_MSR; \
andni r11, r11, MSR_EIP; \
ori r11, r11, MSR_EE | MSR_BIP; \
mts rmsr , r11; \
RESTORE_REGS_GP
#define SAVE_STATE \
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); \
\
mfs r1, rmsr; \
andi r1, r1, MSR_UMS; \
bnei r1, 1f; \
\
\
lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); \
\
\
\
addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; \
SAVE_REGS \
brid 2f; \
swi r1, r1, PT_MODE; \
1: \
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); \
tophys(r1,r1); \
lwi r1, r1, TS_THREAD_INFO; \
\
\
\
\
addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; \
SAVE_REGS \
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); \
swi r11, r1, PT_R1; \
swi r0, r1, PT_MODE; \
\
clear_ums; \
2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
.text
.extern cpuinfo
C_ENTRY(mb_flush_dcache):
addik r1, r1, -PT_SIZE
SAVE_REGS
addik r3, r0, cpuinfo
lwi r7, r3, CI_DCS
lwi r8, r3, CI_DCL
sub r9, r7, r8
1:
wdc.flush r9, r0
bgtid r9, 1b
addk r9, r9, r8
RESTORE_REGS
addik r1, r1, PT_SIZE
rtsd r15, 8
nop
C_ENTRY(mb_invalidate_icache):
addik r1, r1, -PT_SIZE
SAVE_REGS
addik r3, r0, cpuinfo
lwi r7, r3, CI_ICS
lwi r8, r3, CI_ICL
sub r9, r7, r8
1:
wic r9, r0
bgtid r9, 1b
addk r9, r9, r8
RESTORE_REGS
addik r1, r1, PT_SIZE
rtsd r15, 8
nop
C_ENTRY(_user_exception):
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
addi r14, r14, 4
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tophys(r1,r1);
lwi r1, r1, TS_THREAD_INFO;
addik r1, r1, THREAD_SIZE;
tophys(r1,r1);
addik r1, r1, -PT_SIZE;
SAVE_REGS
swi r0, r1, PT_R3
swi r0, r1, PT_R4
swi r0, r1, PT_MODE;
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
swi r11, r1, PT_R1;
clear_ums;
2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
swi r12, r1, PT_R0;
tovirt(r1,r1)
rtbd r0, 3f
nop
3:
lwi r11, CURRENT_TASK, TS_THREAD_INFO
lwi r11, r11, TI_FLAGS
andi r11, r11, _TIF_WORK_SYSCALL_MASK
beqi r11, 4f
addik r3, r0, -ENOSYS
swi r3, r1, PT_R3
brlid r15, do_syscall_trace_enter
addik r5, r1, PT_R0
addk r12, r0, r3
lwi r5, r1, PT_R5;
lwi r6, r1, PT_R6;
lwi r7, r1, PT_R7;
lwi r8, r1, PT_R8;
lwi r9, r1, PT_R9;
lwi r10, r1, PT_R10;
4:
blti r12, 5f
addi r11, r12, -__NR_syscalls;
bgei r11, 5f;
add r12, r12, r12;
add r12, r12, r12;
addi r30, r0, 1
#ifdef DEBUG
lwi r3, r0, syscall_debug_table
addi r3, r3, 1
swi r3, r0, syscall_debug_table
lwi r3, r12, syscall_debug_table
addi r3, r3, 1
swi r3, r12, syscall_debug_table
#endif
lwi r12, r12, sys_call_table
addi r15, r0, ret_from_trap-8
bra r12
5:
braid ret_from_trap
addi r3, r0, -ENOSYS;
C_ENTRY(ret_from_trap):
swi r3, r1, PT_R3
swi r4, r1, PT_R4
lwi r11, r1, PT_MODE;
bnei r11, 2f;
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r11, r11, TI_FLAGS;
andi r11, r11, _TIF_WORK_SYSCALL_MASK
beqi r11, 1f
brlid r15, do_syscall_trace_leave
addik r5, r1, PT_R0
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r19, r11, TI_FLAGS;
andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f;
bralid r15, schedule;
nop;
bri 1b
5:
andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 4f;
addik r5, r1, 0;
bralid r15, do_notify_resume;
add r6, r30, r0;
add r30, r0, r0
bri 1b
4: set_bip;
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE);
VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD;
addik r1, r1, PT_SIZE
lwi r1, r1, PT_R1 - PT_SIZE;
bri 6f;
2: set_bip;
VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD;
addik r1, r1, PT_SIZE
tovirt(r1,r1);
6:
TRAP_return:
rtbd r14, 0;
nop;
C_ENTRY(ret_from_fork):
bralid r15, schedule_tail;
add r5, r3, r0;
brid ret_from_trap;
add r3, r0, r0;
C_ENTRY(ret_from_kernel_thread):
bralid r15, schedule_tail;
add r5, r3, r0;
brald r15, r20
addk r5, r0, r19
brid ret_from_trap
add r3, r0, r0
C_ENTRY(sys_rt_sigreturn_wrapper):
addik r30, r0, 0
brid sys_rt_sigreturn
addik r5, r1, 0;
C_ENTRY(full_exception_trap):
addik r17, r17, -4
SAVE_STATE
swi r17, r1, PT_PC;
tovirt(r1,r1)
addik r15, r0, ret_from_exc - 8
mfs r6, resr
mfs r7, rfsr;
mts rfsr, r0;
rted r0, full_exception
addik r5, r1, 0
C_ENTRY(unaligned_data_trap):
swi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
set_bip;
clear_eip;
set_ee;
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
SAVE_STATE
swi r17, r1, PT_PC;
tovirt(r1,r1)
addik r15, r0, ret_from_exc-8
mfs r3, resr
mfs r4, rear
rtbd r0, _unaligned_data_exception
addik r7, r1, 0
C_ENTRY(page_fault_data_trap):
SAVE_STATE
swi r17, r1, PT_PC;
tovirt(r1,r1)
addik r15, r0, ret_from_exc-8
mfs r6, rear
mfs r7, resr
rted r0, do_page_fault
addik r5, r1, 0
C_ENTRY(page_fault_instr_trap):
SAVE_STATE
swi r17, r1, PT_PC;
tovirt(r1,r1)
addik r15, r0, ret_from_exc-8
mfs r6, rear
ori r7, r0, 0
rted r0, do_page_fault
addik r5, r1, 0
C_ENTRY(ret_from_exc):
lwi r11, r1, PT_MODE;
bnei r11, 2f;
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r19, r11, TI_FLAGS;
andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f;
bralid r15, schedule;
nop;
bri 1b
5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 4f;
addik r5, r1, 0;
bralid r15, do_notify_resume;
addi r6, r0, 0;
bri 1b
4: set_bip;
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE);
VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD;
addik r1, r1, PT_SIZE
lwi r1, r1, PT_R1 - PT_SIZE;
bri 6f;
2: set_bip;
VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD;
addik r1, r1, PT_SIZE
tovirt(r1,r1);
6:
EXC_return:
rtbd r14, 0;
nop;
C_ENTRY(_interrupt):
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
mfs r1, rmsr
nop
andi r1, r1, MSR_UMS
bnei r1, 1f
lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
tophys(r1,r1);
addik r1, r1, -PT_SIZE;
SAVE_REGS
brid 2f;
swi r1, r1, PT_MODE;
1:
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tophys(r1,r1);
lwi r1, r1, TS_THREAD_INFO;
addik r1, r1, THREAD_SIZE;
tophys(r1,r1);
addik r1, r1, -PT_SIZE;
SAVE_REGS
swi r0, r1, PT_MODE;
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
swi r11, r1, PT_R1;
clear_ums;
2:
lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tovirt(r1,r1)
addik r15, r0, irq_call;
irq_call:rtbd r0, do_IRQ;
addik r5, r1, 0;
ret_from_irq:
lwi r11, r1, PT_MODE;
bnei r11, 2f;
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r19, r11, TI_FLAGS;
andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f
bralid r15, schedule;
nop;
bri 1b
5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqid r11, no_intr_resched
addik r5, r1, 0;
bralid r15, do_notify_resume;
addi r6, r0, 0;
bri 1b
no_intr_resched:
disable_irq
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE);
VM_OFF;
tophys(r1,r1);
RESTORE_REGS
addik r1, r1, PT_SIZE
lwi r1, r1, PT_R1 - PT_SIZE;
bri 6f;
2:
#ifdef CONFIG_PREEMPTION
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r5, r11, TI_PREEMPT_COUNT;
bgti r5, restore;
lwi r5, r11, TI_FLAGS;
andi r5, r5, _TIF_NEED_RESCHED;
beqi r5, restore
bralid r15, preempt_schedule_irq
nop
restore:
#endif
VM_OFF
tophys(r1,r1)
RESTORE_REGS
addik r1, r1, PT_SIZE
tovirt(r1,r1);
6:
IRQ_return:
rtid r14, 0
nop
#ifdef CONFIG_MB_MANAGER
#define PT_PID PT_SIZE
#define PT_TLBI PT_SIZE + 4
#define PT_ZPR PT_SIZE + 8
#define PT_TLBL0 PT_SIZE + 12
#define PT_TLBH0 PT_SIZE + 16
C_ENTRY(_xtmr_manager_reset):
lwi r1, r0, xmb_manager_stackpointer
lwi r2, r1, PT_MSR
mts rmsr, r2
bri 4
lwi r2, r1, PT_PID
mts rpid, r2
lwi r2, r1, PT_TLBI
mts rtlbx, r2
lwi r2, r1, PT_ZPR
mts rzpr, r2
#if CONFIG_XILINX_MICROBLAZE0_USE_FPU
lwi r2, r1, PT_FSR
mts rfsr, r2
#endif
addik r3, r0, TOPHYS(tlb_skip)
addik r6, r0, PT_TLBL0
addik r7, r0, PT_TLBH0
restore_tlb:
add r6, r6, r1
add r7, r7, r1
lwi r2, r6, 0
mts rtlblo, r2
lwi r2, r7, 0
mts rtlbhi, r2
addik r6, r6, 4
addik r7, r7, 4
bgtid r3, restore_tlb
addik r3, r3, -1
lwi r5, r0, TOPHYS(xmb_manager_dev)
lwi r8, r0, TOPHYS(xmb_manager_reset_callback)
set_vms
addik r15, r0, ret_from_reset - 8
rtbd r8, 0
nop
ret_from_reset:
set_bip
VM_OFF
RESTORE_REGS
lwi r14, r1, PT_R14
lwi r16, r1, PT_PC
addik r1, r1, PT_SIZE + 36
rtbd r16, 0
nop
C_ENTRY(_xmb_manager_break):
addik r1, r1, -PT_SIZE - 36
swi r1, r0, xmb_manager_stackpointer
SAVE_REGS
swi r14, r1, PT_R14
swi r16, r1, PT_PC;
lwi r6, r0, TOPHYS(xmb_manager_baseaddr)
lwi r7, r0, TOPHYS(xmb_manager_crval)
swi r7, r6, 0
mfs r2, rpid
swi r2, r1, PT_PID
mfs r2, rtlbx
swi r2, r1, PT_TLBI
mfs r2, rzpr
swi r2, r1, PT_ZPR
#if CONFIG_XILINX_MICROBLAZE0_USE_FPU
mfs r2, rfsr
swi r2, r1, PT_FSR
#endif
mfs r2, rmsr
swi r2, r1, PT_MSR
addik r3, r0, TOPHYS(tlb_skip)
addik r6, r0, PT_TLBL0
addik r7, r0, PT_TLBH0
save_tlb:
add r6, r6, r1
add r7, r7, r1
mfs r2, rtlblo
swi r2, r6, 0
mfs r2, rtlbhi
swi r2, r7, 0
addik r6, r6, 4
addik r7, r7, 4
bgtid r3, save_tlb
addik r3, r3, -1
lwi r5, r0, TOPHYS(xmb_manager_dev)
lwi r8, r0, TOPHYS(xmb_manager_callback)
addik r15, r0, ret_from_break - 8
rtbd r8, 0
nop
ret_from_break:
bralid r15, mb_flush_dcache
nop
bralid r15, mb_invalidate_icache
nop
set_bip;
VM_OFF;
mbar 1
mbar 2
bri 4
suspend
nop
#endif
C_ENTRY(_debug_exception):
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
mfs r1, rmsr
nop
andi r1, r1, MSR_UMS
bnei r1, 1f
lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP));
addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE;
SAVE_REGS;
swi r0, r1, PT_R0;
swi r14, r1, PT_R14
swi r16, r1, PT_PC;
mfs r11, rear;
swi r11, r1, PT_EAR;
mfs r11, resr;
swi r11, r1, PT_ESR;
mfs r11, rfsr;
swi r11, r1, PT_FSR;
addik r11, r1, CONFIG_KERNEL_START - CONFIG_KERNEL_BASE_ADDR + PT_SIZE;
swi r11, r1, PT_R1
tovirt(r1,r1)
#ifdef CONFIG_KGDB
addi r5, r1, 0
addik r15, r0, dbtrap_call;
rtbd r0, microblaze_kgdb_break
nop;
#endif
bri 0
1: lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tophys(r1,r1);
lwi r1, r1, TS_THREAD_INFO;
addik r1, r1, THREAD_SIZE;
tophys(r1,r1);
addik r1, r1, -PT_SIZE;
SAVE_REGS;
swi r16, r1, PT_PC;
swi r0, r1, PT_MODE;
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
swi r11, r1, PT_R1;
lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tovirt(r1,r1)
set_vms;
addik r5, r1, 0;
addik r15, r0, dbtrap_call;
dbtrap_call:
rtbd r0, sw_exception
nop
set_bip;
lwi r11, r1, PT_MODE;
bnei r11, 2f;
1:
lwi r11, CURRENT_TASK, TS_THREAD_INFO;
lwi r19, r11, TI_FLAGS;
andi r11, r19, _TIF_NEED_RESCHED;
beqi r11, 5f;
bralid r15, schedule;
nop;
bri 1b
5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
beqi r11, 4f;
addik r5, r1, 0;
bralid r15, do_notify_resume;
addi r6, r0, 0;
bri 1b
4: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE);
VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD
addik r1, r1, PT_SIZE
lwi r1, r1, PT_R1 - PT_SIZE;
DBTRAP_return_user:
rtbd r16, 0;
nop;
2: VM_OFF;
tophys(r1,r1);
RESTORE_REGS_RTBD
lwi r14, r1, PT_R14;
lwi r16, r1, PT_PC;
addik r1, r1, PT_SIZE;
tovirt(r1,r1);
DBTRAP_return_kernel:
rtbd r16, 0;
nop;
ENTRY(_switch_to)
addk r3, r0, CURRENT_TASK
addik r11, r5, TI_CPU_CONTEXT
swi r1, r11, CC_R1
swi r2, r11, CC_R2
swi r13, r11, CC_R13
swi r14, r11, CC_R14
swi r15, r11, CC_R15
swi r16, r11, CC_R16
swi r17, r11, CC_R17
swi r18, r11, CC_R18
swi r19, r11, CC_R19
swi r20, r11, CC_R20
swi r21, r11, CC_R21
swi r22, r11, CC_R22
swi r23, r11, CC_R23
swi r24, r11, CC_R24
swi r25, r11, CC_R25
swi r26, r11, CC_R26
swi r27, r11, CC_R27
swi r28, r11, CC_R28
swi r29, r11, CC_R29
swi r30, r11, CC_R30
mfs r12, rmsr
swi r12, r11, CC_MSR
mfs r12, rear
swi r12, r11, CC_EAR
mfs r12, resr
swi r12, r11, CC_ESR
mfs r12, rfsr
swi r12, r11, CC_FSR
lwi CURRENT_TASK, r6, TI_TASK
swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE)
addik r11, r6, TI_CPU_CONTEXT
lwi r30, r11, CC_R30
lwi r29, r11, CC_R29
lwi r28, r11, CC_R28
lwi r27, r11, CC_R27
lwi r26, r11, CC_R26
lwi r25, r11, CC_R25
lwi r24, r11, CC_R24
lwi r23, r11, CC_R23
lwi r22, r11, CC_R22
lwi r21, r11, CC_R21
lwi r20, r11, CC_R20
lwi r19, r11, CC_R19
lwi r18, r11, CC_R18
lwi r17, r11, CC_R17
lwi r16, r11, CC_R16
lwi r15, r11, CC_R15
lwi r14, r11, CC_R14
lwi r13, r11, CC_R13
lwi r2, r11, CC_R2
lwi r1, r11, CC_R1
lwi r12, r11, CC_FSR
mts rfsr, r12
lwi r12, r11, CC_MSR
mts rmsr, r12
rtsd r15, 8
nop
#ifdef CONFIG_MB_MANAGER
.global xmb_inject_err
.section .text
.align 2
.ent xmb_inject_err
.type xmb_inject_err, @function
xmb_inject_err:
addik r1, r1, -PT_SIZE
SAVE_REGS
VM_OFF;
set_bip;
mbar 1
mbar 2
bralid r15, XMB_INJECT_ERR_OFFSET
nop;
set_vms;
mbar 1
mbar 2
rtbd r0, 1f
nop;
1:
RESTORE_REGS
addik r1, r1, PT_SIZE
rtsd r15, 8;
nop;
.end xmb_inject_err
.section .data
.global xmb_manager_dev
.global xmb_manager_baseaddr
.global xmb_manager_crval
.global xmb_manager_callback
.global xmb_manager_reset_callback
.global xmb_manager_stackpointer
.align 4
xmb_manager_dev:
.long 0
xmb_manager_baseaddr:
.long 0
xmb_manager_crval:
.long 0
xmb_manager_callback:
.long 0
xmb_manager_reset_callback:
.long 0
xmb_manager_stackpointer:
.long 0
.global xmb_manager_register
.section .text
.align 2
.ent xmb_manager_register
.type xmb_manager_register, @function
xmb_manager_register:
swi r5, r0, xmb_manager_baseaddr
swi r6, r0, xmb_manager_crval
swi r7, r0, xmb_manager_callback
swi r8, r0, xmb_manager_dev
swi r9, r0, xmb_manager_reset_callback
rtsd r15, 8;
nop;
.end xmb_manager_register
#endif
ENTRY(_reset)
VM_OFF
brai 0;
.section .init.ivt, "ax"
#if CONFIG_MANUAL_RESET_VECTOR && !defined(CONFIG_MB_MANAGER)
.org 0x0
brai CONFIG_MANUAL_RESET_VECTOR
#elif defined(CONFIG_MB_MANAGER)
.org 0x0
brai TOPHYS(_xtmr_manager_reset);
#endif
.org 0x8
brai TOPHYS(_user_exception);
.org 0x10
brai TOPHYS(_interrupt);
#ifdef CONFIG_MB_MANAGER
.org 0x18
brai TOPHYS(_xmb_manager_break);
#else
.org 0x18
brai TOPHYS(_debug_exception);
#endif
.org 0x20
brai TOPHYS(_hw_exception_handler);
#ifdef CONFIG_MB_MANAGER
.org XMB_INJECT_ERR_OFFSET
xmb_inject_error:
nop
rtsd r15, 8
nop
#endif
.section .rodata,"a"
#include "syscall_table.S"
syscall_table_size=(.-sys_call_table)
type_SYSCALL:
.ascii "SYSCALL\0"
type_IRQ:
.ascii "IRQ\0"
type_IRQ_PREEMPT:
.ascii "IRQ (PREEMPTED)\0"
type_SYSCALL_PREEMPT:
.ascii " SYSCALL (PREEMPTED)\0"
.align 4
.global microblaze_trap_handlers
microblaze_trap_handlers:
.word ret_from_trap; .word ret_from_trap ; .word type_SYSCALL
.word ret_from_irq ; .word ret_from_irq ; .word type_IRQ
.word ret_from_irq ; .word no_intr_resched ; .word type_IRQ_PREEMPT
.word ret_from_trap; .word TRAP_return ; .word type_SYSCALL_PREEMPT
.word 0 ; .word 0 ; .word 0