Re: Why all glibc2 programs are FPU programs

Adam J. Richter (adam@yggdrasil.com)
Wed, 27 May 1998 11:36:38 -0700


>> = Adam Richter
> = Ulrich Drepper

>> You would have to upgrade the libc to use the AT_LINUX_FPUCW
>> approach, but you could update things in any order if the initial
>> FPU control word were just considered part of the executable personality
>> number.

>It is IMO a bad idea to overload the meaning of this personality
>thing. We cannot change the personality whenever something is is
>added. When the FPU CW would be control one change would make it
>necessary to add several more personalities since the iBSC must also
>get a new personality. Then we get another feature which depends on
>personality and again we have to double the number of possiblities.

>Since the personality value is no bitset it does not scale and should
>therefore not we used.

Actually, from my reading of linux-2.1.104pre1/include/linux/personality.h,
it appears that the high three bytes of the personality number
already are an extensible bitmap. I have attached it below, in
case you're not running on a Linux system with easy access to
these files.

So, I believe that my proposed solution of just declaring that
this initial value of the FPU control word in the absense of
prior FPU instructions executed is part of the semantics of the
personality(0) system call.

So, can we settle on this solution? To implement this change, no
work is necessary beyond deleteing that line that line in
glibc/sysdeps/unix/sysv/linux/init-first.c that says
"setfpucw(__fpu_control);". Okay?

Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite 205
adam@yggdrasil.com \ / San Jose, California 95129-1034
+1 408 261-6630 | g g d r a s i l United States of America
fax +1 408 261-6631 "Free Software For The Rest Of Us."
-----------------------------------------------------------------------

#ifndef _PERSONALITY_H
#define _PERSONALITY_H

#include <linux/linkage.h>
#include <linux/ptrace.h>

/* Flags for bug emulation. These occupy the top three bytes. */
#define STICKY_TIMEOUTS 0x4000000
#define WHOLE_SECONDS 0x2000000
#define ADDR_LIMIT_32BIT 0x0800000

/* Personality types. These go in the low byte. Avoid using the top bit,
* it will conflict with error returns.
*/
#define PER_MASK (0x00ff)
#define PER_LINUX (0x0000)
#define PER_LINUX_32BIT (0x0000 | ADDR_LIMIT_32BIT)
#define PER_SVR4 (0x0001 | STICKY_TIMEOUTS)
#define PER_SVR3 (0x0002 | STICKY_TIMEOUTS)
#define PER_SCOSVR3 (0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS)
#define PER_WYSEV386 (0x0004 | STICKY_TIMEOUTS)
#define PER_ISCR4 (0x0005 | STICKY_TIMEOUTS)
#define PER_BSD (0x0006)
#define PER_XENIX (0x0007 | STICKY_TIMEOUTS)

/* Prototype for an lcall7 syscall handler. */
typedef void (*lcall7_func)(struct pt_regs *);

/* Description of an execution domain - personality range supported,
* lcall7 syscall handler, start up / shut down functions etc.
* N.B. The name and lcall7 handler must be where they are since the
* offset of the handler is hard coded in kernel/sys_call.S.
*/
struct exec_domain {
const char *name;
lcall7_func handler;
unsigned char pers_low, pers_high;
unsigned long * signal_map;
unsigned long * signal_invmap;
struct module * module;
struct exec_domain *next;
};

extern struct exec_domain default_exec_domain;

extern struct exec_domain *lookup_exec_domain(unsigned long personality);
extern int register_exec_domain(struct exec_domain *it);
extern int unregister_exec_domain(struct exec_domain *it);
asmlinkage int sys_personality(unsigned long personality);

#endif /* _PERSONALITY_H */

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu