Hi,
On 17/10/2018 15:31, Stefano Stabellini wrote:
Use __symbol everywhere _stext, _etext, etc. are used. Technically, it
is only required when comparing pointers, but use it everywhere to avoid
Well no. It is also required when substracting pointers (see [1]).
confusion.
[...]
diff --git a/xen/arch/arm/alternative.c b/xen/arch/arm/alternative.c
index 52ed7ed..305b337 100644
--- a/xen/arch/arm/alternative.c
+++ b/xen/arch/arm/alternative.c
@@ -187,8 +187,8 @@ static int __apply_alternatives_multi_stop(void *unused)
{
int ret;
struct alt_region region;
- mfn_t xen_mfn = virt_to_mfn(_start);
- paddr_t xen_size = _end - _start;
+ mfn_t xen_mfn = virt_to_mfn(__symbol(_start));
+ paddr_t xen_size = __symbol(_end) - __symbol(_start);
unsigned int xen_order = get_order_from_bytes(xen_size);
void *xenmap;
@@ -206,7 +206,7 @@ static int __apply_alternatives_multi_stop(void *unused)
region.begin = __alt_instructions;
region.end = __alt_instructions_end;
- ret = __apply_alternatives(®ion, xenmap - (void *)_start);
+ ret = __apply_alternatives(®ion, xenmap - (void *)__symbol(_start));
For instance, I think this line would be contain undefined behavior.
There are probably others below.
[...]
diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 7a06a33..d9d3948 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -620,7 +620,7 @@ void __init setup_pagetables(unsigned long
boot_phys_offset, paddr_t xen_paddr)
int i;
/* Calculate virt-to-phys offset for the new location */
- phys_offset = xen_paddr - (unsigned long) _start;
+ phys_offset = xen_paddr - (unsigned long) __symbol(_start);
#ifdef CONFIG_ARM_64
p = (void *) xen_pgtable;
@@ -681,7 +681,8 @@ void __init setup_pagetables(unsigned long
boot_phys_offset, paddr_t xen_paddr)
ttbr = (uintptr_t) cpu0_pgtable + phys_offset;
#endif
- relocate_xen(ttbr, _start, (void*)dest_va, _end - _start);
+ relocate_xen(ttbr, (void*)__symbol(_start), (void*)dest_va,
+ __symbol(_end) - __symbol(_start));
No hard tab.
[...]
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index ea2495a..9d0b915 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -394,7 +394,8 @@ static paddr_t __init get_xen_paddr(void)
paddr_t paddr = 0;
int i;
- min_size = (_end - _start + (XEN_PADDR_ALIGN-1)) & ~(XEN_PADDR_ALIGN-1);
+ min_size = (__symbol(_end) - __symbol(_start) +
+ (XEN_PADDR_ALIGN-1)) & ~(XEN_PADDR_ALIGN-1);
/* Find the highest bank with enough space. */
for ( i = 0; i < mi->nr_banks; i++ )
@@ -727,8 +728,9 @@ void __init start_xen(unsigned long boot_phys_offset,
/* Register Xen's load address as a boot module. */
xen_bootmodule = add_boot_module(BOOTMOD_XEN,
- (paddr_t)(uintptr_t)(_start + boot_phys_offset),
- (paddr_t)(uintptr_t)(_end - _start + 1), NULL);
+ (paddr_t)(uintptr_t)(__symbol(_start) +
boot_phys_offset),
+ (paddr_t)(uintptr_t)(__symbol(_end) -
+
__symbol(_start) + 1), NULL);
No hard tab.
BUG_ON(!xen_bootmodule);
xen_paddr = get_xen_paddr();
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 93b79c7..0a7d6c0 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
[...]
@@ -1390,22 +1393,22 @@ void __init noreturn __start_xen(unsigned long mbi_p)
{
/* Mark .text as RX (avoiding the first 2M superpage). */
modify_xen_mappings(XEN_VIRT_START + MB(2),
- (unsigned long)&__2M_text_end,
+ (unsigned long)__symbol(&__2M_text_end),
PAGE_HYPERVISOR_RX);
/* Mark .rodata as RO. */
- modify_xen_mappings((unsigned long)&__2M_rodata_start,
- (unsigned long)&__2M_rodata_end,
+ modify_xen_mappings((unsigned long)__symbol(&__2M_rodata_start),
+ (unsigned long)__symbol(&__2M_rodata_end),
AFAICT the return of __symbol should be unsigned long, right? If so, the
cast could be removed.
Cheers,
[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
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel