|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 5/7] xen: use per_cpu_start_, start_bug_frames_, and more
Start making use of the following uintptr_t variables:
per_cpu_start_, per_cpu_data_end_, per_cpu_data_end_,
start_bug_frames_, stop_bug_frames_0_, stop_bug_frames_1_,
stop_bug_frames_2_, stop_bug_frames_3_
Replacing the corresponding linker symbols. It is done to avoid
comparing and subtracting pointers pointing to different objects.
The separation is a bit arbitrary, but all these symbols are declared in
asm files.
One meaningful change is in the size calculation (sz variable) in
setup_virtual_regions, now it needs to take into account the size of the
struct pointer.
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/percpu.c | 11 ++++++-----
xen/arch/x86/percpu.c | 10 +++++-----
xen/common/virtual_region.c | 18 +++++++++---------
xen/include/asm-arm/bug.h | 8 ++++----
xen/include/asm-arm/percpu.h | 2 +-
xen/include/asm-x86/bug.h | 10 +++++-----
xen/include/asm-x86/percpu.h | 4 +++-
7 files changed, 33 insertions(+), 30 deletions(-)
diff --git a/xen/arch/arm/percpu.c b/xen/arch/arm/percpu.c
index 25442c4..91f5ae9 100644
--- a/xen/arch/arm/percpu.c
+++ b/xen/arch/arm/percpu.c
@@ -5,8 +5,8 @@
#include <xen/rcupdate.h>
unsigned long __per_cpu_offset[NR_CPUS];
-#define INVALID_PERCPU_AREA (-(long)__per_cpu_start)
-#define PERCPU_ORDER (get_order_from_bytes(__per_cpu_data_end-__per_cpu_start))
+#define INVALID_PERCPU_AREA (-(long)per_cpu_start_)
+#define PERCPU_ORDER (get_order_from_bytes(per_cpu_data_end_ - per_cpu_start_))
void __init percpu_init_areas(void)
{
@@ -22,8 +22,8 @@ static int init_percpu_area(unsigned int cpu)
return -EBUSY;
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_data_end_ - per_cpu_start_);
+ __per_cpu_offset[cpu] = (uintptr_t)p - per_cpu_start_;
return 0;
}
@@ -37,7 +37,8 @@ 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/percpu.c b/xen/arch/x86/percpu.c
index 8be4ebd..58624a3 100644
--- a/xen/arch/x86/percpu.c
+++ b/xen/arch/x86/percpu.c
@@ -12,8 +12,8 @@ unsigned long __per_cpu_offset[NR_CPUS];
* possible #PF at (NULL + a little) which has security implications in the
* 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 INVALID_PERCPU_AREA (0x8000000000000000L - (long)per_cpu_start_)
+#define PERCPU_ORDER get_order_from_bytes(per_cpu_data_end_ - per_cpu_start_)
void __init percpu_init_areas(void)
{
@@ -33,8 +33,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_data_end_ - per_cpu_start_);
+ __per_cpu_offset[cpu] = (uintptr_t)p - per_cpu_start_;
return 0;
}
@@ -49,7 +49,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/common/virtual_region.c b/xen/common/virtual_region.c
index 1637453..d048016 100644
--- a/xen/common/virtual_region.c
+++ b/xen/common/virtual_region.c
@@ -99,15 +99,15 @@ void __init setup_virtual_regions(const struct
exception_table_entry *start,
{
size_t sz;
unsigned int i;
- static const struct bug_frame *const __initconstrel bug_frames[] = {
- __start_bug_frames,
- __stop_bug_frames_0,
- __stop_bug_frames_1,
- __stop_bug_frames_2,
+ const uintptr_t bug_frames[] = {
+ start_bug_frames_,
+ stop_bug_frames_0_,
+ stop_bug_frames_1_,
+ stop_bug_frames_2_,
#ifdef CONFIG_X86
- __stop_bug_frames_3,
+ stop_bug_frames_3_,
#endif
- NULL
+ 0
};
core.start = (char *)start_;
@@ -119,8 +119,8 @@ void __init setup_virtual_regions(const struct
exception_table_entry *start,
{
const struct bug_frame *s;
- s = bug_frames[i - 1];
- sz = bug_frames[i] - s;
+ s = (struct bug_frame *)bug_frames[i - 1];
+ sz = (bug_frames[i] - bug_frames[i - 1]) / sizeof(struct bug_frame *);
core.frame[i - 1].n_bugs = sz;
core.frame[i - 1].bugs = s;
diff --git a/xen/include/asm-arm/bug.h b/xen/include/asm-arm/bug.h
index 36c8033..8720241 100644
--- a/xen/include/asm-arm/bug.h
+++ b/xen/include/asm-arm/bug.h
@@ -70,10 +70,10 @@ struct bug_frame {
unreachable(); \
} while (0)
-extern const struct bug_frame __start_bug_frames[],
- __stop_bug_frames_0[],
- __stop_bug_frames_1[],
- __stop_bug_frames_2[];
+extern uintptr_t start_bug_frames_,
+ stop_bug_frames_0_,
+ stop_bug_frames_1_,
+ stop_bug_frames_2_;
#endif /* __ARM_BUG_H__ */
/*
diff --git a/xen/include/asm-arm/percpu.h b/xen/include/asm-arm/percpu.h
index 6263e77..2cb50ed 100644
--- a/xen/include/asm-arm/percpu.h
+++ b/xen/include/asm-arm/percpu.h
@@ -6,7 +6,7 @@
#include <xen/types.h>
#include <asm/sysregs.h>
-extern char __per_cpu_start[], __per_cpu_data_end[];
+extern uintptr_t per_cpu_start_, per_cpu_data_end_;
extern unsigned long __per_cpu_offset[NR_CPUS];
void percpu_init_areas(void);
diff --git a/xen/include/asm-x86/bug.h b/xen/include/asm-x86/bug.h
index 9bb4a19..32cd2c4 100644
--- a/xen/include/asm-x86/bug.h
+++ b/xen/include/asm-x86/bug.h
@@ -72,11 +72,11 @@ struct bug_frame {
unreachable(); \
} while (0)
-extern const struct bug_frame __start_bug_frames[],
- __stop_bug_frames_0[],
- __stop_bug_frames_1[],
- __stop_bug_frames_2[],
- __stop_bug_frames_3[];
+extern uintptr_t start_bug_frames_,
+ stop_bug_frames_0_,
+ stop_bug_frames_1_,
+ stop_bug_frames_2_,
+ stop_bug_frames_3_;
#else /* !__ASSEMBLY__ */
diff --git a/xen/include/asm-x86/percpu.h b/xen/include/asm-x86/percpu.h
index 51562b9..a1e1569 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>
+
+extern uintptr_t 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 |