Minix1.5/kernel/table.c
/* The object file of "table.c" contains all the data. In the *.h files,
* declared variables appear with EXTERN in front of them, as in
*
* EXTERN int x;
*
* Normally EXTERN is defined as extern, so when they are included in another
* file, no storage is allocated. If the EXTERN were not present, but just
* say,
*
* int x;
*
* then including this file in several source files would cause 'x' to be
* declared several times. While some linkers accept this, others do not,
* so they are declared extern when included normally. However, it must
* be declared for real somewhere. That is done here, by redefining
* EXTERN as the null string, so the inclusion of all the *.h files in
* table.c actually generates storage for them. All the initialized
* variables are also declared here, since
*
* extern int x = 4;
*
* is not allowed. If such variables are shared, they must also be declared
* in one of the *.h files without the initialization.
*/
#define _TABLE
#include "kernel.h"
#include <minix/com.h>
#include "proc.h"
#include "tty.h"
/* The startup routine of each task is given below, from -NR_TASKS upwards.
* The order of the names here MUST agree with the numerical values assigned to
* the tasks in <minix/com.h>.
*/
#define SMALL_STACK (128 * sizeof (char *))
#if (MACHINE == ATARI)
#define TTY_STACK (2 * SMALL_STACK)
#define IDLE_STACK SMALL_STACK
#else
#define TTY_STACK SMALL_STACK
#define IDLE_STACK (3 * 2 + 3 * 2 + 4 * 2) /* 3 intr, 3 temps, 4 db */
#endif
#define PRINTER_STACK SMALL_STACK
#define WINCH_STACK SMALL_STACK
#define FLOP_STACK (3*SMALL_STACK/2)
#define MEM_STACK SMALL_STACK
#define CLOCK_STACK SMALL_STACK
#define SYS_STACK SMALL_STACK
#define HARDWARE_STACK 0 /* dummy task, uses kernel stack */
#if AM_KERNEL
# define AMINT_STACK (SMALL_STACK*4)
# define AMOEBA_STACK 1532
# define AMOEBA_STACK_SPACE (AM_NTASKS*AMOEBA_STACK + AMINT_STACK)
#else
# define AMOEBA_STACK_SPACE 0
#endif
#define TOT_STACK_SPACE (TTY_STACK + AMOEBA_STACK_SPACE + \
IDLE_STACK + HARDWARE_STACK + \
PRINTER_STACK + WINCH_STACK + FLOP_STACK + \
MEM_STACK + CLOCK_STACK + SYS_STACK)
/*
** some notes about the following table:
** 1) The tty_task should always be first so that other tasks can use printf
** if their initialisation has problems.
** 2) If you add a new kernel task, add it after the amoeba_tasks and before
** the printer task.
** 3) The task name is used for process status (F1 key) and must be six (6)
** characters in length. Pad it with blanks if it is too short.
*/
PUBLIC struct tasktab tasktab[] = {
tty_task, TTY_STACK, "TTY ",
#if AM_KERNEL
amint_task, AMINT_STACK, "AMINT ",
amoeba_task, AMOEBA_STACK, "AMTASK",
amoeba_task, AMOEBA_STACK, "AMTASK",
amoeba_task, AMOEBA_STACK, "AMTASK",
amoeba_task, AMOEBA_STACK, "AMTASK",
#endif
idle_task, IDLE_STACK, "IDLE ",
printer_task, PRINTER_STACK, "PRINTR",
winchester_task, WINCH_STACK, "WINCHE",
floppy_task, FLOP_STACK, "FLOPPY",
mem_task, MEM_STACK, "RAMDSK",
clock_task, CLOCK_STACK, "CLOCK ",
sys_task, SYS_STACK, "SYS ",
0, HARDWARE_STACK, "HARDWA",
0, 0, "MM ",
0, 0, "FS ",
0, 0, "INIT "
};
PUBLIC char t_stack[TOT_STACK_SPACE + ALIGNMENT - 1]; /* to be aligned */
/*
** The number of kernel tasks must be the same as NR_TASKS.
** If NR_TASKS is not correct then you will get the compile error:
** multiple case entry for value 0
** The function ___dummy is never called.
*/
#define NKT (sizeof tasktab / sizeof (struct tasktab) - (INIT_PROC_NR + 1))
PUBLIC void ___dummy()
{
switch(0)
{
case 0:
case (NR_TASKS == NKT):
;
}
}