[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v9 4/5] xen/x86: use SYMBOLS_SUBTRACT and SYMBOLS_COMPARE as required
Use SYMBOLS_SUBTRACT and SYMBOLS_COMPARE in cases of comparisons and subtractions of: _start, _end, __2M_rwdata_start, __2M_rwdata_end, _stext, _etext, __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 as by the C standard [1]. M3CM: Rule-18.2: Subtraction between pointers shall only be applied to pointers that address elements of the same array [1] 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 v9: - use SYMBOLS_SUBTRACT and SYMBOLS_COMPARE --- xen/arch/x86/alternative.c | 4 +++- xen/arch/x86/efi/efi-boot.h | 4 ++-- xen/arch/x86/percpu.c | 7 ++++--- xen/arch/x86/setup.c | 10 +++++++--- xen/arch/x86/smpboot.c | 3 ++- xen/drivers/vpci/vpci.c | 2 +- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index b8c819a..56c3710 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -193,8 +193,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; SYMBOLS_COMPARE(a, end) < 0; 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..12709e1 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -112,11 +112,11 @@ static void __init relocate_trampoline(unsigned long phys) /* Apply relocations to trampoline. */ for ( trampoline_ptr = __trampoline_rel_start; - trampoline_ptr < __trampoline_rel_stop; + SYMBOLS_COMPARE(trampoline_ptr, __trampoline_rel_stop) < 0; ++trampoline_ptr ) *(u32 *)(*trampoline_ptr + (long)trampoline_ptr) += phys; for ( trampoline_ptr = __trampoline_seg_start; - trampoline_ptr < __trampoline_seg_stop; + SYMBOLS_COMPARE(trampoline_ptr, __trampoline_seg_stop) < 0; ++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..17a9c90 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(SYMBOLS_SUBTRACT(__per_cpu_data_end, \ + __per_cpu_start)) 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, SYMBOLS_SUBTRACT(__per_cpu_data_end, __per_cpu_start)); + __per_cpu_offset[cpu] = SYMBOLS_SUBTRACT(p, __per_cpu_start); return 0; } diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 06eb483..11d26d7 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -600,7 +600,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 = __init_begin; + SYMBOLS_COMPARE(va, __init_end) < 0; + va += PAGE_SIZE ) clear_page(va); /* Destroy Xen's mappings, and reuse the pages. */ @@ -972,7 +974,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) * respective reserve_e820_ram() invocation below. */ mod[mbi->mods_count].mod_start = virt_to_mfn(_stext); - mod[mbi->mods_count].mod_end = __2M_rwdata_end - _stext; + mod[mbi->mods_count].mod_end = SYMBOLS_SUBTRACT(__2M_rwdata_end, + _stext); } modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end); @@ -1067,7 +1070,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) * data until after we have switched to the relocated pagetables! */ barrier(); - move_memory(e + XEN_IMG_OFFSET, XEN_IMG_OFFSET, _end - _start, 1); + move_memory(e + XEN_IMG_OFFSET, XEN_IMG_OFFSET, + SYMBOLS_SUBTRACT(_end, _start), 1); /* Walk initial pagetables, relocating page directory entries. */ pl4e = __va(__pa(idle_pg_table)); diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 7d1226d..0bfd4a8 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -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 && SYMBOLS_COMPARE(ptr, _etextentry) < 0; + 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..88054da 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -33,7 +33,7 @@ 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 NUM_VPCI_INIT (SYMBOLS_SUBTRACT(__end_vpci_array, __start_vpci_array)) void vpci_remove_device(struct pci_dev *pdev) { -- 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 |