[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v10 4/6] xen/x86: use DEFINE_SYMBOL as required
Use SYMBOLS_SUBTRACT and SYMBOLS_COMPARE in cases of 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 Use explicit casts to uintptr_t when it is not possible to use the provided static inline functions. 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 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/alternative.c | 8 +++++++- xen/arch/x86/efi/efi-boot.h | 10 ++++++---- xen/arch/x86/percpu.c | 9 +++++---- xen/arch/x86/setup.c | 7 +++++-- xen/arch/x86/smpboot.c | 5 +++-- xen/drivers/vpci/vpci.c | 6 +++--- xen/include/asm-x86/percpu.h | 4 +++- 7 files changed, 32 insertions(+), 17 deletions(-) diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index b8c819a..f81759f 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -29,6 +29,10 @@ #define MAX_PATCH_LEN (255-1) +/* + * Cannot use DEFINE_SYMBOL because of the way they are passed to + * apply_alternatives. + */ extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; #ifdef K8_NOP1 @@ -193,8 +197,10 @@ void init_or_livepatch apply_alternatives(struct alt_instr *start, * * So be careful if you want to change the scan order to any other * order. + * + * start and end could be pointers to different objects. */ - for ( a = base = start; a < end; a++ ) + for ( a = base = start; (uintptr_t)a < (uintptr_t)end; a++ ) { uint8_t *orig = ALT_ORIG_PTR(a); uint8_t *repl = ALT_REPL_PTR(a); diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index 5789d2c..f798b7b 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[]; +DEFINE_SYMBOL(s32, trampoline_rel, __trampoline_rel_start, + __trampoline_rel_stop); +DEFINE_SYMBOL(s32, 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..2efb180 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) { @@ -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] = (uintptr_t)p - (uintptr_t)__per_cpu_start; 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..b024339 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -252,7 +252,8 @@ void __init discard_initial_images(void) initial_images = NULL; } -extern char __init_begin[], __init_end[], __bss_start[], __bss_end[]; +DEFINE_SYMBOL(char, init, __init_begin, __init_end); +extern char __bss_start[], __bss_end[]; static void __init init_idle_domain(void) { @@ -600,7 +601,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..b51bead 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -782,7 +782,7 @@ DEFINE_PER_CPU(root_pgentry_t *, root_pgt); static root_pgentry_t common_pgt; -extern const char _stextentry[], _etextentry[]; +DEFINE_SYMBOL(char, textentry, _stextentry, _etextentry); static int setup_cpu_root_pgt(unsigned int cpu) { @@ -811,7 +811,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..1ea6d7f 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) +DEFINE_SYMBOL(vpci_register_init_t *const, 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..8778ed1 100644 --- a/xen/include/asm-x86/percpu.h +++ b/xen/include/asm-x86/percpu.h @@ -2,7 +2,9 @@ #define __X86_PERCPU_H__ #ifndef __ASSEMBLY__ -extern char __per_cpu_start[], __per_cpu_data_end[]; +#include <xen/types.h> + +DEFINE_SYMBOL(char, 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 |