syscalls: normalize _exit(2) declerations
exit(3) is implemented by the runtime and performs a number of shutdown actions before ultimately calling _exit(2) to terminate the program. We historically named the syscall table entry `exit` rather than `_exit`, but this requires special handling in libc/libsys to cause the `_exit` symbol to exist while implementing `exit` in libc. Declare the syscall as `_exit` and flow that through the system. Because syscall(SYS_exit, code) is fairly widely used, allow a configured extra line in syscall.h to define SYS_exit to SYS__exit. I've found no external uses of __sys_exit() so I've not bothered to create a compatability version of this private symbol. Reviewed by: imp, kib, emaste Differential Revision: https://reviews.freebsd.org/D51672
This commit is contained in:
@@ -52,7 +52,6 @@ STATICOBJS+= interposing_table.o
|
|||||||
PSEUDO= \
|
PSEUDO= \
|
||||||
__realpathat \
|
__realpathat \
|
||||||
clock_gettime \
|
clock_gettime \
|
||||||
exit \
|
|
||||||
getlogin \
|
getlogin \
|
||||||
gettimeofday \
|
gettimeofday \
|
||||||
sched_getcpu
|
sched_getcpu
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
#define __libc_interposing error, must not use this variable inside rtld
|
#define __libc_interposing error, must not use this variable inside rtld
|
||||||
|
|
||||||
int __sys_close(int);
|
int __sys_close(int);
|
||||||
void __sys_exit(int) __dead2;
|
void __sys__exit(int) __dead2;
|
||||||
int __sys_fcntl(int, int, ...);
|
int __sys_fcntl(int, int, ...);
|
||||||
int __sys_fstat(int fd, struct stat *);
|
int __sys_fstat(int fd, struct stat *);
|
||||||
int __sys_fstatat(int, const char *, struct stat *, int);
|
int __sys_fstatat(int, const char *, struct stat *, int);
|
||||||
@@ -70,8 +70,8 @@ int __getosreldate(void);
|
|||||||
*/
|
*/
|
||||||
#define close(fd) __sys_close(fd)
|
#define close(fd) __sys_close(fd)
|
||||||
#define _close(fd) __sys_close(fd)
|
#define _close(fd) __sys_close(fd)
|
||||||
#define exit(status) __sys_exit(status)
|
#define exit(status) __sys__exit(status)
|
||||||
#define _exit(status) __sys_exit(status)
|
#define _exit(status) __sys__exit(status)
|
||||||
#define fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
|
#define fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
|
||||||
#define _fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
|
#define _fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
|
||||||
#define _fstat(fd, sb) __sys_fstat(fd, sb)
|
#define _fstat(fd, sb) __sys_fstat(fd, sb)
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ exit_onexit(struct proc *p)
|
|||||||
* exit -- death of process.
|
* exit -- death of process.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
sys_exit(struct thread *td, struct exit_args *uap)
|
sys__exit(struct thread *td, struct _exit_args *uap)
|
||||||
{
|
{
|
||||||
|
|
||||||
exit1(td, uap->rval, 0);
|
exit1(td, uap->rval, 0);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
libsysmap="../../lib/libsys/syscalls.map"
|
libsysmap="../../lib/libsys/syscalls.map"
|
||||||
libsys_h="../../lib/libsys/_libsys.h"
|
libsys_h="../../lib/libsys/_libsys.h"
|
||||||
sysmk="../sys/syscall.mk"
|
sysmk="../sys/syscall.mk"
|
||||||
|
syshdr_extra="#define SYS_exit SYS__exit"
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
1 AUE_EXIT STD|CAPENABLED {
|
1 AUE_EXIT STD|CAPENABLED {
|
||||||
void exit(
|
void _exit(
|
||||||
int rval
|
int rval
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ local util = require("tools.util")
|
|||||||
local config = {
|
local config = {
|
||||||
sysnames = "syscalls.c",
|
sysnames = "syscalls.c",
|
||||||
syshdr = "../sys/syscall.h",
|
syshdr = "../sys/syscall.h",
|
||||||
|
syshdr_extra = nil;
|
||||||
sysmk = "/dev/null",
|
sysmk = "/dev/null",
|
||||||
syssw = "init_sysent.c",
|
syssw = "init_sysent.c",
|
||||||
systrace = "systrace_args.c",
|
systrace = "systrace_args.c",
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ function syscall_h.generate(tbl, config, fh)
|
|||||||
-- Write the generated preamble.
|
-- Write the generated preamble.
|
||||||
gen:preamble("System call numbers.")
|
gen:preamble("System call numbers.")
|
||||||
|
|
||||||
|
if config.syshdr_extra then
|
||||||
|
gen:write(string.format("%s\n\n", config.syshdr_extra))
|
||||||
|
end
|
||||||
|
|
||||||
for _, v in pairs(s) do
|
for _, v in pairs(s) do
|
||||||
local c = v:compatLevel()
|
local c = v:compatLevel()
|
||||||
if v.num > max then
|
if v.num > max then
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ function syscalls_map.generate(tbl, config, fh)
|
|||||||
for _, v in pairs(s) do
|
for _, v in pairs(s) do
|
||||||
gen:write(v.prolog)
|
gen:write(v.prolog)
|
||||||
if v:native() and not v.type.NODEF and not v.type.NOLIB then
|
if v:native() and not v.type.NODEF and not v.type.NOLIB then
|
||||||
if v.name ~= "exit" and v.name ~= "vfork" then
|
if v.name ~= "_exit" and v.name ~= "vfork" then
|
||||||
gen:write(string.format("\t_%s;\n", v.name))
|
gen:write(string.format("\t_%s;\n", v.name))
|
||||||
end
|
end
|
||||||
gen:write(string.format("\t__sys_%s;\n", v.name))
|
gen:write(string.format("\t__sys_%s;\n", v.name))
|
||||||
|
|||||||
Reference in New Issue
Block a user