Root/arch/blackfin/kernel/entry.S

1/*
2 * Copyright 2004-2009 Analog Devices Inc.
3 *
4 * Licensed under the GPL-2 or later
5 */
6
7#include <linux/linkage.h>
8#include <asm/thread_info.h>
9#include <asm/errno.h>
10#include <asm/blackfin.h>
11#include <asm/asm-offsets.h>
12
13#include <asm/context.S>
14
15#ifdef CONFIG_EXCPT_IRQ_SYSC_L1
16.section .l1.text
17#else
18.text
19#endif
20
21ENTRY(_ret_from_fork)
22#ifdef CONFIG_IPIPE
23    /*
24     * Hw IRQs are off on entry, and we don't want the scheduling tail
25     * code to starve high priority domains from interrupts while it
26     * runs. Therefore we first stall the root stage to have the
27     * virtual interrupt state reflect IMASK.
28     */
29    p0.l = ___ipipe_root_status;
30    p0.h = ___ipipe_root_status;
31    r4 = [p0];
32    bitset(r4, 0);
33    [p0] = r4;
34    /*
35     * Then we may enable hw IRQs, allowing preemption from high
36     * priority domains. schedule_tail() will do local_irq_enable()
37     * since Blackfin does not define __ARCH_WANT_UNLOCKED_CTXSW, so
38     * there is no need to unstall the root domain by ourselves
39     * afterwards.
40     */
41    p0.l = _bfin_irq_flags;
42    p0.h = _bfin_irq_flags;
43    r4 = [p0];
44    sti r4;
45#endif /* CONFIG_IPIPE */
46    SP += -12;
47    pseudo_long_call _schedule_tail, p5;
48    SP += 12;
49    r0 = [sp + PT_IPEND];
50    cc = bittst(r0,1);
51    if cc jump .Lin_kernel;
52    RESTORE_CONTEXT
53    rti;
54.Lin_kernel:
55    bitclr(r0,1);
56    [sp + PT_IPEND] = r0;
57    /* do a 'fake' RTI by jumping to [RETI]
58     * to avoid clearing supervisor mode in child
59     */
60    r0 = [sp + PT_PC];
61    [sp + PT_P0] = r0;
62
63    RESTORE_ALL_SYS
64    jump (p0);
65ENDPROC(_ret_from_fork)
66
67ENTRY(_sys_fork)
68    r0 = -EINVAL;
69#if (ANOMALY_05000371)
70    nop;
71    nop;
72    nop;
73#endif
74    rts;
75ENDPROC(_sys_fork)
76
77ENTRY(_sys_vfork)
78    r0 = sp;
79    r0 += 24;
80    [--sp] = rets;
81    SP += -12;
82    pseudo_long_call _bfin_vfork, p2;
83    SP += 12;
84    rets = [sp++];
85    rts;
86ENDPROC(_sys_vfork)
87
88ENTRY(_sys_clone)
89    r0 = sp;
90    r0 += 24;
91    [--sp] = rets;
92    SP += -12;
93    pseudo_long_call _bfin_clone, p2;
94    SP += 12;
95    rets = [sp++];
96    rts;
97ENDPROC(_sys_clone)
98
99ENTRY(_sys_rt_sigreturn)
100    r0 = sp;
101    r0 += 24;
102    [--sp] = rets;
103    SP += -12;
104    pseudo_long_call _do_rt_sigreturn, p2;
105    SP += 12;
106    rets = [sp++];
107    rts;
108ENDPROC(_sys_rt_sigreturn)
109

Archive Download this file



interactive