|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 7/7] xen/arm: use alt_instructions_, trampoline_rel_start_, start_vpci_array_, and more
Start making use of the following x86 specific uintptr_t variables:
alt_instructions_, alt_instructions_end_, trampoline_rel_start_,
trampoline_rel_stop_, trampoline_seg_start_, trampoline_seg_stop_,
init_begin_, init_end_, start_vpci_array_, end_vpci_array_
Replacing the corresponding linker symbols. These are all x86 specific
changes. It is done to avoid comparing and subtracting pointers pointing
to different objects.
bss_start_, bss_end_ have been removed because they are not used.
Another meaningful change is in the calculation of NUM_VPCI_INIT: now it
needs to take into account the size of the struct pointer.
One thing to note is that ideally we would avoid converting
alt_instructions_ and alt_instructions_end_ to pointers as done in
alternative.c because it can lead to comparisions/subtractions between
pointers to different objects. It is not difficult to fix by reworking
the code slightly but out of scope for this patch.
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/x86/alternative.c | 5 +++--
xen/arch/x86/efi/efi-boot.h | 12 ++++++------
xen/arch/x86/setup.c | 8 ++++----
xen/drivers/vpci/vpci.c | 11 +++++++----
4 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
index b8c819a..bdbb9bd 100644
--- a/xen/arch/x86/alternative.c
+++ b/xen/arch/x86/alternative.c
@@ -29,7 +29,7 @@
#define MAX_PATCH_LEN (255-1)
-extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
+extern uintptr_t alt_instructions_, alt_instructions_end_;
#ifdef K8_NOP1
static const unsigned char k8nops[] init_or_livepatch_const = {
@@ -273,7 +273,8 @@ static int __init nmi_apply_alternatives(const struct
cpu_user_regs *regs,
/* Disable WP to allow patching read-only pages. */
write_cr0(cr0 & ~X86_CR0_WP);
- apply_alternatives(__alt_instructions, __alt_instructions_end);
+ apply_alternatives((struct alt_instr *)alt_instructions_,
+ (struct alt_instr *)alt_instructions_end_);
write_cr0(cr0);
diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
index 5789d2c..33e39bd 100644
--- a/xen/arch/x86/efi/efi-boot.h
+++ b/xen/arch/x86/efi/efi-boot.h
@@ -98,8 +98,8 @@ 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[];
+extern uintptr_t trampoline_rel_start_, trampoline_rel_stop_;
+extern uintptr_t trampoline_seg_start_, trampoline_seg_stop_;
static void __init relocate_trampoline(unsigned long phys)
{
@@ -111,12 +111,12 @@ static void __init relocate_trampoline(unsigned long phys)
return;
/* Apply relocations to trampoline. */
- for ( trampoline_ptr = __trampoline_rel_start;
- trampoline_ptr < __trampoline_rel_stop;
+ for ( trampoline_ptr = (const s32 *)trampoline_rel_start_;
+ (uintptr_t)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;
+ for ( trampoline_ptr = (const s32 *)trampoline_seg_start_;
+ (uintptr_t)trampoline_ptr < trampoline_seg_stop_;
++trampoline_ptr )
*(u16 *)(*trampoline_ptr + (long)trampoline_ptr) = phys >> 4;
}
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 3a2aa4c..3f0d597 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -252,7 +252,7 @@ void __init discard_initial_images(void)
initial_images = NULL;
}
-extern char __init_begin[], __init_end[], __bss_start[], __bss_end[];
+extern uintptr_t init_begin_, init_end_;
static void __init init_idle_domain(void)
{
@@ -600,7 +600,7 @@ 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 = (void *)init_begin_; (uintptr_t)va < init_end_; va += PAGE_SIZE
)
clear_page(va);
/* Destroy Xen's mappings, and reuse the pages. */
@@ -611,8 +611,8 @@ static void noinline init_done(void)
}
else
{
- start = (unsigned long)&__init_begin;
- end = (unsigned long)&__init_end;
+ start = init_begin_;
+ end = init_end_;
}
destroy_xen_mappings(start, end);
diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c
index 82607bd..6eafd00 100644
--- a/xen/drivers/vpci/vpci.c
+++ b/xen/drivers/vpci/vpci.c
@@ -31,9 +31,10 @@ 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)
+extern uintptr_t start_vpci_array_;
+extern uintptr_t end_vpci_array_;
+#define NUM_VPCI_INIT ((end_vpci_array_ - start_vpci_array_) / \
+ (sizeof(vpci_register_init_t *)))
void vpci_remove_device(struct pci_dev *pdev)
{
@@ -58,6 +59,8 @@ int __hwdom_init vpci_add_handlers(struct pci_dev *pdev)
{
unsigned int i;
int rc = 0;
+ vpci_register_init_t **start_vpci_array = (vpci_register_init_t **)
+ start_vpci_array_;
if ( !has_vpci(pdev->domain) )
return 0;
@@ -71,7 +74,7 @@ int __hwdom_init vpci_add_handlers(struct pci_dev *pdev)
for ( i = 0; i < NUM_VPCI_INIT; i++ )
{
- rc = __start_vpci_array[i](pdev);
+ rc = start_vpci_array[i](pdev);
if ( rc )
break;
}
--
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 |