[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v11 5/9] xen/x86: use DECLARE_BOUNDS as required
Use DECLARE_BOUNDS and the two static inline functions that come with it for comparisons and subtractions of: __2M_rwdata_start, __2M_rwdata_end, __end_vpci_array, __start_vpci_array, _stextentry, _etextentry, __trampoline_rel_start, __trampoline_rel_stop, __trampoline_seg_start, __trampoline_seg_stop __per_cpu_start, __per_cpu_data_end possible to use the provided static inline functions. M3CM: Rule-18.2: Subtraction between pointers shall only be applied to pointers that address elements of the same array. https://wiki.sei.cmu.edu/confluence/display/c/ARR36-C.+Do+not+subtract+or+compare+two+pointers+that+do+not+refer+to+the+same+array QAVerify: 2761 Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> CC: JBeulich@xxxxxxxx CC: andrew.cooper3@xxxxxxxxxx --- Changes in v11: - change p type to struct abstract_per_cpu * - move changes to alternative.c to a new patch - use DECLARE_BOUNDS Changes in v10: - use DEFINE_SYMBOL - move changes for _start, _end, _stext, _etext, _srodata, _erodata, _sinittext, _einittext to a different patch Changes in v9: - use SYMBOLS_SUBTRACT and SYMBOLS_COMPARE --- xen/arch/x86/efi/efi-boot.h | 10 ++++++---- xen/arch/x86/percpu.c | 11 ++++++----- xen/arch/x86/setup.c | 8 ++++++-- xen/arch/x86/smpboot.c | 6 ++++-- xen/drivers/vpci/vpci.c | 6 +++--- xen/include/asm-x86/percpu.h | 6 +++++- 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index 5789d2c..a674e98 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -98,8 +98,10 @@ static void __init efi_arch_relocate_image(unsigned long delta) } } -extern const s32 __trampoline_rel_start[], __trampoline_rel_stop[]; -extern const s32 __trampoline_seg_start[], __trampoline_seg_stop[]; +typedef s32 trampoline_rel_t; +DECLARE_BOUNDS(trampoline_rel, __trampoline_rel_start, __trampoline_rel_stop); +typedef s32 trampoline_seg_t; +DECLARE_BOUNDS(trampoline_seg, __trampoline_seg_start, __trampoline_seg_stop); static void __init relocate_trampoline(unsigned long phys) { @@ -112,11 +114,11 @@ static void __init relocate_trampoline(unsigned long phys) /* Apply relocations to trampoline. */ for ( trampoline_ptr = __trampoline_rel_start; - trampoline_ptr < __trampoline_rel_stop; + trampoline_rel_lt(trampoline_ptr, __trampoline_rel_stop); ++trampoline_ptr ) *(u32 *)(*trampoline_ptr + (long)trampoline_ptr) += phys; for ( trampoline_ptr = __trampoline_seg_start; - trampoline_ptr < __trampoline_seg_stop; + trampoline_seg_lt(trampoline_ptr, __trampoline_seg_stop); ++trampoline_ptr ) *(u16 *)(*trampoline_ptr + (long)trampoline_ptr) = phys >> 4; } diff --git a/xen/arch/x86/percpu.c b/xen/arch/x86/percpu.c index 8be4ebd..82ed5a2 100644 --- a/xen/arch/x86/percpu.c +++ b/xen/arch/x86/percpu.c @@ -13,7 +13,8 @@ unsigned long __per_cpu_offset[NR_CPUS]; * context of PV guests. */ #define INVALID_PERCPU_AREA (0x8000000000000000L - (long)__per_cpu_start) -#define PERCPU_ORDER get_order_from_bytes(__per_cpu_data_end - __per_cpu_start) +#define PERCPU_ORDER get_order_from_bytes(per_cpu_diff(__per_cpu_start, \ + __per_cpu_data_end)) void __init percpu_init_areas(void) { @@ -25,7 +26,7 @@ void __init percpu_init_areas(void) static int init_percpu_area(unsigned int cpu) { - char *p; + struct abstract_per_cpu *p; if ( __per_cpu_offset[cpu] != INVALID_PERCPU_AREA ) return 0; @@ -33,8 +34,8 @@ static int init_percpu_area(unsigned int cpu) if ( (p = alloc_xenheap_pages(PERCPU_ORDER, 0)) == NULL ) return -ENOMEM; - memset(p, 0, __per_cpu_data_end - __per_cpu_start); - __per_cpu_offset[cpu] = p - __per_cpu_start; + memset(p, 0, per_cpu_diff(__per_cpu_start, __per_cpu_data_end)); + __per_cpu_offset[cpu] = per_cpu_lt(__per_cpu_start, p); return 0; } @@ -49,7 +50,7 @@ static void _free_percpu_area(struct rcu_head *head) { struct free_info *info = container_of(head, struct free_info, rcu); unsigned int cpu = info->cpu; - char *p = __per_cpu_start + __per_cpu_offset[cpu]; + char *p = (char *)__per_cpu_start + __per_cpu_offset[cpu]; free_xenheap_pages(p, PERCPU_ORDER); __per_cpu_offset[cpu] = INVALID_PERCPU_AREA; diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 06eb483..3264328 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -252,7 +252,9 @@ void __init discard_initial_images(void) initial_images = NULL; } -extern char __init_begin[], __init_end[], __bss_start[], __bss_end[]; +typedef char init_t; +DECLARE_BOUNDS(init, __init_begin, __init_end); +extern char __bss_start[], __bss_end[]; static void __init init_idle_domain(void) { @@ -600,7 +602,9 @@ static void noinline init_done(void) unregister_init_virtual_region(); /* Zero the .init code and data. */ - for ( va = __init_begin; va < _p(__init_end); va += PAGE_SIZE ) + for ( va = (char *)__init_begin; + init_lt(va, __init_end); + va += PAGE_SIZE ) clear_page(va); /* Destroy Xen's mappings, and reuse the pages. */ diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 7d1226d..114c953 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -782,7 +782,8 @@ DEFINE_PER_CPU(root_pgentry_t *, root_pgt); static root_pgentry_t common_pgt; -extern const char _stextentry[], _etextentry[]; +typedef char textentry_t; +DECLARE_BOUNDS(textentry, _stextentry, _etextentry); static int setup_cpu_root_pgt(unsigned int cpu) { @@ -811,7 +812,8 @@ static int setup_cpu_root_pgt(unsigned int cpu) const char *ptr; for ( rc = 0, ptr = _stextentry; - !rc && ptr < _etextentry; ptr += PAGE_SIZE ) + !rc && textentry_lt(ptr, _etextentry); + ptr += PAGE_SIZE ) rc = clone_mapping(ptr, rpt); if ( rc ) diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 82607bd..a1d6817 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -31,9 +31,9 @@ struct vpci_register { }; #ifdef __XEN__ -extern vpci_register_init_t *const __start_vpci_array[]; -extern vpci_register_init_t *const __end_vpci_array[]; -#define NUM_VPCI_INIT (__end_vpci_array - __start_vpci_array) +typedef vpci_register_init_t *const vpci_array_t; +DECLARE_BOUNDS(vpci_array, __start_vpci_array, __end_vpci_array); +#define NUM_VPCI_INIT (vpci_array_diff(__start_vpci_array, __end_vpci_array)) void vpci_remove_device(struct pci_dev *pdev) { diff --git a/xen/include/asm-x86/percpu.h b/xen/include/asm-x86/percpu.h index 51562b9..67982de 100644 --- a/xen/include/asm-x86/percpu.h +++ b/xen/include/asm-x86/percpu.h @@ -2,7 +2,11 @@ #define __X86_PERCPU_H__ #ifndef __ASSEMBLY__ -extern char __per_cpu_start[], __per_cpu_data_end[]; +#include <xen/lib.h> +#include <xen/types.h> + +typedef char per_cpu_t; +DECLARE_BOUNDS(per_cpu, __per_cpu_start, __per_cpu_data_end); extern unsigned long __per_cpu_offset[NR_CPUS]; void percpu_init_areas(void); #endif -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |