microblaze_v8: assembler files head.S, entry-nommu.S, syscall_table.S
Reviewed-by: Ingo Molnar <mingo@elte.hu> Acked-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com> Acked-by: John Linn <john.linn@xilinx.com> Acked-by: John Williams <john.williams@petalogix.com> Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
Родитель
2d43dab99a
Коммит
6d5af1a35f
|
@ -0,0 +1,596 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
|
||||
* Copyright (C) 2007-2009 PetaLogix
|
||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/entry.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/registers.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/signal.h>
|
||||
|
||||
#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
|
||||
.macro disable_irq
|
||||
msrclr r0, MSR_IE
|
||||
.endm
|
||||
|
||||
.macro enable_irq
|
||||
msrset r0, MSR_IE
|
||||
.endm
|
||||
|
||||
.macro clear_bip
|
||||
msrclr r0, MSR_BIP
|
||||
.endm
|
||||
#else
|
||||
.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 clear_bip
|
||||
mfs r11, rmsr
|
||||
andi r11, r11, ~MSR_BIP
|
||||
mts rmsr, r11
|
||||
.endm
|
||||
#endif
|
||||
|
||||
ENTRY(_interrupt)
|
||||
swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */
|
||||
swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */
|
||||
lwi r11, r0, PER_CPU(KM) /* load mode indicator */
|
||||
beqid r11, 1f
|
||||
nop
|
||||
brid 2f /* jump over */
|
||||
addik r1, r1, (-PT_SIZE) /* room for pt_regs (delay slot) */
|
||||
1: /* switch to kernel stack */
|
||||
lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */
|
||||
lwi r1, r1, TS_THREAD_INFO /* get the thread info */
|
||||
/* calculate kernel stack pointer */
|
||||
addik r1, r1, THREAD_SIZE - PT_SIZE
|
||||
2:
|
||||
swi r11, r1, PT_MODE /* store the mode */
|
||||
lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */
|
||||
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_R14
|
||||
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
|
||||
/* special purpose registers */
|
||||
mfs r11, rmsr
|
||||
swi r11, r1, PT_MSR
|
||||
mfs r11, rear
|
||||
swi r11, r1, PT_EAR
|
||||
mfs r11, resr
|
||||
swi r11, r1, PT_ESR
|
||||
mfs r11, rfsr
|
||||
swi r11, r1, PT_FSR
|
||||
/* reload original stack pointer and save it */
|
||||
lwi r11, r0, PER_CPU(ENTRY_SP)
|
||||
swi r11, r1, PT_R1
|
||||
/* update mode indicator we are in kernel mode */
|
||||
addik r11, r0, 1
|
||||
swi r11, r0, PER_CPU(KM)
|
||||
/* restore r31 */
|
||||
lwi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
/* prepare the link register, the argument and jump */
|
||||
la r15, r0, ret_from_intr - 8
|
||||
addk r6, r0, r15
|
||||
braid do_IRQ
|
||||
add r5, r0, r1
|
||||
|
||||
ret_from_intr:
|
||||
lwi r11, r1, PT_MODE
|
||||
bneid r11, 3f
|
||||
|
||||
lwi r6, r31, TS_THREAD_INFO /* get thread info */
|
||||
lwi r19, r6, TI_FLAGS /* get flags in thread info */
|
||||
/* do an extra work if any bits are set */
|
||||
|
||||
andi r11, r19, _TIF_NEED_RESCHED
|
||||
beqi r11, 1f
|
||||
bralid r15, schedule
|
||||
nop
|
||||
1: andi r11, r19, _TIF_SIGPENDING
|
||||
beqid r11, no_intr_reshed
|
||||
addk r5, r1, r0
|
||||
addk r7, r0, r0
|
||||
bralid r15, do_signal
|
||||
addk r6, r0, r0
|
||||
|
||||
no_intr_reshed:
|
||||
/* save mode indicator */
|
||||
lwi r11, r1, PT_MODE
|
||||
3:
|
||||
swi r11, r0, PER_CPU(KM)
|
||||
|
||||
/* save r31 */
|
||||
swi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
restore_context:
|
||||
/* special purpose registers */
|
||||
lwi r11, r1, PT_FSR
|
||||
mts rfsr, r11
|
||||
lwi r11, r1, PT_ESR
|
||||
mts resr, r11
|
||||
lwi r11, r1, PT_EAR
|
||||
mts rear, r11
|
||||
lwi r11, r1, PT_MSR
|
||||
mts rmsr, r11
|
||||
|
||||
lwi r31, r1, PT_R31
|
||||
lwi r30, r1, PT_R30
|
||||
lwi r29, r1, PT_R29
|
||||
lwi r28, r1, PT_R28
|
||||
lwi r27, r1, PT_R27
|
||||
lwi r26, r1, PT_R26
|
||||
lwi r25, r1, PT_R25
|
||||
lwi r24, r1, PT_R24
|
||||
lwi r23, r1, PT_R23
|
||||
lwi r22, r1, PT_R22
|
||||
lwi r21, r1, PT_R21
|
||||
lwi r20, r1, PT_R20
|
||||
lwi r19, r1, PT_R19
|
||||
lwi r18, r1, PT_R18
|
||||
lwi r17, r1, PT_R17
|
||||
lwi r16, r1, PT_R16
|
||||
lwi r15, r1, PT_R15
|
||||
lwi r14, r1, PT_PC
|
||||
lwi r13, r1, PT_R13
|
||||
lwi r12, r1, PT_R12
|
||||
lwi r11, r1, PT_R11
|
||||
lwi r10, r1, PT_R10
|
||||
lwi r9, r1, PT_R9
|
||||
lwi r8, r1, PT_R8
|
||||
lwi r7, r1, PT_R7
|
||||
lwi r6, r1, PT_R6
|
||||
lwi r5, r1, PT_R5
|
||||
lwi r4, r1, PT_R4
|
||||
lwi r3, r1, PT_R3
|
||||
lwi r2, r1, PT_R2
|
||||
lwi r1, r1, PT_R1
|
||||
rtid r14, 0
|
||||
nop
|
||||
|
||||
ENTRY(_reset)
|
||||
brai 0;
|
||||
|
||||
ENTRY(_user_exception)
|
||||
swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */
|
||||
swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */
|
||||
lwi r11, r0, PER_CPU(KM) /* load mode indicator */
|
||||
beqid r11, 1f /* Already in kernel mode? */
|
||||
nop
|
||||
brid 2f /* jump over */
|
||||
addik r1, r1, (-PT_SIZE) /* Room for pt_regs (delay slot) */
|
||||
1: /* Switch to kernel stack */
|
||||
lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */
|
||||
lwi r1, r1, TS_THREAD_INFO /* get the thread info */
|
||||
/* calculate kernel stack pointer */
|
||||
addik r1, r1, THREAD_SIZE - PT_SIZE
|
||||
swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */
|
||||
lwi r11, r0, PER_CPU(KM) /* load mode indicator */
|
||||
2:
|
||||
swi r11, r1, PT_MODE /* store the mode */
|
||||
lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */
|
||||
/* save them on stack */
|
||||
swi r2, r1, PT_R2
|
||||
swi r3, r1, PT_R3 /* r3: _always_ in clobber list; see unistd.h */
|
||||
swi r4, r1, PT_R4 /* r4: _always_ in clobber list; see unistd.h */
|
||||
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
|
||||
/* r12: _always_ in clobber list; see unistd.h */
|
||||
swi r12, r1, PT_R12
|
||||
swi r13, r1, PT_R13
|
||||
/* r14: _always_ in clobber list; see unistd.h */
|
||||
swi r14, r1, PT_R14
|
||||
/* but we want to return to the next inst. */
|
||||
addik r14, r14, 0x4
|
||||
swi r14, r1, PT_PC /* increment by 4 and store in 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
|
||||
|
||||
disable_irq
|
||||
nop /* make sure IE bit is in effect */
|
||||
clear_bip /* once IE is in effect it is safe to clear BIP */
|
||||
nop
|
||||
|
||||
/* special purpose registers */
|
||||
mfs r11, rmsr
|
||||
swi r11, r1, PT_MSR
|
||||
mfs r11, rear
|
||||
swi r11, r1, PT_EAR
|
||||
mfs r11, resr
|
||||
swi r11, r1, PT_ESR
|
||||
mfs r11, rfsr
|
||||
swi r11, r1, PT_FSR
|
||||
/* reload original stack pointer and save it */
|
||||
lwi r11, r0, PER_CPU(ENTRY_SP)
|
||||
swi r11, r1, PT_R1
|
||||
/* update mode indicator we are in kernel mode */
|
||||
addik r11, r0, 1
|
||||
swi r11, r0, PER_CPU(KM)
|
||||
/* restore r31 */
|
||||
lwi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
/* re-enable interrupts now we are in kernel mode */
|
||||
enable_irq
|
||||
|
||||
/* See if the system call number is valid. */
|
||||
addi r11, r12, -__NR_syscalls
|
||||
bgei r11, 1f /* return to user if not valid */
|
||||
/* Figure out which function to use for this system call. */
|
||||
/* Note Microblaze barrel shift is optional, so don't rely on it */
|
||||
add r12, r12, r12 /* convert num -> ptr */
|
||||
add r12, r12, r12
|
||||
lwi r12, r12, sys_call_table /* Get function pointer */
|
||||
la r15, r0, ret_to_user-8 /* set return address */
|
||||
bra r12 /* Make the system call. */
|
||||
bri 0 /* won't reach here */
|
||||
1:
|
||||
brid ret_to_user /* jump to syscall epilogue */
|
||||
addi r3, r0, -ENOSYS /* set errno in delay slot */
|
||||
|
||||
/*
|
||||
* Debug traps are like a system call, but entered via brki r14, 0x60
|
||||
* All we need to do is send the SIGTRAP signal to current, ptrace and do_signal
|
||||
* will handle the rest
|
||||
*/
|
||||
ENTRY(_debug_exception)
|
||||
swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */
|
||||
lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */
|
||||
lwi r1, r1, TS_THREAD_INFO /* get the thread info */
|
||||
addik r1, r1, THREAD_SIZE - PT_SIZE /* get the kernel stack */
|
||||
swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */
|
||||
lwi r11, r0, PER_CPU(KM) /* load mode indicator */
|
||||
//save_context:
|
||||
swi r11, r1, PT_MODE /* store the mode */
|
||||
lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */
|
||||
/* save them on stack */
|
||||
swi r2, r1, PT_R2
|
||||
swi r3, r1, PT_R3 /* r3: _always_ in clobber list; see unistd.h */
|
||||
swi r4, r1, PT_R4 /* r4: _always_ in clobber list; see unistd.h */
|
||||
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
|
||||
/* r12: _always_ in clobber list; see unistd.h */
|
||||
swi r12, r1, PT_R12
|
||||
swi r13, r1, PT_R13
|
||||
/* r14: _always_ in clobber list; see unistd.h */
|
||||
swi r14, r1, PT_R14
|
||||
swi r14, r1, PT_PC /* Will return to interrupted instruction */
|
||||
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
|
||||
|
||||
disable_irq
|
||||
nop /* make sure IE bit is in effect */
|
||||
clear_bip /* once IE is in effect it is safe to clear BIP */
|
||||
nop
|
||||
|
||||
/* special purpose registers */
|
||||
mfs r11, rmsr
|
||||
swi r11, r1, PT_MSR
|
||||
mfs r11, rear
|
||||
swi r11, r1, PT_EAR
|
||||
mfs r11, resr
|
||||
swi r11, r1, PT_ESR
|
||||
mfs r11, rfsr
|
||||
swi r11, r1, PT_FSR
|
||||
/* reload original stack pointer and save it */
|
||||
lwi r11, r0, PER_CPU(ENTRY_SP)
|
||||
swi r11, r1, PT_R1
|
||||
/* update mode indicator we are in kernel mode */
|
||||
addik r11, r0, 1
|
||||
swi r11, r0, PER_CPU(KM)
|
||||
/* restore r31 */
|
||||
lwi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
/* re-enable interrupts now we are in kernel mode */
|
||||
enable_irq
|
||||
|
||||
addi r5, r0, SIGTRAP /* sending the trap signal */
|
||||
add r6, r0, r31 /* to current */
|
||||
bralid r15, send_sig
|
||||
add r7, r0, r0 /* 3rd param zero */
|
||||
|
||||
/* Restore r3/r4 to work around how ret_to_user works */
|
||||
lwi r3, r1, PT_R3
|
||||
lwi r4, r1, PT_R4
|
||||
bri ret_to_user
|
||||
|
||||
ENTRY(_break)
|
||||
bri 0
|
||||
|
||||
/* struct task_struct *_switch_to(struct thread_info *prev,
|
||||
struct thread_info *next); */
|
||||
ENTRY(_switch_to)
|
||||
/* prepare return value */
|
||||
addk r3, r0, r31
|
||||
|
||||
/* save registers in cpu_context */
|
||||
/* use r11 and r12, volatile registers, as temp register */
|
||||
addik r11, r5, TI_CPU_CONTEXT
|
||||
swi r1, r11, CC_R1
|
||||
swi r2, r11, CC_R2
|
||||
/* skip volatile registers.
|
||||
* they are saved on stack when we jumped to _switch_to() */
|
||||
/* dedicated registers */
|
||||
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
|
||||
/* save non-volatile registers */
|
||||
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
|
||||
/* special purpose registers */
|
||||
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
|
||||
|
||||
/* update r31, the current */
|
||||
lwi r31, r6, TI_TASK
|
||||
swi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
|
||||
/* get new process' cpu context and restore */
|
||||
addik r11, r6, TI_CPU_CONTEXT
|
||||
|
||||
/* special purpose registers */
|
||||
lwi r12, r11, CC_FSR
|
||||
mts rfsr, r12
|
||||
lwi r12, r11, CC_ESR
|
||||
mts resr, r12
|
||||
lwi r12, r11, CC_EAR
|
||||
mts rear, r12
|
||||
lwi r12, r11, CC_MSR
|
||||
mts rmsr, r12
|
||||
/* non-volatile registers */
|
||||
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
|
||||
/* dedicated registers */
|
||||
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
|
||||
/* skip volatile registers */
|
||||
lwi r2, r11, CC_R2
|
||||
lwi r1, r11, CC_R1
|
||||
|
||||
rtsd r15, 8
|
||||
nop
|
||||
|
||||
ENTRY(ret_from_fork)
|
||||
addk r5, r0, r3
|
||||
addk r6, r0, r1
|
||||
brlid r15, schedule_tail
|
||||
nop
|
||||
swi r31, r1, PT_R31 /* save r31 in user context. */
|
||||
/* will soon be restored to r31 in ret_to_user */
|
||||
addk r3, r0, r0
|
||||
brid ret_to_user
|
||||
nop
|
||||
|
||||
work_pending:
|
||||
andi r11, r19, _TIF_NEED_RESCHED
|
||||
beqi r11, 1f
|
||||
bralid r15, schedule
|
||||
nop
|
||||
1: andi r11, r19, _TIF_SIGPENDING
|
||||
beqi r11, no_work_pending
|
||||
addk r5, r1, r0
|
||||
addik r7, r0, 1
|
||||
bralid r15, do_signal
|
||||
addk r6, r0, r0
|
||||
bri no_work_pending
|
||||
|
||||
ENTRY(ret_to_user)
|
||||
disable_irq
|
||||
|
||||
swi r4, r1, PT_R4 /* return val */
|
||||
swi r3, r1, PT_R3 /* return val */
|
||||
|
||||
lwi r6, r31, TS_THREAD_INFO /* get thread info */
|
||||
lwi r19, r6, TI_FLAGS /* get flags in thread info */
|
||||
bnei r19, work_pending /* do an extra work if any bits are set */
|
||||
no_work_pending:
|
||||
disable_irq
|
||||
|
||||
/* save r31 */
|
||||
swi r31, r0, PER_CPU(CURRENT_SAVE)
|
||||
/* save mode indicator */
|
||||
lwi r18, r1, PT_MODE
|
||||
swi r18, r0, PER_CPU(KM)
|
||||
//restore_context:
|
||||
/* special purpose registers */
|
||||
lwi r18, r1, PT_FSR
|
||||
mts rfsr, r18
|
||||
lwi r18, r1, PT_ESR
|
||||
mts resr, r18
|
||||
lwi r18, r1, PT_EAR
|
||||
mts rear, r18
|
||||
lwi r18, r1, PT_MSR
|
||||
mts rmsr, r18
|
||||
|
||||
lwi r31, r1, PT_R31
|
||||
lwi r30, r1, PT_R30
|
||||
lwi r29, r1, PT_R29
|
||||
lwi r28, r1, PT_R28
|
||||
lwi r27, r1, PT_R27
|
||||
lwi r26, r1, PT_R26
|
||||
lwi r25, r1, PT_R25
|
||||
lwi r24, r1, PT_R24
|
||||
lwi r23, r1, PT_R23
|
||||
lwi r22, r1, PT_R22
|
||||
lwi r21, r1, PT_R21
|
||||
lwi r20, r1, PT_R20
|
||||
lwi r19, r1, PT_R19
|
||||
lwi r18, r1, PT_R18
|
||||
lwi r17, r1, PT_R17
|
||||
lwi r16, r1, PT_R16
|
||||
lwi r15, r1, PT_R15
|
||||
lwi r14, r1, PT_PC
|
||||
lwi r13, r1, PT_R13
|
||||
lwi r12, r1, PT_R12
|
||||
lwi r11, r1, PT_R11
|
||||
lwi r10, r1, PT_R10
|
||||
lwi r9, r1, PT_R9
|
||||
lwi r8, r1, PT_R8
|
||||
lwi r7, r1, PT_R7
|
||||
lwi r6, r1, PT_R6
|
||||
lwi r5, r1, PT_R5
|
||||
lwi r4, r1, PT_R4 /* return val */
|
||||
lwi r3, r1, PT_R3 /* return val */
|
||||
lwi r2, r1, PT_R2
|
||||
lwi r1, r1, PT_R1
|
||||
|
||||
rtid r14, 0
|
||||
nop
|
||||
|
||||
sys_vfork_wrapper:
|
||||
brid sys_vfork
|
||||
addk r5, r1, r0
|
||||
|
||||
sys_clone_wrapper:
|
||||
brid sys_clone
|
||||
addk r7, r1, r0
|
||||
|
||||
sys_execve_wrapper:
|
||||
brid sys_execve
|
||||
addk r8, r1, r0
|
||||
|
||||
sys_sigreturn_wrapper:
|
||||
brid sys_sigreturn
|
||||
addk r5, r1, r0
|
||||
|
||||
sys_rt_sigreturn_wrapper:
|
||||
brid sys_rt_sigreturn
|
||||
addk r5, r1, r0
|
||||
|
||||
sys_sigsuspend_wrapper:
|
||||
brid sys_rt_sigsuspend
|
||||
addk r6, r1, r0
|
||||
|
||||
sys_rt_sigsuspend_wrapper:
|
||||
brid sys_rt_sigsuspend
|
||||
addk r7, r1, r0
|
||||
|
||||
/* Interrupt vector table */
|
||||
.section .init.ivt, "ax"
|
||||
.org 0x0
|
||||
brai _reset
|
||||
brai _user_exception
|
||||
brai _interrupt
|
||||
brai _break
|
||||
brai _hw_exception_handler
|
||||
.org 0x60
|
||||
brai _debug_exception
|
||||
|
||||
.section .rodata,"a"
|
||||
#include "syscall_table.S"
|
||||
|
||||
syscall_table_size=(.-sys_call_table)
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
|
||||
* Copyright (C) 2007-2009 PetaLogix
|
||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
.text
|
||||
ENTRY(_start)
|
||||
mfs r1, rmsr
|
||||
andi r1, r1, ~2
|
||||
mts rmsr, r1
|
||||
|
||||
/* save fdt to kernel location */
|
||||
/* r7 stores pointer to fdt blob */
|
||||
beqi r7, no_fdt_arg
|
||||
or r11, r0, r0 /* incremment */
|
||||
ori r4, r0, TOPHYS(_fdt_start) /* save bram context */
|
||||
ori r3, r0, (0x4000 - 4)
|
||||
_copy_fdt:
|
||||
lw r12, r7, r11 /* r12 = r7 + r11 */
|
||||
sw r12, r4, r11 /* addr[r4 + r11] = r12 */
|
||||
addik r11, r11, 4 /* increment counting */
|
||||
bgtid r3, _copy_fdt /* loop for all entries */
|
||||
addik r3, r3, -4 /* descrement loop */
|
||||
no_fdt_arg:
|
||||
|
||||
/* Initialize small data anchors */
|
||||
la r13, r0, _KERNEL_SDA_BASE_
|
||||
la r2, r0, _KERNEL_SDA2_BASE_
|
||||
|
||||
/* Initialize stack pointer */
|
||||
la r1, r0, init_thread_union + THREAD_SIZE - 4
|
||||
|
||||
/* Initialize r31 with current task address */
|
||||
la r31, r0, init_task
|
||||
|
||||
/*
|
||||
* Call platform dependent initialize function.
|
||||
* Please see $(ARCH)/mach-$(SUBARCH)/setup.c for
|
||||
* the function.
|
||||
*/
|
||||
la r8, r0, machine_early_init
|
||||
brald r15, r8
|
||||
nop
|
||||
|
||||
la r15, r0, machine_halt
|
||||
braid start_kernel
|
||||
nop
|
|
@ -0,0 +1,365 @@
|
|||
ENTRY(sys_call_table)
|
||||
.long sys_restart_syscall /* 0 - old "setup()" system call,
|
||||
* used for restarting */
|
||||
.long sys_exit
|
||||
.long sys_ni_syscall /* was fork */
|
||||
.long sys_read
|
||||
.long sys_write
|
||||
.long sys_open /* 5 */
|
||||
.long sys_close
|
||||
.long sys_waitpid
|
||||
.long sys_creat
|
||||
.long sys_link
|
||||
.long sys_unlink /* 10 */
|
||||
.long sys_execve_wrapper
|
||||
.long sys_chdir
|
||||
.long sys_time
|
||||
.long sys_mknod
|
||||
.long sys_chmod /* 15 */
|
||||
.long sys_lchown
|
||||
.long sys_ni_syscall /* old break syscall holder */
|
||||
.long sys_ni_syscall /* old stat */
|
||||
.long sys_lseek
|
||||
.long sys_getpid /* 20 */
|
||||
.long sys_mount
|
||||
.long sys_oldumount
|
||||
.long sys_setuid
|
||||
.long sys_getuid
|
||||
.long sys_stime /* 25 */
|
||||
.long sys_ptrace
|
||||
.long sys_alarm
|
||||
.long sys_ni_syscall /* oldfstat */
|
||||
.long sys_pause
|
||||
.long sys_utime /* 30 */
|
||||
.long sys_ni_syscall /* old stty syscall holder */
|
||||
.long sys_ni_syscall /* old gtty syscall holder */
|
||||
.long sys_access
|
||||
.long sys_nice
|
||||
.long sys_ni_syscall /* 35 - old ftime syscall holder */
|
||||
.long sys_sync
|
||||
.long sys_kill
|
||||
.long sys_rename
|
||||
.long sys_mkdir
|
||||
.long sys_rmdir /* 40 */
|
||||
.long sys_dup
|
||||
.long sys_pipe
|
||||
.long sys_times
|
||||
.long sys_ni_syscall /* old prof syscall holder */
|
||||
.long sys_brk /* 45 */
|
||||
.long sys_setgid
|
||||
.long sys_getgid
|
||||
.long sys_signal
|
||||
.long sys_geteuid
|
||||
.long sys_getegid /* 50 */
|
||||
.long sys_acct
|
||||
.long sys_umount /* recycled never used phys() */
|
||||
.long sys_ni_syscall /* old lock syscall holder */
|
||||
.long sys_ioctl
|
||||
.long sys_fcntl /* 55 */
|
||||
.long sys_ni_syscall /* old mpx syscall holder */
|
||||
.long sys_setpgid
|
||||
.long sys_ni_syscall /* old ulimit syscall holder */
|
||||
.long sys_ni_syscall /* olduname */
|
||||
.long sys_umask /* 60 */
|
||||
.long sys_chroot
|
||||
.long sys_ustat
|
||||
.long sys_dup2
|
||||
.long sys_getppid
|
||||
.long sys_getpgrp /* 65 */
|
||||
.long sys_setsid
|
||||
.long sys_sigaction
|
||||
.long sys_sgetmask
|
||||
.long sys_ssetmask
|
||||
.long sys_setreuid /* 70 */
|
||||
.long sys_setregid
|
||||
.long sys_sigsuspend_wrapper
|
||||
.long sys_sigpending
|
||||
.long sys_sethostname
|
||||
.long sys_setrlimit /* 75 */
|
||||
.long sys_ni_syscall /* old_getrlimit */
|
||||
.long sys_getrusage
|
||||
.long sys_gettimeofday
|
||||
.long sys_settimeofday
|
||||
.long sys_getgroups /* 80 */
|
||||
.long sys_setgroups
|
||||
.long sys_ni_syscall /* old_select */
|
||||
.long sys_symlink
|
||||
.long sys_ni_syscall /* oldlstat */
|
||||
.long sys_readlink /* 85 */
|
||||
.long sys_uselib
|
||||
.long sys_swapon
|
||||
.long sys_reboot
|
||||
.long sys_ni_syscall /* old_readdir */
|
||||
.long sys_mmap /* 90 */ /* old_mmap */
|
||||
.long sys_munmap
|
||||
.long sys_truncate
|
||||
.long sys_ftruncate
|
||||
.long sys_fchmod
|
||||
.long sys_fchown /* 95 */
|
||||
.long sys_getpriority
|
||||
.long sys_setpriority
|
||||
.long sys_ni_syscall /* old profil syscall holder */
|
||||
.long sys_statfs
|
||||
.long sys_fstatfs /* 100 */
|
||||
.long sys_ni_syscall /* ioperm */
|
||||
.long sys_socketcall
|
||||
.long sys_syslog /* operation with system console */
|
||||
.long sys_setitimer
|
||||
.long sys_getitimer /* 105 */
|
||||
.long sys_newstat
|
||||
.long sys_newlstat
|
||||
.long sys_newfstat
|
||||
.long sys_ni_syscall /* uname */
|
||||
.long sys_ni_syscall /* 110 */ /* iopl */
|
||||
.long sys_vhangup
|
||||
.long sys_ni_syscall /* old "idle" system call */
|
||||
.long sys_ni_syscall /* old sys_vm86old */
|
||||
.long sys_wait4
|
||||
.long sys_swapoff /* 115 */
|
||||
.long sys_sysinfo
|
||||
.long sys_ipc
|
||||
.long sys_fsync
|
||||
.long sys_sigreturn_wrapper
|
||||
.long sys_clone_wrapper /* 120 */
|
||||
.long sys_setdomainname
|
||||
.long sys_newuname
|
||||
.long sys_ni_syscall /* modify_ldt */
|
||||
.long sys_adjtimex
|
||||
.long sys_mprotect /* 125: sys_mprotect */
|
||||
.long sys_sigprocmask
|
||||
.long sys_ni_syscall /* old "create_module" */
|
||||
.long sys_init_module
|
||||
.long sys_delete_module
|
||||
.long sys_ni_syscall /* 130: old "get_kernel_syms" */
|
||||
.long sys_quotactl
|
||||
.long sys_getpgid
|
||||
.long sys_fchdir
|
||||
.long sys_bdflush
|
||||
.long sys_sysfs /* 135 */
|
||||
.long sys_personality
|
||||
.long sys_ni_syscall /* reserved for afs_syscall */
|
||||
.long sys_setfsuid
|
||||
.long sys_setfsgid
|
||||
.long sys_llseek /* 140 */
|
||||
.long sys_getdents
|
||||
.long sys_select
|
||||
.long sys_flock
|
||||
.long sys_msync
|
||||
.long sys_readv /* 145 */
|
||||
.long sys_writev
|
||||
.long sys_getsid
|
||||
.long sys_fdatasync
|
||||
.long sys_sysctl
|
||||
.long sys_mlock /* 150: sys_mlock */
|
||||
.long sys_munlock
|
||||
.long sys_mlockall
|
||||
.long sys_munlockall
|
||||
.long sys_sched_setparam
|
||||
.long sys_sched_getparam /* 155 */
|
||||
.long sys_sched_setscheduler
|
||||
.long sys_sched_getscheduler
|
||||
.long sys_sched_yield
|
||||
.long sys_sched_get_priority_max
|
||||
.long sys_sched_get_priority_min /* 160 */
|
||||
.long sys_sched_rr_get_interval
|
||||
.long sys_nanosleep
|
||||
.long sys_mremap
|
||||
.long sys_setresuid
|
||||
.long sys_getresuid /* 165 */
|
||||
.long sys_ni_syscall /* sys_vm86 */
|
||||
.long sys_ni_syscall /* Old sys_query_module */
|
||||
.long sys_poll
|
||||
.long sys_nfsservctl
|
||||
.long sys_setresgid /* 170 */
|
||||
.long sys_getresgid
|
||||
.long sys_prctl
|
||||
.long sys_rt_sigreturn_wrapper
|
||||
.long sys_rt_sigaction
|
||||
.long sys_rt_sigprocmask /* 175 */
|
||||
.long sys_rt_sigpending
|
||||
.long sys_rt_sigtimedwait
|
||||
.long sys_rt_sigqueueinfo
|
||||
.long sys_rt_sigsuspend_wrapper
|
||||
.long sys_pread64 /* 180 */
|
||||
.long sys_pwrite64
|
||||
.long sys_chown
|
||||
.long sys_getcwd
|
||||
.long sys_capget
|
||||
.long sys_capset /* 185 */
|
||||
.long sys_ni_syscall /* sigaltstack */
|
||||
.long sys_sendfile
|
||||
.long sys_ni_syscall /* reserved for streams1 */
|
||||
.long sys_ni_syscall /* reserved for streams2 */
|
||||
.long sys_vfork_wrapper /* 190 */
|
||||
.long sys_getrlimit
|
||||
.long sys_mmap2 /* mmap2 */
|
||||
.long sys_truncate64
|
||||
.long sys_ftruncate64
|
||||
.long sys_stat64 /* 195 */
|
||||
.long sys_lstat64
|
||||
.long sys_fstat64
|
||||
.long sys_lchown
|
||||
.long sys_getuid
|
||||
.long sys_getgid /* 200 */
|
||||
.long sys_geteuid
|
||||
.long sys_getegid
|
||||
.long sys_setreuid
|
||||
.long sys_setregid
|
||||
.long sys_getgroups /* 205 */
|
||||
.long sys_setgroups
|
||||
.long sys_fchown
|
||||
.long sys_setresuid
|
||||
.long sys_getresuid
|
||||
.long sys_setresgid /* 210 */
|
||||
.long sys_getresgid
|
||||
.long sys_chown
|
||||
.long sys_setuid
|
||||
.long sys_setgid
|
||||
.long sys_setfsuid /* 215 */
|
||||
.long sys_setfsgid
|
||||
.long sys_pivot_root
|
||||
.long sys_mincore
|
||||
.long sys_madvise
|
||||
.long sys_getdents64 /* 220 */
|
||||
.long sys_fcntl64
|
||||
.long sys_ni_syscall /* reserved for TUX */
|
||||
.long sys_ni_syscall
|
||||
.long sys_gettid
|
||||
.long sys_readahead /* 225 */
|
||||
.long sys_setxattr
|
||||
.long sys_lsetxattr
|
||||
.long sys_fsetxattr
|
||||
.long sys_getxattr
|
||||
.long sys_lgetxattr /* 230 */
|
||||
.long sys_fgetxattr
|
||||
.long sys_listxattr
|
||||
.long sys_llistxattr
|
||||
.long sys_flistxattr
|
||||
.long sys_removexattr /* 235 */
|
||||
.long sys_lremovexattr
|
||||
.long sys_fremovexattr
|
||||
.long sys_tkill
|
||||
.long sys_sendfile64
|
||||
.long sys_futex /* 240 */
|
||||
.long sys_sched_setaffinity
|
||||
.long sys_sched_getaffinity
|
||||
.long sys_ni_syscall /* set_thread_area */
|
||||
.long sys_ni_syscall /* get_thread_area */
|
||||
.long sys_io_setup /* 245 */
|
||||
.long sys_io_destroy
|
||||
.long sys_io_getevents
|
||||
.long sys_io_submit
|
||||
.long sys_io_cancel
|
||||
.long sys_fadvise64 /* 250 */
|
||||
.long sys_ni_syscall
|
||||
.long sys_exit_group
|
||||
.long sys_lookup_dcookie
|
||||
.long sys_epoll_create
|
||||
.long sys_epoll_ctl /* 255 */
|
||||
.long sys_epoll_wait
|
||||
.long sys_remap_file_pages
|
||||
.long sys_set_tid_address
|
||||
.long sys_timer_create
|
||||
.long sys_timer_settime /* 260 */
|
||||
.long sys_timer_gettime
|
||||
.long sys_timer_getoverrun
|
||||
.long sys_timer_delete
|
||||
.long sys_clock_settime
|
||||
.long sys_clock_gettime /* 265 */
|
||||
.long sys_clock_getres
|
||||
.long sys_clock_nanosleep
|
||||
.long sys_statfs64
|
||||
.long sys_fstatfs64
|
||||
.long sys_tgkill /* 270 */
|
||||
.long sys_utimes
|
||||
.long sys_fadvise64_64
|
||||
.long sys_ni_syscall /* sys_vserver */
|
||||
.long sys_mbind
|
||||
.long sys_get_mempolicy
|
||||
.long sys_set_mempolicy
|
||||
.long sys_mq_open
|
||||
.long sys_mq_unlink
|
||||
.long sys_mq_timedsend
|
||||
.long sys_mq_timedreceive /* 280 */
|
||||
.long sys_mq_notify
|
||||
.long sys_mq_getsetattr
|
||||
.long sys_kexec_load
|
||||
.long sys_waitid
|
||||
.long sys_ni_syscall /* 285 */ /* available */
|
||||
.long sys_add_key
|
||||
.long sys_request_key
|
||||
.long sys_keyctl
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get /* 290 */
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
.long sys_ni_syscall /* sys_migrate_pages */
|
||||
.long sys_openat /* 295 */
|
||||
.long sys_mkdirat
|
||||
.long sys_mknodat
|
||||
.long sys_fchownat
|
||||
.long sys_ni_syscall
|
||||
.long sys_fstatat64 /* 300 */
|
||||
.long sys_unlinkat
|
||||
.long sys_renameat
|
||||
.long sys_linkat
|
||||
.long sys_symlinkat
|
||||
.long sys_readlinkat /* 305 */
|
||||
.long sys_fchmodat
|
||||
.long sys_faccessat
|
||||
.long sys_ni_syscall /* pselect6 */
|
||||
.long sys_ni_syscall /* sys_ppoll */
|
||||
.long sys_unshare /* 310 */
|
||||
.long sys_set_robust_list
|
||||
.long sys_get_robust_list
|
||||
.long sys_splice
|
||||
.long sys_sync_file_range
|
||||
.long sys_tee /* 315 */
|
||||
.long sys_vmsplice
|
||||
.long sys_move_pages
|
||||
.long sys_getcpu
|
||||
.long sys_epoll_pwait
|
||||
.long sys_utimensat /* 320 */
|
||||
.long sys_signalfd
|
||||
.long sys_timerfd_create
|
||||
.long sys_eventfd
|
||||
.long sys_fallocate
|
||||
.long sys_semtimedop /* 325 */
|
||||
.long sys_timerfd_settime
|
||||
.long sys_timerfd_gettime
|
||||
.long sys_semctl
|
||||
.long sys_semget
|
||||
.long sys_semop /* 330 */
|
||||
.long sys_msgctl
|
||||
.long sys_msgget
|
||||
.long sys_msgrcv
|
||||
.long sys_msgsnd
|
||||
.long sys_shmat /* 335 */
|
||||
.long sys_shmctl
|
||||
.long sys_shmdt
|
||||
.long sys_shmget
|
||||
.long sys_signalfd4 /* new syscall */
|
||||
.long sys_eventfd2 /* 340 */
|
||||
.long sys_epoll_create1
|
||||
.long sys_dup3
|
||||
.long sys_pipe2
|
||||
.long sys_inotify_init1
|
||||
.long sys_socket /* 345 */
|
||||
.long sys_socketpair
|
||||
.long sys_bind
|
||||
.long sys_listen
|
||||
.long sys_accept
|
||||
.long sys_connect /* 350 */
|
||||
.long sys_getsockname
|
||||
.long sys_getpeername
|
||||
.long sys_sendto
|
||||
.long sys_send
|
||||
.long sys_recvfrom /* 355 */
|
||||
.long sys_recv
|
||||
.long sys_setsockopt
|
||||
.long sys_getsockopt
|
||||
.long sys_shutdown
|
||||
.long sys_sendmsg /* 360 */
|
||||
.long sys_recvmsg
|
||||
.long sys_ni_syscall
|
Загрузка…
Ссылка в новой задаче