Replace build macro WARN_DEPRECATED with ERROR_DEPRECATED

This patch changes the build time behaviour when using deprecated API within
Trusted Firmware. Previously the use of deprecated APIs would only trigger a
build warning (which was always treated as a build error), when
WARN_DEPRECATED = 1. Now, the use of deprecated C declarations will always
trigger a build time warning. Whether this warning is treated as error or not
is determined by the build flag ERROR_DEPRECATED which is disabled by default.
When the build flag ERROR_DEPRECATED=1, the invocation of deprecated API or
inclusion of deprecated headers will result in a build error.

Also the deprecated context management helpers in context_mgmt.c are now
conditionally compiled depending on the value of ERROR_DEPRECATED flag
so that the APIs themselves do not result in a build error when the
ERROR_DEPRECATED flag is set.

NOTE: Build systems that use the macro WARN_DEPRECATED must migrate to
using ERROR_DEPRECATED, otherwise deprecated API usage will no longer
trigger a build error.

Change-Id: I843bceef6bde979af7e9b51dddf861035ec7965a
This commit is contained in:
Soby Mathew 2015-10-26 14:29:21 +00:00
parent 4a1dcde72f
commit 7a24cba5c2
5 changed files with 40 additions and 31 deletions

View File

@ -87,8 +87,8 @@ TRUSTED_BOARD_BOOT := 0
# By default, consider that the platform's reset address is not programmable. # By default, consider that the platform's reset address is not programmable.
# The platform Makefile is free to override this value. # The platform Makefile is free to override this value.
PROGRAMMABLE_RESET_ADDRESS := 0 PROGRAMMABLE_RESET_ADDRESS := 0
# Build flag to warn about usage of deprecated platform and framework APIs # Build flag to treat usage of deprecated platform and framework APIs as error.
WARN_DEPRECATED := 0 ERROR_DEPRECATED := 0
################################################################################ ################################################################################
@ -346,7 +346,7 @@ $(eval $(call assert_boolean,SAVE_KEYS))
$(eval $(call assert_boolean,TRUSTED_BOARD_BOOT)) $(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
$(eval $(call assert_boolean,PROGRAMMABLE_RESET_ADDRESS)) $(eval $(call assert_boolean,PROGRAMMABLE_RESET_ADDRESS))
$(eval $(call assert_boolean,PSCI_EXTENDED_STATE_ID)) $(eval $(call assert_boolean,PSCI_EXTENDED_STATE_ID))
$(eval $(call assert_boolean,WARN_DEPRECATED)) $(eval $(call assert_boolean,ERROR_DEPRECATED))
$(eval $(call assert_boolean,ENABLE_PLAT_COMPAT)) $(eval $(call assert_boolean,ENABLE_PLAT_COMPAT))
@ -368,7 +368,7 @@ $(eval $(call add_define,USE_COHERENT_MEM))
$(eval $(call add_define,TRUSTED_BOARD_BOOT)) $(eval $(call add_define,TRUSTED_BOARD_BOOT))
$(eval $(call add_define,PROGRAMMABLE_RESET_ADDRESS)) $(eval $(call add_define,PROGRAMMABLE_RESET_ADDRESS))
$(eval $(call add_define,PSCI_EXTENDED_STATE_ID)) $(eval $(call add_define,PSCI_EXTENDED_STATE_ID))
$(eval $(call add_define,WARN_DEPRECATED)) $(eval $(call add_define,ERROR_DEPRECATED))
$(eval $(call add_define,ENABLE_PLAT_COMPAT)) $(eval $(call add_define,ENABLE_PLAT_COMPAT))
@ -404,6 +404,11 @@ all: msg_start
msg_start: msg_start:
@echo "Building ${PLAT}" @echo "Building ${PLAT}"
# Check if deprecated declarations should be treated as error or not.
ifeq (${ERROR_DEPRECATED},0)
CFLAGS += -Wno-error=deprecated-declarations
endif
# Expand build macros for the different images # Expand build macros for the different images
ifeq (${NEED_BL1},yes) ifeq (${NEED_BL1},yes)
$(eval $(call MAKE_BL,1)) $(eval $(call MAKE_BL,1))

View File

@ -90,6 +90,14 @@ void cm_set_context_by_index(unsigned int cpu_idx, void *context,
set_cpu_data_by_index(cpu_idx, cpu_context[security_state], context); set_cpu_data_by_index(cpu_idx, cpu_context[security_state], context);
} }
#if !ERROR_DEPRECATED
/*
* These context management helpers are deprecated but are maintained for use
* by SPDs which have not migrated to the new API. If ERROR_DEPRECATED
* is enabled, these are excluded from the build so as to force users to
* migrate to the new API.
*/
/******************************************************************************* /*******************************************************************************
* This function returns a pointer to the most recent 'cpu_context' structure * This function returns a pointer to the most recent 'cpu_context' structure
* for the CPU identified by MPIDR that was set as the context for the specified * for the CPU identified by MPIDR that was set as the context for the specified
@ -114,6 +122,21 @@ void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_st
context, security_state); context, security_state);
} }
/*******************************************************************************
* The following function provides a compatibility function for SPDs using the
* existing cm library routines. This function is expected to be invoked for
* initializing the cpu_context for the CPU specified by MPIDR for first use.
******************************************************************************/
void cm_init_context(unsigned long mpidr, const entry_point_info_t *ep)
{
if ((mpidr & MPIDR_AFFINITY_MASK) ==
(read_mpidr_el1() & MPIDR_AFFINITY_MASK))
cm_init_my_context(ep);
else
cm_init_context_by_index(platform_get_core_pos(mpidr), ep);
}
#endif
/******************************************************************************* /*******************************************************************************
* This function is used to program the context that's used for exception * This function is used to program the context that's used for exception
* return. This initializes the SP_EL3 to a pointer to a 'cpu_context' set for * return. This initializes the SP_EL3 to a pointer to a 'cpu_context' set for
@ -260,20 +283,6 @@ void cm_init_my_context(const entry_point_info_t *ep)
cm_init_context_common(ctx, ep); cm_init_context_common(ctx, ep);
} }
/*******************************************************************************
* The following function provides a compatibility function for SPDs using the
* existing cm library routines. This function is expected to be invoked for
* initializing the cpu_context for the CPU specified by MPIDR for first use.
******************************************************************************/
void cm_init_context(unsigned long mpidr, const entry_point_info_t *ep)
{
if ((mpidr & MPIDR_AFFINITY_MASK) ==
(read_mpidr_el1() & MPIDR_AFFINITY_MASK))
cm_init_my_context(ep);
else
cm_init_context_by_index(platform_get_core_pos(mpidr), ep);
}
/******************************************************************************* /*******************************************************************************
* Prepare the CPU system registers for first entry into secure or normal world * Prepare the CPU system registers for first entry into secure or normal world
* *

View File

@ -367,10 +367,10 @@ performed.
and it governs the return value of PSCI_FEATURES API for CPU_SUSPEND and it governs the return value of PSCI_FEATURES API for CPU_SUSPEND
smc function id. smc function id.
* `WARN_DEPRECATED`: This option decides whether to warn the usage of * `ERROR_DEPRECATED`: This option decides whether to treat the usage of
deprecated platform APIs and context management helpers within Trusted deprecated platform APIs, helper functions or drivers within Trusted
Firmware. It can take the value 1 (warn the use of deprecated APIs) or Firmware as error. It can take the value 1 (flag the use of deprecated
0. The default is 0. APIs as error) or 0. The default is 0.
#### ARM development platform specific build options #### ARM development platform specific build options

View File

@ -101,10 +101,10 @@
/* /*
* Theses macros are used to create function labels for deprecated * Theses macros are used to create function labels for deprecated
* APIs. If WARN_DEPRECATED is non zero, the callers of these APIs * APIs. If ERROR_DEPRECATED is non zero, the callers of these APIs
* will fail to link and cause build failure. * will fail to link and cause build failure.
*/ */
#if WARN_DEPRECATED #if ERROR_DEPRECATED
.macro func_deprecated _name .macro func_deprecated _name
func deprecated\_name func deprecated\_name
.endm .endm

View File

@ -69,15 +69,10 @@
/* /*
* Macros to wrap declarations of deprecated APIs within Trusted Firmware. * Macros to wrap declarations of deprecated APIs within Trusted Firmware.
* The callers of these APIs will continue to compile as long as the build * The callers of these APIs will continue to compile with a warning as long
* flag WARN_DEPRECATED is zero. Else the compiler will emit a warning * as the build flag ERROR_DEPRECATED is zero.
* when the callers of these APIs are compiled.
*/ */
#if WARN_DEPRECATED
#define __warn_deprecated __attribute__ ((deprecated)) #define __warn_deprecated __attribute__ ((deprecated))
#else
#define __warn_deprecated
#endif
#endif /* __COMMON_DEF_H__ */ #endif /* __COMMON_DEF_H__ */