hurd: Initial support.
This adds minimal Hurd support by implementing the _exit function. * AUTHORS: Update. * .gitignore: Ignore a.out, core, .config. * include/sys/wait.h (W_EXITCODE): New define. * lib/gnu/x86-mes-gcc/crt1.c: New file. * lib/gnu/x86-mes-gcc/mini.c: New file. * lib/gnu/hurd-start.c: New file. * lib/gnu/_exit.c: New file. * include/gnu/syscall.h: New file. * include/gnu/hurd.h: New file. * lib/gnu/_exit.c: New file. * lib/gnu/exec-startup-get-data.c: New file. * lib/gnu/hurd-start.c: New file. * lib/gnu/proc-mark-exit.c: New file. * lib/gnu/syscall.c: New file. * lib/gnu/task-get-special-port.c: New file. * lib/gnu/task-terminate.c: New file. * lib/gnu/vm-statistics.c: New file. * build-aux/configure-lib.sh (libc_mini_SOURCES): Add Hurd sources. * build-aux/build.sh.in (CPPFLAGS): Add lib to includes, to find linux crt1.c. * build-aux/test-c.sh: Always use at least -l c+mini for GNU. * lib/tests/scaffold/30-exit-42.exit: New file. * lib/tests/scaffold/30-exit-42.c: New test. * build-aux/check-mescc.sh (TESTS): Add it. * lib/tests/scaffold/30-exit-0.c (main): Move from 00-exit-0.c; Rewrite, use _exit. * include/gnu/hurd-types.h: Import from GNU C Library. * include/mach/mach-init.h: Likewise. * lib/mach/mach-init.c: Likewise. * lib/mach/mach_host_self.S: Likewise. * lib/mach/mach_msg_trap.S: Likewise. * lib/mach/mach_reply_port.S: Likewise. * lib/mach/mach_task_self.S: Likewise. * lib/mach/mach_thread_self.S: Likewise. * lib/mach/msg.c: Likewise.
This commit is contained in:
parent
820c93097c
commit
784838e368
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -114,3 +114,6 @@
|
||||||
/body-hello-mes
|
/body-hello-mes
|
||||||
/exit-42
|
/exit-42
|
||||||
/hello-mes
|
/hello-mes
|
||||||
|
core
|
||||||
|
/.config
|
||||||
|
a.out
|
||||||
|
|
7
AUTHORS
7
AUTHORS
|
@ -73,6 +73,13 @@ mes/module/srfi/srfi-26.scm
|
||||||
GNU FDL in texinfo from GNU
|
GNU FDL in texinfo from GNU
|
||||||
doc/fdl-1.3.texi
|
doc/fdl-1.3.texi
|
||||||
|
|
||||||
|
Hurd and Mach support from GNU C Library
|
||||||
|
include/gnu/hurd-types.h
|
||||||
|
include/mach/mach-init.h
|
||||||
|
lib/mach/msg.c
|
||||||
|
lib/mach/mach-init.c
|
||||||
|
lib/mach/*.S
|
||||||
|
|
||||||
* legalese
|
* legalese
|
||||||
Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -65,10 +65,17 @@ fi
|
||||||
"
|
"
|
||||||
AM_CPPFLAGS="
|
AM_CPPFLAGS="
|
||||||
-D HAVE_CONFIG_H=1
|
-D HAVE_CONFIG_H=1
|
||||||
|
-I ${srcdest}lib
|
||||||
-I include
|
-I include
|
||||||
-I ${srcdest}include
|
-I ${srcdest}include
|
||||||
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
||||||
"
|
"
|
||||||
|
if test $mes_kernel = gnu; then
|
||||||
|
AM_CPPFLAGS="$AM_CPPFLAGS
|
||||||
|
-I /usr/include
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
${SHELL} ${srcdest}build-aux/build-lib.sh
|
${SHELL} ${srcdest}build-aux/build-lib.sh
|
||||||
cp crt1.o ..
|
cp crt1.o ..
|
||||||
fi
|
fi
|
||||||
|
@ -85,6 +92,7 @@ fi
|
||||||
|
|
||||||
AM_CPPFLAGS="
|
AM_CPPFLAGS="
|
||||||
-D HAVE_CONFIG_H=1
|
-D HAVE_CONFIG_H=1
|
||||||
|
-I ${srcdest}lib
|
||||||
-I include
|
-I include
|
||||||
-I ${srcdest}include
|
-I ${srcdest}include
|
||||||
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
||||||
|
@ -108,6 +116,7 @@ fi
|
||||||
fi
|
fi
|
||||||
AM_CPPFLAGS="
|
AM_CPPFLAGS="
|
||||||
-D HAVE_CONFIG_H=1
|
-D HAVE_CONFIG_H=1
|
||||||
|
-I ${srcdest}lib
|
||||||
-I include
|
-I include
|
||||||
-I ${srcdest}include
|
-I ${srcdest}include
|
||||||
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
||||||
|
|
|
@ -22,6 +22,12 @@ AM_CPPFLAGS="
|
||||||
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
-I ${srcdest}include/$mes_kernel/$mes_cpu
|
||||||
"
|
"
|
||||||
|
|
||||||
|
if test $mes_kernel = gnu; then
|
||||||
|
AM_CPPFLAGS="$AM_CPPFLAGS
|
||||||
|
-I /usr/include
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
AM_CFLAGS=
|
AM_CFLAGS=
|
||||||
|
|
||||||
if test $mes_libc = mes; then
|
if test $mes_libc = mes; then
|
||||||
|
|
|
@ -24,7 +24,6 @@ set -u
|
||||||
|
|
||||||
TESTS="
|
TESTS="
|
||||||
lib/tests/scaffold/t.c
|
lib/tests/scaffold/t.c
|
||||||
lib/tests/scaffold/00-exit-0.c
|
|
||||||
lib/tests/scaffold/01-return-0.c
|
lib/tests/scaffold/01-return-0.c
|
||||||
lib/tests/scaffold/02-return-1.c
|
lib/tests/scaffold/02-return-1.c
|
||||||
lib/tests/scaffold/03-call.c
|
lib/tests/scaffold/03-call.c
|
||||||
|
@ -77,6 +76,8 @@ lib/tests/scaffold/23-pointer-sub.c
|
||||||
lib/tests/scaffold/23-pointer.c
|
lib/tests/scaffold/23-pointer.c
|
||||||
lib/tests/mes/30-oputs.c
|
lib/tests/mes/30-oputs.c
|
||||||
lib/tests/string/30-strlen.c
|
lib/tests/string/30-strlen.c
|
||||||
|
lib/tests/scaffold/30-exit-0.c
|
||||||
|
lib/tests/scaffold/30-exit-42.c
|
||||||
lib/tests/scaffold/32-call-wrap.c
|
lib/tests/scaffold/32-call-wrap.c
|
||||||
lib/tests/scaffold/32-compare.c
|
lib/tests/scaffold/32-compare.c
|
||||||
lib/tests/scaffold/33-and-or.c
|
lib/tests/scaffold/33-and-or.c
|
||||||
|
|
|
@ -41,6 +41,26 @@ lib/stdlib/exit.c
|
||||||
lib/stdlib/puts.c
|
lib/stdlib/puts.c
|
||||||
lib/string/strlen.c
|
lib/string/strlen.c
|
||||||
"
|
"
|
||||||
|
|
||||||
|
if test $mes_kernel = gnu; then
|
||||||
|
libc_mini_shared_SOURCES="$libc_mini_shared_SOURCES
|
||||||
|
lib/gnu/_exit.c
|
||||||
|
lib/gnu/exec-startup-get-data.c
|
||||||
|
lib/gnu/hurd-start.c
|
||||||
|
lib/gnu/proc-mark-exit.c
|
||||||
|
lib/gnu/syscall.c
|
||||||
|
lib/gnu/task-get-special-port.c
|
||||||
|
lib/gnu/task-terminate.c
|
||||||
|
lib/gnu/vm-statistics.c
|
||||||
|
lib/mach/mach-init.c
|
||||||
|
lib/mach/mach_host_self.S
|
||||||
|
lib/mach/mach_msg_trap.S
|
||||||
|
lib/mach/mach_reply_port.S
|
||||||
|
lib/mach/mach_task_self.S
|
||||||
|
lib/mach/mach_thread_self.S
|
||||||
|
lib/mach/msg.c
|
||||||
|
"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
libc_mini_SOURCES="$libc_mini_shared_SOURCES"
|
libc_mini_SOURCES="$libc_mini_shared_SOURCES"
|
||||||
|
|
|
@ -52,6 +52,11 @@ else
|
||||||
LIBS='-l c'
|
LIBS='-l c'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test $mes_kernel = gnu\
|
||||||
|
&& test -z "$LIBS"; then
|
||||||
|
LIBS="-l c-mini"
|
||||||
|
fi
|
||||||
|
|
||||||
if test $mes_libc = system; then
|
if test $mes_libc = system; then
|
||||||
crt1=
|
crt1=
|
||||||
LIBS='-l mes'
|
LIBS='-l mes'
|
||||||
|
|
393
include/gnu/hurd-types.h
Normal file
393
include/gnu/hurd-types.h
Normal file
|
@ -0,0 +1,393 @@
|
||||||
|
/* C declarations for Hurd server interfaces
|
||||||
|
Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002,
|
||||||
|
2010 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU Hurd.
|
||||||
|
|
||||||
|
The GNU Hurd is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
The GNU Hurd is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with the GNU Hurd; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
#ifndef _HURD_TYPES_H
|
||||||
|
#define _HURD_TYPES_H
|
||||||
|
|
||||||
|
#ifndef _FILE_OFFSET_BITS
|
||||||
|
#define _FILE_OFFSET_BITS 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <time.h> /* For struct timespec. */
|
||||||
|
#include <mach/std_types.h> /* For mach_port_t et al. */
|
||||||
|
#include <mach/message.h> /* For mach_msg_id_t et al. */
|
||||||
|
#include <sys/types.h> /* For pid_t and uid_t. */
|
||||||
|
|
||||||
|
/* A string identifying this release of the GNU Hurd. Our
|
||||||
|
interpretation of the term "release" is that it refers to a set of
|
||||||
|
server interface definitions. A "version" in Posix terminology is
|
||||||
|
a distribution of the Hurd; there may be more than one distribution
|
||||||
|
without changing the release number. */
|
||||||
|
#define HURD_RELEASE "0.0"
|
||||||
|
|
||||||
|
|
||||||
|
/* Simple type declarations */
|
||||||
|
|
||||||
|
/* These types identify certain kinds of ports used by the Hurd. */
|
||||||
|
typedef mach_port_t file_t;
|
||||||
|
typedef mach_port_t fsys_t;
|
||||||
|
typedef mach_port_t io_t;
|
||||||
|
typedef mach_port_t process_t;
|
||||||
|
typedef mach_port_t auth_t;
|
||||||
|
typedef mach_port_t socket_t;
|
||||||
|
typedef mach_port_t pf_t; /* Protocol family */
|
||||||
|
typedef mach_port_t addr_port_t;
|
||||||
|
typedef mach_port_t startup_t;
|
||||||
|
typedef mach_port_t fs_notify_t;
|
||||||
|
typedef mach_port_t exec_startup_t;
|
||||||
|
typedef mach_port_t interrupt_t;
|
||||||
|
typedef mach_port_t proccoll_t;
|
||||||
|
typedef mach_port_t ctty_t;
|
||||||
|
|
||||||
|
#include <errno.h> /* Defines `error_t'. */
|
||||||
|
|
||||||
|
/* These names exist only because of MiG deficiencies.
|
||||||
|
You should not use them in C source; use the normal C types instead. */
|
||||||
|
typedef char *data_t;
|
||||||
|
typedef const char *const_data_t;
|
||||||
|
typedef char string_t [1024];
|
||||||
|
typedef int *intarray_t;
|
||||||
|
typedef const int *const_intarray_t;
|
||||||
|
typedef int *fd_mask_t;
|
||||||
|
typedef const int *const_fd_mask_t;
|
||||||
|
typedef mach_port_t *portarray_t;
|
||||||
|
typedef const mach_port_t *const_portarray_t;
|
||||||
|
typedef pid_t *pidarray_t;
|
||||||
|
typedef const pid_t *const_pidarray_t;
|
||||||
|
typedef uid_t *idarray_t;
|
||||||
|
typedef const uid_t *const_idarray_t;
|
||||||
|
#if 0
|
||||||
|
typedef __loff_t *off_array_t;
|
||||||
|
typedef const __loff_t *const_off_array_t;
|
||||||
|
#endif
|
||||||
|
typedef struct rusage rusage_t;
|
||||||
|
typedef struct flock flock_t;
|
||||||
|
typedef struct utsname utsname_t;
|
||||||
|
#if _FILE_OFFSET_BITS == 64
|
||||||
|
typedef struct stat io_statbuf_t;
|
||||||
|
typedef struct statfs fsys_statfsbuf_t;
|
||||||
|
#else
|
||||||
|
typedef struct stat64 io_statbuf_t;
|
||||||
|
typedef struct statfs64 fsys_statfsbuf_t;
|
||||||
|
#endif
|
||||||
|
typedef struct timespec timespec_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Parameters and flags in RPC calls */
|
||||||
|
|
||||||
|
/* Many such parameters and flags are also defined in various libc
|
||||||
|
headers. */
|
||||||
|
|
||||||
|
/* Bits for flags in fs.defs:file_exec_paths and exec.defs:exec_* calls: */
|
||||||
|
#define EXEC_NEWTASK 0x00000001 /* Create new task; kill old one. */
|
||||||
|
#define EXEC_SECURE 0x00000002 /* Use secure values of portarray, etc. */
|
||||||
|
#define EXEC_DEFAULTS 0x00000004 /* Use defaults for unspecified ports. */
|
||||||
|
#define EXEC_SIGTRAP 0x00000008 /* Simulate SIGTRAP on startup. */
|
||||||
|
/* This flag is passed through by the exec server but not examined by it. */
|
||||||
|
#define EXEC_STACK_ARGS 0x00000010 /* Use arguments from stack, not RPC. */
|
||||||
|
|
||||||
|
/* Bits for flags in fs.defs:file_set_translator call: */
|
||||||
|
#define FS_TRANS_FORCE 0x00000001 /* Must use translator(no sht circuit) */
|
||||||
|
#define FS_TRANS_EXCL 0x00000002 /* Don't do it if already translated. */
|
||||||
|
#define FS_TRANS_SET 0x00000004 /* Set or clear translator */
|
||||||
|
#define FS_TRANS_ORPHAN 0x00000008 /* Orphan the active translator. */
|
||||||
|
|
||||||
|
/* Values for retry field in fs.defs:dir_lookup call: */
|
||||||
|
enum retry_type
|
||||||
|
{
|
||||||
|
FS_RETRY_NORMAL = 1, /* Retry normally if retry_name is not null. */
|
||||||
|
FS_RETRY_REAUTH = 2, /* Retry after reauthenticating retry port.
|
||||||
|
Even if the retry name is null, a retry
|
||||||
|
is still necessary with this code after the
|
||||||
|
reauthentication is complete. */
|
||||||
|
FS_RETRY_MAGICAL = 3, /* Retry string is magical. */
|
||||||
|
/* "tty" means controlling tty;
|
||||||
|
|
||||||
|
"fd/%u" means file descriptor N;
|
||||||
|
|
||||||
|
"machtype/..." means replace `machtype' with the numbers in decimal
|
||||||
|
returned by the user's kernel as the cpu_type (N) and
|
||||||
|
cpu_subtype (M) (producing N/M/...) and then retry
|
||||||
|
as for FS_RETRY_NORMAL.
|
||||||
|
|
||||||
|
"/..." means retry "...", but starting from the users root directory.
|
||||||
|
|
||||||
|
"pid/..." means replace `pid' with the PID of the current process in %u
|
||||||
|
format and then retry as for FS_RETRY_NORMAL.
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
typedef enum retry_type retry_type;
|
||||||
|
|
||||||
|
/* Types for fs_notify.defs:dir_changed call: */
|
||||||
|
enum dir_changed_type
|
||||||
|
{
|
||||||
|
DIR_CHANGED_NULL, /* Always sent first for sync. */
|
||||||
|
DIR_CHANGED_NEW, /* Specified name has been added. */
|
||||||
|
DIR_CHANGED_UNLINK, /* Specified name has been removed. */
|
||||||
|
DIR_CHANGED_RENUMBER, /* Name has been the target of rename. */
|
||||||
|
};
|
||||||
|
typedef enum dir_changed_type dir_changed_type_t;
|
||||||
|
|
||||||
|
/* Types for fs_notify.defs:file_changed call: */
|
||||||
|
enum file_changed_type
|
||||||
|
{
|
||||||
|
FILE_CHANGED_NULL, /* Always sent first for sync. */
|
||||||
|
FILE_CHANGED_WRITE, /* File data has been written. */
|
||||||
|
FILE_CHANGED_EXTEND, /* File has grown. */
|
||||||
|
FILE_CHANGED_TRUNCATE, /* File has been truncated. */
|
||||||
|
FILE_CHANGED_META, /* Stat information has changed, and none
|
||||||
|
of the previous three apply. Not sent
|
||||||
|
for changes in node times. */
|
||||||
|
};
|
||||||
|
typedef enum file_changed_type file_changed_type_t;
|
||||||
|
|
||||||
|
/* Select types for io.defs:io_select call: */
|
||||||
|
#define SELECT_READ 0x00000001
|
||||||
|
#define SELECT_WRITE 0x00000002
|
||||||
|
#define SELECT_URG 0x00000004
|
||||||
|
|
||||||
|
/* Flags for fsys.defs:fsys_goaway. Also, these flags are sent as the
|
||||||
|
oldtrans_flags in fs.defs:file_set_translator to describe how to
|
||||||
|
terminate the old translator. */
|
||||||
|
#define FSYS_GOAWAY_NOWAIT 0x00000001 /* Return immediately. */
|
||||||
|
#define FSYS_GOAWAY_NOSYNC 0x00000002 /* Don't update physical media. */
|
||||||
|
#define FSYS_GOAWAY_FORCE 0x00000004 /* Go away despite current users. */
|
||||||
|
#define FSYS_GOAWAY_UNLINK 0x00000008 /* Go away only if non-directory. */
|
||||||
|
#define FSYS_GOAWAY_RECURSE 0x00000010 /* Shutdown children too. */
|
||||||
|
|
||||||
|
/* Types of ports the terminal driver can run on top of;
|
||||||
|
used in term.defs:term_get_bottom_type. */
|
||||||
|
enum term_bottom_type
|
||||||
|
{
|
||||||
|
TERM_ON_MACHDEV,
|
||||||
|
TERM_ON_HURDIO,
|
||||||
|
TERM_ON_MASTERPTY,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Types of storage, as returned by file_get_storage_info.
|
||||||
|
|
||||||
|
STORAGE_DEVICE is a mach device_t (for random access devices)
|
||||||
|
STORAGE_HURD_FILE is a hurd file_t (as if a file were mapped)
|
||||||
|
STORAGE_TASK is a task_t (the storage is in the vm of the task)
|
||||||
|
STORAGE_MEMORY is a memory object port
|
||||||
|
STORAGE_ZERO is a fixed-size constant source of zeros
|
||||||
|
STORAGE_INTERLEAVE is a set of other storage types interleaved at a fixed
|
||||||
|
interval
|
||||||
|
STORAGE_CONCAT is a set of other storage types concatenated end-to-end
|
||||||
|
STORAGE_LAYER is a set of storage types, representing the same address
|
||||||
|
range; all will be written too, and will be read in turn until one
|
||||||
|
succeeds
|
||||||
|
STORAGE_REMAP is a layer on top of another store that remaps its blocks
|
||||||
|
STORAGE_COPY is a memory snapshot of another store
|
||||||
|
STORAGE_NETWORK means that the file is stored elsewhere on the
|
||||||
|
network; all the remaining fields contan type-specific information.
|
||||||
|
STORAGE_OTHER means none of these apply; and should be used when no
|
||||||
|
meaningful answer can be given
|
||||||
|
|
||||||
|
The vectors returned by file_get_storage_info encode each of the above
|
||||||
|
(note that the first int is always the storage type). There are four:
|
||||||
|
ports, ints, offsets (off_t), and data (char); each type of store uses the
|
||||||
|
following entries in each vector:
|
||||||
|
|
||||||
|
-type- -ports- -ints- -offsets- -data- -kids-
|
||||||
|
device DEVICE TY, FL, BS, NR, NL, ML NR * (OFFS, LEN) NL + ML -
|
||||||
|
file FILE TY, FL, BS, NR, NL, ML NR * (OFFS, LEN) NL + ML -
|
||||||
|
memory MEMOBJ TY, FL, BS, NR, NL, ML NR * (OFFS, LEN) NL + ML -
|
||||||
|
task TASK TY, FL, BS, NR, NL, ML NR * (OFFS, LEN) NL + ML -
|
||||||
|
(the data for the above is a name (incl '\0') and a misc data block)
|
||||||
|
null - TY, FL SIZE - -
|
||||||
|
(BS is 1)
|
||||||
|
ileave - TY, FL, IL, NC - - NC
|
||||||
|
(BS is the LCM of its children; SIZE is the minimum of theirs * IL)
|
||||||
|
concat - TY, FL, NC - - NC
|
||||||
|
(BS is the LCM of its children; SIZE is the sum of theirs)
|
||||||
|
layer - TY, FL, NC - - NC
|
||||||
|
(BS is the LCM of its children; SIZE is the minimum of theirs)
|
||||||
|
remap - TY, FL, NR NR * (OFFS, LEN) - 1
|
||||||
|
(BS and SIZE are that of the child)
|
||||||
|
copy - TY, FL, SIZE - DATA -
|
||||||
|
(DATA is preceded by padding to the next page boundary, and is
|
||||||
|
SIZE bytes long itself)
|
||||||
|
|
||||||
|
For ileave, concat, and layer, the children are encoded following the parent.
|
||||||
|
The first int must always be TY.
|
||||||
|
|
||||||
|
key: TY = type code, FL = flags, BS = block size, NR = num runs,
|
||||||
|
NL = name len, ML = misc len, NC = num children,
|
||||||
|
IL = interleave (bytes), SIZE = Size of storage (blocks),
|
||||||
|
LEN = run length (blocks), OFFS = run offset (blocks),
|
||||||
|
|
||||||
|
The NR * (OFFS, LEN) offsets for some of the types is the set of block
|
||||||
|
ranges in the underlying address space that, concatenated, make up the
|
||||||
|
contents of the storage -- for instance, doing file_get_storage_info on a
|
||||||
|
file may return storage of type STORAGE_DEVICE, and the accompanying block
|
||||||
|
ranges are the set of blocks on the given device that correspond to that
|
||||||
|
file. Any OFFS == -1 designates a hole in the address range. Note that
|
||||||
|
the total size (SIZE) for these types is the sum of their LEN's.
|
||||||
|
|
||||||
|
The optional NAME returned by some types (if NL != 0) is a type specific
|
||||||
|
name for the same object referenced by the port also returned. E.g.:
|
||||||
|
device -- The mach device name
|
||||||
|
file -- The file name (unreliable, as the root may not be the same)
|
||||||
|
task -- The pid
|
||||||
|
Unless it is MACH_PORT_NULL, the port should generally be used instead of
|
||||||
|
trying to regenerate it from the associated name, which is intended more for
|
||||||
|
printing messages, etc. */
|
||||||
|
enum file_storage_class
|
||||||
|
{
|
||||||
|
STORAGE_OTHER,
|
||||||
|
STORAGE_DEVICE,
|
||||||
|
STORAGE_HURD_FILE,
|
||||||
|
STORAGE_NETWORK,
|
||||||
|
STORAGE_MEMORY,
|
||||||
|
STORAGE_TASK,
|
||||||
|
STORAGE_ZERO,
|
||||||
|
STORAGE_CONCAT,
|
||||||
|
STORAGE_INTERLEAVE,
|
||||||
|
STORAGE_LAYER,
|
||||||
|
STORAGE_REMAP,
|
||||||
|
STORAGE_COPY,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for the flags word returned by some types . */
|
||||||
|
#define STORAGE_MUTATED 0x00000001 /* data as stored is munged from file */
|
||||||
|
|
||||||
|
/* Data types */
|
||||||
|
|
||||||
|
#include <mach/task_info.h>
|
||||||
|
#include <mach/thread_info.h>
|
||||||
|
#ifndef THREAD_SCHED_INFO
|
||||||
|
#include <mach/policy.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Flags sent in proc_getprocinfo request. */
|
||||||
|
#define PI_FETCH_TASKINFO 0x0001
|
||||||
|
#define PI_FETCH_TASKEVENTS 0x0020
|
||||||
|
#define PI_FETCH_THREADS 0x0002
|
||||||
|
#define PI_FETCH_THREAD_BASIC 0x0004
|
||||||
|
#define PI_FETCH_THREAD_SCHED 0x0008
|
||||||
|
#define PI_FETCH_THREAD_WAITS 0x0010
|
||||||
|
|
||||||
|
struct procinfo
|
||||||
|
{
|
||||||
|
int state;
|
||||||
|
uid_t owner;
|
||||||
|
pid_t ppid;
|
||||||
|
pid_t pgrp;
|
||||||
|
pid_t session;
|
||||||
|
pid_t logincollection;
|
||||||
|
int exitstatus;
|
||||||
|
int sigcode;
|
||||||
|
|
||||||
|
int nthreads; /* size of pi_threadinfos */
|
||||||
|
|
||||||
|
struct task_basic_info taskinfo;
|
||||||
|
struct task_events_info taskevents;
|
||||||
|
#ifdef TASK_SCHED_TIMESHARE_INFO
|
||||||
|
struct policy_timeshare_base timeshare_base_info;
|
||||||
|
#endif
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int died; /* this thread died in the middle of call */
|
||||||
|
mach_msg_id_t rpc_block; /* thread is blocked on this RPC */
|
||||||
|
struct thread_basic_info pis_bi;
|
||||||
|
#ifdef THREAD_SCHED_INFO
|
||||||
|
struct thread_sched_info pis_si;
|
||||||
|
#else
|
||||||
|
struct policy_infos pis_pi;
|
||||||
|
#endif
|
||||||
|
} threadinfos[0];
|
||||||
|
};
|
||||||
|
typedef int *procinfo_t;
|
||||||
|
typedef const int *const_procinfo_t;
|
||||||
|
|
||||||
|
/* Bits in struct procinfo state: */
|
||||||
|
#define PI_STOPPED 0x00000001 /* Proc server thinks is stopped. */
|
||||||
|
#define PI_EXECED 0x00000002 /* Has called proc_exec. */
|
||||||
|
#define PI_WAITING 0x00000004 /* Process is waiting for child to exit */
|
||||||
|
#define PI_ORPHAN 0x00000008 /* Process group is orphaned. */
|
||||||
|
#define PI_NOMSG 0x00000010 /* Process has no message port. */
|
||||||
|
#define PI_SESSLD 0x00000020 /* Session leader. */
|
||||||
|
#define PI_NOTOWNED 0x0000040 /* Process has no owner. */
|
||||||
|
#define PI_NOPARENT 0x0000080 /* Hasn't identified a parent. */
|
||||||
|
#define PI_ZOMBIE 0x00000100 /* Has no associated task. */
|
||||||
|
#define PI_TRACED 0x00000200 /* Process is being traced */
|
||||||
|
#define PI_GETMSG 0x00000400 /* Process is blocked in proc_getmsgport. */
|
||||||
|
#define PI_LOGINLD 0x00000800 /* Process is leader of login collection */
|
||||||
|
|
||||||
|
|
||||||
|
/* Conventions */
|
||||||
|
|
||||||
|
|
||||||
|
/* st_fstype in struct stat and fsys_stb_type in fsys_statfsbuf is one of: */
|
||||||
|
#define FSTYPE_UFS 0x00000000 /* 4.x BSD Fast File System */
|
||||||
|
#define FSTYPE_NFS 0x00000001 /* Network File System ala Sun */
|
||||||
|
#define FSTYPE_GFS 0x00000002 /* GNU file system */
|
||||||
|
#define FSTYPE_LFS 0x00000003 /* Logging File System ala Sprite */
|
||||||
|
#define FSTYPE_SYSV 0x00000004 /* Old U*x filesystem ala System V */
|
||||||
|
#define FSTYPE_FTP 0x00000005 /* Transparent FTP */
|
||||||
|
#define FSTYPE_TAR 0x00000006 /* Transparent TAR */
|
||||||
|
#define FSTYPE_AR 0x00000007 /* Transparent AR */
|
||||||
|
#define FSTYPE_CPIO 0x00000008 /* Transparent CPIO */
|
||||||
|
#define FSTYPE_MSLOSS 0x00000009 /* MS-DOS */
|
||||||
|
#define FSTYPE_CPM 0x0000000a /* CP/M */
|
||||||
|
#define FSTYPE_HFS 0x0000000b /* Don't ask */
|
||||||
|
#define FSTYPE_DTFS 0x0000000c /* used by desktop to provide more info */
|
||||||
|
#define FSTYPE_GRFS 0x0000000d /* GNU Remote File System */
|
||||||
|
#define FSTYPE_TERM 0x0000000e /* GNU Terminal driver */
|
||||||
|
#define FSTYPE_DEV 0x0000000f /* GNU Special file server */
|
||||||
|
#define FSTYPE_PROC 0x00000010 /* /proc filesystem ala Version 9 */
|
||||||
|
#define FSTYPE_IFSOCK 0x00000011 /* PF_LOCAL socket naming point */
|
||||||
|
#define FSTYPE_AFS 0x00000012 /* Andrew File System 3.xx */
|
||||||
|
#define FSTYPE_DFS 0x00000013 /* Distributed File Sys (OSF) == AFS 4.xx */
|
||||||
|
#define FSTYPE_PROC9 0x00000014 /* /proc filesystem ala Plan 9 */
|
||||||
|
#define FSTYPE_SOCKET 0x00000015 /* io_t that isn't a file but a socket */
|
||||||
|
#define FSTYPE_MISC 0x00000016 /* generic trivfs server */
|
||||||
|
#define FSTYPE_EXT2FS 0x00000017 /* Linux filesystem by Remy Card */
|
||||||
|
#define FSTYPE_HTTP 0x00000018 /* Transparent HTTP */
|
||||||
|
#define FSTYPE_MEMFS 0x00000019 /* In-core filesystem */
|
||||||
|
#define FSTYPE_ISO9660 0x0000001a /* ISO9660 */
|
||||||
|
|
||||||
|
/* Standard port assignments for file_exec_paths and exec_* */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
INIT_PORT_CWDIR,
|
||||||
|
INIT_PORT_CRDIR,
|
||||||
|
INIT_PORT_AUTH,
|
||||||
|
INIT_PORT_PROC,
|
||||||
|
INIT_PORT_CTTYID,
|
||||||
|
/* If MACH_PORT_NULL is given for the bootstrap port,
|
||||||
|
the bootstrap port of the old task is used. */
|
||||||
|
INIT_PORT_BOOTSTRAP,
|
||||||
|
INIT_PORT_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Standard ints for file_exec_paths and exec_* */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
INIT_UMASK,
|
||||||
|
INIT_SIGMASK,
|
||||||
|
INIT_SIGIGN,
|
||||||
|
INIT_SIGPENDING,
|
||||||
|
INIT_TRACEMASK,
|
||||||
|
INIT_INT_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _HURD_TYPES_H
|
51
include/gnu/hurd.h
Normal file
51
include/gnu/hurd.h
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MES_GNU_HURD_H
|
||||||
|
#define __MES_GNU_HURD_H
|
||||||
|
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
#define __USE_GNU 1
|
||||||
|
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
#include <mach/message.h>
|
||||||
|
#include <mach/port.h>
|
||||||
|
|
||||||
|
struct hurd_startup_data
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
mach_port_t *dtable;
|
||||||
|
mach_msg_type_number_t dtablesize;
|
||||||
|
mach_port_t *portarray;
|
||||||
|
mach_msg_type_number_t portarraysize;
|
||||||
|
int *intarray;
|
||||||
|
mach_msg_type_number_t intarraysize;
|
||||||
|
vm_address_t stack_base;
|
||||||
|
vm_size_t stack_size;
|
||||||
|
vm_address_t phdr;
|
||||||
|
vm_size_t phdrsz;
|
||||||
|
vm_address_t user_entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern mach_port_t *_hurd_init_dtable;
|
||||||
|
extern mach_msg_type_number_t _hurd_init_dtablesize;
|
||||||
|
extern struct hurd_startup_data _hurd_startup_data;
|
||||||
|
|
||||||
|
#endif // __MES_GNU_HURD_H
|
115
include/gnu/syscall.h
Normal file
115
include/gnu/syscall.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MES_GNU_SYSCALL_H
|
||||||
|
#define __MES_GNU_SYSCALL_H
|
||||||
|
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
#define __USE_GNU 1
|
||||||
|
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
#include <mach/port.h>
|
||||||
|
#include <mach/message.h>
|
||||||
|
#include <gnu/hurd.h>
|
||||||
|
#include <gnu/hurd-types.h>
|
||||||
|
|
||||||
|
// mach/mach.defs
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SYS__task_terminate = 2008,
|
||||||
|
SYS__vm_statistics = 2030,
|
||||||
|
SYS__task_get_special_port = 2058,
|
||||||
|
};
|
||||||
|
|
||||||
|
// hurd/process.defs
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SYS__proc_mark_exit = 24025,
|
||||||
|
};
|
||||||
|
|
||||||
|
// hurd/startup.defs
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SYS__exec_startup_get_info = 30500,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern mach_msg_type_t mach_msg_type_int32;
|
||||||
|
|
||||||
|
struct mach_msg
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mach_msg_1
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
mach_msg_type_t type_one; int one;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mach_msg_2
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
mach_msg_type_t type_one; int one;
|
||||||
|
mach_msg_type_t type_two; int two;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mach_msg_startup_info
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
mach_msg_type_t RetCodeType;
|
||||||
|
kern_return_t RetCode;
|
||||||
|
mach_msg_type_t user_entryType;
|
||||||
|
vm_address_t user_entry;
|
||||||
|
mach_msg_type_t phdrType;
|
||||||
|
vm_address_t phdr;
|
||||||
|
mach_msg_type_t phdr_sizeType;
|
||||||
|
vm_size_t phdr_size;
|
||||||
|
mach_msg_type_t stack_baseType;
|
||||||
|
vm_address_t stack_base;
|
||||||
|
mach_msg_type_t stack_sizeType;
|
||||||
|
vm_size_t stack_size;
|
||||||
|
mach_msg_type_t flagsType;
|
||||||
|
int flags;
|
||||||
|
mach_msg_type_long_t argvType;
|
||||||
|
char *argv;
|
||||||
|
mach_msg_type_long_t envpType;
|
||||||
|
char *envp;
|
||||||
|
mach_msg_type_long_t dtableType;
|
||||||
|
mach_port_t *dtable;
|
||||||
|
mach_msg_type_long_t portarrayType;
|
||||||
|
mach_port_t *portarray;
|
||||||
|
mach_msg_type_long_t intarrayType;
|
||||||
|
int *intarray;
|
||||||
|
};
|
||||||
|
|
||||||
|
kern_return_t __syscall (mach_port_t port, int sys_call);
|
||||||
|
kern_return_t __syscall2 (mach_port_t port, int sys_call, int one, int two);
|
||||||
|
kern_return_t __syscall_get (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size);
|
||||||
|
|
||||||
|
// mach.defs
|
||||||
|
kern_return_t __task_terminate (mach_port_t task);
|
||||||
|
kern_return_t __task_get_special_port (mach_port_t task, int which, mach_port_t *port);
|
||||||
|
kern_return_t __vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats);
|
||||||
|
|
||||||
|
// process.defs
|
||||||
|
kern_return_t __proc_mark_exit (mach_port_t process, int one, int two);
|
||||||
|
kern_return_t __exec_startup_get_data (mach_port_t bootstrap, struct hurd_startup_data *data);
|
||||||
|
|
||||||
|
#endif // __MES_GNU_SYSCALL_H
|
52
include/mach/mach-init.h
Normal file
52
include/mach/mach-init.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/* Declarations and macros for the basic Mach things set at startup.
|
||||||
|
Copyright (C) 1993-2016 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _MACH_INIT_H
|
||||||
|
|
||||||
|
#define _MACH_INIT_H 1
|
||||||
|
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
|
||||||
|
/* Return the current task's task port. */
|
||||||
|
extern mach_port_t __mach_task_self (void);
|
||||||
|
extern mach_port_t mach_task_self (void);
|
||||||
|
|
||||||
|
/* This cache is initialized at startup. */
|
||||||
|
extern mach_port_t __mach_task_self_;
|
||||||
|
#define __mach_task_self() (__mach_task_self_ + 0) /* Not an lvalue. */
|
||||||
|
#define mach_task_self() (__mach_task_self ())
|
||||||
|
|
||||||
|
/* This cache is initialized at startup. */
|
||||||
|
extern mach_port_t __mach_host_self_;
|
||||||
|
#define __mach_host_self() (__mach_host_self_ + 0) /* Not an lvalue. */
|
||||||
|
#define mach_host_self() (__mach_host_self ())
|
||||||
|
|
||||||
|
/* Kernel page size. */
|
||||||
|
extern vm_size_t __vm_page_size;
|
||||||
|
extern vm_size_t vm_page_size;
|
||||||
|
|
||||||
|
/* Round the address X up to a page boundary. */
|
||||||
|
#define round_page(x) \
|
||||||
|
((((vm_offset_t) (x) + __vm_page_size - 1) / __vm_page_size) * \
|
||||||
|
__vm_page_size)
|
||||||
|
|
||||||
|
/* Truncate the address X down to a page boundary. */
|
||||||
|
#define trunc_page(x) \
|
||||||
|
((((vm_offset_t) (x)) / __vm_page_size) * __vm_page_size)
|
||||||
|
|
||||||
|
#endif /* mach_init.h */
|
|
@ -1,6 +1,6 @@
|
||||||
/* -*-comment-start: "//";comment-end:""-*-
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
* GNU Mes --- Maxwell Equations of Software
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
* Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
*
|
*
|
||||||
* This file is part of GNU Mes.
|
* This file is part of GNU Mes.
|
||||||
*
|
*
|
||||||
|
@ -31,6 +31,7 @@ typedef int pid_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define WNOHANG 1
|
#define WNOHANG 1
|
||||||
|
#define W_EXITCODE(status, signal) ((status) << 8 | (signal))
|
||||||
|
|
||||||
pid_t waitpid (pid_t pid, int *status_ptr, int options);
|
pid_t waitpid (pid_t pid, int *status_ptr, int options);
|
||||||
pid_t wait (int *status_ptr);
|
pid_t wait (int *status_ptr);
|
||||||
|
|
38
lib/gnu/_exit.c
Normal file
38
lib/gnu/_exit.c
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Commentary:
|
||||||
|
Inspired by implementation in GNU C Library:
|
||||||
|
_hurd_exit
|
||||||
|
Copyright (C) 1993-2016 Free Software Foundation, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/hurd.h>
|
||||||
|
#include <gnu/hurd-types.h>
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
#include <mach/mach-init.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
_exit (int status)
|
||||||
|
{
|
||||||
|
__proc_mark_exit (_hurd_startup_data.portarray[INIT_PORT_PROC], status, 0);
|
||||||
|
__task_terminate (__mach_task_self ());
|
||||||
|
while (1) {* (int *) 0 = 0;}
|
||||||
|
}
|
57
lib/gnu/exec-startup-get-data.c
Normal file
57
lib/gnu/exec-startup-get-data.c
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
mach_startup_info2hurd_startup_data (struct mach_msg_startup_info *info,
|
||||||
|
struct hurd_startup_data *data)
|
||||||
|
{
|
||||||
|
data->flags = info->flags;
|
||||||
|
data->dtable = info->dtable;
|
||||||
|
data->dtablesize = info->dtableType.msgtl_number;
|
||||||
|
data->portarray = info->portarray;
|
||||||
|
data->portarraysize = info->portarrayType.msgtl_number;
|
||||||
|
data->intarray = info->intarray;
|
||||||
|
data->intarraysize = info->intarrayType.msgtl_number;
|
||||||
|
data->stack_base = info->stack_base;
|
||||||
|
data->stack_size = info->stack_size;
|
||||||
|
data->phdr = info->phdr;
|
||||||
|
data->phdrsz = info->phdr_size;
|
||||||
|
data->user_entry = info->user_entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__exec_startup_get_data (mach_port_t bootstrap, struct hurd_startup_data *data)
|
||||||
|
{
|
||||||
|
union message
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
struct mach_msg_startup_info info;
|
||||||
|
};
|
||||||
|
union message message;
|
||||||
|
message.header.msgh_size = sizeof (struct mach_msg);
|
||||||
|
kern_return_t result = __syscall_get (bootstrap, SYS__exec_startup_get_info,
|
||||||
|
&message.header, sizeof (message));
|
||||||
|
|
||||||
|
|
||||||
|
mach_startup_info2hurd_startup_data (&message.info, data);
|
||||||
|
return result;
|
||||||
|
}
|
47
lib/gnu/hurd-start.c
Normal file
47
lib/gnu/hurd-start.c
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Commentary:
|
||||||
|
Inspired by implementation in GNU C Library:
|
||||||
|
Initialization code run first thing by the ELF startup code. For i386/Hurd.
|
||||||
|
Copyright (C) 1995-2016 Free Software Foundation, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/hurd.h>
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
#include <mach/mach-init.h>
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
#include <mach/message.h>
|
||||||
|
#include <mach/port.h>
|
||||||
|
|
||||||
|
struct hurd_startup_data _hurd_startup_data;
|
||||||
|
|
||||||
|
void __mach_init (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
_hurd_start ()
|
||||||
|
{
|
||||||
|
mach_port_t bootstrap;
|
||||||
|
__mach_init ();
|
||||||
|
__task_get_special_port (__mach_task_self (), TASK_BOOTSTRAP_PORT,
|
||||||
|
&bootstrap);
|
||||||
|
__exec_startup_get_data (bootstrap, &_hurd_startup_data);
|
||||||
|
}
|
28
lib/gnu/proc-mark-exit.c
Normal file
28
lib/gnu/proc-mark-exit.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__proc_mark_exit (mach_port_t process, int status, int signal)
|
||||||
|
{
|
||||||
|
return __syscall2 (process, SYS__proc_mark_exit, W_EXITCODE (status, 0), signal);
|
||||||
|
}
|
99
lib/gnu/syscall.c
Normal file
99
lib/gnu/syscall.c
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
#include <mach/mach_traps.h>
|
||||||
|
|
||||||
|
mach_msg_type_t mach_msg_type_int32 =
|
||||||
|
{
|
||||||
|
.msgt_name = (unsigned char) MACH_MSG_TYPE_INTEGER_32, // msgt_name
|
||||||
|
.msgt_size = 32, // msgt_size
|
||||||
|
.msgt_number = 1, // msgt_number
|
||||||
|
.msgt_inline = 1, // msgt_inline
|
||||||
|
.msgt_longform = 0, // msgt_longform
|
||||||
|
.msgt_deallocate = 0, // msgt_deallocate
|
||||||
|
.msgt_unused = 0 // msgt_unused
|
||||||
|
};
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__syscall (mach_port_t port, int sys_call)
|
||||||
|
{
|
||||||
|
struct mach_msg message =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE),
|
||||||
|
0,
|
||||||
|
port,
|
||||||
|
{__mach_reply_port (),},
|
||||||
|
0,
|
||||||
|
sys_call,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return __mach_msg (&message.header,
|
||||||
|
MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
|
||||||
|
sizeof (message),
|
||||||
|
sizeof (message),
|
||||||
|
message.header.msgh_local_port,
|
||||||
|
MACH_MSG_TIMEOUT_NONE,
|
||||||
|
MACH_PORT_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__syscall2 (mach_port_t port, int sys_call, int one, int two)
|
||||||
|
{
|
||||||
|
struct mach_msg_2 message =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE),
|
||||||
|
0,
|
||||||
|
port,
|
||||||
|
{__mach_reply_port (),},
|
||||||
|
0,
|
||||||
|
sys_call,
|
||||||
|
},
|
||||||
|
mach_msg_type_int32, one,
|
||||||
|
mach_msg_type_int32, two,
|
||||||
|
};
|
||||||
|
return __mach_msg (&message.header,
|
||||||
|
MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
|
||||||
|
sizeof (message),
|
||||||
|
sizeof (message),
|
||||||
|
message.header.msgh_local_port,
|
||||||
|
MACH_MSG_TIMEOUT_NONE,
|
||||||
|
MACH_PORT_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__syscall_get (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size)
|
||||||
|
{
|
||||||
|
message->msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE);
|
||||||
|
message->msgh_remote_port = port;
|
||||||
|
message->msgh_local_port = __mach_reply_port ();
|
||||||
|
message->msgh_seqno = 0;
|
||||||
|
message->msgh_id = sys_call;
|
||||||
|
return __mach_msg (message,
|
||||||
|
MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
|
||||||
|
message->msgh_size,
|
||||||
|
size,
|
||||||
|
message->msgh_local_port,
|
||||||
|
MACH_MSG_TIMEOUT_NONE,
|
||||||
|
MACH_PORT_NULL);
|
||||||
|
}
|
37
lib/gnu/task-get-special-port.c
Normal file
37
lib/gnu/task-get-special-port.c
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__task_get_special_port (mach_port_t task, int which, mach_port_t *port)
|
||||||
|
{
|
||||||
|
struct mach_msg_2 message = {0};
|
||||||
|
message.header.msgh_size = sizeof (struct mach_msg_1);
|
||||||
|
message.type_one = mach_msg_type_int32;
|
||||||
|
message.one = which;
|
||||||
|
message.type_two = mach_msg_type_int32;
|
||||||
|
message.two = 0;
|
||||||
|
kern_return_t result = __syscall_get (task, SYS__task_get_special_port,
|
||||||
|
&message.header, sizeof (message));
|
||||||
|
if (result == KERN_SUCCESS)
|
||||||
|
*port = message.two;
|
||||||
|
return result;
|
||||||
|
}
|
27
lib/gnu/task-terminate.c
Normal file
27
lib/gnu/task-terminate.c
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__task_terminate (mach_port_t task)
|
||||||
|
{
|
||||||
|
return __syscall (task, SYS__task_terminate);
|
||||||
|
}
|
41
lib/gnu/vm-statistics.c
Normal file
41
lib/gnu/vm-statistics.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gnu/syscall.h>
|
||||||
|
|
||||||
|
struct mach_msg_int32_vm_statistics_data
|
||||||
|
{
|
||||||
|
mach_msg_header_t header;
|
||||||
|
mach_msg_type_t type_one; int one;
|
||||||
|
mach_msg_type_t type_two; vm_statistics_data_t two;
|
||||||
|
};
|
||||||
|
|
||||||
|
kern_return_t
|
||||||
|
__vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats)
|
||||||
|
{
|
||||||
|
struct mach_msg_int32_vm_statistics_data message = {0};
|
||||||
|
message.header.msgh_size = sizeof (struct mach_msg);
|
||||||
|
message.type_one = mach_msg_type_int32;
|
||||||
|
message.type_two = mach_msg_type_int32;
|
||||||
|
kern_return_t result = __syscall_get (task, SYS__vm_statistics,
|
||||||
|
&message.header, sizeof (message));
|
||||||
|
*vm_stats = message.two;
|
||||||
|
return result;
|
||||||
|
}
|
43
lib/gnu/x86-mes-gcc/crt1.c
Normal file
43
lib/gnu/x86-mes-gcc/crt1.c
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of Mes.
|
||||||
|
*
|
||||||
|
* Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#include <mes/lib-mini.h>
|
||||||
|
#else // FIXME
|
||||||
|
#define __MES_LIB_MINI_H 1
|
||||||
|
|
||||||
|
char **environ;
|
||||||
|
int __stdin;
|
||||||
|
int __stdout;
|
||||||
|
int __stderr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void _hurd_start (void);
|
||||||
|
void _posix_start (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
_start ()
|
||||||
|
{
|
||||||
|
_hurd_start ();
|
||||||
|
_posix_start ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define _start _posix_start
|
||||||
|
#include <linux/x86-mes-gcc/crt1.c>
|
23
lib/gnu/x86-mes-gcc/mini.c
Normal file
23
lib/gnu/x86-mes-gcc/mini.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mes/lib-mini.h"
|
||||||
|
|
||||||
|
// your mini mach here
|
52
lib/mach/mach-init.c
Normal file
52
lib/mach/mach-init.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/* Copyright (C) 1992-2016 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
#define __USE_GNU 1
|
||||||
|
|
||||||
|
#include <mach.h>
|
||||||
|
#include <mach/mach-init.h>
|
||||||
|
//#include <mach/mig_support.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
mach_port_t __mach_task_self_;
|
||||||
|
mach_port_t __mach_host_self_;
|
||||||
|
vm_size_t __vm_page_size = 0;
|
||||||
|
|
||||||
|
void
|
||||||
|
__mach_init (void)
|
||||||
|
{
|
||||||
|
kern_return_t err;
|
||||||
|
|
||||||
|
__mach_task_self_ = (__mach_task_self) ();
|
||||||
|
__mach_host_self_ = (__mach_host_self) ();
|
||||||
|
#if 0
|
||||||
|
__mig_init (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HOST_PAGE_SIZE
|
||||||
|
if (err = __host_page_size (__mach_host_self (), &__vm_page_size))
|
||||||
|
_exit (err);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
vm_statistics_data_t stats;
|
||||||
|
if (err = __vm_statistics (__mach_task_self (), &stats))
|
||||||
|
_exit (err);
|
||||||
|
__vm_page_size = stats.pagesize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
3
lib/mach/mach_host_self.S
Normal file
3
lib/mach/mach_host_self.S
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include <mach/machine/syscall_sw.h>
|
||||||
|
kernel_trap (__mach_host_self,-29,0)
|
||||||
|
// weak_alias (__mach_host_self, mach_host_self)
|
3
lib/mach/mach_msg_trap.S
Normal file
3
lib/mach/mach_msg_trap.S
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include <mach/machine/syscall_sw.h>
|
||||||
|
kernel_trap (__mach_msg_trap,-25,7)
|
||||||
|
// weak_alias (__mach_msg_trap, mach_msg_trap)
|
3
lib/mach/mach_reply_port.S
Normal file
3
lib/mach/mach_reply_port.S
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include <mach/machine/syscall_sw.h>
|
||||||
|
kernel_trap (__mach_reply_port,-26,0)
|
||||||
|
// weak_alias (__mach_reply_port, mach_reply_port)
|
3
lib/mach/mach_task_self.S
Normal file
3
lib/mach/mach_task_self.S
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include <mach/machine/syscall_sw.h>
|
||||||
|
kernel_trap (__mach_task_self,-28,0)
|
||||||
|
// weak_alias (__mach_task_self, mach_task_self)
|
19
lib/mach/mach_thread_self.S
Normal file
19
lib/mach/mach_thread_self.S
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#if 1
|
||||||
|
#include <mach/machine/syscall_sw.h>
|
||||||
|
kernel_trap (__mach_thread_self,-27,0)
|
||||||
|
// weak_alias (__mach_thread_self, mach_thread_self)
|
||||||
|
#else
|
||||||
|
.globl __mach_thread_self
|
||||||
|
.type __mach_thread_self,@function
|
||||||
|
.align 1<<4
|
||||||
|
__mach_thread_self: .cfi_startproc
|
||||||
|
movl $ -27,%eax
|
||||||
|
.byte 0x9a
|
||||||
|
.long 0
|
||||||
|
.word 0x7
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.size __mach_thread_self,.-__mach_thread_self
|
||||||
|
.weak mach_thread_self
|
||||||
|
mach_thread_self = __mach_thread_self
|
||||||
|
#endif
|
145
lib/mach/msg.c
Normal file
145
lib/mach/msg.c
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* Mach Operating System
|
||||||
|
* Copyright (c) 1991,1990,1989, 1995 Carnegie Mellon University
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify and distribute this software and its
|
||||||
|
* documentation is hereby granted, provided that both the copyright
|
||||||
|
* notice and this permission notice appear in all copies of the
|
||||||
|
* software, derivative works or modified versions, and any portions
|
||||||
|
* thereof, and that both notices appear in supporting documentation.
|
||||||
|
*
|
||||||
|
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
|
||||||
|
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
|
||||||
|
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* Carnegie Mellon requests users of this software to return to
|
||||||
|
*
|
||||||
|
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
|
||||||
|
* School of Computer Science
|
||||||
|
* Carnegie Mellon University
|
||||||
|
* Pittsburgh PA 15213-3890
|
||||||
|
*
|
||||||
|
* any improvements or extensions that they make and grant Carnegie Mellon
|
||||||
|
* the rights to redistribute these changes.
|
||||||
|
*/
|
||||||
|
#include <mach/port.h>
|
||||||
|
#include <mach/message.h>
|
||||||
|
|
||||||
|
#ifdef MACH_MSG_OVERWRITE
|
||||||
|
/* In variants with this feature, the actual system call is
|
||||||
|
__mach_msg_overwrite_trap. */
|
||||||
|
mach_msg_return_t
|
||||||
|
__mach_msg_trap (mach_msg_header_t *msg,
|
||||||
|
mach_msg_option_t option,
|
||||||
|
mach_msg_size_t send_size,
|
||||||
|
mach_msg_size_t rcv_size,
|
||||||
|
mach_port_t rcv_name,
|
||||||
|
mach_msg_timeout_t timeout,
|
||||||
|
mach_port_t notify)
|
||||||
|
{
|
||||||
|
return __mach_msg_overwrite_trap (msg, option, send_size,
|
||||||
|
rcv_size, rcv_name, timeout, notify,
|
||||||
|
MACH_MSG_NULL, 0);
|
||||||
|
}
|
||||||
|
weak_alias (__mach_msg_trap, mach_msg_trap)
|
||||||
|
|
||||||
|
/* See comments below in __mach_msg. */
|
||||||
|
mach_msg_return_t
|
||||||
|
__mach_msg_overwrite (mach_msg_header_t *msg,
|
||||||
|
mach_msg_option_t option,
|
||||||
|
mach_msg_size_t send_size,
|
||||||
|
mach_msg_size_t rcv_size,
|
||||||
|
mach_port_t rcv_name,
|
||||||
|
mach_msg_timeout_t timeout,
|
||||||
|
mach_port_t notify,
|
||||||
|
mach_msg_header_t *rcv_msg,
|
||||||
|
mach_msg_size_t rcv_msg_size)
|
||||||
|
|
||||||
|
{
|
||||||
|
mach_msg_return_t ret;
|
||||||
|
|
||||||
|
/* Consider the following cases:
|
||||||
|
1. Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
|
||||||
|
plus special bits).
|
||||||
|
2. Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
|
||||||
|
3. RPC calls with interruptions in one/both halves.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = __mach_msg_overwrite_trap (msg, option, send_size,
|
||||||
|
rcv_size, rcv_name, timeout, notify,
|
||||||
|
rcv_msg, rcv_msg_size);
|
||||||
|
if (ret == MACH_MSG_SUCCESS)
|
||||||
|
return MACH_MSG_SUCCESS;
|
||||||
|
|
||||||
|
if (!(option & MACH_SEND_INTERRUPT))
|
||||||
|
while (ret == MACH_SEND_INTERRUPTED)
|
||||||
|
ret = __mach_msg_overwrite_trap (msg, option, send_size,
|
||||||
|
rcv_size, rcv_name, timeout, notify,
|
||||||
|
rcv_msg, rcv_msg_size);
|
||||||
|
|
||||||
|
if (!(option & MACH_RCV_INTERRUPT))
|
||||||
|
while (ret == MACH_RCV_INTERRUPTED)
|
||||||
|
ret = __mach_msg_overwrite_trap (msg, option & ~MACH_SEND_MSG,
|
||||||
|
0, rcv_size, rcv_name, timeout, notify,
|
||||||
|
rcv_msg, rcv_msg_size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
weak_alias (__mach_msg_overwrite, mach_msg_overwrite)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mach_msg_return_t
|
||||||
|
__mach_msg (mach_msg_header_t *msg,
|
||||||
|
mach_msg_option_t option,
|
||||||
|
mach_msg_size_t send_size,
|
||||||
|
mach_msg_size_t rcv_size,
|
||||||
|
mach_port_t rcv_name,
|
||||||
|
mach_msg_timeout_t timeout,
|
||||||
|
mach_port_t notify)
|
||||||
|
{
|
||||||
|
mach_msg_return_t ret;
|
||||||
|
|
||||||
|
/* Consider the following cases:
|
||||||
|
1. Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
|
||||||
|
plus special bits).
|
||||||
|
2. Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
|
||||||
|
3. RPC calls with interruptions in one/both halves.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = __mach_msg_trap (msg, option, send_size,
|
||||||
|
rcv_size, rcv_name, timeout, notify);
|
||||||
|
if (ret == MACH_MSG_SUCCESS)
|
||||||
|
return MACH_MSG_SUCCESS;
|
||||||
|
|
||||||
|
if (!(option & MACH_SEND_INTERRUPT))
|
||||||
|
while (ret == MACH_SEND_INTERRUPTED)
|
||||||
|
ret = __mach_msg_trap (msg, option, send_size,
|
||||||
|
rcv_size, rcv_name, timeout, notify);
|
||||||
|
|
||||||
|
if (!(option & MACH_RCV_INTERRUPT))
|
||||||
|
while (ret == MACH_RCV_INTERRUPTED)
|
||||||
|
ret = __mach_msg_trap (msg, option & ~MACH_SEND_MSG,
|
||||||
|
0, rcv_size, rcv_name, timeout, notify);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// weak_alias (__mach_msg, mach_msg)
|
||||||
|
|
||||||
|
mach_msg_return_t
|
||||||
|
__mach_msg_send (mach_msg_header_t *msg)
|
||||||
|
{
|
||||||
|
return __mach_msg (msg, MACH_SEND_MSG,
|
||||||
|
msg->msgh_size, 0, MACH_PORT_NULL,
|
||||||
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
}
|
||||||
|
// weak_alias (__mach_msg_send, mach_msg_send)
|
||||||
|
|
||||||
|
mach_msg_return_t
|
||||||
|
__mach_msg_receive (mach_msg_header_t *msg)
|
||||||
|
{
|
||||||
|
return __mach_msg (msg, MACH_RCV_MSG,
|
||||||
|
0, msg->msgh_size, msg->msgh_local_port,
|
||||||
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
}
|
||||||
|
// weak_alias (__mach_msg_receive, mach_msg_receive)
|
|
@ -1,6 +1,6 @@
|
||||||
/* -*-comment-start: "//";comment-end:""-*-
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
* GNU Mes --- Maxwell Equations of Software
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
* Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
*
|
*
|
||||||
* This file is part of GNU Mes.
|
* This file is part of GNU Mes.
|
||||||
*
|
*
|
||||||
|
@ -21,37 +21,6 @@
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
#if __i386__
|
_exit (0);
|
||||||
|
return 1;
|
||||||
#if __MESC__
|
|
||||||
asm ("mov____$i32,%ebx %0");
|
|
||||||
asm ("mov____$i32,%eax SYS_exit");
|
|
||||||
asm ("int____$0x80");
|
|
||||||
#elif __TINYC__
|
|
||||||
asm ("mov $0,%ebx");
|
|
||||||
asm ("mov $1,%eax");
|
|
||||||
asm ("int $128");
|
|
||||||
#else // !__TINYC__
|
|
||||||
asm ("mov $0,%ebx");
|
|
||||||
asm ("mov $1,%eax");
|
|
||||||
asm ("int $0x80");
|
|
||||||
#endif // !__TINYC__
|
|
||||||
|
|
||||||
#elif __x86_64__
|
|
||||||
|
|
||||||
#if __MESC__
|
|
||||||
asm ("mov____$i32,%rdi %0");
|
|
||||||
asm ("mov____$i32,%rax SYS_exit");
|
|
||||||
asm ("syscall");
|
|
||||||
#elif __TINYC__
|
|
||||||
asm ("mov $0,%rdi");
|
|
||||||
asm ("mov $0x3c,%rax");
|
|
||||||
asm ("syscall");
|
|
||||||
#else // !__TINYC__
|
|
||||||
asm ("mov $0,%rdi");
|
|
||||||
asm ("mov $60,%rax");
|
|
||||||
asm ("syscall");
|
|
||||||
#endif // !__TINYC__
|
|
||||||
|
|
||||||
#endif // ! __x86_64__
|
|
||||||
}
|
}
|
26
lib/tests/scaffold/30-exit-42.c
Normal file
26
lib/tests/scaffold/30-exit-42.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU Mes is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Mes is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
_exit (42);
|
||||||
|
return 0;
|
||||||
|
}
|
1
lib/tests/scaffold/30-exit-42.exit
Normal file
1
lib/tests/scaffold/30-exit-42.exit
Normal file
|
@ -0,0 +1 @@
|
||||||
|
42
|
Loading…
Reference in a new issue