int ret;
struct alt_region region;
mfn_t xen_mfn = virt_to_mfn(_start);
- paddr_t xen_size = _end - _start;
+ paddr_t xen_size = xen_diff(_start, _end);
unsigned int xen_order = get_order_from_bytes(xen_size);
void *xenmap;
region.begin = __alt_instructions;
region.end = __alt_instructions_end;
- ret = __apply_alternatives(®ion, xenmap - (void *)_start);
+ ret = __apply_alternatives(®ion, xen_diff(_start, xenmap));
/* The patching is not expected to fail during boot. */
BUG_ON(ret != 0);
else
insn = 0xe1a00000; /* mov r0, r0 */
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = xen_diff(_start, func->old_addr) + vmap_of_xen_text;
len = len / sizeof(uint32_t);
/* PATCH! */
/* Verified in livepatch_verify_distance. */
ASSERT(insn != AARCH64_BREAK_FAULT);
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = xen_diff(_start, func->old_addr) + vmap_of_xen_text;
len = len / sizeof(uint32_t);
/* PATCH! */
return -EINVAL;
text_mfn = virt_to_mfn(_start);
- text_order = get_order_from_bytes(_end - _start);
+ text_order = get_order_from_bytes(xen_diff(_start, _end));
/*
* The text section is read-only. So re-map Xen to be able to patch
uint32_t *new_ptr;
unsigned int len;
- new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
+ new_ptr = xen_diff(_start, func->old_addr) + vmap_of_xen_text;
len = livepatch_insn_len(func);
memcpy(new_ptr, func->opaque, len);
}
enum mg { mg_clear, mg_ro, mg_rw, mg_rx };
-static void set_pte_flags_on_range(const char *p, unsigned long l, enum mg mg)
+static void set_pte_flags_on_range(const void *p, unsigned long l, enum mg mg)
{
lpae_t pte;
int i;
ASSERT(!((unsigned long) p & ~PAGE_MASK));
ASSERT(!(l & ~PAGE_MASK));
- for ( i = (p - _start) / PAGE_SIZE;
- i < (p + l - _start) / PAGE_SIZE;
+ for ( i = xen_diff(_start, p) / PAGE_SIZE;
+ i < (xen_diff(_start, p) + l) / PAGE_SIZE;
i++ )
{
pte = xen_xenmap[i];
/* 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);
+ (paddr_t)(_start + boot_phys_offset),
+ (paddr_t)(xen_diff(_start, _end) + 1),
+ false);
BUG_ON(!xen_bootmodule);
setup_pagetables(boot_phys_offset);
* 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,
+ xen_diff(_start, _end), 1);
/* Walk initial pagetables, relocating page directory entries. */
pl4e = __va(__pa(idle_pg_table));
* 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(text_diff(_stext, _etext)))
#define gnttab_init_arch(gt) \
({ \
* 'kernel.h' contains some often-used function prototypes etc
*/
+#include <xen/lib.h>
#include <xen/types.h>
/*
1; \
})
-extern char _start[], _end[], start[];
-#define is_kernel(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _start) && (__p < _end); \
+extern char start[];
+typedef char xen_t;
+DECLARE_BOUNDS(xen, _start, _end);
+#define is_kernel(p) ({ \
+ const char *p__ = (const char *)(unsigned long)(p); \
+ ((uintptr_t)p__ >= (uintptr_t)_start && \
+ xen_lt(p__, _end)); \
})
-extern char _stext[], _etext[];
-#define is_kernel_text(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _stext) && (__p < _etext); \
+typedef char text_t;
+DECLARE_BOUNDS(text, _stext, _etext);
+#define is_kernel_text(p) ({ \
+ const char *p__ = (const char *)(unsigned long)(p); \
+ ((uintptr_t)p__ >= (uintptr_t) _stext && \
+ text_lt(p__, _etext)); \
})
-extern const char _srodata[], _erodata[];
-#define is_kernel_rodata(p) ({ \
- const char *__p = (const char *)(unsigned long)(p); \
- (__p >= _srodata) && (__p < _erodata); \
+typedef char rodata_t;
+DECLARE_BOUNDS(rodata, _srodata, _erodata);
+#define is_kernel_rodata(p) ({ \
+ const char *p__ = (const char *)(unsigned long)(p); \
+ ((uintptr_t)p__ >= (uintptr_t)_srodata && \
+ rodata_lt(p__, _erodata)); \
})
-extern char _sinittext[], _einittext[];
-#define is_kernel_inittext(p) ({ \
- char *__p = (char *)(unsigned long)(p); \
- (__p >= _sinittext) && (__p < _einittext); \
+typedef char inittext_t;
+DECLARE_BOUNDS(inittext, _sinittext, _einittext);
+#define is_kernel_inittext(p) ({ \
+ const char *p__ = (const char *)(unsigned long)(p); \
+ ((uintptr_t)p__ >= (uintptr_t) _sinittext && \
+ inittext_lt(p__, _einittext)); \
})
extern enum system_state {