Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
de975e85
Commit
de975e85
authored
Jun 02, 2015
by
Achin Gupta
Browse files
Merge pull request #305 from achingupta/ag/tf-issues#306
Ag/tf issues#306
parents
dbc963e2
ca0225a5
Changes
3
Show whitespace changes
Inline
Side-by-side
bl31/aarch64/runtime_exceptions.S
View file @
de975e85
...
@@ -79,6 +79,14 @@
...
@@ -79,6 +79,14 @@
str
x30
,
[
sp
,
#
CTX_GPREGS_OFFSET
+
CTX_GPREG_LR
]
str
x30
,
[
sp
,
#
CTX_GPREGS_OFFSET
+
CTX_GPREG_LR
]
bl
save_gp_registers
bl
save_gp_registers
/
*
*
Save
the
EL3
system
registers
needed
to
return
from
*
this
exception
.
*/
mrs
x0
,
spsr_el3
mrs
x1
,
elr_el3
stp
x0
,
x1
,
[
sp
,
#
CTX_EL3STATE_OFFSET
+
CTX_SPSR_EL3
]
/
*
Switch
to
the
runtime
stack
i
.
e
.
SP_EL0
*/
/
*
Switch
to
the
runtime
stack
i
.
e
.
SP_EL0
*/
ldr
x2
,
[
sp
,
#
CTX_EL3STATE_OFFSET
+
CTX_RUNTIME_SP
]
ldr
x2
,
[
sp
,
#
CTX_EL3STATE_OFFSET
+
CTX_RUNTIME_SP
]
mov
x20
,
sp
mov
x20
,
sp
...
@@ -96,13 +104,29 @@
...
@@ -96,13 +104,29 @@
/
*
/
*
*
Get
the
registered
handler
for
this
interrupt
type
.
A
*
Get
the
registered
handler
for
this
interrupt
type
.
A
*
NULL
return
value
implies
that
an
interrupt
was
generated
*
NULL
return
value
could
be
'cause of the following
*
for
which
there
is
no
handler
registered
or
the
interrupt
*
conditions
:
*
was
routed
incorrectly
.
This
is
a
problem
of
the
framework
*
*
so
report
it
as
an
error
.
*
a
.
An
interrupt
of
a
type
was
routed
correctly
but
a
*
handler
for
its
type
was
not
registered
.
*
*
b
.
An
interrupt
of
a
type
was
not
routed
correctly
so
*
a
handler
for
its
type
was
not
registered
.
*
*
c
.
An
interrupt
of
a
type
was
routed
correctly
to
EL3
,
*
but
was
deasserted
before
its
pending
state
could
*
be
read
.
Another
interrupt
of
a
different
type
pended
*
at
the
same
time
and
its
type
was
reported
as
pending
*
instead
.
However
,
a
handler
for
this
type
was
not
*
registered
.
*
*
a
.
and
b
.
can
only
happen
due
to
a
programming
error
.
*
The
occurrence
of
c
.
could
be
beyond
the
control
of
*
Trusted
Firmware
.
It
makes
sense
to
return
from
this
*
exception
instead
of
reporting
an
error
.
*/
*/
bl
get_interrupt_type_handler
bl
get_interrupt_type_handler
cbz
x0
,
interrupt_e
rror
_
\
label
cbz
x0
,
interrupt_e
xit
_
\
label
mov
x21
,
x0
mov
x21
,
x0
mov
x0
,
#
INTR_ID_UNAVAILABLE
mov
x0
,
#
INTR_ID_UNAVAILABLE
...
@@ -117,14 +141,6 @@
...
@@ -117,14 +141,6 @@
b.eq
interrupt_exit_
\
label
b.eq
interrupt_exit_
\
label
#endif
#endif
/
*
*
Save
the
EL3
system
registers
needed
to
return
from
*
this
exception
.
*/
mrs
x3
,
spsr_el3
mrs
x4
,
elr_el3
stp
x3
,
x4
,
[
x20
,
#
CTX_EL3STATE_OFFSET
+
CTX_SPSR_EL3
]
/
*
Set
the
current
security
state
in
the
'flags'
parameter
*/
/
*
Set
the
current
security
state
in
the
'flags'
parameter
*/
mrs
x2
,
scr_el3
mrs
x2
,
scr_el3
ubfx
x1
,
x2
,
#
0
,
#
1
ubfx
x1
,
x2
,
#
0
,
#
1
...
@@ -142,13 +158,6 @@ interrupt_exit_\label:
...
@@ -142,13 +158,6 @@ interrupt_exit_\label:
/
*
Return
from
exception
,
possibly
in
a
different
security
state
*/
/
*
Return
from
exception
,
possibly
in
a
different
security
state
*/
b
el3_exit
b
el3_exit
/
*
*
This
label
signifies
a
problem
with
the
interrupt
management
*
framework
where
it
is
not
safe
to
go
back
to
the
instruction
*
where
the
interrupt
was
generated
.
*/
interrupt_error_
\
label
:
bl
report_unhandled_interrupt
.
endm
.
endm
...
...
drivers/arm/gic/arm_gic.c
View file @
de975e85
...
@@ -401,7 +401,7 @@ uint32_t arm_gic_get_pending_interrupt_type(void)
...
@@ -401,7 +401,7 @@ uint32_t arm_gic_get_pending_interrupt_type(void)
uint32_t
id
;
uint32_t
id
;
assert
(
g_gicc_base
);
assert
(
g_gicc_base
);
id
=
gicc_read_hppir
(
g_gicc_base
);
id
=
gicc_read_hppir
(
g_gicc_base
)
&
INT_ID_MASK
;
/* Assume that all secure interrupts are S-EL1 interrupts */
/* Assume that all secure interrupts are S-EL1 interrupts */
if
(
id
<
1022
)
if
(
id
<
1022
)
...
@@ -423,7 +423,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
...
@@ -423,7 +423,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
uint32_t
id
;
uint32_t
id
;
assert
(
g_gicc_base
);
assert
(
g_gicc_base
);
id
=
gicc_read_hppir
(
g_gicc_base
);
id
=
gicc_read_hppir
(
g_gicc_base
)
&
INT_ID_MASK
;
if
(
id
<
1022
)
if
(
id
<
1022
)
return
id
;
return
id
;
...
@@ -435,7 +435,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
...
@@ -435,7 +435,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
* Find out which non-secure interrupt it is under the assumption that
* Find out which non-secure interrupt it is under the assumption that
* the GICC_CTLR.AckCtl bit is 0.
* the GICC_CTLR.AckCtl bit is 0.
*/
*/
return
gicc_read_ahppir
(
g_gicc_base
);
return
gicc_read_ahppir
(
g_gicc_base
)
&
INT_ID_MASK
;
}
}
/*******************************************************************************
/*******************************************************************************
...
...
include/drivers/arm/gic_v2.h
View file @
de975e85
...
@@ -99,6 +99,9 @@
...
@@ -99,6 +99,9 @@
#define GICC_DIR 0x1000
#define GICC_DIR 0x1000
#define GICC_PRIODROP GICC_EOIR
#define GICC_PRIODROP GICC_EOIR
/* Common CPU Interface definitions */
#define INT_ID_MASK 0x3ff
/* GICC_CTLR bit definitions */
/* GICC_CTLR bit definitions */
#define EOI_MODE_NS (1 << 10)
#define EOI_MODE_NS (1 << 10)
#define EOI_MODE_S (1 << 9)
#define EOI_MODE_S (1 << 9)
...
...
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