|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 2/7] xen: use start_, end_, and more
Start making use of the following uintptr_t variables:
start_, end_, stext_, etext_, stextentry_, etextentry_,
srodata_, erodata_, _sinittext, _einittext
Replacing the corresponding linker symbols. It is done to avoid
comparing and subtracting pointers pointing to different objects.
This patch carries one functional change: core.start/end and
core_init.start/end are now initialized in setup_virtual_regions,
because stext_ & friends are not constant anymore (initializer element
is not constant).
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
Changes in v8:
- remove SYMBOL_HIDE
- use new symbol names
- changes are split differently across the patches
---
xen/arch/arm/alternative.c | 6 +++---
xen/arch/arm/arm32/livepatch.c | 3 ++-
xen/arch/arm/arm64/livepatch.c | 3 ++-
xen/arch/arm/domain_build.c | 2 +-
xen/arch/arm/livepatch.c | 5 +++--
xen/arch/arm/setup.c | 5 +++--
xen/arch/x86/setup.c | 17 ++++++++---------
xen/arch/x86/smpboot.c | 7 ++++---
xen/arch/x86/tboot.c | 4 ++--
xen/arch/x86/x86_64/machine_kexec.c | 4 ++--
xen/common/symbols.c | 3 +--
xen/common/virtual_region.c | 9 +++++----
xen/include/asm-arm/grant_table.h | 2 +-
xen/include/asm-arm/mm.h | 4 ++--
xen/include/asm-x86/mm.h | 2 +-
xen/include/xen/kernel.h | 32 ++++++++++++++++----------------
16 files changed, 56 insertions(+), 52 deletions(-)
diff --git a/xen/arch/arm/alternative.c b/xen/arch/arm/alternative.c
index 52ed7ed..b79536d 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(start_);
+ paddr_t xen_size = end_ - 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, (uintptr_t)xenmap - start_);
/* The patching is not expected to fail during boot. */
BUG_ON(ret != 0);
diff --git a/xen/arch/arm/arm32/livepatch.c b/xen/arch/arm/arm32/livepatch.c
index 41378a5..db9a3f4 100644
--- a/xen/arch/arm/arm32/livepatch.c
+++ b/xen/arch/arm/arm32/livepatch.c
@@ -56,7 +56,8 @@ void arch_livepatch_apply(struct livepatch_func *func)
else
insn = 0xe1a00000; /* mov r0, r0 */
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = (uint32_t *)((uintptr_t)func->old_addr -
+ start_ + (uintptr_t)vmap_of_xen_text);
len = len / sizeof(uint32_t);
/* PATCH! */
diff --git a/xen/arch/arm/arm64/livepatch.c b/xen/arch/arm/arm64/livepatch.c
index 2247b92..a18d25d 100644
--- a/xen/arch/arm/arm64/livepatch.c
+++ b/xen/arch/arm/arm64/livepatch.c
@@ -43,7 +43,8 @@ void arch_livepatch_apply(struct livepatch_func *func)
/* Verified in livepatch_verify_distance. */
ASSERT(insn != AARCH64_BREAK_FAULT);
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = (uint32_t *)((uintptr_t)func->old_addr -
+ start_ + (uintptr_t)vmap_of_xen_text);
len = len / sizeof(uint32_t);
/* PATCH! */
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index d2c63a8..455b0f2 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1904,7 +1904,7 @@ static void __init find_gnttab_region(struct domain *d,
* Only use the text section as it's always present and will contain
* enough space for a large grant table
*/
- kinfo->gnttab_start = __pa(_stext);
+ kinfo->gnttab_start = __pa(stext_);
kinfo->gnttab_size = gnttab_dom0_frames() << PAGE_SHIFT;
#ifdef CONFIG_ARM_32
diff --git a/xen/arch/arm/livepatch.c b/xen/arch/arm/livepatch.c
index 279d52c..3f12c8e 100644
--- a/xen/arch/arm/livepatch.c
+++ b/xen/arch/arm/livepatch.c
@@ -27,7 +27,7 @@ int arch_livepatch_quiesce(void)
return -EINVAL;
text_mfn = virt_to_mfn(_start);
- text_order = get_order_from_bytes(_end - _start);
+ text_order = get_order_from_bytes(end_ - start_);
/*
* The text section is read-only. So re-map Xen to be able to patch
@@ -78,7 +78,8 @@ void arch_livepatch_revert(const struct livepatch_func *func)
uint32_t *new_ptr;
unsigned int len;
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = (uint32_t *)((uintptr_t)func->old_addr -
+ start_ + (uintptr_t)vmap_of_xen_text);
len = livepatch_insn_len(func);
memcpy(new_ptr, func->opaque, len);
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 444857a..83e29ff 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -772,8 +772,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), false);
+ start_ + boot_phys_offset,
+ end_ - start_ + 1,
+ false);
BUG_ON(!xen_bootmodule);
setup_pagetables(boot_phys_offset);
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 06eb483..34949fc4 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -971,8 +971,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
* This needs to remain in sync with xen_in_range() and the
* 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_start = virt_to_mfn(stext_);
+ mod[mbi->mods_count].mod_end = (uintptr_t)__2M_rwdata_end - stext_;
}
modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end);
@@ -1039,7 +1039,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
* Is the region size greater than zero and does it begin
* at or above the end of current Xen image placement?
*/
- if ( (end > s) && (end - reloc_size + XEN_IMG_OFFSET >= __pa(_end)) )
+ if ( (end > s) && (end - reloc_size + XEN_IMG_OFFSET >= __pa(end_)) )
{
l4_pgentry_t *pl4e;
l3_pgentry_t *pl3e;
@@ -1067,7 +1067,7 @@ 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, end_ - start_, 1);
/* Walk initial pagetables, relocating page directory entries. */
pl4e = __va(__pa(idle_pg_table));
@@ -1108,8 +1108,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
* is contained in this PTE.
*/
BUG_ON(using_2M_mapping() &&
- l2_table_offset((unsigned long)_erodata) ==
- l2_table_offset((unsigned long)_stext));
+ l2_table_offset(erodata_) == l2_table_offset(stext_));
*pl2e++ = l2e_from_pfn(xen_phys_start >> PAGE_SHIFT,
PAGE_HYPERVISOR_RX | _PAGE_PSE);
for ( i = 1; i < L2_PAGETABLE_ENTRIES; i++, pl2e++ )
@@ -1239,7 +1238,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
panic("Not enough memory to relocate Xen\n");
/* This needs to remain in sync with xen_in_range(). */
- reserve_e820_ram(&boot_e820, __pa(_stext), __pa(__2M_rwdata_end));
+ reserve_e820_ram(&boot_e820, __pa(stext_), __pa(__2M_rwdata_end));
/* Late kexec reservation (dynamic start address). */
kexec_reserve_area(&boot_e820);
@@ -1382,7 +1381,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
}
#endif
- xen_virt_end = ((unsigned long)_end + (1UL << L2_PAGETABLE_SHIFT) - 1) &
+ xen_virt_end = (end_ + (1UL << L2_PAGETABLE_SHIFT) - 1) &
~((1UL << L2_PAGETABLE_SHIFT) - 1);
destroy_xen_mappings(xen_virt_end, XEN_VIRT_START + BOOTSTRAP_MAP_BASE);
@@ -1871,7 +1870,7 @@ int __hwdom_init xen_in_range(unsigned long mfn)
*/
/* hypervisor .text + .rodata */
- xen_regions[region_ro].s = __pa(&_stext);
+ xen_regions[region_ro].s = __pa(stext_);
xen_regions[region_ro].e = __pa(&__2M_rodata_end);
/* hypervisor .data + .bss */
xen_regions[region_rw].s = __pa(&__2M_rwdata_start);
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 7d1226d..44fae91 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[];
+extern uintptr_t stextentry_, etextentry_;
static int setup_cpu_root_pgt(unsigned int cpu)
{
@@ -810,8 +810,9 @@ static int setup_cpu_root_pgt(unsigned int cpu)
{
const char *ptr;
- for ( rc = 0, ptr = _stextentry;
- !rc && ptr < _etextentry; ptr += PAGE_SIZE )
+ for ( rc = 0, ptr = (const char *)stextentry_;
+ !rc && (uintptr_t)ptr < etextentry_;
+ ptr += PAGE_SIZE )
rc = clone_mapping(ptr, rpt);
if ( rc )
diff --git a/xen/arch/x86/tboot.c b/xen/arch/x86/tboot.c
index f3fdee4..620303e 100644
--- a/xen/arch/x86/tboot.c
+++ b/xen/arch/x86/tboot.c
@@ -373,9 +373,9 @@ void tboot_shutdown(uint32_t shutdown_type)
g_tboot_shared->mac_regions[0].size = bootsym_phys(trampoline_end) -
bootsym_phys(trampoline_start);
/* hypervisor .text + .rodata */
- g_tboot_shared->mac_regions[1].start = (uint64_t)__pa(&_stext);
+ g_tboot_shared->mac_regions[1].start = (uint64_t)__pa(stext_);
g_tboot_shared->mac_regions[1].size = __pa(&__2M_rodata_end) -
- __pa(&_stext);
+ __pa(stext_);
/* hypervisor .data + .bss */
g_tboot_shared->mac_regions[2].start =
(uint64_t)__pa(&__2M_rwdata_start);
g_tboot_shared->mac_regions[2].size = __pa(&__2M_rwdata_end) -
diff --git a/xen/arch/x86/x86_64/machine_kexec.c
b/xen/arch/x86/x86_64/machine_kexec.c
index f4a005c..cf435ac 100644
--- a/xen/arch/x86/x86_64/machine_kexec.c
+++ b/xen/arch/x86/x86_64/machine_kexec.c
@@ -13,8 +13,8 @@
int machine_kexec_get_xen(xen_kexec_range_t *range)
{
- range->start = virt_to_maddr(_start);
- range->size = virt_to_maddr(_end) - (unsigned long)range->start;
+ range->start = virt_to_maddr(start_);
+ range->size = virt_to_maddr(end_) - (unsigned long)range->start;
return 0;
}
diff --git a/xen/common/symbols.c b/xen/common/symbols.c
index 9377f41..b6cf0dd 100644
--- a/xen/common/symbols.c
+++ b/xen/common/symbols.c
@@ -149,8 +149,7 @@ const char *symbols_lookup(unsigned long addr,
/* if we found no next symbol, we use the end of the section */
if (!symbol_end)
- symbol_end = is_kernel_inittext(addr) ?
- (unsigned long)_einittext : (unsigned long)_etext;
+ symbol_end = is_kernel_inittext(addr) ? einittext_ : etext_;
*symbolsize = symbol_end - symbols_address(low);
*offset = addr - symbols_address(low);
diff --git a/xen/common/virtual_region.c b/xen/common/virtual_region.c
index aa23918..1637453 100644
--- a/xen/common/virtual_region.c
+++ b/xen/common/virtual_region.c
@@ -10,15 +10,11 @@
static struct virtual_region core = {
.list = LIST_HEAD_INIT(core.list),
- .start = _stext,
- .end = _etext,
};
/* Becomes irrelevant when __init sections are cleared. */
static struct virtual_region core_init __initdata = {
.list = LIST_HEAD_INIT(core_init.list),
- .start = _sinittext,
- .end = _einittext,
};
/*
@@ -114,6 +110,11 @@ void __init setup_virtual_regions(const struct
exception_table_entry *start,
NULL
};
+ core.start = (char *)start_;
+ core.end = (char *)end_;
+ core_init.start = (char *)sinittext_;
+ core_init.end = (char *)einittext_;
+
for ( i = 1; bug_frames[i]; i++ )
{
const struct bug_frame *s;
diff --git a/xen/include/asm-arm/grant_table.h
b/xen/include/asm-arm/grant_table.h
index 816e3c6..74a8ef4 100644
--- a/xen/include/asm-arm/grant_table.h
+++ b/xen/include/asm-arm/grant_table.h
@@ -31,7 +31,7 @@ void gnttab_mark_dirty(struct domain *d, mfn_t mfn);
* enough space for a large grant table
*/
#define gnttab_dom0_frames() \
- min_t(unsigned int, opt_max_grant_frames, PFN_DOWN(_etext - _stext))
+ min_t(unsigned int, opt_max_grant_frames, PFN_DOWN(etext_ - stext_))
#define gnttab_init_arch(gt) \
({ \
diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h
index eafa26f..e72ffb2 100644
--- a/xen/include/asm-arm/mm.h
+++ b/xen/include/asm-arm/mm.h
@@ -151,8 +151,8 @@ extern vaddr_t xenheap_virt_start;
#endif
#define is_xen_fixed_mfn(mfn) \
- ((pfn_to_paddr(mfn) >= virt_to_maddr(&_start)) && \
- (pfn_to_paddr(mfn) <= virt_to_maddr(&_end)))
+ ((pfn_to_paddr(mfn) >= virt_to_maddr(&start_)) && \
+ (pfn_to_paddr(mfn) <= virt_to_maddr(&end_)))
#define page_get_owner(_p) (_p)->v.inuse.domain
#define page_set_owner(_p,_d) ((_p)->v.inuse.domain = (_d))
diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
index 6faa563..3b07d12 100644
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -280,7 +280,7 @@ struct page_info
#define is_xen_heap_mfn(mfn) \
(__mfn_valid(mfn) && is_xen_heap_page(mfn_to_page(_mfn(mfn))))
#define is_xen_fixed_mfn(mfn) \
- ((((mfn) << PAGE_SHIFT) >= __pa(&_stext)) && \
+ ((((mfn) << PAGE_SHIFT) >= __pa(stext_)) && \
(((mfn) << PAGE_SHIFT) <= __pa(&__2M_rwdata_end)))
#define PRtype_info "016lx"/* should only be used for printk's */
diff --git a/xen/include/xen/kernel.h b/xen/include/xen/kernel.h
index 548b64d..78643a9 100644
--- a/xen/include/xen/kernel.h
+++ b/xen/include/xen/kernel.h
@@ -65,28 +65,28 @@
1; \
})
-extern char _start[], _end[], start[];
-#define is_kernel(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _start) && (__p < _end); \
+extern uintptr_t start_, end_;
+#define is_kernel(p) ({ \
+ const uintptr_t p__ = (const uintptr_t)(p); \
+ (p__ >= start_) && (p__ < end_); \
})
-extern char _stext[], _etext[];
-#define is_kernel_text(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _stext) && (__p < _etext); \
+extern uintptr_t stext_, etext_;
+#define is_kernel_text(p) ({ \
+ const uintptr_t p__ = (const uintptr_t)(p); \
+ (p__ >= stext_) && (p__ < etext_); \
})
-extern const char _srodata[], _erodata[];
-#define is_kernel_rodata(p) ({ \
- const char *__p = (const char *)(unsigned long)(p); \
- (__p >= _srodata) && (__p < _erodata); \
+extern uintptr_t srodata_, erodata_;
+#define is_kernel_rodata(p) ({ \
+ const uintptr_t p__ = (const uintptr_t)(p); \
+ (p__ >= srodata_) && (p__ < erodata_); \
})
-extern char _sinittext[], _einittext[];
-#define is_kernel_inittext(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _sinittext) && (__p < _einittext); \
+extern uintptr_t sinittext_, einittext_;
+#define is_kernel_inittext(p) ({ \
+ const uintptr_t p__ = (const uintptr_t)(p); \
+ (p__ >= sinittext_) && (p__ < einittext_); \
})
extern enum system_state {
--
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 |