Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/blackfin/kernel/entry.S
10817 views
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
21
ENTRY(_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);
65
ENDPROC(_ret_from_fork)
66
67
ENTRY(_sys_fork)
68
r0 = -EINVAL;
69
#if (ANOMALY_05000371)
70
nop;
71
nop;
72
nop;
73
#endif
74
rts;
75
ENDPROC(_sys_fork)
76
77
ENTRY(_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;
86
ENDPROC(_sys_vfork)
87
88
ENTRY(_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;
97
ENDPROC(_sys_clone)
98
99
ENTRY(_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;
108
ENDPROC(_sys_rt_sigreturn)
109
110