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
Kirill Smelkov
linux
Commits
50aaccb1
Commit
50aaccb1
authored
Apr 17, 2002
by
Anton Blanchard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ppc64: store trap into exception frame, make DSISR 32bit and create
CCR field - from Dave Engebretsen
parent
7e43513d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
94 additions
and
89 deletions
+94
-89
arch/ppc64/kernel/head.S
arch/ppc64/kernel/head.S
+94
-89
No files found.
arch/ppc64/kernel/head.S
View file @
50aaccb1
...
...
@@ -163,14 +163,18 @@ _GLOBAL(__secondary_hold)
#define EX_R23 40
#define EX_DAR 48
#define EX_DSISR 56
#define EX_CCR 60
#define EX_TRAP 60
#define EXCEPTION_PROLOG_PSERIES(
label)
\
#define EXCEPTION_PROLOG_PSERIES(
n,label)
\
mtspr
SPRG2
,
r20
; /* use SPRG2 as scratch reg */ \
mtspr
SPRG1
,
r21
; /* save r21 */ \
mfspr
r20
,
SPRG3
; /* get paca virt addr */ \
ld
r21
,
PACAEXCSP
(
r20
)
; /* get exception stack ptr */ \
addi
r21
,
r21
,
EXC_FRAME_SIZE
; /* make exception frame */ \
std
r22
,
EX_R22
(
r21
)
; /* Save r22 in exc. frame */ \
li
r22
,
n
; /* Save the ex # in exc. frame*/ \
stw
r22
,
EX_TRAP
(
r21
)
; /* */ \
std
r23
,
EX_R23
(
r21
)
; /* Save r23 in exc. frame */ \
mfspr
r22
,
SRR0
; /* EA of interrupted instr */ \
std
r22
,
EX_SRR0
(
r21
)
; /* Save SRR0 in exc. frame */ \
...
...
@@ -192,19 +196,21 @@ _GLOBAL(__secondary_hold)
*
This
is
the
start
of
the
interrupt
handlers
for
i_series
*
This
code
runs
with
relocation
on
.
*/
#define EXCEPTION_PROLOG_ISERIES \
mtspr
SPRG2
,
r20
; /* use SPRG2 as scratch reg */\
mtspr
SPRG1
,
r21
; /* save r21 */\
mfspr
r20
,
SPRG3
; /* get paca */\
ld
r21
,
PACAEXCSP
(
r20
)
; /* get exception stack ptr */\
addi
r21
,
r21
,
EXC_FRAME_SIZE
; /* make exception frame */\
std
r22
,
EX_R22
(
r21
)
; /* save r22 on exception frame */\
std
r23
,
EX_R23
(
r21
)
; /* Save r23 in exc. frame */\
ld
r22
,
LPPACA
+
LPPACASRR0
(
r20
)
; /* Get SRR0 from ItLpPaca */\
std
r22
,
EX_SRR0
(
r21
)
; /* save SRR0 in exc. frame */\
ld
r23
,
LPPACA
+
LPPACASRR1
(
r20
)
; /* Get SRR1 from ItLpPaca */\
std
r23
,
EX_SRR1
(
r21
)
; /* save SRR1 in exc. frame */\
mfcr
r23
; /* save CR in r23 */
#define EXCEPTION_PROLOG_ISERIES(n) \
mtspr
SPRG2
,
r20
; /* use SPRG2 as scratch reg */ \
mtspr
SPRG1
,
r21
; /* save r21 */ \
mfspr
r20
,
SPRG3
; /* get paca */ \
ld
r21
,
PACAEXCSP
(
r20
)
; /* get exception stack ptr */ \
addi
r21
,
r21
,
EXC_FRAME_SIZE
; /* make exception frame */ \
std
r22
,
EX_R22
(
r21
)
; /* save r22 on exception frame */ \
li
r22
,
n
; /* Save the ex # in exc. frame */ \
stw
r22
,
EX_TRAP
(
r21
)
; /* */ \
std
r23
,
EX_R23
(
r21
)
; /* Save r23 in exc. frame */ \
ld
r22
,
LPPACA
+
LPPACASRR0
(
r20
)
; /* Get SRR0 from ItLpPaca */ \
std
r22
,
EX_SRR0
(
r21
)
; /* save SRR0 in exc. frame */ \
ld
r23
,
LPPACA
+
LPPACASRR1
(
r20
)
; /* Get SRR1 from ItLpPaca */ \
std
r23
,
EX_SRR1
(
r21
)
; /* save SRR1 in exc. frame */ \
mfcr
r23
; /* save CR in r23 */
/*
*
The
common
exception
prolog
is
used
for
all
except
a
few
exceptions
...
...
@@ -215,54 +221,54 @@ _GLOBAL(__secondary_hold)
*
On
entry
r20
points
to
the
paca
and
r21
points
to
the
exception
*
frame
on
entry
,
r23
contains
the
saved
CR
,
and
relocation
is
on
.
*/
#define EXCEPTION_PROLOG_COMMON
\
mfspr
r22
,
SPRG2
; /* Save r20 in exc. frame */ \
std
r22
,
EX_R20
(
r21
)
; \
mfspr
r22
,
SPRG1
; /* Save r21 in exc. frame */ \
std
r22
,
EX_R21
(
r21
)
; \
mfspr
r22
,
DAR
; /* Save DAR in exc. frame
*/ \
std
r22
,
EX_DAR
(
r21
)
; \
std
r21
,
PACAEXCSP
(
r20
)
; /* update exception stack ptr
*/ \
/
*
iff
no
protection
flt
*/
\
mfspr
r22
,
DSISR
; /* Save DSISR in exc. frame */ \
st
d
r22
,
EX_DSISR
(
r21
)
;
\
ld
r22
,
EX_SRR1
(
r21
)
; /* Get SRR1 from exc. frame */ \
andi
.
r22
,
r22
,
MSR_PR
; /* Set CR for later branch
*/ \
mr
r22
,
r1
; /* Save r1
*/ \
subi
r1
,
r1
,
INT_FRAME_SIZE
;
/* alloc frame on kernel stack
*/ \
beq
-
1
f
; \
ld
r1
,
PACAKSAVE
(
r20
)
; /* kernel stack to use */ \
1
:
std
r22
,
GPR1
(
r1
)
; /* save r1 in stackframe */ \
std
r22
,
0
(
r1
)
; /* make stack chain pointer */ \
std
r23
,
_CCR
(
r1
)
; /* save CR in stackframe */ \
ld
r22
,
EX_R20
(
r21
)
; /* move r20 to stackframe */ \
std
r22
,
GPR20
(
r1
)
; \
ld
r23
,
EX_R21
(
r21
)
; /* move r21 to stackframe */ \
std
r23
,
GPR21
(
r1
)
; \
ld
r22
,
EX_R22
(
r21
)
; /* move r22 to stackframe */ \
std
r22
,
GPR22
(
r1
)
; \
ld
r23
,
EX_R23
(
r21
)
; /* move r23 to stackframe */ \
std
r23
,
GPR23
(
r1
)
; \
mflr
r22
; /* save LR in stackframe */ \
std
r22
,
_LINK
(
r1
)
; \
mfctr
r23
; /* save CTR in stackframe */ \
std
r23
,
_CTR
(
r1
)
; \
mfspr
r22
,
XER
; /* save XER in stackframe */ \
std
r22
,
_XER
(
r1
)
; \
ld
r23
,
EX_DAR
(
r21
)
; /* move DAR to stackframe */ \
std
r23
,
_DAR
(
r1
)
; \
l
d
r22
,
EX_DSISR
(
r21
)
; /* move DSISR to stackframe
*/ \
std
r22
,
_DSISR
(
r1
)
; \
lbz
r22
,
PACAPROCENABLED
(
r20
)
; \
std
r22
,
SOFTE
(
r1
)
; \
ld
r22
,
EX_SRR0
(
r21
)
; /* get SRR0 from exc. frame */ \
ld
r23
,
EX_SRR1
(
r21
)
; /* get SRR1 from exc. frame */ \
addi
r21
,
r21
,-
EXC_FRAME_SIZE
;/* pop off exception frame */ \
std
r21
,
PACAEXCSP
(
r20
)
; \
SAVE_GPR
(0,
r1
)
; /* save r0 in stackframe */ \
#define EXCEPTION_PROLOG_COMMON \
mfspr
r22
,
SPRG2
; /* Save r20 in exc. frame
*/ \
std
r22
,
EX_R20
(
r21
)
;
\
mfspr
r22
,
SPRG1
; /* Save r21 in exc. frame
*/ \
std
r22
,
EX_R21
(
r21
)
;
\
mfspr
r22
,
DAR
; /* Save DAR in exc. frame */ \
std
r22
,
EX_DAR
(
r21
)
;
\
std
r21
,
PACAEXCSP
(
r20
)
; /* update exception stack ptr */ \
/
*
iff
no
protection
flt
*/
\
mfspr
r22
,
DSISR
; /* Save DSISR in exc. frame
*/ \
st
w
r22
,
EX_DSISR
(
r21
)
;
\
ld
r22
,
EX_SRR1
(
r21
)
; /* Get SRR1 from exc. frame
*/ \
andi
.
r22
,
r22
,
MSR_PR
; /* Set CR for later branch */ \
mr
r22
,
r1
; /* Save r1 */ \
subi
r1
,
r1
,
INT_FRAME_SIZE
;
/* alloc frame on kernel stack
*/ \
beq
-
1
f
;
\
ld
r1
,
PACAKSAVE
(
r20
)
; /* kernel stack to use
*/ \
1
:
std
r22
,
GPR1
(
r1
)
; /* save r1 in stackframe
*/ \
std
r22
,
0
(
r1
)
; /* make stack chain pointer
*/ \
std
r23
,
_CCR
(
r1
)
; /* save CR in stackframe
*/ \
ld
r22
,
EX_R20
(
r21
)
; /* move r20 to stackframe
*/ \
std
r22
,
GPR20
(
r1
)
;
\
ld
r23
,
EX_R21
(
r21
)
; /* move r21 to stackframe
*/ \
std
r23
,
GPR21
(
r1
)
;
\
ld
r22
,
EX_R22
(
r21
)
; /* move r22 to stackframe
*/ \
std
r22
,
GPR22
(
r1
)
;
\
ld
r23
,
EX_R23
(
r21
)
; /* move r23 to stackframe
*/ \
std
r23
,
GPR23
(
r1
)
;
\
mflr
r22
; /* save LR in stackframe
*/ \
std
r22
,
_LINK
(
r1
)
;
\
mfctr
r23
; /* save CTR in stackframe
*/ \
std
r23
,
_CTR
(
r1
)
;
\
mfspr
r22
,
XER
; /* save XER in stackframe
*/ \
std
r22
,
_XER
(
r1
)
;
\
ld
r23
,
EX_DAR
(
r21
)
; /* move DAR to stackframe
*/ \
std
r23
,
_DAR
(
r1
)
;
\
l
wz
r22
,
EX_DSISR
(
r21
)
; /* move DSISR to stackframe
*/ \
std
r22
,
_DSISR
(
r1
)
;
\
lbz
r22
,
PACAPROCENABLED
(
r20
)
;
\
std
r22
,
SOFTE
(
r1
)
;
\
ld
r22
,
EX_SRR0
(
r21
)
; /* get SRR0 from exc. frame
*/ \
ld
r23
,
EX_SRR1
(
r21
)
; /* get SRR1 from exc. frame
*/ \
addi
r21
,
r21
,-
EXC_FRAME_SIZE
;/* pop off exception frame
*/ \
std
r21
,
PACAEXCSP
(
r20
)
;
\
SAVE_GPR
(0,
r1
)
; /* save r0 in stackframe
*/ \
SAVE_8GPRS
(2,
r1
)
; /* save r2 - r13 in stackframe */ \
SAVE_4GPRS
(10,
r1
)
; \
ld
r2
,
PACATOC
(
r20
)
; \
SAVE_4GPRS
(10,
r1
)
;
\
ld
r2
,
PACATOC
(
r20
)
;
\
ld
r13
,
PACACURRENT
(
r20
)
/*
...
...
@@ -277,18 +283,18 @@ _GLOBAL(__secondary_hold)
.
=
n
; \
.
globl
label
##
_Pseries
; \
label
##
_Pseries
:
\
EXCEPTION_PROLOG_PSERIES
(
label
##
_common
)
EXCEPTION_PROLOG_PSERIES
(
n
,
label
##
_common
)
#define STD_EXCEPTION_ISERIES(
label )
\
#define STD_EXCEPTION_ISERIES(
n, label )
\
.
globl
label
##
_Iseries
; \
label
##
_Iseries
:
\
EXCEPTION_PROLOG_ISERIES
;
\
EXCEPTION_PROLOG_ISERIES
(
n
)
;
\
b
label
##
_common
#define MASKABLE_EXCEPTION_ISERIES( label ) \
#define MASKABLE_EXCEPTION_ISERIES(
n,
label ) \
.
globl
label
##
_Iseries
; \
label
##
_Iseries
:
\
EXCEPTION_PROLOG_ISERIES
; \
EXCEPTION_PROLOG_ISERIES
(
n
)
; \
lbz
r22
,
PACAPROFENABLED
(
r20
)
; \
cmpi
0
,
r22
,
0
; \
bne
-
label
##
_Iseries_profile
; \
...
...
@@ -364,7 +370,6 @@ __start_naca:
*
For
LPAR
,
the
hypervisor
must
fill
in
at
least
one
entry
*
before
we
get
control
(
with
relocate
on
)
*/
.
=
0x5000
.
globl
__end_naca
.
globl
__start_stab
...
...
@@ -403,22 +408,22 @@ __end_stab:
/***
ISeries
-
LPAR
interrupt
handlers
***/
STD_EXCEPTION_ISERIES
(
MachineCheck
)
STD_EXCEPTION_ISERIES
(
DataAccess
)
STD_EXCEPTION_ISERIES
(
DataAccessSLB
)
STD_EXCEPTION_ISERIES
(
InstructionAccess
)
STD_EXCEPTION_ISERIES
(
InstructionAccessSLB
)
MASKABLE_EXCEPTION_ISERIES
(
HardwareInterrupt
)
STD_EXCEPTION_ISERIES
(
Alignment
)
STD_EXCEPTION_ISERIES
(
ProgramCheck
)
STD_EXCEPTION_ISERIES
(
FPUnavailable
)
MASKABLE_EXCEPTION_ISERIES
(
Decrementer
)
STD_EXCEPTION_ISERIES
(
Trap_0a
)
STD_EXCEPTION_ISERIES
(
Trap_0b
)
STD_EXCEPTION_ISERIES
(
SystemCall
)
STD_EXCEPTION_ISERIES
(
SingleStep
)
STD_EXCEPTION_ISERIES
(
Trap_0e
)
STD_EXCEPTION_ISERIES
(
PerformanceMonitor
)
STD_EXCEPTION_ISERIES
(
0x200
,
MachineCheck
)
STD_EXCEPTION_ISERIES
(
0x300
,
DataAccess
)
STD_EXCEPTION_ISERIES
(
0x380
,
DataAccessSLB
)
STD_EXCEPTION_ISERIES
(
0x400
,
InstructionAccess
)
STD_EXCEPTION_ISERIES
(
0x480
,
InstructionAccessSLB
)
MASKABLE_EXCEPTION_ISERIES
(
0x500
,
HardwareInterrupt
)
STD_EXCEPTION_ISERIES
(
0x600
,
Alignment
)
STD_EXCEPTION_ISERIES
(
0x700
,
ProgramCheck
)
STD_EXCEPTION_ISERIES
(
0x800
,
FPUnavailable
)
MASKABLE_EXCEPTION_ISERIES
(
0x900
,
Decrementer
)
STD_EXCEPTION_ISERIES
(
0xa00
,
Trap_0a
)
STD_EXCEPTION_ISERIES
(
0xb00
,
Trap_0b
)
STD_EXCEPTION_ISERIES
(
0xc00
,
SystemCall
)
STD_EXCEPTION_ISERIES
(
0xd00
,
SingleStep
)
STD_EXCEPTION_ISERIES
(
0xe00
,
Trap_0e
)
STD_EXCEPTION_ISERIES
(
0xf00
,
PerformanceMonitor
)
.
globl
SystemReset_Iseries
SystemReset_Iseries
:
...
...
@@ -503,10 +508,10 @@ fwnmi_data_area:
.
=
0x8000
.
globl
SystemReset_FWNMI
SystemReset_FWNMI
:
//
EXCEPTION_PROLOG_PSERIES
(0
x100
,
SystemReset_common
)
EXCEPTION_PROLOG_PSERIES
(0
x100
,
SystemReset_common
)
.
globl
MachineCheck_FWNMI
MachineCheck_FWNMI
:
//
EXCEPTION_PROLOG_PSERIES
(0
x200
,
MachineCheck_common
)
EXCEPTION_PROLOG_PSERIES
(0
x200
,
MachineCheck_common
)
/***
Common
interrupt
handlers
***/
...
...
@@ -839,7 +844,7 @@ _GLOBAL(do_hash_page_DSI)
*
We
assume
we
aren
't going to take any exceptions during this procedure.
*/
_GLOBAL
(
do_stab_bolted
)
st
d
r23
,
EX_DA
R
(
r21
)
/*
save
CR
in
exc
.
frame
*/
st
w
r23
,
EX_CC
R
(
r21
)
/*
save
CR
in
exc
.
frame
*/
mfspr
r22
,
DSISR
andis
.
r22
,
r22
,
0x0020
...
...
@@ -945,7 +950,7 @@ _GLOBAL(do_stab_bolted)
mfsprg
r20
,
3
/*
Load
the
PACA
pointer
*/
ld
r21
,
PACAEXCSP
(
r20
)
/*
Get
the
exception
frame
pointer
*/
addi
r21
,
r21
,
EXC_FRAME_SIZE
l
d
r23
,
EX_DA
R
(
r21
)
/*
get
saved
CR
*/
l
wz
r23
,
EX_CC
R
(
r21
)
/*
get
saved
CR
*/
/
*
note
that
this
is
almost
identical
to
maskable_exception_exit
*/
mtcr
r23
/*
restore
CR
*/
ld
r22
,
EX_SRR0
(
r21
)
/*
Get
SRR0
from
exc
.
frame
*/
...
...
@@ -966,7 +971,7 @@ _TRACEBACK(do_stab_bolted)
*
We
assume
we
aren
't going to take any exceptions during this procedure.
*/
_GLOBAL
(
do_slb_bolted
)
st
d
r23
,
48
(
r21
)
/*
save
CR
in
exc
.
frame
*/
st
w
r23
,
EX_CCR
(
r21
)
/*
save
CR
in
exc
.
frame
*/
/
*
(((
ea
>>
28
)
&
0x1fff
)
<<
15
)
|
(
ea
>>
60
)
*/
mfspr
r21
,
DAR
...
...
@@ -1033,7 +1038,7 @@ SLB_NUM_ENTRIES = 64
mfsprg
r20
,
3
/*
Load
the
PACA
pointer
*/
ld
r21
,
PACAEXCSP
(
r20
)
/*
Get
the
exception
frame
pointer
*/
addi
r21
,
r21
,
EXC_FRAME_SIZE
l
d
r23
,
EX_DA
R
(
r21
)
/*
get
saved
CR
*/
l
wz
r23
,
EX_CC
R
(
r21
)
/*
get
saved
CR
*/
/
*
note
that
this
is
almost
identical
to
maskable_exception_exit
*/
mtcr
r23
/*
restore
CR
*/
ld
r22
,
EX_SRR0
(
r21
)
/*
Get
SRR0
from
exc
.
frame
*/
...
...
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