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
766ff011
Unverified
Commit
766ff011
authored
Jan 31, 2019
by
Antonio Niño Díaz
Committed by
GitHub
Jan 31, 2019
Browse files
Merge pull request #1797 from antonio-nino-diaz-arm/an/remove-smccc-v2
Remove support for the SMC Calling Convention 2.0
parents
c723ad84
0709055e
Changes
14
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
766ff011
...
...
@@ -432,16 +432,6 @@ ifeq ($(BL2_AT_EL3)-$(BL2_IN_XIP_MEM),0-1)
$(error "
BL2_IN_XIP_MEM
is
only
supported
when
BL2_AT_EL3
is
enabled
")
endif
# SMC Calling Convention checks
ifneq (${SMCCC_MAJOR_VERSION},1)
ifneq (${SPD},none)
$(error "
SMC
Calling
Convention
1.X
must
be
used
with
SPDs
")
endif
ifeq (${ARCH},aarch32)
$(error "
Only
SMCCC
1.X
is
supported
in
AArch32
mode.
")
endif
endif
# For RAS_EXTENSION, require that EAs are handled in EL3 first
ifeq ($(RAS_EXTENSION),1)
ifneq ($(HANDLE_EA_EL3_FIRST),1)
...
...
@@ -624,7 +614,6 @@ $(eval $(call assert_boolean,BL2_IN_XIP_MEM))
$(eval $(call assert_numeric,ARM_ARCH_MAJOR))
$(eval $(call assert_numeric,ARM_ARCH_MINOR))
$(eval $(call assert_numeric,SMCCC_MAJOR_VERSION))
################################################################################
# Add definitions to the cpp preprocessor based on the current build options.
...
...
@@ -664,7 +653,6 @@ $(eval $(call add_define,RAS_EXTENSION))
$(eval $(call add_define,RESET_TO_BL31))
$(eval $(call add_define,SEPARATE_CODE_AND_RODATA))
$(eval $(call add_define,RECLAIM_INIT_CODE))
$(eval $(call add_define,SMCCC_MAJOR_VERSION))
$(eval $(call add_define,SPD_${SPD}))
$(eval $(call add_define,SPIN_ON_BL1_EXIT))
$(eval $(call add_define,SPM_MM))
...
...
bl31/aarch64/runtime_exceptions.S
View file @
766ff011
/*
*
Copyright
(
c
)
2013
-
201
8
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2013
-
201
9
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
...
...
@@ -303,38 +303,6 @@ vector_entry serror_aarch32
b
enter_lower_el_async_ea
end_vector_entry
serror_aarch32
/
*
---------------------------------------------------------------------
*
This
macro
takes
an
argument
in
x16
that
is
the
index
in
the
*
'rt_svc_descs_indices'
array
,
checks
that
the
value
in
the
array
is
*
valid
,
and
loads
in
x15
the
pointer
to
the
handler
of
that
service
.
*
---------------------------------------------------------------------
*/
.
macro
load_rt_svc_desc_pointer
/
*
Load
descriptor
index
from
array
of
indices
*/
adr
x14
,
rt_svc_descs_indices
ldrb
w15
,
[
x14
,
x16
]
#if SMCCC_MAJOR_VERSION == 1
/
*
Any
index
greater
than
127
is
invalid
.
Check
bit
7
.
*/
tbnz
w15
,
7
,
smc_unknown
#elif SMCCC_MAJOR_VERSION == 2
/
*
Verify
that
the
top
3
bits
of
the
loaded
index
are
0
(
w15
<=
31
)
*/
cmp
w15
,
#
31
b.hi
smc_unknown
#endif /* SMCCC_MAJOR_VERSION */
/
*
*
Get
the
descriptor
using
the
index
*
x11
=
(
base
+
off
),
w15
=
index
*
*
handler
=
(
base
+
off
)
+
(
index
<<
log2
(
size
))
*/
adr
x11
,
(
__RT_SVC_DESCS_START__
+
RT_SVC_DESC_HANDLE
)
lsl
w10
,
w15
,
#
RT_SVC_SIZE_LOG2
ldr
x15
,
[
x11
,
w10
,
uxtw
]
.
endm
/
*
---------------------------------------------------------------------
*
The
following
code
handles
secure
monitor
calls
.
*
Depending
upon
the
execution
state
from
where
the
SMC
has
been
...
...
@@ -363,56 +331,27 @@ smc_handler64:
mov
x5
,
xzr
mov
x6
,
sp
#if SMCCC_MAJOR_VERSION == 1
/
*
Get
the
unique
owning
entity
number
*/
ubfx
x16
,
x0
,
#
FUNCID_OEN_SHIFT
,
#
FUNCID_OEN_WIDTH
ubfx
x15
,
x0
,
#
FUNCID_TYPE_SHIFT
,
#
FUNCID_TYPE_WIDTH
orr
x16
,
x16
,
x15
,
lsl
#
FUNCID_OEN_WIDTH
load_rt_svc_desc_pointer
#elif SMCCC_MAJOR_VERSION == 2
/
*
Bit
31
must
be
set
*/
tbz
x0
,
#
FUNCID_TYPE_SHIFT
,
smc_unknown
/
*
*
Check
MSB
of
namespace
to
decide
between
compatibility
/
vendor
and
*
SPCI
/
SPRT
*/
tbz
x0
,
#(
FUNCID_NAMESPACE_SHIFT
+
1
),
compat_or_vendor
/
*
Namespace
is
b
'10 (SPRT) or b'
11
(
SPCI
)
*/
#if ENABLE_SPM
tst
x0
,
#(
1
<<
FUNCID_NAMESPACE_SHIFT
)
adr
x15
,
spci_smc_handler
adr
x16
,
sprt_smc_handler
csel
x15
,
x15
,
x16
,
ne
b
prepare_enter_handler
#else
b
smc_unknown
#endif
compat_or_vendor
:
/
*
Load
descriptor
index
from
array
of
indices
*/
adr
x14
,
rt_svc_descs_indices
ldrb
w15
,
[
x14
,
x16
]
/
*
Namespace
is
b
'00 (compatibility) or b'
01
(
vendor
)
*/
/
*
Any
index
greater
than
127
is
invalid
.
Check
bit
7
.
*/
tbnz
w15
,
7
,
smc_unknown
/
*
*
Add
the
LSB
of
the
namespace
(
bit
[
28
])
to
the
OEN
[
27
:
24
]
to
create
*
a
5
-
bit
index
into
the
rt_svc_descs_indices
array
.
*
Get
the
descriptor
using
the
index
*
x11
=
(
base
+
off
),
w15
=
index
*
*
The
low
16
entries
of
the
rt_svc_descs_indices
array
correspond
to
*
OENs
of
the
compatibility
namespace
and
the
top
16
entries
of
the
*
array
are
assigned
to
the
vendor
namespace
descriptor
.
*
handler
=
(
base
+
off
)
+
(
index
<<
log2
(
size
))
*/
ubfx
x16
,
x0
,
#
FUNCID_OEN_SHIFT
,
#(
FUNCID_OEN_WIDTH
+
1
)
load_rt_svc_desc_pointer
prepare_enter_handler
:
#endif /* SMCCC_MAJOR_VERSION */
adr
x11
,
(
__RT_SVC_DESCS_START__
+
RT_SVC_DESC_HANDLE
)
lsl
w10
,
w15
,
#
RT_SVC_SIZE_LOG2
ldr
x15
,
[
x11
,
w10
,
uxtw
]
/
*
*
Restore
the
saved
C
runtime
stack
value
which
will
become
the
new
...
...
common/runtime_svc.c
View file @
766ff011
/*
* Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -29,7 +29,6 @@ uint8_t rt_svc_descs_indices[MAX_RT_SVCS];
* Function to invoke the registered `handle` corresponding to the smc_fid in
* AArch32 mode.
******************************************************************************/
#if SMCCC_MAJOR_VERSION == 1
uintptr_t
handle_runtime_svc
(
uint32_t
smc_fid
,
void
*
cookie
,
void
*
handle
,
...
...
@@ -55,7 +54,6 @@ uintptr_t handle_runtime_svc(uint32_t smc_fid,
return
rt_svc_descs
[
index
].
handle
(
smc_fid
,
x1
,
x2
,
x3
,
x4
,
cookie
,
handle
,
flags
);
}
#endif
/* SMCCC_MAJOR_VERSION */
/*******************************************************************************
* Simple routine to sanity check a runtime service descriptor before using it
...
...
@@ -71,14 +69,9 @@ static int32_t validate_rt_svc_desc(const rt_svc_desc_t *desc)
if
(
desc
->
end_oen
>=
OEN_LIMIT
)
return
-
EINVAL
;
#if SMCCC_MAJOR_VERSION == 1
if
((
desc
->
call_type
!=
SMC_TYPE_FAST
)
&&
(
desc
->
call_type
!=
SMC_TYPE_YIELD
))
return
-
EINVAL
;
#elif SMCCC_MAJOR_VERSION == 2
if
(
desc
->
is_vendor
>
1U
)
return
-
EINVAL
;
#endif
/* SMCCC_MAJOR_VERSION */
/* A runtime service having no init or handle function doesn't make sense */
if
((
desc
->
init
==
NULL
)
&&
(
desc
->
handle
==
NULL
))
...
...
@@ -149,17 +142,10 @@ void __init runtime_svc_init(void)
* descriptor which will handle the SMCs for this owning
* entity range.
*/
#if SMCCC_MAJOR_VERSION == 1
start_idx
=
(
uint8_t
)
get_unique_oen
(
service
->
start_oen
,
service
->
call_type
);
end_idx
=
(
uint8_t
)
get_unique_oen
(
service
->
end_oen
,
service
->
call_type
);
#elif SMCCC_MAJOR_VERSION == 2
start_idx
=
(
uint8_t
)
get_rt_desc_idx
(
service
->
start_oen
,
service
->
is_vendor
);
end_idx
=
(
uint8_t
)
get_rt_desc_idx
(
service
->
end_oen
,
service
->
is_vendor
);
#endif
assert
(
start_idx
<=
end_idx
);
assert
(
end_idx
<
MAX_RT_SVCS
);
for
(;
start_idx
<=
end_idx
;
start_idx
++
)
...
...
docs/user-guide.rst
View file @
766ff011
...
...
@@ -668,11 +668,6 @@ Common build options
pages"
section
in
`
Firmware
Design
`
_
.
This
flag
is
disabled
by
default
and
affects
all
BL
images
.
-
``
SMCCC_MAJOR_VERSION
``:
Numeric
value
that
indicates
the
major
version
of
the
SMC
Calling
Convention
that
the
Trusted
Firmware
supports
.
The
only
two
allowed
values
are
1
and
2
,
and
it
defaults
to
1.
The
minor
version
is
determined
using
this
value
.
-
``
SPD
``:
Choose
a
Secure
Payload
Dispatcher
component
to
be
built
into
TF
-
A
.
This
build
option
is
only
valid
if
``
ARCH
=
aarch64
``.
The
value
should
be
the
path
to
the
directory
containing
the
SPD
source
,
relative
to
...
...
@@ -2057,7 +2052,7 @@ wakeup interrupt from RTC.
--------------
*Copyright (c) 2013-201
8
, Arm Limited and Contributors. All rights reserved.*
*Copyright (c) 2013-201
9
, Arm Limited and Contributors. All rights reserved.*
.. _Linaro: `Linaro Release Notes`_
.. _Linaro Release: `Linaro Release Notes`_
...
...
include/common/runtime_svc.h
View file @
766ff011
/*
* Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -36,17 +36,8 @@
* In SMCCC 1.X, the function identifier has 6 bits for the owning entity number
* and a single bit for the type of smc call. When taken together, those values
* limit the maximum number of runtime services to 128.
*
* In SMCCC 2.X the type bit is always 1 and there are only 4 OEN bits in the
* compatibility namespace, so the total number of services is 16. The LSB of
* namespace is also added to these 4 bits to make space for the vendor service
* handler and so the total number of runtime services is 32.
*/
#if SMCCC_MAJOR_VERSION == 1
#define MAX_RT_SVCS U(128)
#elif SMCCC_MAJOR_VERSION == 2
#define MAX_RT_SVCS U(32)
#endif
#ifndef __ASSEMBLY__
...
...
@@ -70,11 +61,7 @@ typedef uintptr_t (*rt_svc_handle_t)(uint32_t smc_fid,
typedef
struct
rt_svc_desc
{
uint8_t
start_oen
;
uint8_t
end_oen
;
#if SMCCC_MAJOR_VERSION == 1
uint8_t
call_type
;
#elif SMCCC_MAJOR_VERSION == 2
uint8_t
is_vendor
;
#endif
const
char
*
name
;
rt_svc_init_t
init
;
rt_svc_handle_t
handle
;
...
...
@@ -83,8 +70,6 @@ typedef struct rt_svc_desc {
/*
* Convenience macros to declare a service descriptor
*/
#if SMCCC_MAJOR_VERSION == 1
#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \
static const rt_svc_desc_t __svc_desc_ ## _name \
__section("rt_svc_descs") __used = { \
...
...
@@ -96,37 +81,6 @@ typedef struct rt_svc_desc {
.handle = (_smch) \
}
#elif SMCCC_MAJOR_VERSION == 2
#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \
static const rt_svc_desc_t __svc_desc_ ## _name \
__section("rt_svc_descs") __used = { \
.start_oen = (_start), \
.end_oen = (_end), \
.is_vendor = 0, \
.name = #_name, \
.init = (_setup), \
.handle = (_smch), \
}; \
CASSERT((_type) == SMC_TYPE_FAST, rt_svc_type_check_ ## _name)
/*
* The higher 16 entries of the runtime services are used for the vendor
* specific descriptor.
*/
#define DECLARE_RT_SVC_VENDOR(_setup, _smch) \
static const rt_svc_desc_t __svc_desc_vendor \
__section("rt_svc_descs") __used = { \
.start_oen = 0, \
.end_oen = 15, \
.is_vendor = 1, \
.name = "vendor_rt_svc", \
.init = _setup, \
.handle = _smch, \
}
#endif
/* SMCCC_MAJOR_VERSION */
/*
* Compile time assertions related to the 'rt_svc_desc' structure to:
* 1. ensure that the assembler and the compiler view of the size
...
...
@@ -144,7 +98,6 @@ CASSERT(RT_SVC_DESC_HANDLE == __builtin_offsetof(rt_svc_desc_t, handle), \
assert_rt_svc_desc_handle_offset_mismatch
);
#if SMCCC_MAJOR_VERSION == 1
/*
* This function combines the call type and the owning entity number
* corresponding to a runtime service to generate a unique owning entity number.
...
...
@@ -169,22 +122,6 @@ static inline uint32_t get_unique_oen_from_smc_fid(uint32_t fid)
return
get_unique_oen
(
GET_SMC_OEN
(
fid
),
GET_SMC_TYPE
(
fid
));
}
#elif SMCCC_MAJOR_VERSION == 2
/*
* This function combines the owning entity number corresponding to a runtime
* service with one extra bit for the vendor namespace to generate an index into
* the 'rt_svc_descs_indices' array. The entry contains the index of the service
* descriptor in the 'rt_svc_descs' array.
*/
static
inline
uint32_t
get_rt_desc_idx
(
uint32_t
oen
,
uint32_t
is_vendor
)
{
return
((
is_vendor
&
1U
)
<<
FUNCID_OEN_WIDTH
)
|
(
oen
&
FUNCID_OEN_MASK
);
}
#endif
/*******************************************************************************
* Function & variable prototypes
******************************************************************************/
...
...
include/lib/smccc.h
View file @
766ff011
/*
* Copyright (c) 2016-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2016-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -19,15 +19,69 @@
| (((uint32_t)(_minor) & SMCCC_VERSION_MINOR_MASK) << \
SMCCC_VERSION_MINOR_SHIFT))
#if SMCCC_MAJOR_VERSION == 1
# define SMCCC_MINOR_VERSION U(1)
# include <lib/smccc_v1.h>
#elif SMCCC_MAJOR_VERSION == 2
# define SMCCC_MINOR_VERSION U(0)
# include <lib/smccc_v2.h>
#else
# error "Unsupported version of SMCCC."
#endif
#define SMCCC_MAJOR_VERSION U(1)
#define SMCCC_MINOR_VERSION U(1)
/*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention
******************************************************************************/
#define FUNCID_TYPE_SHIFT U(31)
#define FUNCID_TYPE_MASK U(0x1)
#define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0x3f)
#define FUNCID_OEN_WIDTH U(6)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4)
/* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5)
/* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6)
/* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_TAP_START U(48)
/* Trusted Applications */
#define OEN_TAP_END U(49)
#define OEN_TOS_START U(50)
/* Trusted OS */
#define OEN_TOS_END U(63)
#define OEN_LIMIT U(64)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_TYPE_YIELD ULL(0)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#define SMC_PREEMPTED -2
/* Not defined by the SMCCC */
/* Various flags passed to SMC handlers */
#define SMC_FROM_SECURE (U(0) << 0)
...
...
include/lib/smccc_v1.h
deleted
100644 → 0
View file @
c723ad84
/*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SMCCC_V1_H
#define SMCCC_V1_H
#ifndef SMCCC_H
#error "This file must only be included from smccc.h"
#endif
/*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention
******************************************************************************/
#define FUNCID_TYPE_SHIFT U(31)
#define FUNCID_TYPE_MASK U(0x1)
#define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0x3f)
#define FUNCID_OEN_WIDTH U(6)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4)
/* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5)
/* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6)
/* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_TAP_START U(48)
/* Trusted Applications */
#define OEN_TAP_END U(49)
#define OEN_TOS_START U(50)
/* Trusted OS */
#define OEN_TOS_END U(63)
#define OEN_LIMIT U(64)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_TYPE_YIELD ULL(0)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#define SMC_PREEMPTED -2
/* Not defined by the SMCCC */
#endif
/* SMCCC_V1_H */
include/lib/smccc_v2.h
deleted
100644 → 0
View file @
c723ad84
/*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SMCCC_V2_H
#define SMCCC_V2_H
#ifndef SMCCC_H
#error "This file must only be included from smccc.h"
#endif
/*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention
******************************************************************************/
#define FUNCID_TYPE_SHIFT U(31)
#define FUNCID_TYPE_MASK U(0x1)
#define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_NAMESPACE_SHIFT U(28)
#define FUNCID_NAMESPACE_MASK U(0x3)
#define FUNCID_NAMESPACE_WIDTH U(2)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0xf)
#define FUNCID_OEN_WIDTH U(4)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_NAMESPACE(id) (((id) >> FUNCID_NAMESPACE_SHIFT) & \
FUNCID_NAMESPACE_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4)
/* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5)
/* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6)
/* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_LIMIT U(16)
/*******************************************************************************
* Service namespaces as per the SMC Calling Convention v2.X
******************************************************************************/
#define FUNCID_NAMESPACE_START U(0)
#define FUNCID_NAMESPACE_COMPAT U(0)
#define FUNCID_NAMESPACE_VENDOR U(1)
#define FUNCID_NAMESPACE_SPRT U(2)
#define FUNCID_NAMESPACE_SPCI U(3)
#define FUNCID_NAMESPACE_LIMIT U(4)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#endif
/* SMCCC_V2_H */
include/services/spci_svc.h
View file @
766ff011
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
* Copyright (c) 2018
-2019
, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -34,7 +34,10 @@
#define SPCI_FID_TUN_SHIFT U(24)
#define SPCI_FID_TUN_MASK U(0x7)
#define SPCI_SMC(spci_fid) ((FUNCID_NAMESPACE_SPCI << FUNCID_NAMESPACE_SHIFT) | \
#define OEN_SPCI_START U(0x30)
#define OEN_SPCI_END U(0x3F)
#define SPCI_SMC(spci_fid) ((OEN_SPCI_START << FUNCID_OEN_SHIFT) | \
(U(1) << 31) | (spci_fid))
#define SPCI_MISC_32(misc_fid) ((SMC_32 << FUNCID_CC_SHIFT) | \
SPCI_FID_MISC_FLAG | \
...
...
include/services/sprt_svc.h
View file @
766ff011
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
* Copyright (c) 2018
-2019
, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -37,10 +37,13 @@
/* Definitions to build the complete SMC ID */
#define SPRT_SMC_64(sprt_fid) ((FUNCID_NAMESPACE_SPRT << FUNCID_NAMESPACE_SHIFT) | \
#define OEN_SPRT_START U(0x20)
#define OEN_SPRT_END U(0x2F)
#define SPRT_SMC_64(sprt_fid) ((OEN_SPRT_START << FUNCID_OEN_SHIFT) | \
(U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \
(SMC_64 << FUNCID_CC_SHIFT))
#define SPRT_SMC_32(sprt_fid) ((
FUNCID_NAMESPACE_SP
RT << FUNCID_
NAMESPACE
_SHIFT) | \
#define SPRT_SMC_32(sprt_fid) ((
OEN_SPRT_STA
RT << FUNCID_
OEN
_SHIFT) | \
(U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \
(SMC_32 << FUNCID_CC_SHIFT))
...
...
make_helpers/defaults.mk
View file @
766ff011
...
...
@@ -153,9 +153,6 @@ SEPARATE_CODE_AND_RODATA := 0
# cores stack
RECLAIM_INIT_CODE
:=
0
# Default to SMCCC Version 1.X
SMCCC_MAJOR_VERSION
:=
1
# SPD choice
SPD
:=
none
...
...
services/std_svc/spm/spci.c
View file @
766ff011
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
* Copyright (c) 2018
-2019
, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -9,6 +9,7 @@
#include <string.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/el3_runtime/context_mgmt.h>
#include <lib/smccc.h>
#include <lib/spinlock.h>
...
...
@@ -679,9 +680,10 @@ static uint64_t spci_service_get_response(void *handle, u_register_t x1,
/*******************************************************************************
* This function handles all SMCs in the range reserved for SPCI.
******************************************************************************/
uint64_t
spci_smc_handler
(
uint32_t
smc_fid
,
uint64_t
x1
,
uint64_t
x2
,
uint64_t
x3
,
uint64_t
x4
,
void
*
cookie
,
void
*
handle
,
uint64_t
flags
)
static
uintptr_t
spci_smc_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
,
void
*
cookie
,
void
*
handle
,
u_register_t
flags
)
{
uint32_t
spci_fid
;
...
...
@@ -773,3 +775,12 @@ uint64_t spci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2,
WARN
(
"SPCI: Unsupported call 0x%08x
\n
"
,
smc_fid
);
SMC_RET1
(
handle
,
SPCI_NOT_SUPPORTED
);
}
DECLARE_RT_SVC
(
spci_handler
,
OEN_SPCI_START
,
OEN_SPCI_END
,
SMC_TYPE_FAST
,
NULL
,
spci_smc_handler
);
services/std_svc/spm/spm.mk
View file @
766ff011
#
# Copyright (c) 2017-201
8
, ARM Limited and Contributors. All rights reserved.
# Copyright (c) 2017-201
9
, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
...
...
@@ -26,8 +26,5 @@ SPM_SOURCES := $(addprefix services/std_svc/spm/, \
INCLUDES
+=
${SPRT_LIB_INCLUDES}
# Force SMC Calling Convention 2 when using SPM
SMCCC_MAJOR_VERSION
:=
2
# Let the top-level Makefile know that we intend to include a BL32 image
NEED_BL32
:=
yes
services/std_svc/spm/sprt.c
View file @
766ff011
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
* Copyright (c) 2018
-2019
, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -10,6 +10,7 @@
#include <arch_helpers.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/el3_runtime/context_mgmt.h>
#include <lib/smccc.h>
#include <lib/utils.h>
...
...
@@ -154,9 +155,10 @@ static int32_t sprt_memory_perm_attr_set(sp_context_t *sp_ctx,
/*******************************************************************************
* This function handles all SMCs in the range reserved for SPRT.
******************************************************************************/
uint64_t
sprt_smc_handler
(
uint32_t
smc_fid
,
uint64_t
x1
,
uint64_t
x2
,
uint64_t
x3
,
uint64_t
x4
,
void
*
cookie
,
void
*
handle
,
uint64_t
flags
)
static
uintptr_t
sprt_smc_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
,
void
*
cookie
,
void
*
handle
,
u_register_t
flags
)
{
/* SPRT only supported from the Secure world */
if
(
is_caller_non_secure
(
flags
)
==
SMC_FROM_NON_SECURE
)
{
...
...
@@ -214,3 +216,12 @@ uint64_t sprt_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2,
WARN
(
"SPRT: Unsupported call 0x%08x
\n
"
,
smc_fid
);
SMC_RET1
(
handle
,
SPRT_NOT_SUPPORTED
);
}
DECLARE_RT_SVC
(
sprt_handler
,
OEN_SPRT_START
,
OEN_SPRT_END
,
SMC_TYPE_FAST
,
NULL
,
sprt_smc_handler
);
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