Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
250b5e26
Commit
250b5e26
authored
Nov 04, 2002
by
Richard Henderson
Browse files
Options
Browse Files
Download
Plain Diff
Merge dorothy.sfbay.redhat.com:/dorothy/rth/linux/linus-2.5
into dorothy.sfbay.redhat.com:/dorothy/rth/linux/axp-2.5
parents
db01fdce
23dff340
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
705 additions
and
674 deletions
+705
-674
arch/alpha/kernel/alpha_ksyms.c
arch/alpha/kernel/alpha_ksyms.c
+0
-1
arch/alpha/kernel/entry.S
arch/alpha/kernel/entry.S
+661
-616
arch/alpha/kernel/irq_alpha.c
arch/alpha/kernel/irq_alpha.c
+12
-15
arch/alpha/kernel/process.c
arch/alpha/kernel/process.c
+6
-9
arch/alpha/kernel/traps.c
arch/alpha/kernel/traps.c
+26
-33
No files found.
arch/alpha/kernel/alpha_ksyms.c
View file @
250b5e26
...
...
@@ -144,7 +144,6 @@ EXPORT_SYMBOL(pci_dac_dma_to_offset);
EXPORT_SYMBOL
(
dump_thread
);
EXPORT_SYMBOL
(
dump_fpu
);
EXPORT_SYMBOL
(
hwrpb
);
EXPORT_SYMBOL
(
wrusp
);
EXPORT_SYMBOL
(
start_thread
);
EXPORT_SYMBOL
(
alpha_read_fp_reg
);
EXPORT_SYMBOL
(
alpha_read_fp_reg_s
);
...
...
arch/alpha/kernel/entry.S
View file @
250b5e26
/*
*
a
lpha
/
entry
.
S
*
a
rch
/
alpha
/
kernel
/
entry
.
S
*
*
kernel
entry
-
points
*
Kernel
entry
-
points
.
*/
#include <linux/config.h>
...
...
@@ -11,9 +11,10 @@
#include <asm/thread_info.h>
#include <asm/unistd.h>
/*
*
stack
offsets
*/
.
text
.
set
noat
/*
Stack
offsets
.
*/
#define SP_OFF 184
#define SWITCH_STACK_SIZE 320
...
...
@@ -28,145 +29,578 @@
*/
#define SAVE_ALL \
subq
$
30
,
SP_OFF
,
$
30
;
\
stq
$
0
,
0
(
$
30
)
; \
stq
$
1
,
8
(
$
30
)
; \
stq
$
2
,
16
(
$
30
)
; \
stq
$
3
,
24
(
$
30
)
; \
stq
$
4
,
32
(
$
30
)
; \
stq
$
28
,
144
(
$
30
)
; \
lda
$
2
,
alpha_mv
; \
stq
$
5
,
40
(
$
30
)
; \
stq
$
6
,
48
(
$
30
)
; \
stq
$
7
,
56
(
$
30
)
; \
stq
$
8
,
64
(
$
30
)
; \
stq
$
19
,
72
(
$
30
)
; \
stq
$
20
,
80
(
$
30
)
; \
stq
$
21
,
88
(
$
30
)
; \
ldq
$
2
,
HAE_CACHE
(
$
2
)
; \
stq
$
22
,
96
(
$
30
)
; \
stq
$
23
,
104
(
$
30
)
; \
stq
$
24
,
112
(
$
30
)
; \
stq
$
25
,
120
(
$
30
)
; \
stq
$
26
,
128
(
$
30
)
; \
stq
$
27
,
136
(
$
30
)
; \
stq
$
2
,
152
(
$
30
)
; \
stq
$
16
,
160
(
$
30
)
; \
stq
$
17
,
168
(
$
30
)
; \
stq
$
18
,
176
(
$
30
)
subq
$
sp
,
SP_OFF
,
$sp
;
\
stq
$
0
,
0
(
$sp
)
; \
stq
$
1
,
8
(
$sp
)
; \
stq
$
2
,
16
(
$sp
)
; \
stq
$
3
,
24
(
$sp
)
; \
stq
$
4
,
32
(
$sp
)
; \
stq
$
28
,
144
(
$sp
)
; \
lda
$
2
,
alpha_mv
; \
stq
$
5
,
40
(
$sp
)
; \
stq
$
6
,
48
(
$sp
)
; \
stq
$
7
,
56
(
$sp
)
; \
stq
$
8
,
64
(
$sp
)
; \
stq
$
19
,
72
(
$sp
)
; \
stq
$
20
,
80
(
$sp
)
; \
stq
$
21
,
88
(
$sp
)
; \
ldq
$
2
,
HAE_CACHE
(
$
2
)
; \
stq
$
22
,
96
(
$sp
)
; \
stq
$
23
,
104
(
$sp
)
; \
stq
$
24
,
112
(
$sp
)
; \
stq
$
25
,
120
(
$sp
)
; \
stq
$
26
,
128
(
$sp
)
; \
stq
$
27
,
136
(
$sp
)
; \
stq
$
2
,
152
(
$sp
)
; \
stq
$
16
,
160
(
$sp
)
; \
stq
$
17
,
168
(
$sp
)
; \
stq
$
18
,
176
(
$sp
)
#define RESTORE_ALL \
lda
$
19
,
alpha_mv
; \
ldq
$
0
,
0
(
$
30
)
; \
ldq
$
1
,
8
(
$
30
)
; \
ldq
$
2
,
16
(
$
30
)
; \
ldq
$
3
,
24
(
$
30
)
; \
ldq
$
21
,
152
(
$
30
)
; \
ldq
$
20
,
HAE_CACHE
(
$
19
)
; \
ldq
$
4
,
32
(
$
30
)
; \
ldq
$
5
,
40
(
$
30
)
; \
ldq
$
6
,
48
(
$
30
)
; \
ldq
$
7
,
56
(
$
30
)
; \
subq
$
20
,
$
21
,
$
20
; \
ldq
$
8
,
64
(
$
30
)
; \
beq
$
20
,
99
f
; \
ldq
$
20
,
HAE_REG
(
$
19
)
; \
stq
$
21
,
HAE_CACHE
(
$
19
)
; \
stq
$
21
,
0
(
$
20
)
; \
ldq
$
0
,
0
(
$
30
)
; \
ldq
$
1
,
8
(
$
30
)
; \
lda
$
19
,
alpha_mv
; \
ldq
$
0
,
0
(
$sp
)
; \
ldq
$
1
,
8
(
$sp
)
; \
ldq
$
2
,
16
(
$sp
)
; \
ldq
$
3
,
24
(
$sp
)
; \
ldq
$
21
,
152
(
$sp
)
; \
ldq
$
20
,
HAE_CACHE
(
$
19
)
; \
ldq
$
4
,
32
(
$sp
)
; \
ldq
$
5
,
40
(
$sp
)
; \
ldq
$
6
,
48
(
$sp
)
; \
ldq
$
7
,
56
(
$sp
)
; \
subq
$
20
,
$
21
,
$
20
; \
ldq
$
8
,
64
(
$sp
)
; \
beq
$
20
,
99
f
; \
ldq
$
20
,
HAE_REG
(
$
19
)
; \
stq
$
21
,
HAE_CACHE
(
$
19
)
; \
stq
$
21
,
0
(
$
20
)
; \
ldq
$
0
,
0
(
$sp
)
; \
ldq
$
1
,
8
(
$sp
)
; \
99
:
; \
ldq
$
19
,
72
(
$
30
)
; \
ldq
$
20
,
80
(
$
30
)
; \
ldq
$
21
,
88
(
$
30
)
; \
ldq
$
22
,
96
(
$
30
)
; \
ldq
$
23
,
104
(
$
30
)
; \
ldq
$
24
,
112
(
$
30
)
; \
ldq
$
25
,
120
(
$
30
)
; \
ldq
$
26
,
128
(
$
30
)
; \
ldq
$
27
,
136
(
$
30
)
; \
ldq
$
28
,
144
(
$
30
)
; \
addq
$
30
,
SP_OFF
,
$
30
.
text
.
set
noat
.
align
3
.
globl
entInt
.
ent
entInt
ldq
$
19
,
72
(
$sp
)
; \
ldq
$
20
,
80
(
$sp
)
; \
ldq
$
21
,
88
(
$sp
)
; \
ldq
$
22
,
96
(
$sp
)
; \
ldq
$
23
,
104
(
$sp
)
; \
ldq
$
24
,
112
(
$sp
)
; \
ldq
$
25
,
120
(
$sp
)
; \
ldq
$
26
,
128
(
$sp
)
; \
ldq
$
27
,
136
(
$sp
)
; \
ldq
$
28
,
144
(
$sp
)
; \
addq
$sp
,
SP_OFF
,
$sp
/*
*
Non
-
syscall
kernel
entry
points
.
*/
.
align
4
.
globl
entInt
.
ent
entInt
entInt
:
SAVE_ALL
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$
30
,
$
8
,
$
8
jsr
$
31
,
do_entInt
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$sp
,
$
8
,
$
8
mov
$sp
,
$
19
jsr
$
31
,
do_entInt
.
end
entInt
.
align
3
.
globl
entMM
.
ent
entMM
.
align
4
.
globl
entArith
.
ent
entArith
entArith
:
SAVE_ALL
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$sp
,
$
8
,
$
8
mov
$sp
,
$
18
jsr
$
31
,
do_entArith
.
end
entArith
.
align
4
.
globl
entMM
.
ent
entMM
entMM
:
SAVE_ALL
/*
save
$
9
-
$
15
so
the
inline
exception
code
can
manipulate
them
.
*/
subq
$
30
,
56
,
$
30
stq
$
9
,
0
(
$
30
)
stq
$
10
,
8
(
$
30
)
stq
$
11
,
16
(
$
30
)
stq
$
12
,
24
(
$
30
)
stq
$
13
,
32
(
$
30
)
stq
$
14
,
40
(
$
30
)
stq
$
15
,
48
(
$
30
)
addq
$
30
,
56
,
$
19
subq
$
sp
,
56
,
$sp
stq
$
9
,
0
(
$sp
)
stq
$
10
,
8
(
$sp
)
stq
$
11
,
16
(
$sp
)
stq
$
12
,
24
(
$sp
)
stq
$
13
,
32
(
$sp
)
stq
$
14
,
40
(
$sp
)
stq
$
15
,
48
(
$sp
)
addq
$
sp
,
56
,
$
19
/*
handle
the
fault
*/
lda
$
8
,
0x3fff
bic
$
30
,
$
8
,
$
8
jsr
$
26
,
do_page_fault
lda
$
8
,
0x3fff
bic
$
sp
,
$
8
,
$
8
jsr
$
26
,
do_page_fault
/*
reload
the
registers
after
the
exception
code
played
.
*/
ldq
$
9
,
0
(
$
30
)
ldq
$
10
,
8
(
$
30
)
ldq
$
11
,
16
(
$
30
)
ldq
$
12
,
24
(
$
30
)
ldq
$
13
,
32
(
$
30
)
ldq
$
14
,
40
(
$
30
)
ldq
$
15
,
48
(
$
30
)
addq
$
30
,
56
,
$
30
ldq
$
9
,
0
(
$sp
)
ldq
$
10
,
8
(
$sp
)
ldq
$
11
,
16
(
$sp
)
ldq
$
12
,
24
(
$sp
)
ldq
$
13
,
32
(
$sp
)
ldq
$
14
,
40
(
$sp
)
ldq
$
15
,
48
(
$sp
)
addq
$
sp
,
56
,
$sp
/*
finish
up
the
syscall
as
normal
.
*/
br
ret_from_sys_call
.
end
entMM
.
align
3
.
globl
entArith
.
ent
entArith
entArith
:
SAVE_ALL
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$
30
,
$
8
,
$
8
jsr
$
31
,
do_entArith
.
end
entArith
.
align
3
.
globl
entIF
.
ent
entIF
.
align
4
.
globl
entIF
.
ent
entIF
entIF
:
SAVE_ALL
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$
30
,
$
8
,
$
8
jsr
$
31
,
do_entIF
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$sp
,
$
8
,
$
8
mov
$sp
,
$
17
jsr
$
31
,
do_entIF
.
end
entIF
.
align
3
.
globl
entDbg
.
ent
entDbg
.
align
4
.
globl
entUna
.
ent
entUna
entUna
:
lda
$sp
,
-
256
(
$sp
)
stq
$
0
,
0
(
$sp
)
ldq
$
0
,
256
(
$sp
)
/*
get
PS
*/
stq
$
1
,
8
(
$sp
)
stq
$
2
,
16
(
$sp
)
stq
$
3
,
24
(
$sp
)
and
$
0
,
8
,
$
0
/*
user
mode
?
*/
stq
$
4
,
32
(
$sp
)
bne
$
0
,
entUnaUser
/*
yup
->
do
user
-
level
unaligned
fault
*/
stq
$
5
,
40
(
$sp
)
stq
$
6
,
48
(
$sp
)
stq
$
7
,
56
(
$sp
)
stq
$
8
,
64
(
$sp
)
stq
$
9
,
72
(
$sp
)
stq
$
10
,
80
(
$sp
)
stq
$
11
,
88
(
$sp
)
stq
$
12
,
96
(
$sp
)
stq
$
13
,
104
(
$sp
)
stq
$
14
,
112
(
$sp
)
stq
$
15
,
120
(
$sp
)
/
*
16
-
18
PAL
-
saved
*/
stq
$
19
,
152
(
$sp
)
stq
$
20
,
160
(
$sp
)
stq
$
21
,
168
(
$sp
)
stq
$
22
,
176
(
$sp
)
stq
$
23
,
184
(
$sp
)
stq
$
24
,
192
(
$sp
)
stq
$
25
,
200
(
$sp
)
stq
$
26
,
208
(
$sp
)
stq
$
27
,
216
(
$sp
)
stq
$
28
,
224
(
$sp
)
stq
$gp
,
232
(
$sp
)
lda
$
8
,
0x3fff
stq
$
31
,
248
(
$sp
)
bic
$sp
,
$
8
,
$
8
jsr
$
26
,
do_entUna
ldq
$
0
,
0
(
$sp
)
ldq
$
1
,
8
(
$sp
)
ldq
$
2
,
16
(
$sp
)
ldq
$
3
,
24
(
$sp
)
ldq
$
4
,
32
(
$sp
)
ldq
$
5
,
40
(
$sp
)
ldq
$
6
,
48
(
$sp
)
ldq
$
7
,
56
(
$sp
)
ldq
$
8
,
64
(
$sp
)
ldq
$
9
,
72
(
$sp
)
ldq
$
10
,
80
(
$sp
)
ldq
$
11
,
88
(
$sp
)
ldq
$
12
,
96
(
$sp
)
ldq
$
13
,
104
(
$sp
)
ldq
$
14
,
112
(
$sp
)
ldq
$
15
,
120
(
$sp
)
/
*
16
-
18
PAL
-
saved
*/
ldq
$
19
,
152
(
$sp
)
ldq
$
20
,
160
(
$sp
)
ldq
$
21
,
168
(
$sp
)
ldq
$
22
,
176
(
$sp
)
ldq
$
23
,
184
(
$sp
)
ldq
$
24
,
192
(
$sp
)
ldq
$
25
,
200
(
$sp
)
ldq
$
26
,
208
(
$sp
)
ldq
$
27
,
216
(
$sp
)
ldq
$
28
,
224
(
$sp
)
ldq
$gp
,
232
(
$sp
)
lda
$sp
,
256
(
$sp
)
call_pal
PAL_rti
.
end
entUna
.
align
4
.
ent
entUnaUser
entUnaUser
:
ldq
$
0
,
0
(
$sp
)
/*
restore
original
$
0
*/
lda
$sp
,
256
(
$sp
)
/*
pop
entUna
's stack frame */
SAVE_ALL
/*
setup
normal
kernel
stack
*/
lda
$sp
,
-
56
(
$sp
)
stq
$
9
,
0
(
$sp
)
stq
$
10
,
8
(
$sp
)
stq
$
11
,
16
(
$sp
)
stq
$
12
,
24
(
$sp
)
stq
$
13
,
32
(
$sp
)
stq
$
14
,
40
(
$sp
)
stq
$
15
,
48
(
$sp
)
lda
$
8
,
0x3fff
addq
$sp
,
56
,
$
19
bic
$sp
,
$
8
,
$
8
jsr
$
26
,
do_entUnaUser
ldq
$
9
,
0
(
$sp
)
ldq
$
10
,
8
(
$sp
)
ldq
$
11
,
16
(
$sp
)
ldq
$
12
,
24
(
$sp
)
ldq
$
13
,
32
(
$sp
)
ldq
$
14
,
40
(
$sp
)
ldq
$
15
,
48
(
$sp
)
lda
$sp
,
56
(
$sp
)
br
ret_from_sys_call
.
end
entUnaUser
.
align
4
.
globl
entDbg
.
ent
entDbg
entDbg
:
SAVE_ALL
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$
30
,
$
8
,
$
8
jsr
$
31
,
do_entDbg
lda
$
8
,
0x3fff
lda
$
26
,
ret_from_sys_call
bic
$sp
,
$
8
,
$
8
mov
$sp
,
$
16
jsr
$
31
,
do_entDbg
.
end
entDbg
/*
*
The
system
call
entry
point
is
special
.
Most
importantly
,
it
looks
*
like
a
function
call
to
userspace
as
far
as
clobbered
registers
.
We
*
do
preserve
the
argument
registers
(
for
syscall
restarts
)
and
$
26
*
(
for
leaf
syscall
functions
)
.
*
*
So
much
for
theory
.
We
don
't take advantage of this yet.
*
*
Note
that
a0
-
a2
are
not
saved
by
PALcode
as
with
the
other
entry
points
.
*/
.
align
4
.
globl
entSys
.
globl
ret_from_sys_call
.
ent
entSys
entSys
:
SAVE_ALL
lda
$
8
,
0x3fff
bic
$sp
,
$
8
,
$
8
lda
$
4
,
NR_SYSCALLS
(
$
31
)
stq
$
16
,
SP_OFF
+
24
(
$sp
)
lda
$
5
,
sys_call_table
lda
$
27
,
sys_ni_syscall
cmpult
$
0
,
$
4
,
$
4
ldl
$
3
,
TI_FLAGS
(
$
8
)
stq
$
17
,
SP_OFF
+
32
(
$sp
)
s8addq
$
0
,
$
5
,
$
5
stq
$
18
,
SP_OFF
+
40
(
$sp
)
blbs
$
3
,
strace
beq
$
4
,
1
f
ldq
$
27
,
0
(
$
5
)
1
:
jsr
$
26
,
(
$
27
),
alpha_ni_syscall
ldgp
$gp
,
0
(
$
26
)
blt
$
0
,
$syscall_error
/*
the
call
failed
*/
stq
$
0
,
0
(
$sp
)
stq
$
31
,
72
(
$sp
)
/*
a3
=
0
=>
no
error
*/
.
align
4
ret_from_sys_call
:
cmovne
$
26
,
0
,
$
19
/*
$
19
=
0
=>
non
-
restartable
*/
ldq
$
0
,
SP_OFF
(
$sp
)
and
$
0
,
8
,
$
0
beq
$
0
,
restore_all
ret_from_reschedule
:
/
*
Make
sure
need_resched
and
sigpending
don
't change between
sampling
and
the
rti
.
*/
lda
$
16
,
7
call_pal
PAL_swpipl
ldl
$
5
,
TI_FLAGS
(
$
8
)
and
$
5
,
_TIF_WORK_MASK
,
$
2
bne
$
5
,
work_pending
restore_all
:
RESTORE_ALL
call_pal
PAL_rti
.
align
3
$syscall_error
:
/
*
*
Some
system
calls
(
e
.
g
.
,
ptrace
)
can
return
arbitrary
*
values
which
might
normally
be
mistaken
as
error
numbers
.
*
Those
functions
must
zero
$
0
(
v0
)
directly
in
the
stack
*
frame
to
indicate
that
a
negative
return
value
wasn
't an
*
error
number
..
*/
ldq
$
19
,
0
(
$sp
)
/*
old
syscall
nr
(
zero
if
success
)
*/
beq
$
19
,
$ret_success
ldq
$
20
,
72
(
$sp
)
/*
..
and
this
a3
*/
subq
$
31
,
$
0
,
$
0
/*
with
error
in
v0
*/
addq
$
31
,
1
,
$
1
/*
set
a3
for
errno
return
*/
stq
$
0
,
0
(
$sp
)
mov
$
31
,
$
26
/*
tell
"ret_from_sys_call"
we
can
restart
*/
stq
$
1
,
72
(
$sp
)
/*
a3
for
return
*/
br
ret_from_sys_call
$ret_success
:
stq
$
0
,
0
(
$sp
)
stq
$
31
,
72
(
$sp
)
/*
a3
=
0
=>
no
error
*/
br
ret_from_sys_call
.
end
entSys
/*
*
Do
all
cleanup
when
returning
from
all
interrupts
and
system
calls
.
*
*
Arguments
:
*
$
5
:
TI_FLAGS
.
*
$
8
:
current
.
*
$
19
:
The
old
syscall
number
,
or
zero
if
this
is
not
a
return
*
from
a
syscall
that
errored
and
is
possibly
restartable
.
*
$
20
:
Error
indication
.
*/
.
align
4
.
ent
work_pending
work_pending
:
and
$
5
,
_TIF_NEED_RESCHED
,
$
2
beq
$
2
,
$work_notifysig
$work_resched
:
subq
$sp
,
16
,
$sp
stq
$
19
,
0
(
$sp
)
/*
save
syscall
nr
*/
stq
$
20
,
8
(
$sp
)
/*
and
error
indication
(
a3
)
*/
jsr
$
26
,
schedule
ldq
$
19
,
0
(
$sp
)
ldq
$
20
,
8
(
$sp
)
addq
$sp
,
16
,
$sp
/
*
Make
sure
need_resched
and
sigpending
don
't change between
sampling
and
the
rti
.
*/
lda
$
16
,
7
call_pal
PAL_swpipl
ldl
$
5
,
TI_FLAGS
(
$
8
)
and
$
5
,
_TIF_WORK_MASK
,
$
2
beq
$
2
,
restore_all
and
$
5
,
_TIF_NEED_RESCHED
,
$
2
bne
$
2
,
$work_resched
$work_notifysig
:
mov
$sp
,
$
17
br
$
1
,
do_switch_stack
mov
$
5
,
$
21
mov
$sp
,
$
18
mov
$
31
,
$
16
jsr
$
26
,
do_notify_resume
bsr
$
1
,
undo_switch_stack
br
restore_all
.
end
work_pending
/*
*
PTRACE
syscall
handler
*/
.
align
4
.
ent
strace
strace
:
/
*
set
up
signal
stack
,
call
syscall_trace
*/
bsr
$
1
,
do_switch_stack
jsr
$
26
,
syscall_trace
bsr
$
1
,
undo_switch_stack
/
*
get
the
system
call
number
and
the
arguments
back
..
*/
ldq
$
0
,
0
(
$sp
)
ldq
$
16
,
SP_OFF
+
24
(
$sp
)
ldq
$
17
,
SP_OFF
+
32
(
$sp
)
ldq
$
18
,
SP_OFF
+
40
(
$sp
)
ldq
$
19
,
72
(
$sp
)
ldq
$
20
,
80
(
$sp
)
ldq
$
21
,
88
(
$sp
)
/
*
get
the
system
call
pointer
..
*/
lda
$
1
,
NR_SYSCALLS
(
$
31
)
lda
$
2
,
sys_call_table
lda
$
27
,
alpha_ni_syscall
cmpult
$
0
,
$
1
,
$
1
s8addq
$
0
,
$
2
,
$
2
beq
$
1
,
1
f
ldq
$
27
,
0
(
$
2
)
1
:
jsr
$
26
,
(
$
27
),
sys_gettimeofday
ldgp
$gp
,
0
(
$
26
)
/
*
check
return
..
*/
blt
$
0
,
$strace_error
/*
the
call
failed
*/
stq
$
31
,
72
(
$sp
)
/*
a3
=
0
=>
no
error
*/
$strace_success
:
stq
$
0
,
0
(
$sp
)
/*
save
return
value
*/
bsr
$
1
,
do_switch_stack
jsr
$
26
,
syscall_trace
bsr
$
1
,
undo_switch_stack
br
$
31
,
ret_from_sys_call
.
align
3
$strace_error
:
ldq
$
19
,
0
(
$sp
)
/*
old
syscall
nr
(
zero
if
success
)
*/
beq
$
19
,
$strace_success
ldq
$
20
,
72
(
$sp
)
/*
..
and
this
a3
*/
subq
$
31
,
$
0
,
$
0
/*
with
error
in
v0
*/
addq
$
31
,
1
,
$
1
/*
set
a3
for
errno
return
*/
stq
$
0
,
0
(
$sp
)
stq
$
1
,
72
(
$sp
)
/*
a3
for
return
*/
bsr
$
1
,
do_switch_stack
mov
$
19
,
$
9
/*
save
old
syscall
number
*/
mov
$
20
,
$
10
/*
save
old
a3
*/
jsr
$
26
,
syscall_trace
mov
$
9
,
$
19
mov
$
10
,
$
20
bsr
$
1
,
undo_switch_stack
mov
$
31
,
$
26
/*
tell
"ret_from_sys_call"
we
can
restart
*/
br
ret_from_sys_call
.
end
strace
/*
*
Save
and
restore
the
switch
stack
--
aka
the
balance
of
the
user
context
.
*/
.
align
4
.
ent
do_switch_stack
do_switch_stack
:
lda
$sp
,
-
SWITCH_STACK_SIZE
(
$sp
)
stq
$
9
,
0
(
$sp
)
stq
$
10
,
8
(
$sp
)
stq
$
11
,
16
(
$sp
)
stq
$
12
,
24
(
$sp
)
stq
$
13
,
32
(
$sp
)
stq
$
14
,
40
(
$sp
)
stq
$
15
,
48
(
$sp
)
stq
$
26
,
56
(
$sp
)
stt
$f0
,
64
(
$sp
)
stt
$f1
,
72
(
$sp
)
stt
$f2
,
80
(
$sp
)
stt
$f3
,
88
(
$sp
)
stt
$f4
,
96
(
$sp
)
stt
$f5
,
104
(
$sp
)
stt
$f6
,
112
(
$sp
)
stt
$f7
,
120
(
$sp
)
stt
$f8
,
128
(
$sp
)
stt
$f9
,
136
(
$sp
)
stt
$f10
,
144
(
$sp
)
stt
$f11
,
152
(
$sp
)
stt
$f12
,
160
(
$sp
)
stt
$f13
,
168
(
$sp
)
stt
$f14
,
176
(
$sp
)
stt
$f15
,
184
(
$sp
)
stt
$f16
,
192
(
$sp
)
stt
$f17
,
200
(
$sp
)
stt
$f18
,
208
(
$sp
)
stt
$f19
,
216
(
$sp
)
stt
$f20
,
224
(
$sp
)
stt
$f21
,
232
(
$sp
)
stt
$f22
,
240
(
$sp
)
stt
$f23
,
248
(
$sp
)
stt
$f24
,
256
(
$sp
)
stt
$f25
,
264
(
$sp
)
stt
$f26
,
272
(
$sp
)
stt
$f27
,
280
(
$sp
)
mf_fpcr
$f0
#
get
fpcr
stt
$f28
,
288
(
$sp
)
stt
$f29
,
296
(
$sp
)
stt
$f30
,
304
(
$sp
)
stt
$f0
,
312
(
$sp
)
#
save
fpcr
in
slot
of
$f31
ldt
$f0
,
64
(
$sp
)
#
dont
let
"do_switch_stack"
change
fp
state
.
ret
$
31
,
(
$
1
),
1
.
end
do_switch_stack
.
align
4
.
ent
undo_switch_stack
undo_switch_stack
:
ldq
$
9
,
0
(
$sp
)
ldq
$
10
,
8
(
$sp
)
ldq
$
11
,
16
(
$sp
)
ldq
$
12
,
24
(
$sp
)
ldq
$
13
,
32
(
$sp
)
ldq
$
14
,
40
(
$sp
)
ldq
$
15
,
48
(
$sp
)
ldq
$
26
,
56
(
$sp
)
ldt
$f30
,
312
(
$sp
)
#
get
saved
fpcr
ldt
$f0
,
64
(
$sp
)
ldt
$f1
,
72
(
$sp
)
ldt
$f2
,
80
(
$sp
)
ldt
$f3
,
88
(
$sp
)
mt_fpcr
$f30
#
install
saved
fpcr
ldt
$f4
,
96
(
$sp
)
ldt
$f5
,
104
(
$sp
)
ldt
$f6
,
112
(
$sp
)
ldt
$f7
,
120
(
$sp
)
ldt
$f8
,
128
(
$sp
)
ldt
$f9
,
136
(
$sp
)
ldt
$f10
,
144
(
$sp
)
ldt
$f11
,
152
(
$sp
)
ldt
$f12
,
160
(
$sp
)
ldt
$f13
,
168
(
$sp
)
ldt
$f14
,
176
(
$sp
)
ldt
$f15
,
184
(
$sp
)
ldt
$f16
,
192
(
$sp
)
ldt
$f17
,
200
(
$sp
)
ldt
$f18
,
208
(
$sp
)
ldt
$f19
,
216
(
$sp
)
ldt
$f20
,
224
(
$sp
)
ldt
$f21
,
232
(
$sp
)
ldt
$f22
,
240
(
$sp
)
ldt
$f23
,
248
(
$sp
)
ldt
$f24
,
256
(
$sp
)
ldt
$f25
,
264
(
$sp
)
ldt
$f26
,
272
(
$sp
)
ldt
$f27
,
280
(
$sp
)
ldt
$f28
,
288
(
$sp
)
ldt
$f29
,
296
(
$sp
)
ldt
$f30
,
304
(
$sp
)
lda
$sp
,
SWITCH_STACK_SIZE
(
$sp
)
ret
$
31
,
(
$
1
),
1
.
end
undo_switch_stack
/*
*
The
meat
of
the
context
switch
code
.
*/
.
align
4
.
globl
alpha_switch_to
.
ent
alpha_switch_to
alpha_switch_to
:
.
prologue
0
bsr
$
1
,
do_switch_stack
call_pal
PAL_swpctx
lda
$
8
,
0x3fff
bsr
$
1
,
undo_switch_stack
bic
$sp
,
$
8
,
$
8
ret
$
31
,
(
$
26
),
1
.
end
alpha_switch_to
/*
*
New
processes
begin
life
here
.
*/
.
globl
ret_from_fork
#if CONFIG_SMP || CONFIG_PREEMPT
.
align
4
.
ent
ret_from_fork
ret_from_fork
:
lda
$
26
,
ret_from_sys_call
mov
$
17
,
$
16
jmp
$
31
,
schedule_tail
.
end
ret_from_fork
#else
ret_from_fork
=
ret_from_sys_call
#endif
/*
*
kernel_thread
(
fn
,
arg
,
clone_flags
)
...
...
@@ -175,9 +609,9 @@ entDbg:
.
globl
kernel_thread
.
ent
kernel_thread
kernel_thread
:
ldgp
$
29
,
0
(
$
27
)
/*
we
can
be
called
from
a
module
*/
ldgp
$
gp
,
0
(
$
27
)
/*
we
can
be
called
from
a
module
*/
.
prologue
1
subq
$
30
,
SP_OFF
+
6
*
8
,
$
30
subq
$
sp
,
SP_OFF
+
6
*
8
,
$sp
br
$
1
,
2
f
/*
load
start
address
*/
/
*
We
've now "returned" from a fake system call. */
...
...
@@ -186,9 +620,9 @@ kernel_thread:
ldi
$
1
,
0x3fff
beq
$
20
,
1
f
/*
parent
or
child
?
*/
bic
$
30
,
$
1
,
$
8
/*
in
child
.
*/
bic
$
sp
,
$
1
,
$
8
/*
in
child
.
*/
jsr
$
26
,
(
$
27
)
ldgp
$
29
,
0
(
$
26
)
ldgp
$
gp
,
0
(
$
26
)
mov
$
0
,
$
16
mov
$
31
,
$
26
jmp
$
31
,
sys_exit
...
...
@@ -200,16 +634,16 @@ kernel_thread:
from
kernel
space
.
Note
that
we
store
FN
and
ARG
as
they
need
to
be
set
up
in
the
child
for
the
call
.
Also
store
$
8
and
$
26
for
use
in
the
parent
.
*/
stq
$
31
,
SP_OFF
(
$
30
)
/*
ps
*/
stq
$
1
,
SP_OFF
+
8
(
$
30
)
/*
pc
*/
stq
$
29
,
SP_OFF
+
16
(
$
30
)
/*
gp
*/
stq
$
16
,
136
(
$
30
)
/*
$
27
; FN for child */
stq
$
17
,
SP_OFF
+
24
(
$
30
)
/*
$
16
; ARG for child */
stq
$
8
,
64
(
$
30
)
/*
$
8
*/
stq
$
26
,
128
(
$
30
)
/*
$
26
*/
stq
$
31
,
SP_OFF
(
$
sp
)
/*
ps
*/
stq
$
1
,
SP_OFF
+
8
(
$
sp
)
/*
pc
*/
stq
$
gp
,
SP_OFF
+
16
(
$sp
)
/*
gp
*/
stq
$
16
,
136
(
$
sp
)
/*
$
27
; FN for child */
stq
$
17
,
SP_OFF
+
24
(
$
sp
)
/*
$
16
; ARG for child */
stq
$
8
,
64
(
$
sp
)
/*
$
8
*/
stq
$
26
,
128
(
$
sp
)
/*
$
26
*/
/
*
Avoid
the
HAE
being
gratuitously
wrong
,
to
avoid
restoring
it
.
*/
ldq
$
2
,
alpha_mv
+
HAE_CACHE
stq
$
2
,
152
(
$
30
)
/*
HAE
*/
stq
$
2
,
152
(
$
sp
)
/*
HAE
*/
/
*
Shuffle
FLAGS
to
the
front
; add CLONE_VM. */
ldi
$
1
,
CLONE_VM
|
CLONE_UNTRACED
...
...
@@ -218,515 +652,126 @@ kernel_thread:
/
*
We
don
't actually care for a3 success widgetry in the kernel.
Not
for
positive
errno
values
.
*/
stq
$
0
,
0
(
$
30
)
/*
$
0
*/
stq
$
0
,
0
(
$
sp
)
/*
$
0
*/
br
restore_all
.
end
kernel_thread
/*
*
__kernel_execve
(
path
,
argv
,
envp
,
regs
)
*/
.
align
3
.
globl
__kernel_execve
.
ent
__kernel_execve
.
align
4
.
globl
__kernel_execve
.
ent
__kernel_execve
__kernel_execve
:
ldgp
$
29
,
0
(
$
27
)
/*
we
can
be
called
from
modules
.
*/
subq
$
30
,
16
,
$
30
.
frame
$
30
,
16
,
$
26
,
0
stq
$
26
,
0
(
$
30
)
stq
$
19
,
8
(
$
30
)
ldgp
$
gp
,
0
(
$
27
)
/*
we
can
be
called
from
modules
.
*/
subq
$
sp
,
16
,
$sp
.
frame
$
sp
,
16
,
$
26
,
0
stq
$
26
,
0
(
$sp
)
stq
$
19
,
8
(
$sp
)
.
prologue
1
jsr
$
26
,
do_execve
bne
$
0
,
1
f
/*
error
!
*/
ldq
$
30
,
8
(
$
30
)
br
$
31
,
ret_from_sys_call
1
:
ldq
$
26
,
0
(
$
30
)
addq
$
30
,
16
,
$
30
jsr
$
26
,
do_execve
bne
$
0
,
1
f
/*
error
!
*/
ldq
$
sp
,
8
(
$sp
)
br
$
31
,
ret_from_sys_call
1
:
ldq
$
26
,
0
(
$sp
)
addq
$
sp
,
16
,
$sp
ret
.
end
__kernel_execve
.
align
3
.
ent
do_switch_stack
do_switch_stack
:
lda
$
30
,-
SWITCH_STACK_SIZE
(
$
30
)
stq
$
9
,
0
(
$
30
)
stq
$
10
,
8
(
$
30
)
stq
$
11
,
16
(
$
30
)
stq
$
12
,
24
(
$
30
)
stq
$
13
,
32
(
$
30
)
stq
$
14
,
40
(
$
30
)
stq
$
15
,
48
(
$
30
)
stq
$
26
,
56
(
$
30
)
stt
$f0
,
64
(
$
30
)
stt
$f1
,
72
(
$
30
)
stt
$f2
,
80
(
$
30
)
stt
$f3
,
88
(
$
30
)
stt
$f4
,
96
(
$
30
)
stt
$f5
,
104
(
$
30
)
stt
$f6
,
112
(
$
30
)
stt
$f7
,
120
(
$
30
)
stt
$f8
,
128
(
$
30
)
stt
$f9
,
136
(
$
30
)
stt
$f10
,
144
(
$
30
)
stt
$f11
,
152
(
$
30
)
stt
$f12
,
160
(
$
30
)
stt
$f13
,
168
(
$
30
)
stt
$f14
,
176
(
$
30
)
stt
$f15
,
184
(
$
30
)
stt
$f16
,
192
(
$
30
)
stt
$f17
,
200
(
$
30
)
stt
$f18
,
208
(
$
30
)
stt
$f19
,
216
(
$
30
)
stt
$f20
,
224
(
$
30
)
stt
$f21
,
232
(
$
30
)
stt
$f22
,
240
(
$
30
)
stt
$f23
,
248
(
$
30
)
stt
$f24
,
256
(
$
30
)
stt
$f25
,
264
(
$
30
)
stt
$f26
,
272
(
$
30
)
stt
$f27
,
280
(
$
30
)
mf_fpcr
$f0
#
get
fpcr
stt
$f28
,
288
(
$
30
)
stt
$f29
,
296
(
$
30
)
stt
$f30
,
304
(
$
30
)
stt
$f0
,
312
(
$
30
)
#
save
fpcr
in
slot
of
$f31
ldt
$f0
,
64
(
$
30
)
#
dont
let
"do_switch_stack"
change
fp
state
.
ret
$
31
,(
$
1
),
1
.
end
do_switch_stack
.
align
3
.
ent
undo_switch_stack
undo_switch_stack
:
ldq
$
9
,
0
(
$
30
)
ldq
$
10
,
8
(
$
30
)
ldq
$
11
,
16
(
$
30
)
ldq
$
12
,
24
(
$
30
)
ldq
$
13
,
32
(
$
30
)
ldq
$
14
,
40
(
$
30
)
ldq
$
15
,
48
(
$
30
)
ldq
$
26
,
56
(
$
30
)
ldt
$f30
,
312
(
$
30
)
#
get
saved
fpcr
ldt
$f0
,
64
(
$
30
)
ldt
$f1
,
72
(
$
30
)
ldt
$f2
,
80
(
$
30
)
ldt
$f3
,
88
(
$
30
)
mt_fpcr
$f30
#
install
saved
fpcr
ldt
$f4
,
96
(
$
30
)
ldt
$f5
,
104
(
$
30
)
ldt
$f6
,
112
(
$
30
)
ldt
$f7
,
120
(
$
30
)
ldt
$f8
,
128
(
$
30
)
ldt
$f9
,
136
(
$
30
)
ldt
$f10
,
144
(
$
30
)
ldt
$f11
,
152
(
$
30
)
ldt
$f12
,
160
(
$
30
)
ldt
$f13
,
168
(
$
30
)
ldt
$f14
,
176
(
$
30
)
ldt
$f15
,
184
(
$
30
)
ldt
$f16
,
192
(
$
30
)
ldt
$f17
,
200
(
$
30
)
ldt
$f18
,
208
(
$
30
)
ldt
$f19
,
216
(
$
30
)
ldt
$f20
,
224
(
$
30
)
ldt
$f21
,
232
(
$
30
)
ldt
$f22
,
240
(
$
30
)
ldt
$f23
,
248
(
$
30
)
ldt
$f24
,
256
(
$
30
)
ldt
$f25
,
264
(
$
30
)
ldt
$f26
,
272
(
$
30
)
ldt
$f27
,
280
(
$
30
)
ldt
$f28
,
288
(
$
30
)
ldt
$f29
,
296
(
$
30
)
ldt
$f30
,
304
(
$
30
)
lda
$
30
,
SWITCH_STACK_SIZE
(
$
30
)
ret
$
31
,(
$
1
),
1
.
end
undo_switch_stack
.
align
3
.
globl
entUna
.
ent
entUna
entUna
:
lda
$
30
,-
256
(
$
30
)
stq
$
0
,
0
(
$
30
)
ldq
$
0
,
256
(
$
30
)
/*
get
PS
*/
stq
$
1
,
8
(
$
30
)
stq
$
2
,
16
(
$
30
)
stq
$
3
,
24
(
$
30
)
and
$
0
,
8
,
$
0
/*
user
mode
?
*/
stq
$
4
,
32
(
$
30
)
bne
$
0
,
entUnaUser
/*
yup
->
do
user
-
level
unaligned
fault
*/
stq
$
5
,
40
(
$
30
)
stq
$
6
,
48
(
$
30
)
stq
$
7
,
56
(
$
30
)
stq
$
8
,
64
(
$
30
)
stq
$
9
,
72
(
$
30
)
stq
$
10
,
80
(
$
30
)
stq
$
11
,
88
(
$
30
)
stq
$
12
,
96
(
$
30
)
stq
$
13
,
104
(
$
30
)
stq
$
14
,
112
(
$
30
)
stq
$
15
,
120
(
$
30
)
/
*
16
-
18
PAL
-
saved
*/
stq
$
19
,
152
(
$
30
)
stq
$
20
,
160
(
$
30
)
stq
$
21
,
168
(
$
30
)
stq
$
22
,
176
(
$
30
)
stq
$
23
,
184
(
$
30
)
stq
$
24
,
192
(
$
30
)
stq
$
25
,
200
(
$
30
)
stq
$
26
,
208
(
$
30
)
stq
$
27
,
216
(
$
30
)
stq
$
28
,
224
(
$
30
)
stq
$
29
,
232
(
$
30
)
lda
$
8
,
0x3fff
stq
$
31
,
248
(
$
30
)
bic
$
30
,
$
8
,
$
8
jsr
$
26
,
do_entUna
ldq
$
0
,
0
(
$
30
)
ldq
$
1
,
8
(
$
30
)
ldq
$
2
,
16
(
$
30
)
ldq
$
3
,
24
(
$
30
)
ldq
$
4
,
32
(
$
30
)
ldq
$
5
,
40
(
$
30
)
ldq
$
6
,
48
(
$
30
)
ldq
$
7
,
56
(
$
30
)
ldq
$
8
,
64
(
$
30
)
ldq
$
9
,
72
(
$
30
)
ldq
$
10
,
80
(
$
30
)
ldq
$
11
,
88
(
$
30
)
ldq
$
12
,
96
(
$
30
)
ldq
$
13
,
104
(
$
30
)
ldq
$
14
,
112
(
$
30
)
ldq
$
15
,
120
(
$
30
)
/
*
16
-
18
PAL
-
saved
*/
ldq
$
19
,
152
(
$
30
)
ldq
$
20
,
160
(
$
30
)
ldq
$
21
,
168
(
$
30
)
ldq
$
22
,
176
(
$
30
)
ldq
$
23
,
184
(
$
30
)
ldq
$
24
,
192
(
$
30
)
ldq
$
25
,
200
(
$
30
)
ldq
$
26
,
208
(
$
30
)
ldq
$
27
,
216
(
$
30
)
ldq
$
28
,
224
(
$
30
)
ldq
$
29
,
232
(
$
30
)
lda
$
30
,
256
(
$
30
)
call_pal
PAL_rti
.
end
entUna
.
align
3
.
ent
entUnaUser
entUnaUser
:
ldq
$
0
,
0
(
$
30
)
/*
restore
original
$
0
*/
lda
$
30
,
256
(
$
30
)
/*
pop
entUna
's stack frame */
SAVE_ALL
/*
setup
normal
kernel
stack
*/
lda
$
30
,-
56
(
$
30
)
stq
$
9
,
0
(
$
30
)
stq
$
10
,
8
(
$
30
)
stq
$
11
,
16
(
$
30
)
stq
$
12
,
24
(
$
30
)
stq
$
13
,
32
(
$
30
)
stq
$
14
,
40
(
$
30
)
stq
$
15
,
48
(
$
30
)
lda
$
8
,
0x3fff
addq
$
30
,
56
,
$
19
bic
$
30
,
$
8
,
$
8
jsr
$
26
,
do_entUnaUser
ldq
$
9
,
0
(
$
30
)
ldq
$
10
,
8
(
$
30
)
ldq
$
11
,
16
(
$
30
)
ldq
$
12
,
24
(
$
30
)
ldq
$
13
,
32
(
$
30
)
ldq
$
14
,
40
(
$
30
)
ldq
$
15
,
48
(
$
30
)
lda
$
30
,
56
(
$
30
)
br
ret_from_sys_call
.
end
entUnaUser
/*
*
A
fork
is
the
same
as
clone
(
SIGCHLD
,
0
)
;
*
Special
system
calls
.
Most
of
these
are
special
in
that
they
either
*
have
to
play
switch_stack
games
or
in
some
way
use
the
pt_regs
struct
.
*/
.
align
3
.
globl
sys_fork
.
ent
sys_fork
.
align
4
.
globl
sys_fork
.
ent
sys_fork
sys_fork
:
bsr
$
1
,
do_switch_stack
bis
$
31
,
SIGCHLD
,
$
16
mov
$
31
,
$
17
mov
$
31
,
$
18
mov
$
30
,
$
19
jsr
$
26
,
alpha_clone
bsr
$
1
,
undo_switch_stack
ret
$
31
,(
$
26
),
1
mov
$sp
,
$
19
bsr
$
1
,
do_switch_stack
/
*
A
fork
is
the
same
as
clone
(
SIGCHLD
,
0
)
; */
bis
$
31
,
SIGCHLD
,
$
16
mov
$
31
,
$
17
mov
$
31
,
$
18
jsr
$
26
,
alpha_clone
bsr
$
1
,
undo_switch_stack
ret
$
31
,
(
$
26
),
1
.
end
sys_fork
.
align
3
.
globl
sys_clone
.
ent
sys_clone
.
align
4
.
globl
sys_clone
.
ent
sys_clone
sys_clone
:
bsr
$
1
,
do_switch_stack
mov
$sp
,
$
19
bsr
$
1
,
do_switch_stack
/
*
$
16
,
$
17
,
$
18
,
$
19
come
from
the
user
; $19 is used later
via
pt_regs
->
r19
.
*/
mov
$
30
,
$
19
jsr
$
26
,
alpha_clone
bsr
$
1
,
undo_switch_stack
ret
$
31
,(
$
26
),
1
jsr
$
26
,
alpha_clone
bsr
$
1
,
undo_switch_stack
ret
$
31
,
(
$
26
),
1
.
end
sys_clone
.
align
3
.
globl
sys_vfork
.
ent
sys_vfork
.
align
4
.
globl
sys_vfork
.
ent
sys_vfork
sys_vfork
:
bsr
$
1
,
do_switch_stack
mov
$
30
,
$
16
jsr
$
26
,
alpha_vfork
bsr
$
1
,
undo_switch_stack
ret
$
31
,
(
$
26
),
1
bsr
$
1
,
do_switch_stack
mov
$
sp
,
$
16
jsr
$
26
,
alpha_vfork
bsr
$
1
,
undo_switch_stack
ret
$
31
,
(
$
26
),
1
.
end
sys_vfork
.
align
3
.
globl
alpha_switch_to
.
ent
alpha_switch_to
alpha_switch_to
:
.
prologue
0
bsr
$
1
,
do_switch_stack
call_pal
PAL_swpctx
lda
$
8
,
0x3fff
bsr
$
1
,
undo_switch_stack
bic
$
30
,
$
8
,
$
8
ret
$
31
,(
$
26
),
1
.
end
alpha_switch_to
#if CONFIG_SMP || CONFIG_PREEMPT
.
globl
ret_from_fork
.
align
3
.
ent
ret_from_fork
ret_from_fork
:
lda
$
26
,
ret_from_sys_call
mov
$
17
,
$
16
jmp
$
31
,
schedule_tail
.
end
ret_from_fork
#endif
/*
*
Oh
,
well
..
Disassembling
OSF
/
1
binaries
to
find
out
how
the
*
system
calls
work
isn
't much fun.
*
*
entSys
is
special
in
that
the
PAL
-
code
doesn
't save a0-a2, so
*
we
start
off
by
doing
that
by
hand
.
*/
.
align
3
.
globl
entSys
.
globl
ret_from_sys_call
.
ent
entSys
entSys
:
SAVE_ALL
lda
$
8
,
0x3fff
bic
$
30
,
$
8
,
$
8
lda
$
4
,
NR_SYSCALLS
(
$
31
)
stq
$
16
,
SP_OFF
+
24
(
$
30
)
lda
$
5
,
sys_call_table
lda
$
27
,
sys_ni_syscall
cmpult
$
0
,
$
4
,
$
4
ldl
$
3
,
TI_FLAGS
(
$
8
)
stq
$
17
,
SP_OFF
+
32
(
$
30
)
s8addq
$
0
,
$
5
,
$
5
stq
$
18
,
SP_OFF
+
40
(
$
30
)
blbs
$
3
,
strace
beq
$
4
,
1
f
ldq
$
27
,
0
(
$
5
)
1
:
jsr
$
26
,(
$
27
),
alpha_ni_syscall
ldgp
$
29
,
0
(
$
26
)
blt
$
0
,
syscall_error
/*
the
call
failed
*/
stq
$
0
,
0
(
$
30
)
stq
$
31
,
72
(
$
30
)
/*
a3
=
0
=>
no
error
*/
.
align
3
ret_from_sys_call
:
cmovne
$
26
,
0
,
$
19
/*
$
19
=
0
=>
non
-
restartable
*/
ldq
$
0
,
SP_OFF
(
$
30
)
and
$
0
,
8
,
$
0
beq
$
0
,
restore_all
ret_from_reschedule
:
/
*
Make
sure
need_resched
and
sigpending
don
't change between
sampling
and
the
rti
.
*/
lda
$
16
,
7
call_pal
PAL_swpipl
ldl
$
5
,
TI_FLAGS
(
$
8
)
and
$
5
,
_TIF_WORK_MASK
,
$
2
bne
$
5
,
work_pending
restore_all
:
RESTORE_ALL
call_pal
PAL_rti
work_pending
:
and
$
5
,
_TIF_NEED_RESCHED
,
$
2
beq
$
2
,
work_notifysig
work_resched
:
subq
$
30
,
16
,
$
30
stq
$
19
,
0
(
$
30
)
/*
save
syscall
nr
*/
stq
$
20
,
8
(
$
30
)
/*
and
error
indication
(
a3
)
*/
jsr
$
26
,
schedule
ldq
$
19
,
0
(
$
30
)
ldq
$
20
,
8
(
$
30
)
addq
$
30
,
16
,
$
30
/
*
Make
sure
need_resched
and
sigpending
don
't change between
sampling
and
the
rti
.
*/
lda
$
16
,
7
call_pal
PAL_swpipl
ldl
$
5
,
TI_FLAGS
(
$
8
)
and
$
5
,
_TIF_WORK_MASK
,
$
2
beq
$
2
,
restore_all
and
$
5
,
_TIF_NEED_RESCHED
,
$
2
bne
$
2
,
work_resched
work_notifysig
:
mov
$
30
,
$
17
br
$
1
,
do_switch_stack
mov
$
5
,
$
21
mov
$
30
,
$
18
mov
$
31
,
$
16
jsr
$
26
,
do_notify_resume
bsr
$
1
,
undo_switch_stack
br
restore_all
/*
PTRACE
syscall
handler
*/
.
align
3
strace
:
/
*
set
up
signal
stack
,
call
syscall_trace
*/
bsr
$
1
,
do_switch_stack
jsr
$
26
,
syscall_trace
bsr
$
1
,
undo_switch_stack
/
*
get
the
system
call
number
and
the
arguments
back
..
*/
ldq
$
0
,
0
(
$
30
)
ldq
$
16
,
SP_OFF
+
24
(
$
30
)
ldq
$
17
,
SP_OFF
+
32
(
$
30
)
ldq
$
18
,
SP_OFF
+
40
(
$
30
)
ldq
$
19
,
72
(
$
30
)
ldq
$
20
,
80
(
$
30
)
ldq
$
21
,
88
(
$
30
)
/
*
get
the
system
call
pointer
..
*/
lda
$
1
,
NR_SYSCALLS
(
$
31
)
lda
$
2
,
sys_call_table
lda
$
27
,
alpha_ni_syscall
cmpult
$
0
,
$
1
,
$
1
s8addq
$
0
,
$
2
,
$
2
beq
$
1
,
1
f
ldq
$
27
,
0
(
$
2
)
1
:
jsr
$
26
,(
$
27
),
sys_gettimeofday
ldgp
$
29
,
0
(
$
26
)
/
*
check
return
..
*/
blt
$
0
,
strace_error
/*
the
call
failed
*/
stq
$
31
,
72
(
$
30
)
/*
a3
=
0
=>
no
error
*/
strace_success
:
stq
$
0
,
0
(
$
30
)
/*
save
return
value
*/
bsr
$
1
,
do_switch_stack
jsr
$
26
,
syscall_trace
bsr
$
1
,
undo_switch_stack
br
$
31
,
ret_from_sys_call
.
align
3
strace_error
:
ldq
$
19
,
0
(
$
30
)
/*
old
syscall
nr
(
zero
if
success
)
*/
beq
$
19
,
strace_success
ldq
$
20
,
72
(
$
30
)
/*
..
and
this
a3
*/
subq
$
31
,
$
0
,
$
0
/*
with
error
in
v0
*/
addq
$
31
,
1
,
$
1
/*
set
a3
for
errno
return
*/
stq
$
0
,
0
(
$
30
)
stq
$
1
,
72
(
$
30
)
/*
a3
for
return
*/
bsr
$
1
,
do_switch_stack
mov
$
19
,
$
9
/*
save
old
syscall
number
*/
mov
$
20
,
$
10
/*
save
old
a3
*/
jsr
$
26
,
syscall_trace
mov
$
9
,
$
19
mov
$
10
,
$
20
bsr
$
1
,
undo_switch_stack
mov
$
31
,
$
26
/*
tell
"ret_from_sys_call"
we
can
restart
*/
br
ret_from_sys_call
.
align
3
syscall_error
:
/
*
*
Some
system
calls
(
e
.
g
.
,
ptrace
)
can
return
arbitrary
*
values
which
might
normally
be
mistaken
as
error
numbers
.
*
Those
functions
must
zero
$
0
(
v0
)
directly
in
the
stack
*
frame
to
indicate
that
a
negative
return
value
wasn
't an
*
error
number
..
*/
ldq
$
19
,
0
(
$
30
)
/*
old
syscall
nr
(
zero
if
success
)
*/
beq
$
19
,
ret_success
ldq
$
20
,
72
(
$
30
)
/*
..
and
this
a3
*/
subq
$
31
,
$
0
,
$
0
/*
with
error
in
v0
*/
addq
$
31
,
1
,
$
1
/*
set
a3
for
errno
return
*/
stq
$
0
,
0
(
$
30
)
mov
$
31
,
$
26
/*
tell
"ret_from_sys_call"
we
can
restart
*/
stq
$
1
,
72
(
$
30
)
/*
a3
for
return
*/
br
ret_from_sys_call
ret_success
:
stq
$
0
,
0
(
$
30
)
stq
$
31
,
72
(
$
30
)
/*
a3
=
0
=>
no
error
*/
br
ret_from_sys_call
.
end
entSys
.
align
3
.
globl
sys_sigreturn
.
ent
sys_sigreturn
.
align
4
.
globl
sys_sigreturn
.
ent
sys_sigreturn
sys_sigreturn
:
mov
$
30
,
$
17
lda
$
18
,
-
SWITCH_STACK_SIZE
(
$
30
)
lda
$
30
,-
SWITCH_STACK_SIZE
(
$
30
)
jsr
$
26
,
do_sigreturn
br
$
1
,
undo_switch_stack
mov
$
sp
,
$
17
lda
$
18
,
-
SWITCH_STACK_SIZE
(
$sp
)
lda
$
sp
,
-
SWITCH_STACK_SIZE
(
$sp
)
jsr
$
26
,
do_sigreturn
br
$
1
,
undo_switch_stack
br
ret_from_sys_call
.
end
sys_sigreturn
.
align
3
.
globl
sys_rt_sigreturn
.
ent
sys_rt_sigreturn
.
align
4
.
globl
sys_rt_sigreturn
.
ent
sys_rt_sigreturn
sys_rt_sigreturn
:
mov
$
30
,
$
17
lda
$
18
,
-
SWITCH_STACK_SIZE
(
$
30
)
lda
$
30
,-
SWITCH_STACK_SIZE
(
$
30
)
jsr
$
26
,
do_rt_sigreturn
br
$
1
,
undo_switch_stack
mov
$
sp
,
$
17
lda
$
18
,
-
SWITCH_STACK_SIZE
(
$sp
)
lda
$
sp
,
-
SWITCH_STACK_SIZE
(
$sp
)
jsr
$
26
,
do_rt_sigreturn
br
$
1
,
undo_switch_stack
br
ret_from_sys_call
.
end
sys_rt_sigreturn
.
align
3
.
globl
sys_sigsuspend
.
ent
sys_sigsuspend
.
align
4
.
globl
sys_sigsuspend
.
ent
sys_sigsuspend
sys_sigsuspend
:
mov
$
30
,
$
17
br
$
1
,
do_switch_stack
mov
$
30
,
$
18
subq
$
30
,
16
,
$
30
stq
$
26
,
0
(
$
30
)
jsr
$
26
,
do_sigsuspend
ldq
$
26
,
0
(
$
30
)
lda
$
30
,
SWITCH_STACK_SIZE
+
16
(
$
30
)
ret
$
31
,
(
$
26
),
1
mov
$
sp
,
$
17
br
$
1
,
do_switch_stack
mov
$
sp
,
$
18
subq
$
sp
,
16
,
$sp
stq
$
26
,
0
(
$sp
)
jsr
$
26
,
do_sigsuspend
ldq
$
26
,
0
(
$sp
)
lda
$
sp
,
SWITCH_STACK_SIZE
+
16
(
$sp
)
ret
$
31
,
(
$
26
),
1
.
end
sys_sigsuspend
.
align
3
.
globl
sys_rt_sigsuspend
.
ent
sys_rt_sigsuspend
.
align
4
.
globl
sys_rt_sigsuspend
.
ent
sys_rt_sigsuspend
sys_rt_sigsuspend
:
mov
$
30
,
$
18
br
$
1
,
do_switch_stack
mov
$
30
,
$
19
subq
$
30
,
16
,
$
30
stq
$
26
,
0
(
$
30
)
jsr
$
26
,
do_rt_sigsuspend
ldq
$
26
,
0
(
$
30
)
lda
$
30
,
SWITCH_STACK_SIZE
+
16
(
$
30
)
ret
$
31
,
(
$
26
),
1
mov
$
sp
,
$
18
br
$
1
,
do_switch_stack
mov
$
sp
,
$
19
subq
$
sp
,
16
,
$sp
stq
$
26
,
0
(
$sp
)
jsr
$
26
,
do_rt_sigsuspend
ldq
$
26
,
0
(
$sp
)
lda
$
sp
,
SWITCH_STACK_SIZE
+
16
(
$sp
)
ret
$
31
,
(
$
26
),
1
.
end
sys_rt_sigsuspend
arch/alpha/kernel/irq_alpha.c
View file @
250b5e26
...
...
@@ -37,14 +37,13 @@ void (*perf_irq)(unsigned long, struct pt_regs *) = dummy_perf;
*/
asmlinkage
void
do_entInt
(
unsigned
long
type
,
unsigned
long
vector
,
unsigned
long
la_ptr
,
unsigned
long
a3
,
unsigned
long
a4
,
unsigned
long
a5
,
struct
pt_regs
regs
)
do_entInt
(
unsigned
long
type
,
unsigned
long
vector
,
unsigned
long
la_ptr
,
struct
pt_regs
*
regs
)
{
switch
(
type
)
{
case
0
:
#ifdef CONFIG_SMP
handle_ipi
(
&
regs
);
handle_ipi
(
regs
);
return
;
#else
irq_err_count
++
;
...
...
@@ -56,32 +55,32 @@ do_entInt(unsigned long type, unsigned long vector, unsigned long la_ptr,
#ifdef CONFIG_SMP
{
long
cpu
;
smp_percpu_timer_interrupt
(
&
regs
);
smp_percpu_timer_interrupt
(
regs
);
cpu
=
smp_processor_id
();
if
(
cpu
!=
boot_cpuid
)
{
kstat_cpu
(
cpu
).
irqs
[
RTC_IRQ
]
++
;
}
else
{
handle_irq
(
RTC_IRQ
,
&
regs
);
handle_irq
(
RTC_IRQ
,
regs
);
}
}
#else
handle_irq
(
RTC_IRQ
,
&
regs
);
handle_irq
(
RTC_IRQ
,
regs
);
#endif
return
;
case
2
:
alpha_mv
.
machine_check
(
vector
,
la_ptr
,
&
regs
);
alpha_mv
.
machine_check
(
vector
,
la_ptr
,
regs
);
return
;
case
3
:
alpha_mv
.
device_interrupt
(
vector
,
&
regs
);
alpha_mv
.
device_interrupt
(
vector
,
regs
);
return
;
case
4
:
perf_irq
(
vector
,
&
regs
);
perf_irq
(
vector
,
regs
);
return
;
default:
printk
(
KERN_CRIT
"Hardware intr %ld %lx? Huh?
\n
"
,
type
,
vector
);
}
printk
(
"PC = %016lx PS=%04lx
\n
"
,
regs
.
pc
,
regs
.
ps
);
printk
(
KERN_CRIT
"PC = %016lx PS=%04lx
\n
"
,
regs
->
pc
,
regs
->
ps
);
}
void
__init
...
...
@@ -96,10 +95,8 @@ common_init_isa_dma(void)
void
__init
init_IRQ
(
void
)
{
/* Uh, this really MUST come first, just in case
* the platform init_irq() causes interrupts/mchecks
* (as is the case with RAWHIDE, at least).
*/
/* Just in case the platform init_irq() causes interrupts/mchecks
(as is the case with RAWHIDE, at least). */
wrent
(
entInt
,
0
);
alpha_mv
.
init_irq
();
...
...
arch/alpha/kernel/process.c
View file @
250b5e26
...
...
@@ -227,6 +227,9 @@ flush_thread(void)
with respect to the FPU. This is all exceptions disabled. */
current_thread_info
()
->
ieee_state
=
0
;
wrfpcr
(
FPCR_DYN_NORMAL
|
ieee_swcr_to_fpcr
(
0
));
/* Clean slate for TLS. */
current_thread_info
()
->
pcb
.
unique
=
0
;
}
void
...
...
@@ -244,16 +247,15 @@ release_thread(struct task_struct *dead_task)
* with parameters (SIGCHLD, 0).
*/
int
alpha_clone
(
unsigned
long
clone_flags
,
unsigned
long
usp
,
int
*
user_tid
,
struct
switch_stack
*
swstack
)
alpha_clone
(
unsigned
long
clone_flags
,
unsigned
long
usp
,
int
*
user_tid
,
struct
pt_regs
*
regs
)
{
struct
task_struct
*
p
;
struct
pt_regs
*
u_regs
=
(
struct
pt_regs
*
)
(
swstack
+
1
);
if
(
!
usp
)
usp
=
rdusp
();
p
=
do_fork
(
clone_flags
&
~
CLONE_IDLETASK
,
usp
,
u_
regs
,
0
,
user_tid
);
p
=
do_fork
(
clone_flags
&
~
CLONE_IDLETASK
,
usp
,
regs
,
0
,
user_tid
);
return
IS_ERR
(
p
)
?
PTR_ERR
(
p
)
:
p
->
pid
;
}
...
...
@@ -282,7 +284,6 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
unsigned
long
unused
,
struct
task_struct
*
p
,
struct
pt_regs
*
regs
)
{
extern
void
ret_from_sys_call
(
void
);
extern
void
ret_from_fork
(
void
);
struct
thread_info
*
childti
=
p
->
thread_info
;
...
...
@@ -304,11 +305,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
stack
=
((
struct
switch_stack
*
)
regs
)
-
1
;
childstack
=
((
struct
switch_stack
*
)
childregs
)
-
1
;
*
childstack
=
*
stack
;
#ifdef CONFIG_SMP
childstack
->
r26
=
(
unsigned
long
)
ret_from_fork
;
#else
childstack
->
r26
=
(
unsigned
long
)
ret_from_sys_call
;
#endif
childti
->
pcb
.
usp
=
usp
;
childti
->
pcb
.
ksp
=
(
unsigned
long
)
childstack
;
childti
->
pcb
.
flags
=
1
;
/* set FEN, clear everything else */
...
...
arch/alpha/kernel/traps.c
View file @
250b5e26
...
...
@@ -210,8 +210,7 @@ long alpha_fp_emul (unsigned long pc);
asmlinkage
void
do_entArith
(
unsigned
long
summary
,
unsigned
long
write_mask
,
unsigned
long
a2
,
unsigned
long
a3
,
unsigned
long
a4
,
unsigned
long
a5
,
struct
pt_regs
regs
)
struct
pt_regs
*
regs
)
{
long
si_code
=
FPE_FLTINV
;
siginfo_t
info
;
...
...
@@ -221,23 +220,21 @@ do_entArith(unsigned long summary, unsigned long write_mask,
emulate the instruction. If the processor supports
precise exceptions, we don't have to search. */
if
(
!
amask
(
AMASK_PRECISE_TRAP
))
si_code
=
alpha_fp_emul
(
regs
.
pc
-
4
);
si_code
=
alpha_fp_emul
(
regs
->
pc
-
4
);
else
si_code
=
alpha_fp_emul_imprecise
(
&
regs
,
write_mask
);
si_code
=
alpha_fp_emul_imprecise
(
regs
,
write_mask
);
}
die_if_kernel
(
"Arithmetic fault"
,
&
regs
,
0
,
0
);
die_if_kernel
(
"Arithmetic fault"
,
regs
,
0
,
0
);
info
.
si_signo
=
SIGFPE
;
info
.
si_errno
=
0
;
info
.
si_code
=
si_code
;
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
send_sig_info
(
SIGFPE
,
&
info
,
current
);
}
asmlinkage
void
do_entIF
(
unsigned
long
type
,
unsigned
long
a1
,
unsigned
long
a2
,
unsigned
long
a3
,
unsigned
long
a4
,
unsigned
long
a5
,
struct
pt_regs
regs
)
do_entIF
(
unsigned
long
type
,
struct
pt_regs
*
regs
)
{
siginfo_t
info
;
int
signo
,
code
;
...
...
@@ -245,13 +242,13 @@ do_entIF(unsigned long type, unsigned long a1,
if
(
!
opDEC_testing
||
type
!=
4
)
{
if
(
type
==
1
)
{
const
unsigned
int
*
data
=
(
const
unsigned
int
*
)
regs
.
pc
;
=
(
const
unsigned
int
*
)
regs
->
pc
;
printk
(
"Kernel bug at %s:%d
\n
"
,
(
const
char
*
)(
data
[
1
]
|
(
long
)
data
[
2
]
<<
32
),
data
[
0
]);
}
die_if_kernel
((
type
==
1
?
"Kernel Bug"
:
"Instruction fault"
),
&
regs
,
type
,
0
);
regs
,
type
,
0
);
}
switch
(
type
)
{
...
...
@@ -260,10 +257,10 @@ do_entIF(unsigned long type, unsigned long a1,
info
.
si_errno
=
0
;
info
.
si_code
=
TRAP_BRKPT
;
info
.
si_trapno
=
0
;
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
if
(
ptrace_cancel_bpt
(
current
))
{
regs
.
pc
-=
4
;
/* make pc point to former bpt */
regs
->
pc
-=
4
;
/* make pc point to former bpt */
}
send_sig_info
(
SIGTRAP
,
&
info
,
current
);
...
...
@@ -273,15 +270,15 @@ do_entIF(unsigned long type, unsigned long a1,
info
.
si_signo
=
SIGTRAP
;
info
.
si_errno
=
0
;
info
.
si_code
=
__SI_FAULT
;
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
info
.
si_trapno
=
0
;
send_sig_info
(
SIGTRAP
,
&
info
,
current
);
return
;
case
2
:
/* gentrap */
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_trapno
=
regs
.
r16
;
switch
((
long
)
regs
.
r16
)
{
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
info
.
si_trapno
=
regs
->
r16
;
switch
((
long
)
regs
->
r16
)
{
case
GEN_INTOVF
:
signo
=
SIGFPE
;
code
=
FPE_INTOVF
;
...
...
@@ -341,7 +338,7 @@ do_entIF(unsigned long type, unsigned long a1,
info
.
si_signo
=
signo
;
info
.
si_errno
=
0
;
info
.
si_code
=
code
;
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
send_sig_info
(
signo
,
&
info
,
current
);
return
;
...
...
@@ -358,26 +355,26 @@ do_entIF(unsigned long type, unsigned long a1,
we get the correct PC. If not, we set a flag
to correct it every time through. */
if
(
opDEC_testing
)
{
if
(
regs
.
pc
==
opDEC_test_pc
)
{
if
(
regs
->
pc
==
opDEC_test_pc
)
{
opDEC_fix
=
4
;
regs
.
pc
+=
4
;
regs
->
pc
+=
4
;
printk
(
"opDEC fixup enabled.
\n
"
);
}
return
;
}
regs
.
pc
+=
opDEC_fix
;
regs
->
pc
+=
opDEC_fix
;
/* EV4 does not implement anything except normal
rounding. Everything else will come here as
an illegal instruction. Emulate them. */
si_code
=
alpha_fp_emul
(
regs
.
pc
-
4
);
si_code
=
alpha_fp_emul
(
regs
->
pc
-
4
);
if
(
si_code
==
0
)
return
;
if
(
si_code
>
0
)
{
info
.
si_signo
=
SIGFPE
;
info
.
si_errno
=
0
;
info
.
si_code
=
si_code
;
info
.
si_addr
=
(
void
*
)
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
send_sig_info
(
SIGFPE
,
&
info
,
current
);
return
;
}
...
...
@@ -406,7 +403,7 @@ do_entIF(unsigned long type, unsigned long a1,
info
.
si_signo
=
SIGILL
;
info
.
si_errno
=
0
;
info
.
si_code
=
ILL_ILLOPC
;
info
.
si_addr
=
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
send_sig_info
(
SIGILL
,
&
info
,
current
);
}
...
...
@@ -418,18 +415,16 @@ do_entIF(unsigned long type, unsigned long a1,
and if we don't put something on the entry point we'll oops. */
asmlinkage
void
do_entDbg
(
unsigned
long
type
,
unsigned
long
a1
,
unsigned
long
a2
,
unsigned
long
a3
,
unsigned
long
a4
,
unsigned
long
a5
,
struct
pt_regs
regs
)
do_entDbg
(
struct
pt_regs
*
regs
)
{
siginfo_t
info
;
die_if_kernel
(
"Instruction fault"
,
&
regs
,
type
,
0
);
die_if_kernel
(
"Instruction fault"
,
regs
,
0
,
0
);
info
.
si_signo
=
SIGILL
;
info
.
si_errno
=
0
;
info
.
si_code
=
ILL_ILLOPC
;
info
.
si_addr
=
regs
.
pc
;
info
.
si_addr
=
(
void
*
)
regs
->
pc
;
force_sig_info
(
SIGILL
,
&
info
,
current
);
}
...
...
@@ -1114,9 +1109,7 @@ trap_init(void)
wrent
(
entDbg
,
6
);
/* Hack for Multia (UDB) and JENSEN: some of their SRMs have
* a bug in the handling of the opDEC fault. Fix it up if so.
*/
if
(
implver
()
==
IMPLVER_EV4
)
{
a bug in the handling of the opDEC fault. Fix it up if so. */
if
(
implver
()
==
IMPLVER_EV4
)
opDEC_check
();
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment