[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 1/4] xen: introduce SYMBOL
Hi Stefano, On 1/11/19 9:37 PM, Stefano Stabellini wrote: On Fri, 11 Jan 2019, Stewart Hildebrand wrote:On Friday, January 11, 2019 3:36 PM, Julien Grall wrote:On Fri, 11 Jan 2019, 12:53 Stewart Hildebrand wrote:Why don't we change the type of _start so it's not a pointer type?Can you suggest a type that would be suitable? Cheers,Yes. My opinion is that the "sufficient-width integer type" should be a "uintptr_t" or "intptr_t", since those types by definition are *integer* types wide enough to hold a value converted from a void pointer. While "unsigned long" seems to work for Linux, the definition of that type doesn't provide the same guarantee. Since uintptr_t is an *integer* type by definition (and not a pointer type), my interpretation of the C standard is that subtraction/comparison of uintptr_t types won't be subject to the potential "pointer to object" issues in question. If I had to choose between "uintptr_t" or "intptr_t" I guess I would choose "uintptr_t" since that type is already used in various places in the Xen codebase. And the Linux workaround is also using an unsigned integer type.On changing type of _start & friends: we cannot declare _start as uintptr_t, the linker won't be able to set the value. It needs to be an array type. At that point, it is basically a pointer, it doesn't matter if it is a char[] or uintptr_t[]. It won't help. Are you sure about this? I wrote a quick patch (see below) to switch _start/_end to uintptr_t and didn't notice any specific linker issue. I borrowed the idea from ATF which have been using uintptr_t for linker symbol. diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 340a1d1548..ab98cabbb7 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c@@ -1073,10 +1073,11 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int flags) } 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 char *__p, unsigned long l, enum mg mg) { lpae_t pte; int i; + uintptr_t p = (uintptr_t)__p; ASSERT(is_kernel(p) && is_kernel(p + l)); diff --git a/xen/include/xen/kernel.h b/xen/include/xen/kernel.h index 548b64da9f..94bb08fc65 100644 --- a/xen/include/xen/kernel.h +++ b/xen/include/xen/kernel.h @@ -65,9 +65,9 @@ 1; \ }) -extern char _start[], _end[], start[]; +extern uintptr_t _start, _end, start; #define is_kernel(p) ({ \ - char *__p = (char *)(unsigned long)(p); \ + uintptr_t __p = (uintptr_t)(p); \ (__p >= _start) && (__p < _end); \ }) Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |