> If the attribute to force it into .data isn't wanted the alternative
> gets messy as config has a bunch of bogus types and casts and treats the
> int values as longs.

Well, I believe that messiness is a result of trying to avoid the
consequences of the ABI.  I feel the ABI shouldn't be exposed here
and changing the compilers is wrong...

The -1 handling could be pushed to the very top.  At the very first
moment anything in ukc runs, set it to 0.  No conditional logic later on.


> Index: mkioconf.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/config/mkioconf.c,v
> retrieving revision 1.36
> diff -u -p -r1.36 mkioconf.c
> --- mkioconf.c        27 Oct 2016 14:33:30 -0000      1.36
> +++ mkioconf.c        14 Sep 2017 02:11:17 -0000
> @@ -183,7 +183,7 @@ static long loc[%d] = {", locators.used)
>  #endif\n\
>  long extraloc[MAXEXTRALOC] = { -1 };\n\
>  int nextraloc = MAXEXTRALOC;\n\
> -int uextraloc = 0;\n") < 0);
> +int uextraloc = -1;\n") < 0);
>  }
>  
>  static int nlocnames, maxlocnames = 8;
> Index: ukcutil.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/config/ukcutil.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 ukcutil.c
> --- ukcutil.c 27 Oct 2016 14:32:10 -0000      1.22
> +++ ukcutil.c 14 Sep 2017 02:22:33 -0000
> @@ -419,6 +419,14 @@ change(int devno)
>  
>                       j = (long *)adjust((caddr_t)nl[I_NEXTRALOC].n_value);
>                       k = (long *)adjust((caddr_t)nl[I_UEXTRALOC].n_value);
> +
> +                     /*
> +                      * uextraloc is initialised to -1 not 0 so it will be
> +                      * put in .data instead of .bss so config can modify it
> +                      */
> +                     if (*(int *)k == -1)
> +                             *k = 0;
> +
>                       if ((i + *k) > *j) {
>                               printf("Not enough space to change device.\n");
>                               return;
> @@ -521,6 +529,14 @@ change_history(int devno, char *str)
>  
>                       j = (long *)adjust((caddr_t)nl[I_NEXTRALOC].n_value);
>                       k = (long *)adjust((caddr_t)nl[I_UEXTRALOC].n_value);
> +
> +                     /*
> +                      * uextraloc is initialised to -1 not 0 so it will be
> +                      * put in .data instead of .bss so config can modify it
> +                      */
> +                     if (*(int *)k == -1)
> +                             *k = 0;
> +
>                       if ((i + *k) > *j) {
>                               printf("Not enough space to change device.\n");
>                               return;

Reply via email to