diff --git a/kernel/config.h b/kernel/config.h new file mode 100644 index 000000000..a15ed0313 --- /dev/null +++ b/kernel/config.h @@ -0,0 +1,85 @@ +#ifndef CONFIG_H +#define CONFIG_H + +/* This file defines the kernel configuration. It allows to set sizes of some + * kernel buffers and to enable or disable debugging code, timing features, + * and individual kernel calls. + * + * Created: Jul 11, 2005 Jorrit N. Herder + */ + +/* In embedded and sensor applications, not all the kernel calls may be + * needed. In this section you can specify which kernel calls are needed + * and which are not. The code for unneeded kernel calls is not included in + * the system binary, making it smaller. If you are not sure, it is best + * to keep all kernel calls enabled. + */ +#define USE_FORK 1 /* fork a new process */ +#define USE_NEWMAP 1 /* set a new memory map */ +#define USE_EXEC 1 /* update process after execute */ +#define USE_EXIT 1 /* clean up after process exit */ +#define USE_TRACE 1 /* process information and tracing */ +#define USE_GETKSIG 1 /* retrieve pending kernel signals */ +#define USE_ENDKSIG 1 /* finish pending kernel signals */ +#define USE_KILL 1 /* send a signal to a process */ +#define USE_SIGSEND 1 /* send POSIX-style signal */ +#define USE_SIGRETURN 1 /* sys_sigreturn(proc_nr, ctxt_ptr, flags) */ +#define USE_ABORT 1 /* shut down MINIX */ +#define USE_GETINFO 1 /* retrieve a copy of kernel data */ +#define USE_TIMES 1 /* get process and system time info */ +#define USE_SETALARM 1 /* schedule a synchronous alarm */ +#define USE_DEVIO 1 /* read or write a single I/O port */ +#define USE_VDEVIO 1 /* process vector with I/O requests */ +#define USE_SDEVIO 1 /* perform I/O request on a buffer */ +#define USE_IRQCTL 1 /* set an interrupt policy */ +#define USE_SEGCTL 1 /* set up a remote segment */ +#define USE_SVRCTL 1 /* system server control */ +#define USE_SCHEDCTL 1 /* change scheduling priority (nice) */ +#define USE_UMAP 1 /* map virtual to physical address */ +#define USE_VIRCOPY 1 /* copy using virtual addressing */ +#define USE_VIRVCOPY 1 /* vector with virtual copy requests */ +#define USE_PHYSCOPY 1 /* copy using physical addressing */ +#define USE_PHYSVCOPY 1 /* vector with physical copy requests */ +#define USE_MEMSET 1 /* write char to a given memory area */ + + +/* Length of program names stored in the process table. This is only used + * for the debugging dumps that can be generated with the IS server. The PM + * server keeps its own copy of the program name. + */ +#define P_NAME_LEN 8 + +/* Kernel diagnostics are written to a circular buffer. After each message, + * a system server is notified and a copy of the buffer can be retrieved to + * display the message. The buffers size can safely be reduced. + */ +#define KMESS_BUF_SIZE 128 + +/* Buffer to gather randomness. This is used to generate a random stream by + * the MEMORY driver when reading from /dev/random. + */ +#define RANDOM_ELEMENTS 64 + + +/* This section contains defines for valuable system resources that are used + * by device drivers. The number of elements of the vectors is determined by + * the maximum needed by any given driver. The number of interrupt hooks may + * be incremented on systems with many device drivers. + */ +#define NR_IRQ_HOOKS 16 /* number of interrupt hooks */ +#define VDEVIO_BUF_SIZE 64 /* max elements per VDEVIO request */ +#define VCOPY_VEC_SIZE 16 /* max elements per VCOPY request */ + +/* How many buffers for notification messages should there be? */ +#define NR_NOTIFY_BUFS 32 + + +/* This section allows to enable kernel debugging and timing functionality. + * For normal operation all options should be disabled. + */ +#define DEBUG_SCHED_CHECK 0 /* sanity check of scheduling queues */ +#define DEBUG_LOCK_CHECK 0 /* kernel lock() sanity check */ +#define DEBUG_TIME_LOCKS 0 /* measure time spent in locks */ + +#endif /* CONFIG_H */ + diff --git a/kernel/priv.h b/kernel/priv.h new file mode 100755 index 000000000..2d0281719 --- /dev/null +++ b/kernel/priv.h @@ -0,0 +1,71 @@ +#ifndef PRIV_H +#define PRIV_H + +/* Declaration of the system privileges structure. It defines flags, system + * call masks, an synchronous alarm timer, I/O privileges, pending hardware + * interrupts and notifications, and so on. + * System processes each get their own structure with properties, whereas all + * user processes share one structure. This setup provides a clear separation + * between common and privileged process fields and is very space efficient. + * + * Created: Jul 1, 2005 Jorrit N. Herder + */ +#include +#include "protect.h" +#include "const.h" +#include "type.h" + +struct priv { + proc_nr_t s_proc_nr; /* number of associated process */ + sys_id_t s_id; /* index of this system structure */ + char s_flags; /* PREEMTIBLE, BILLABLE, etc. */ + + char s_call_mask; /* allowed system call traps */ + sys_map_t s_send_mask; /* allowed send destinations */ + long s_sys_mask; /* allowed kernel calls */ + + sys_map_t s_notify_pending; /* bit map with pending notifications */ + short s_int_pending; /* pending hardware interrupts */ + + timer_t s_alarm_timer; /* synchronous alarm timer */ + struct far_mem s_farmem[NR_REMOTE_SEGS]; /* remote memory map */ + reg_t *s_stack_guard; /* stack guard word for kernel tasks */ +}; + +/* Guard word for task stacks. */ +#define STACK_GUARD ((reg_t) (sizeof(reg_t) == 2 ? 0xBEEF : 0xDEADBEEF)) + +/* Bits for the system property flags. */ +#define PREEMPTIBLE 0x01 /* kernel tasks are not preemptible */ +#define RDY_Q_HEAD 0x02 /* add to queue head instead of tail */ +#define BILLABLE 0x04 /* some processes are not billable */ +#define SYS_PROC 0x10 /* system processes are privileged */ + +/* Magic system structure table addresses. */ +#define BEG_PRIV_ADDR (&priv[0]) +#define END_PRIV_ADDR (&priv[NR_SYS_PROCS]) + +#define priv_addr(i) (ppriv_addr)[(i)] +#define priv_id(rp) ((rp)->p_priv->s_id) +#define priv(rp) ((rp)->p_priv) + +#define id_to_nr(id) priv_addr(id)->s_proc_nr; +#define nr_to_id(nr) priv(proc_addr(nr))->s_id; + +/* The system structures table and pointers to individual table slots. The + * pointers allow faster access because now a process entry can be found by + * indexing the psys_addr array, while accessing an element i requires a + * multiplication with sizeof(struct sys) to determine the address. + */ +EXTERN struct priv priv[NR_SYS_PROCS]; /* system properties table */ +EXTERN struct priv *ppriv_addr[NR_SYS_PROCS]; /* direct slot pointers */ + +/* Make sure the system can boot. The following sanity check verifies that + * the system privileges table is large enough for the number of processes + * in the boot image. + */ +#if (NR_BOOT_PROCS > NR_SYS_PROCS) +#error NR_SYS_PROCS must be larger than NR_BOOT_PROCS +#endif + +#endif /* PRIV_H */