Re: [Xen-devel] [PATCH v6 4/4] xen/common: use SYMBOL when required

2019-01-10 Thread Stefano Stabellini
On Thu, 10 Jan 2019, Jan Beulich wrote:
> >>> On 10.01.19 at 00:42,  wrote:
> > --- a/xen/common/version.c
> > +++ b/xen/common/version.c
> > @@ -147,14 +147,14 @@ static int __init xen_build_init(void)
> >  int rc;
> >  
> >  /* --build-id invoked with wrong parameters. */
> > -if ( __note_gnu_build_id_end <= &n[0] )
> > +if ( SYMBOL(__note_gnu_build_id_end) <= &n[0] )
> >  return -ENODATA;
> >  
> >  /* Check for full Note header. */
> > -if ( &n[1] >= __note_gnu_build_id_end )
> > +if ( &n[1] >= SYMBOL(__note_gnu_build_id_end) )
> >  return -ENODATA;
> >  
> > -sz = (void *)__note_gnu_build_id_end - (void *)n;
> > +sz = (void *)SYMBOL(__note_gnu_build_id_end) - (void *)n;
> 
> Now this is an instance where I wouldn't mind if you switched the
> casts to (unsigned long).

OK


> > --- a/xen/common/virtual_region.c
> > +++ b/xen/common/virtual_region.c
> > @@ -103,13 +103,13 @@ 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 struct bug_frame *bug_frames[] = {
> 
> Please don't loose the second const.

OK


> > --- a/xen/include/xen/kernel.h
> > +++ b/xen/include/xen/kernel.h
> > @@ -66,27 +66,27 @@
> >  })
> >  
> >  extern char _start[], _end[], start[];
> > -#define is_kernel(p) ({ \
> > -char *__p = (char *)(unsigned long)(p); \
> > -(__p >= _start) && (__p < _end);\
> > +#define is_kernel(p) ({ \
> > +char *p__ = (char *)(unsigned long)(p); \
> > +(p__ >= SYMBOL(_start)) && (p__ < SYMBOL(_end));\
> >  })
> >  
> >  extern char _stext[], _etext[];
> > -#define is_kernel_text(p) ({\
> > -char *__p = (char *)(unsigned long)(p); \
> > -(__p >= _stext) && (__p < _etext);  \
> > +#define is_kernel_text(p) ({\
> > +char *p__ = (char *)(unsigned long)(p); \
> > +(p__ >= SYMBOL(_stext)) && (p__ < SYMBOL(_etext));  \
> >  })
> >  
> >  extern const char _srodata[], _erodata[];
> > -#define is_kernel_rodata(p) ({  \
> > -const char *__p = (const char *)(unsigned long)(p); \
> > -(__p >= _srodata) && (__p < _erodata);  \
> > +#define is_kernel_rodata(p) ({  \
> > +const char *p__ = (const char *)(unsigned long)(p); \
> 
> Just like here, in all other of the sibling macros you could easily
> have switched p__ to be const char * as well.

OK


> With at least the bug_frames[] remark taken care of
> Reviewed-by: Jan Beulich 
 
I'll make the changes above and add your reviewed-by

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v6 4/4] xen/common: use SYMBOL when required

2019-01-10 Thread Jan Beulich
>>> On 10.01.19 at 00:42,  wrote:
> --- a/xen/common/version.c
> +++ b/xen/common/version.c
> @@ -147,14 +147,14 @@ static int __init xen_build_init(void)
>  int rc;
>  
>  /* --build-id invoked with wrong parameters. */
> -if ( __note_gnu_build_id_end <= &n[0] )
> +if ( SYMBOL(__note_gnu_build_id_end) <= &n[0] )
>  return -ENODATA;
>  
>  /* Check for full Note header. */
> -if ( &n[1] >= __note_gnu_build_id_end )
> +if ( &n[1] >= SYMBOL(__note_gnu_build_id_end) )
>  return -ENODATA;
>  
> -sz = (void *)__note_gnu_build_id_end - (void *)n;
> +sz = (void *)SYMBOL(__note_gnu_build_id_end) - (void *)n;

Now this is an instance where I wouldn't mind if you switched the
casts to (unsigned long).

> --- a/xen/common/virtual_region.c
> +++ b/xen/common/virtual_region.c
> @@ -103,13 +103,13 @@ 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 struct bug_frame *bug_frames[] = {

Please don't loose the second const.

> --- a/xen/include/xen/kernel.h
> +++ b/xen/include/xen/kernel.h
> @@ -66,27 +66,27 @@
>  })
>  
>  extern char _start[], _end[], start[];
> -#define is_kernel(p) ({ \
> -char *__p = (char *)(unsigned long)(p); \
> -(__p >= _start) && (__p < _end);\
> +#define is_kernel(p) ({ \
> +char *p__ = (char *)(unsigned long)(p); \
> +(p__ >= SYMBOL(_start)) && (p__ < SYMBOL(_end));\
>  })
>  
>  extern char _stext[], _etext[];
> -#define is_kernel_text(p) ({\
> -char *__p = (char *)(unsigned long)(p); \
> -(__p >= _stext) && (__p < _etext);  \
> +#define is_kernel_text(p) ({\
> +char *p__ = (char *)(unsigned long)(p); \
> +(p__ >= SYMBOL(_stext)) && (p__ < SYMBOL(_etext));  \
>  })
>  
>  extern const char _srodata[], _erodata[];
> -#define is_kernel_rodata(p) ({  \
> -const char *__p = (const char *)(unsigned long)(p); \
> -(__p >= _srodata) && (__p < _erodata);  \
> +#define is_kernel_rodata(p) ({  \
> +const char *p__ = (const char *)(unsigned long)(p); \

Just like here, in all other of the sibling macros you could easily
have switched p__ to be const char * as well.

With at least the bug_frames[] remark taken care of
Reviewed-by: Jan Beulich 

Jan



___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

[Xen-devel] [PATCH v6 4/4] xen/common: use SYMBOL when required

2019-01-09 Thread Stefano Stabellini
Use SYMBOL in cases of comparisons and subtractions of:

_start, _end, _stext, _etext, _srodata, _erodata, _sinittext,
_einittext, __note_gnu_build_id_start, __note_gnu_build_id_end,
__lock_profile_start, __lock_profile_end, __initcall_start,
__initcall_end, __presmp_initcall_end, __ctors_start, __ctors_end,
__end_schedulers_array, __start_schedulers_array, __start_bug_frames,
__stop_bug_frames_0, __stop_bug_frames_1, __stop_bug_frames_2,
__stop_bug_frames_3,

as by the C standard [1].

M3CM: Rule-18.2: Subtraction between pointers shall only be applied to
pointers that address elements of the same array

Since we are changing the body of is_kernel_text and friends, take the
opportunity to remove the leading underscores in the local variables
names, which are violationg namespace rules.

[1] 
https://wiki.sei.cmu.edu/confluence/display/c/ARR36-C.+Do+not+subtract+or+compare+two+pointers+that+do+not+refer+to+the+same+array

QAVerify: 2761
Signed-off-by: Stefano Stabellini 
CC: jbeul...@suse.com
CC: andrew.coop...@citrix.com
---
Changes in v6:
- more accurate commit message
- remove hard tabs
- remove leading underscores
- code style
- use SYMBOL only on the problematic bug_frames symbols
- use new SYMBOL macro that returns the native type

Changes in v5:
- remove two spurious changes
- split into three patches
- remove SYMBOL() from derived variables
---
 xen/common/kernel.c |  8 ++--
 xen/common/lib.c|  3 ++-
 xen/common/schedule.c   |  6 --
 xen/common/spinlock.c   |  4 +++-
 xen/common/version.c|  6 +++---
 xen/common/virtual_region.c | 12 ++--
 xen/include/xen/kernel.h| 24 
 7 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index 5766a0f..ed913be 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -312,14 +312,18 @@ extern const initcall_t __initcall_start[], 
__presmp_initcall_end[],
 void __init do_presmp_initcalls(void)
 {
 const initcall_t *call;
-for ( call = __initcall_start; call < __presmp_initcall_end; call++ )
+for ( call = SYMBOL(__initcall_start);
+  call < SYMBOL(__presmp_initcall_end);
+  call++ )
 (*call)();
 }
 
 void __init do_initcalls(void)
 {
 const initcall_t *call;
-for ( call = __presmp_initcall_end; call < __initcall_end; call++ )
+for ( call = SYMBOL(__presmp_initcall_end);
+  call < SYMBOL(__initcall_end);
+  call++ )
 (*call)();
 }
 
diff --git a/xen/common/lib.c b/xen/common/lib.c
index 8ebec81..4e43ee5 100644
--- a/xen/common/lib.c
+++ b/xen/common/lib.c
@@ -497,7 +497,8 @@ extern const ctor_func_t __ctors_start[], __ctors_end[];
 void __init init_constructors(void)
 {
 const ctor_func_t *f;
-for ( f = __ctors_start; f < __ctors_end; ++f )
+
+for ( f = SYMBOL(__ctors_start); f < SYMBOL(__ctors_end); ++f )
 (*f)();
 
 /* Putting this here seems as good (or bad) as any other place. */
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index a957c5e..a81de40 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -67,8 +67,10 @@ DEFINE_PER_CPU(struct scheduler *, scheduler);
 /* Scratch space for cpumasks. */
 DEFINE_PER_CPU(cpumask_t, cpumask_scratch);
 
-extern const struct scheduler *__start_schedulers_array[], 
*__end_schedulers_array[];
-#define NUM_SCHEDULERS (__end_schedulers_array - __start_schedulers_array)
+extern const struct scheduler *__start_schedulers_array[],
+  *__end_schedulers_array[];
+#define NUM_SCHEDULERS (SYMBOL(__end_schedulers_array) - \
+SYMBOL(__start_schedulers_array))
 #define schedulers __start_schedulers_array
 
 static struct scheduler __read_mostly ops;
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index 6bc52d7..ed1b2b0 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -474,7 +474,9 @@ static int __init lock_prof_init(void)
 {
 struct lock_profile **q;
 
-for ( q = &__lock_profile_start; q < &__lock_profile_end; q++ )
+for ( q = SYMBOL(&__lock_profile_start);
+  q < SYMBOL(&__lock_profile_end);
+  q++ )
 {
 (*q)->next = lock_profile_glb_q.elem_q;
 lock_profile_glb_q.elem_q = *q;
diff --git a/xen/common/version.c b/xen/common/version.c
index 223cb52..7414d2d 100644
--- a/xen/common/version.c
+++ b/xen/common/version.c
@@ -147,14 +147,14 @@ static int __init xen_build_init(void)
 int rc;
 
 /* --build-id invoked with wrong parameters. */
-if ( __note_gnu_build_id_end <= &n[0] )
+if ( SYMBOL(__note_gnu_build_id_end) <= &n[0] )
 return -ENODATA;
 
 /* Check for full Note header. */
-if ( &n[1] >= __note_gnu_build_id_end )
+if ( &n[1] >= SYMBOL(__note_gnu_build_id_end) )
 return -ENODATA;
 
-sz = (void *)__note_gnu_build_id_end - (void *)n;
+sz = (void *)SYMBOL(__note_gnu_build_id_end) - (void *)n;
 
 rc = xen_b