Thread: NOFIXADE / NOPRINTADE

NOFIXADE / NOPRINTADE

From
Neil Conway
Date:
There's a bunch of very ugly code in backend/main/main.c that involves
the preprocessor constants "NOFIXADE" and "NOPRINTADE". The code seems
to be related to support for Alpha and/or ultrix4. NOFIXADE is defined
by port/osf.h and port/ultrix4.h, while NOPRINTADE is not defined as far
as I can tell (... unless some system header defines it?)

Does anyone have any idea what this code is intended to do, and why it
is necessary? It would be nice to remove it, but even if that's not
possible we can at least explain why it is necessary.

The code in question is:

#if defined(__alpha)            /* no __alpha__ ? */
#ifdef NOFIXADEint            buffer[] = {SSIN_UACPROC, UAC_SIGBUS};
#endif   /* NOFIXADE */
#ifdef NOPRINTADEint            buffer[] = {SSIN_UACPROC, UAC_NOPRINT};
#endif   /* NOPRINTADE */
#endif   /* __alpha */

#ifdef WIN32char       *env_locale;
#endif

#if defined(NOFIXADE) || defined(NOPRINTADE)

#if defined(ultrix4)syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
#endif

#if defined(__alpha)            /* no __alpha__ ? */if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
(unsigned long) NULL) < 0)    write_stderr("%s: setsysinfo failed: %s\n",                 argv[0], strerror(errno));
 
#endif
#endif   /* NOFIXADE || NOPRINTADE */

-Neil




Re: NOFIXADE / NOPRINTADE

From
Bruce Momjian
Date:
No idea.  That code came in at a time when we weren't as good at
documenting platform-specific stuff.  (We never expected to be this
popular or to be playing with this code 8 years later.)  :-)

I just found this:
http://joshua.raleigh.nc.us/docs/linux-2.4.10_html/87660.html

Want to update the C comments?

---------------------------------------------------------------------------

Neil Conway wrote:
> There's a bunch of very ugly code in backend/main/main.c that involves
> the preprocessor constants "NOFIXADE" and "NOPRINTADE". The code seems
> to be related to support for Alpha and/or ultrix4. NOFIXADE is defined
> by port/osf.h and port/ultrix4.h, while NOPRINTADE is not defined as far
> as I can tell (... unless some system header defines it?)
> 
> Does anyone have any idea what this code is intended to do, and why it
> is necessary? It would be nice to remove it, but even if that's not
> possible we can at least explain why it is necessary.
> 
> The code in question is:
> 
> #if defined(__alpha)            /* no __alpha__ ? */
> #ifdef NOFIXADE
>     int            buffer[] = {SSIN_UACPROC, UAC_SIGBUS};
> #endif   /* NOFIXADE */
> #ifdef NOPRINTADE
>     int            buffer[] = {SSIN_UACPROC, UAC_NOPRINT};
> #endif   /* NOPRINTADE */
> #endif   /* __alpha */
> 
> #ifdef WIN32
>     char       *env_locale;
> #endif
> 
> #if defined(NOFIXADE) || defined(NOPRINTADE)
> 
> #if defined(ultrix4)
>     syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
> #endif
> 
> #if defined(__alpha)            /* no __alpha__ ? */
>     if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
>                    (unsigned long) NULL) < 0)
>         write_stderr("%s: setsysinfo failed: %s\n",
>                      argv[0], strerror(errno));
> #endif
> #endif   /* NOFIXADE || NOPRINTADE */
> 
> -Neil
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: NOFIXADE / NOPRINTADE

From
Tom Lane
Date:
Neil Conway <neilc@samurai.com> writes:
> Does anyone have any idea what this code is intended to do, and why it
> is necessary?

A bit of googling (I used "SSIN_UACPROC") will turn up enough info to
clue you in.  Apparently, on these machines an unaligned memory access
causes a trap to the kernel, but the default behavior of the kernel is
to emulate the desired memory access and then return control.  Fine,
but *really* *slow*.  So good programming practice is to disable the
emulation and fix any thereby-revealed bugs in your code instead.
Which is what we're doing in this code.

The UAC_SIGBUS option turns off the emulation and makes an unaligned
access result in SIGBUS instead.  The UAC_NOPRINT option suppresses
the "unaligned access" warning message that the kernel may helpfully
print about it.  I'm not sure why we have the latter as dead code
(it is dead, because NOPRINTADE doesn't get defined anywhere).
The code samples I found on the net mostly tended to goint    buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT};

I would be inclined to get rid of the separate NOPRINTADE code and make
NOFIXADE select both flags.

The MIPS_FIXADE seems to be the same deal but a different OS' API.
        regards, tom lane


Re: NOFIXADE / NOPRINTADE

From
Neil Conway
Date:
On Fri, 2004-09-24 at 00:35, Tom Lane wrote:
> I would be inclined to get rid of the separate NOPRINTADE code and make
> NOFIXADE select both flags.

Barring any objections, I intend to apply the attached patch to HEAD
later today.

-Neil


Attachment

Re: NOFIXADE / NOPRINTADE

From
Neil Conway
Date:
On Fri, 2004-09-24 at 12:30, Neil Conway wrote:
> Barring any objections, I intend to apply the attached patch to HEAD
> later today.

Applied to HEAD.

-Neil