From 3e0e4c2d050d83b0ff1df71a7bce1eb3bd775bea Mon Sep 17 00:00:00 2001 From: mellvik Date: Fri, 22 Nov 2024 14:28:38 +0100 Subject: [PATCH 1/2] [system] Major synchronization with ELKS updates in header file etc. --- bootblocks/boot_minix.c | 2 +- libc/ia16.inc | 51 +++++++ libc/misc/getcwd.c | 6 +- libc/system/signal.c | 85 ++++++----- tlvc/arch/i86/drivers/block/genhd.c | 2 +- tlvc/arch/i86/drivers/block/ll_rw_blk.c | 25 ++-- tlvc/arch/i86/drivers/char/console-direct.c | 2 +- tlvc/arch/i86/drivers/char/ntty.c | 14 +- tlvc/arch/i86/kernel/process.c | 20 ++- tlvc/arch/i86/kernel/signal.c | 37 +++-- tlvc/arch/i86/mm/malloc.c | 155 +++++++++----------- tlvc/arch/i86/mm/user.c | 8 +- tlvc/fs/Makefile | 2 +- tlvc/fs/block_dev.c | 12 +- tlvc/fs/buffer.c | 2 + tlvc/fs/devices.c | 47 ------ tlvc/fs/exec.c | 28 ++-- tlvc/fs/filesystems.c | 28 ---- tlvc/fs/inode.c | 8 +- tlvc/fs/minix/bitmap.c | 2 +- tlvc/fs/minix/inode.c | 9 +- tlvc/fs/minix/namei.c | 8 +- tlvc/fs/minix/truncate.c | 2 +- tlvc/fs/msdos/file.c | 2 +- tlvc/fs/msdos/inode.c | 11 +- tlvc/fs/msdos/namei.c | 14 +- tlvc/fs/namei.c | 3 +- tlvc/fs/open.c | 25 ++-- tlvc/fs/pipe.c | 4 +- tlvc/fs/select.c | 12 +- tlvc/include/arch/stat.h | 2 +- tlvc/include/arch/system.h | 12 +- tlvc/include/arch/types.h | 87 ++++++----- tlvc/include/linuxmt/dirent.h | 2 +- tlvc/include/linuxmt/init.h | 13 +- tlvc/include/linuxmt/kernel.h | 6 +- tlvc/include/linuxmt/limits.h | 9 +- tlvc/include/linuxmt/list.h | 12 +- tlvc/include/linuxmt/mm.h | 24 ++- tlvc/include/linuxmt/net.h | 3 +- tlvc/include/linuxmt/sched.h | 136 ++++++++--------- tlvc/include/linuxmt/types.h | 73 ++++----- tlvc/kernel/dma.c | 2 +- tlvc/kernel/fork.c | 32 ++-- tlvc/kernel/sched.c | 18 +-- tlvc/kernel/signal.c | 27 ++-- tlvc/kernel/sleepwake.c | 20 ++- tlvc/kernel/sys.c | 102 +++++-------- tlvc/kernel/time.c | 7 +- tlvc/lib/list.c | 20 +-- tlvccmd/disk_utils/df.c | 5 +- tlvccmd/inet/telnetd/Makefile | 2 +- tlvccmd/man/man1/meminfo.1 | 68 ++++++--- tlvccmd/man/man5/dir.5 | 2 +- tlvccmd/misc_utils/fdtest.c | 2 + tlvccmd/sys_utils/ps.c | 4 +- 56 files changed, 631 insertions(+), 685 deletions(-) create mode 100644 libc/ia16.inc delete mode 100644 tlvc/fs/filesystems.c diff --git a/bootblocks/boot_minix.c b/bootblocks/boot_minix.c index 406780335..33ac31b61 100644 --- a/bootblocks/boot_minix.c +++ b/bootblocks/boot_minix.c @@ -122,7 +122,7 @@ static int strcmp (const char * s, const char * d) static void load_super () { - disk_read (2, 2, sb_block, seg_data ()); + disk_read (2, 1, sb_block, seg_data()); /* if (sb_data->s_log_zone_size) { diff --git a/libc/ia16.inc b/libc/ia16.inc new file mode 100644 index 000000000..1df607588 --- /dev/null +++ b/libc/ia16.inc @@ -0,0 +1,51 @@ + +INCLUDES=-I$(TOPDIR)/include -I$(TOPDIR)/libc/include -I$(TOPDIR)/tlvc/include +DEFINES=-D__LIBC__ + +INCS=$(INCLUDES) +SDEFS=$(DEFINES) +CDEFS=$(DEFINES) + +ARCH=-ffreestanding -fno-inline -melks -mtune=i8086 +ifeq "" "$(filter -mcmodel=%,$(MULTILIB))" +ARCH+=-mcmodel=small -mno-segment-relocation-stuff +endif + +CC=ia16-elf-gcc +AS=ia16-elf-as +AR=ia16-elf-ar +LD=ia16-elf-ld + +CFLAGS=$(ARCH) $(INCLUDES) $(CDEFS) -Wall -Os $(MULTILIB) +ASFLAGS=--32-segelf -mtune=i8086 +LDFLAGS=-mtune=i8086 +# This is used in subdirectories to quickly create a library archive without +# a symbol index +ARFLAGS_SUB=cqS + +ifdef MULTISUBDIR +LIBC=$(TOPDIR)/libc/build-ml/$(MULTISUBDIR)/libc.a +CRT0=$(TOPDIR)/libc/build-ml/$(MULTISUBDIR)/crt0.o +endif +LIB_CPU=i86 +LIB_OS=ELKS + +.S.o: + $(CC) -E $(MULTILIB) $(INCS) $(SDEFS) -MD -o $*.tmp $< + $(AS) $(ASFLAGS) -o $*.o $*.tmp + rm -f $*.tmp + +ifdef MULTISUBDIR +$(TOPDIR)/libc/build-ml/$(MULTISUBDIR)/%.o: %.S + $(CC) -E $(MULTILIB) $(INCS) $(SDEFS) -MD -o $@.tmp $< + $(AS) $(ASFLAGS) -o $@ $@.tmp + rm -f $@.tmp +endif + +.s.o: + $(AS) $(ASFLAGS) -o $*.o $< + +.c.o: + $(CC) $(CFLAGS) -c -MD -o $*.o $< + +-include *.d diff --git a/libc/misc/getcwd.c b/libc/misc/getcwd.c index ddd818155..b1d090ffe 100644 --- a/libc/misc/getcwd.c +++ b/libc/misc/getcwd.c @@ -13,12 +13,12 @@ static char * path_buf; static size_t path_size; static dev_t root_dev; -static u_ino_t root_ino; +static ino_t root_ino; static struct stat st; /* routine to find the step back down */ static char * -search_dir(dev_t this_dev, u_ino_t this_ino) +search_dir(dev_t this_dev, ino_t this_ino) { DIR * dp; struct dirent * d; @@ -76,7 +76,7 @@ static char * recurser(void) { dev_t this_dev; - u_ino_t this_ino; + ino_t this_ino; if( stat(path_buf, &st) < 0 ) return NULL; this_dev = st.st_dev; diff --git a/libc/system/signal.c b/libc/system/signal.c index 0e43aba6e..7e4f82bf4 100644 --- a/libc/system/signal.c +++ b/libc/system/signal.c @@ -1,59 +1,64 @@ #include #include - -typedef sighandler_t Sig; - -extern int _signal (int, __kern_sighandler_t); -#if defined __TINY__ || defined __SMALL__ || defined __COMPACT__ -/* - * If we are building libc for a near-code memory model (tiny, small, or - * compact), then we will arrange for _syscall_signal( ) to be within the - * same near code section as this module. - */ -extern __attribute__((near_section, stdcall)) -#else -extern __attribute__((stdcall)) -#endif - __far void _syscall_signal (int); - -Sig _sigtable[_NSIG]; - /* - * Signal handler. + * Signal handling routines. * - */ - -/* * KERNEL INTERFACE: * It is assumed the kernel will never give us a signal we haven't * _explicitly_ asked for! * * The Kernel need only save space for _one_ function pointer - * (to _syscall_signal) and must deal with SIG_DFL and SIG_IGN + * (to _signal_cbhandler) and must deal with SIG_DFL and SIG_IGN * in kernel space. * - * When a signal is required the kernel must set all the registers as if - * returning from a interrupt normally then push the number of the signal - * to be generated, push the current pc value, then set the pc to the - * address of the '_syscall_signal' function. + * When a signal is required to be sent the kernel will setup a specialized + * user stack frame as described in elks/arch/i86/kernel/process.c in the + * arch_setup_sighandler_stack() function. This will look like returning + * from a interrupt normally except the C library kernel signal callback + * routine will be called as _signal_cbhandler(sig), after which a normal + * interrupt return will be executed. + * + * Not all C library routines are safe to call from a C signal handler, + * as the mechanism can be reentrant. + */ + +sighandler_t _sigtable[_NSIG]; + +#ifdef __GNUC__ +#if defined __TINY__ || defined __SMALL__ || defined __COMPACT__ +/* + * If we are building libc for a near-code memory model (tiny, small, or + * compact), then we will arrange for _signal_cbhandler( ) to be within the + * same near code section as this module. */ +extern __attribute__((near_section, __stdcall__)) __far void _signal_cbhandler(int); +#else +extern stdcall __far void _signal_cbhandler(int); +#endif +#endif -Sig signal(int number, Sig pointer) +#ifdef __WATCOMC__ +extern void stdcall __far _signal_cbhandler(int); /* kernel callback in ASM */ +void __far _signal_wchandler(int sig) /* callback handler calls this */ { - Sig old_sig; - int rv; - if( number < 1 || number > _NSIG ) { errno=EINVAL; return SIG_ERR; } + _sigtable[sig-1](sig); +} +#endif -#pragma GCC diagnostic ignored "-Wpointer-to-int-cast" - if( pointer == SIG_DFL || pointer == SIG_IGN ) - rv = _signal(number, (__kern_sighandler_t) (long) (int) pointer); - else - rv = _signal(number, (__kern_sighandler_t) _syscall_signal); +sighandler_t signal(int number, sighandler_t pointer) +{ + sighandler_t old_sig; + int rv; + if (number < 1 || number > _NSIG) { errno = EINVAL; return SIG_ERR; } - if( rv < 0 ) return SIG_ERR; + if (pointer == SIG_DFL || pointer == SIG_IGN) + rv = _signal(number, (__kern_sighandler_t) (unsigned long)pointer); + else + rv = _signal(number, (__kern_sighandler_t) _signal_cbhandler); + if (rv < 0) return SIG_ERR; - old_sig = _sigtable[number-1]; - _sigtable[number-1] = pointer; + old_sig = _sigtable[number-1]; + _sigtable[number-1] = pointer; - return old_sig; + return old_sig; } diff --git a/tlvc/arch/i86/drivers/block/genhd.c b/tlvc/arch/i86/drivers/block/genhd.c index 0b5e22e46..ca406bbaa 100644 --- a/tlvc/arch/i86/drivers/block/genhd.c +++ b/tlvc/arch/i86/drivers/block/genhd.c @@ -360,9 +360,9 @@ void INITPROC setup_dev(register struct gendisk *dev) #ifdef BDEV_SIZE_CHK blk_size[dev->major] = NULL; #endif - //printk("setup_dev %04x/%d\n", dev, dev->major); memset((void *)dev->part, 0, sizeof(struct hd_struct)*dev->max_nr*dev->max_p); dev->init(dev); + printk("setup_dev %04x/%d(%d)\n", dev, dev->major,sizeof(struct hd_struct)*dev->max_nr*dev->max_p); /* * A system can have only one disk 'category' - BIOS, IDE/ATA or XD. diff --git a/tlvc/arch/i86/drivers/block/ll_rw_blk.c b/tlvc/arch/i86/drivers/block/ll_rw_blk.c index fcebea812..c8a3777a8 100644 --- a/tlvc/arch/i86/drivers/block/ll_rw_blk.c +++ b/tlvc/arch/i86/drivers/block/ll_rw_blk.c @@ -45,8 +45,7 @@ static struct request *__get_request_wait(int, kdev_t); * take precedence. */ -#define NR_REQUEST 20 -//#define DEBUG_BUFFER 1 +//#define NR_REQUEST 20 /* Moved to limits.h */ static struct request request_list[NR_REQUEST]; @@ -127,7 +126,8 @@ static struct request *get_request_wait(int n, kdev_t dev) #endif /* - * add-request adds a request to the linked list. + * add_request passes a request on to the low level driver if the device + * request queue is empty, otherwise adds a request to the linked list. * It disables interrupts so that it can muck with the * request-lists in peace. */ @@ -141,8 +141,8 @@ static void add_request(struct blk_dev_struct *dev, struct request *req) if (!(tmp = dev->current_request)) { /* if queue empty, process ... */ dev->current_request = req; set_irq(); -#if DEBUG_BUFFER - printk("AD%04x|", req); +#if DEBUG_ASYNC + if (debug_level > 2) printk("AD%04x|", req); #endif (dev->request_fn) (); } else { /* otherwise just add to queue */ @@ -155,8 +155,8 @@ static void add_request(struct blk_dev_struct *dev, struct request *req) req->rq_next = tmp->rq_next; tmp->rq_next = req; set_irq(); -#if DEBUG_BUFFER - printk("AQ%04x|", req); +#if DEBUG_ASYNC + if (debug_level > 2) printk("AQ%04x|", req); #endif } //mark_buffer_clean(req->rq_bh); /* EXPERIMENTAL: moved to end_request, blk.h */ @@ -168,8 +168,11 @@ static void make_request(unsigned short major, int rw, struct buffer_head *bh) int max_req; ext_buffer_head *ebh = EBH(bh); - debug_blk("BLK (%d) %lu %s %lx:%x\n", major, buffer_blocknr(bh), rw==READ? "read": "write", +#if DEBUG_ASYNC + if (debug_level) + printk("BLK (%d) %lu %s %lx:%x\n", major, buffer_blocknr(bh), rw==READ? "read": "write", (unsigned long)buffer_seg(bh), buffer_data(bh)); +#endif #ifdef BDEV_SIZE_CHK /* NOTE: not updated for raw IO */ sector_t count = BLOCK_SIZE / FIXED_SECTOR_SIZE; /* FIXME must move to lower level*/ @@ -243,8 +246,8 @@ static void make_request(unsigned short major, int rw, struct buffer_head *bh) req->rq_seg = buffer_seg(bh); req->rq_buffer = buffer_data(bh); } -#if DEBUG_BUFFER - printk("\n|seg%lx:%04x|%cblk%d|BH%04x|dev%04x;", (unsigned long)buffer_seg(bh), +#if DEBUG_ASYNC + if (debug_level) printk("\n|seg%lx:%04x|%cblk%d|BH%04x|dev%04x;", (unsigned long)buffer_seg(bh), buffer_data(bh), rw == READ ? 'R' : 'W', (word_t)ebh->b_blocknr, (word_t)bh, (word_t)buffer_dev(bh)); #endif @@ -434,7 +437,7 @@ void INITPROC blk_dev_init(void) #endif #ifdef CONFIG_ROMFS_FS - romflash_init (); + romflash_init(); #endif #ifdef CONFIG_BLK_DEV_XD diff --git a/tlvc/arch/i86/drivers/char/console-direct.c b/tlvc/arch/i86/drivers/char/console-direct.c index 7244d7ab2..7ddae605c 100644 --- a/tlvc/arch/i86/drivers/char/console-direct.c +++ b/tlvc/arch/i86/drivers/char/console-direct.c @@ -174,7 +174,7 @@ struct tty_ops dircon_ops = { Console_conout }; -void console_init(void) +void INITPROC console_init(void) { Console *C; int i; diff --git a/tlvc/arch/i86/drivers/char/ntty.c b/tlvc/arch/i86/drivers/char/ntty.c index de9373b13..97724dd22 100644 --- a/tlvc/arch/i86/drivers/char/ntty.c +++ b/tlvc/arch/i86/drivers/char/ntty.c @@ -89,7 +89,6 @@ struct tty *determine_tty(dev_t dev) { register struct tty *ttyp = &ttys[0]; unsigned short minor = MINOR(dev); - extern dev_t dev_console; /* handle /dev/tty*/ if (minor == 255 && current->pgrp && (current->pgrp == ttyp->pgrp)) @@ -144,13 +143,12 @@ void tty_freeq(struct tty *tty) int tty_open(struct inode *inode, struct file *file) { register struct tty *otty; - register __ptask currentp = current; int err; if (!(otty = determine_tty(inode->i_rdev))) return -ENODEV; - debug_tty("TTY open pid %d\n", currentp->pid); + debug_tty("TTY open pid %d\n", current->pid); #if 0 memcpy(&otty->termios, &def_vals, sizeof(struct termios)); #endif @@ -164,11 +162,11 @@ int tty_open(struct inode *inode, struct file *file) err = otty->ops->open(otty); if (!err) { - if (!(file->f_flags & O_NOCTTY) && currentp->session == currentp->pid - && currentp->tty == NULL && otty->pgrp == 0) { - debug_tty("TTY setting pgrp %d pid %d\n", currentp->pgrp, currentp->pid); - otty->pgrp = currentp->pgrp; - currentp->tty = otty; + if (!(file->f_flags & O_NOCTTY) && current->session == current->pid + && current->tty == NULL && otty->pgrp == 0) { + debug_tty("TTY setting pgrp %d pid %d\n", current->pgrp, current->pid); + otty->pgrp = current->pgrp; + current->tty = otty; } otty->flags |= TTY_OPEN; } diff --git a/tlvc/arch/i86/kernel/process.c b/tlvc/arch/i86/kernel/process.c index a98dd96aa..81cab6594 100644 --- a/tlvc/arch/i86/kernel/process.c +++ b/tlvc/arch/i86/kernel/process.c @@ -48,30 +48,28 @@ int run_init_process_sptr(const char *cmd, char *sptr, int slen) */ void stack_check(void) { - register __ptask currentp = current; - register char *end = (char *)currentp->t_endbrk; + segoff_t end = current->t_endbrk; #ifdef CONFIG_EXEC_LOW_STACK - if (currentp->t_begstack <= currentp->t_enddata) { /* stack below heap?*/ - if (currentp->t_regs.sp < (__u16)end) + if (current->t_begstack <= current->t_enddata) { /* stack below heap?*/ + if (current->t_regs.sp < (__u16)end) return; end = 0; } else #endif { /* optional: check stack over min stack*/ - if (currentp->t_regs.sp < currentp->t_begstack - currentp->t_minstack) { - if (currentp->t_minstack) /* display if protected stack*/ - printk("(%d)STACK OVER MINSTACK by %u BYTES\n", currentp->pid, - currentp->t_begstack - currentp->t_minstack - currentp->t_regs.sp); + if (current->t_regs.sp < current->t_begstack - current->t_minstack) { + if (current->t_minstack) /* display if protected stack*/ + printk("(%d)STACK OVER MINSTACK by %u BYTES\n", current->pid, + current->t_begstack - current->t_minstack - current->t_regs.sp); } /* check stack overflow heap*/ - if (currentp->t_regs.sp > (__u16)end) + if (current->t_regs.sp > end) return; } - printk("(%d)STACK OVERFLOW BY %u BYTES\n", - currentp->pid, (__u16)end - currentp->t_regs.sp); + printk("(%P)STACK OVERFLOW BY %u BYTES\n", end - current->t_regs.sp); do_exit(SIGSEGV); } diff --git a/tlvc/arch/i86/kernel/signal.c b/tlvc/arch/i86/kernel/signal.c index 5f0bdb802..b0cd23889 100644 --- a/tlvc/arch/i86/kernel/signal.c +++ b/tlvc/arch/i86/kernel/signal.c @@ -21,7 +21,6 @@ int do_signal(void) { - register __ptask currentp = current; register __sigdisposition_t *sd; register __kern_sighandler_t sah; unsigned int signr; @@ -29,27 +28,27 @@ int do_signal(void) signr = 1; mask = (sigset_t)1; - while (currentp->signal) { - while(!(currentp->signal & mask)) { + while (current->signal) { + while(!(current->signal & mask)) { signr++; mask <<= 1; } - currentp->signal ^= mask; + current->signal ^= mask; - debug_sig("SIGNAL process signal %d pid %d\n", signr, currentp->pid); - sah = currentp->sig.handler; - sd = ¤tp->sig.action[signr - 1].sa_dispose; + debug_sig("SIGNAL process signal %d pid %d\n", signr, current->pid); + sah = current->sig.handler; + sd = ¤t->sig.action[signr - 1].sa_dispose; if (*sd == SIGDISP_DFL) { /* Default */ if ((mask & /* Default Ignore */ (SM_SIGCONT | SM_SIGCHLD | SM_SIGWINCH | SM_SIGURG)) - || (currentp->pid == 1 && signr != SIGKILL)) + || (current->pid == 1 && signr != SIGKILL)) continue; else if (mask & /* Default Stop */ (SM_SIGSTOP | SM_SIGTSTP | SM_SIGTTIN | SM_SIGTTOU)) { - debug_sig("SIGNAL pid %d stopped\n", currentp->pid); - currentp->state = TASK_STOPPED; + debug_sig("SIGNAL pid %d stopped\n", current->pid); + current->state = TASK_STOPPED; /* Let the parent know */ - currentp->exit_status = signr; + current->exit_status = signr; schedule(); } else { /* Default Core or Terminate */ @@ -58,27 +57,27 @@ int do_signal(void) (SM_SIGQUIT|SM_SIGILL|SM_SIGABRT|SM_SIGFPE|SM_SIGSEGV|SM_SIGTRAP)) dump_core(); #endif - debug_sig("SIGNAL terminating pid %d\n", currentp->pid); + debug_sig("SIGNAL terminating pid %d\n", current->pid); do_exit(signr); /* Default Terminate */ } } else if (*sd != SIGDISP_IGN) { /* Set handler */ debug_sig("SIGNAL setup return stack for handler %x:%x\n", _FP_SEG(sah), _FP_OFF(sah)); - //debug_sig("Stack at %x\n", currentp->t_regs.sp); - arch_setup_sighandler_stack(currentp, sah, signr); - //debug_sig("Stack at %x\n", currentp->t_regs.sp); + //debug_sig("Stack at %x\n", current->t_regs.sp); + arch_setup_sighandler_stack(current, sah, signr); + //debug_sig("Stack at %x\n", current->t_regs.sp); *sd = SIGDISP_DFL; debug_sig("SIGNAL reset pending signals\n"); - if (currentp->signal) + if (current->signal) printk("SIGNAL(%d) ignoring signal (mask=%s)\n", - currentp->pid, currentp->signal); - currentp->signal = 0; + current->pid, current->signal); + current->signal = 0; return 1; } else /* else (*sd == SIGDISP_IGN) Ignore */ - debug_sig("SIGNAL signal %d ignored pid %d\n", signr, currentp->pid); + debug_sig("SIGNAL signal %d ignored pid %d\n", signr, current->pid); } return 0; } diff --git a/tlvc/arch/i86/mm/malloc.c b/tlvc/arch/i86/mm/malloc.c index 33643703d..12c0cbc9f 100644 --- a/tlvc/arch/i86/mm/malloc.c +++ b/tlvc/arch/i86/mm/malloc.c @@ -2,7 +2,7 @@ * Memory management support. */ -#include +#include #include #include #include @@ -22,24 +22,22 @@ // and to ease the 286 protected mode // whenever that mode comes back one day -static list_s _seg_all; +list_s _seg_all; static list_s _seg_free; // Split segment if enough large -static segment_s * seg_split (segment_s * s1, segext_t size0) +static segment_s *seg_split(segment_s *s1, segext_t size0) { segext_t size2 = s1->size - size0; if (size2 >= SEG_MIN_SIZE) { // TODO: use pool_alloc - segment_s * s2 = (segment_s *) heap_alloc (sizeof (segment_s), HEAP_TAG_SEG); - if (!s2) { - printk ("seg:cannot split:heap full\n"); - return 0; - } + segment_s * s2 = (segment_s *)heap_alloc (sizeof(segment_s), HEAP_TAG_SEG); + if (!s2) + return 0; // heap_alloc gives heap full message s2->base = s1->base + size0; s2->size = size2; @@ -61,17 +59,17 @@ static segment_s * seg_split (segment_s * s1, segext_t size0) // Get free segment -static segment_s * seg_free_get (segext_t size0, word_t type) +static segment_s *seg_free_get(segext_t size0, word_t type) { // First get the smallest suitable free segment - segment_s * best_seg = 0; + segment_s *best_seg = 0; segext_t best_size = 0xFFFF; - list_s * n = _seg_free.next; + list_s *n = _seg_free.next; segext_t size00 = size0, incr = 0; while (n != &_seg_free) { - segment_s * seg = structof (n, segment_s, free); + segment_s *seg = structof(n, segment_s, free); segext_t size1 = seg->size; if (type & SEG_FLAG_ALIGN1K) @@ -89,9 +87,9 @@ static segment_s * seg_free_get (segext_t size0, word_t type) // Then allocate that free segment if (best_seg) { - seg_split (best_seg, size00); // split off upper segment + seg_split(best_seg, size00); // split off upper segment if (incr) - best_seg = seg_split (best_seg, incr); // split off lower segment + best_seg = seg_split(best_seg, incr); // split off lower segment best_seg->flags = SEG_FLAG_USED | type; best_seg->ref_count = 1; @@ -104,81 +102,73 @@ static segment_s * seg_free_get (segext_t size0, word_t type) // Merge two contiguous segments -static void seg_merge (segment_s * s1, segment_s * s2) +static void seg_merge(segment_s *s1, segment_s *s2) { - list_remove (&s2->all); + list_remove(&s2->all); s1->size += s2->size; s1->pid = 0; - heap_free (s2); + heap_free(s2); } // Allocate segment -segment_s * seg_alloc (segext_t size, word_t type) +segment_s *seg_alloc(segext_t size, word_t type) { - segment_s * seg = 0; - //lock_wait (&_seg_lock); - seg = seg_free_get (size, type); + segment_s *seg = 0; + seg = seg_free_get(size, type); if (seg && (type & SEG_FLAG_ALIGN1K)) seg->base += ((~seg->base + 1) & ((1024 >> 4) - 1)); - //unlock_event (&_seg_lock); return seg; } // Free segment -void seg_free (segment_s * seg) +void seg_free(segment_s *seg) { - //lock_wait (&_seg_lock); - // Free segment will be inserted to free list: // - tail if merged to previous or next free segment // - head if still alone to increase 'exact hit' // chance on next allocation of same size list_s * i = &_seg_free; + seg->flags = SEG_FLAG_FREE; + seg->pid = 0; // Try to merge with previous segment if free - - list_s * p = seg->all.prev; + list_s *p = seg->all.prev; if (&_seg_all != p) { - segment_s * prev = structof (p, segment_s, all); - if (prev->flags == SEG_FLAG_FREE) { - list_remove (&(prev->free)); - seg_merge (prev, seg); - i = _seg_free.prev; - seg = prev; - } else { - seg->flags = SEG_FLAG_FREE; - seg->pid = 0; - } + segment_s *prev = structof(p, segment_s, all); + if ((prev->flags == SEG_FLAG_FREE) && (prev->base + prev->size == seg->base)) { + list_remove(&(prev->free)); + seg_merge(prev, seg); + i = _seg_free.prev; + seg = prev; + } } // Try to merge with next segment if free - list_s * n = seg->all.next; + list_s *n = seg->all.next; if (n != &_seg_all) { - segment_s * next = structof (n, segment_s, all); - if (next->flags == SEG_FLAG_FREE) { - list_remove (&(next->free)); - seg_merge (seg, next); - i = _seg_free.prev; - } + segment_s *next = structof(n, segment_s, all); + if ((next->flags == SEG_FLAG_FREE) && (seg->base + seg->size == next->base)) { + list_remove(&(next->free)); + seg_merge(seg, next); + i = _seg_free.prev; + } } // Insert to free list head or tail - list_insert_after (i, &(seg->free)); - - //unlock_event (&_seg_lock); + list_insert_after(i, &(seg->free)); } // Increase segment reference count -segment_s * seg_get (segment_s * seg) +segment_s *seg_get(segment_s *seg) { seg->ref_count++; return seg; @@ -188,37 +178,36 @@ segment_s * seg_get (segment_s * seg) // Decrease segment reference count // Free segment on no more reference -void seg_put (segment_s * seg) +void seg_put(segment_s *seg) { if (!--seg->ref_count) - seg_free (seg); + seg_free(seg); } // Allocate segment and copy from another // Typically used by process fork -segment_s * seg_dup (segment_s * src) +segment_s *seg_dup(segment_s *src) { - segment_s * dst = seg_free_get (src->size, src->flags); + segment_s *dst = seg_free_get(src->size, src->flags); if (dst) fmemcpyw(0, dst->base, 0, src->base, src->size << 3); - return dst; } // Get memory information (free and used) in KB -void mm_get_usage (unsigned int * pfree, unsigned int * pused) +void mm_get_usage(unsigned int *pfree, unsigned int *pused) { unsigned int free = 0; unsigned int used = 0; - list_s * n = _seg_all.next; + list_s *n = _seg_all.next; while (n != &_seg_all) { - segment_s * seg = structof (n, segment_s, all); + segment_s *seg = structof(n, segment_s, all); /*if (used) printk ("seg %X: size %u used %u count %u\n", seg->base, seg->size, seg->flags, seg->ref_count);*/ @@ -241,41 +230,41 @@ void mm_get_usage (unsigned int * pfree, unsigned int * pused) // User data segment functions -int sys_brk(__pptr newbrk) +int sys_brk(segoff_t newbrk) { - register __ptask currentp = current; - - /*printk("brk(%d): new %x, edat %x, ebrk %x, free %x sp %x, eseg %x, %d/%dK\n", - current->pid, newbrk, currentp->t_enddata, currentp->t_endbrk, - currentp->t_regs.sp - currentp->t_endbrk, - currentp->t_regs.sp, currentp->t_endseg, - mm_get_usage(MM_MEM, SEG_FLAG_USED), mm_get_usage(MM_MEM, 0));*/ - - if (newbrk < currentp->t_enddata) + /***unsigned int memfree, memused; + mm_get_usage(&memfree, &memused); + printk("brk(%P): new %x, edat %x, ebrk %x, free %x sp %x, eseg %x, %d/%dK\n", + newbrk, current->t_enddata, current->t_endbrk, + current->t_regs.sp - current->t_endbrk, + current->t_regs.sp, current->t_endseg, memfree, memused);***/ + + if (newbrk < current->t_enddata) return -ENOMEM; - if (currentp->t_begstack > currentp->t_endbrk) { /* stack above heap?*/ - if (newbrk > currentp->t_begstack - currentp->t_minstack) { - printk("sys_brk(%d) fail: request %d, over by %u bytes\n", - currentp->pid, newbrk, newbrk - (currentp->t_begstack - currentp->t_minstack)); + if (current->t_begstack > current->t_endbrk) { /* stack above heap?*/ + if (newbrk > current->t_begstack - current->t_minstack) { + printk("sys_brk(%d) fail: brk %x over by %u bytes\n", + current->pid, newbrk, newbrk - (current->t_begstack - current->t_minstack)); return -ENOMEM; } } #ifdef CONFIG_EXEC_LOW_STACK - if (newbrk > currentp->t_endseg) + if (newbrk > current->t_endseg) return -ENOMEM; #endif - currentp->t_endbrk = newbrk; + current->t_endbrk = newbrk; return 0; } -int sys_sbrk (int increment, __u16 * pbrk) +int sys_sbrk(int increment, segoff_t *pbrk) { - __pptr brk = current->t_endbrk; /* always return start of old break*/ + segoff_t brk = current->t_endbrk; /* always return start of old break*/ int err; + debug("sbrk incr %u pointer %04x curbreak %04x\n", increment, pbrk, brk); err = verify_area(VERIFY_WRITE, pbrk, sizeof(*pbrk)); if (err) return err; @@ -284,7 +273,7 @@ int sys_sbrk (int increment, __u16 * pbrk) if (err) return err; } - put_user (brk, pbrk); + put_user(brk, pbrk); return 0; } @@ -297,7 +286,7 @@ int sys_fmemalloc(int paras, unsigned short *pseg) err = verify_area(VERIFY_WRITE, pseg, sizeof(*pseg)); if (err) return err; - seg = seg_alloc((segext_t)paras, SEG_FLAG_PROG); + seg = seg_alloc((segext_t)paras, SEG_FLAG_FDAT); if (!seg) return -ENOMEM; seg->pid = current->pid; @@ -312,7 +301,7 @@ void seg_free_pid(pid_t pid) again: for (n = _seg_all.next; n != &_seg_all; ) { - segment_s * seg = structof (n, segment_s, all); + segment_s *seg = structof(n, segment_s, all); if (seg->pid == pid) { seg_free(seg); @@ -324,16 +313,16 @@ void seg_free_pid(pid_t pid) void INITPROC seg_add(seg_t start, seg_t end) { - segment_s * seg = (segment_s *) heap_alloc (sizeof (segment_s), HEAP_TAG_SEG); - if(seg) { + segment_s *seg = (segment_s *)heap_alloc(sizeof(segment_s), HEAP_TAG_SEG); + if (seg) { seg->base = start; seg->size = end - start; seg->flags = SEG_FLAG_FREE; seg->ref_count = 0; seg->pid = 0; - list_insert_before (&_seg_all, &(seg->all)); // add tail - list_insert_before (&_seg_free, &(seg->free)); // add tail + list_insert_before(&_seg_all, &(seg->all)); // add tail + list_insert_before(&_seg_free, &(seg->free)); // add tail } } @@ -341,8 +330,8 @@ void INITPROC seg_add(seg_t start, seg_t end) void INITPROC mm_init(seg_t start, seg_t end) { - list_init (&_seg_all); - list_init (&_seg_free); + list_init(&_seg_all); + list_init(&_seg_free); seg_add(start, end); } diff --git a/tlvc/arch/i86/mm/user.c b/tlvc/arch/i86/mm/user.c index 2e099ae30..8648414cd 100644 --- a/tlvc/arch/i86/mm/user.c +++ b/tlvc/arch/i86/mm/user.c @@ -10,13 +10,11 @@ int verfy_area(void *p, size_t len) { - register __ptask currentp = current; - /* - * Kernel tasks can always access + * Kernel tasks can always access user process boundaries */ - if ((kernel_ds == currentp->t_regs.ds) /* Kernel tasks can always access */ - || ((__pptr)((char *)p + len) <= currentp->t_endseg)) /* User process boundaries */ + if ((kernel_ds == current->t_regs.ds) || + ((segoff_t)((char *)p + len) <= current->t_endseg)) return 0; return -EFAULT; diff --git a/tlvc/fs/Makefile b/tlvc/fs/Makefile index e3e120ad2..5ba973d11 100644 --- a/tlvc/fs/Makefile +++ b/tlvc/fs/Makefile @@ -36,7 +36,7 @@ include $(BASEDIR)/Makefile-rules # Objects to be compiled. OBJS = buffer.o super.o devices.o fcntl.o stat.o inode.o file_table.o \ - block_dev.o namei.o ioctl.o filesystems.o open.o read_write.o \ + block_dev.o namei.o ioctl.o open.o read_write.o \ readdir.o exec.o select.o pipe.o ifdef CONFIG_EXEC_COMPRESS OBJS += exodecr.o diff --git a/tlvc/fs/block_dev.c b/tlvc/fs/block_dev.c index 1c72f048a..b6ad417b5 100644 --- a/tlvc/fs/block_dev.c +++ b/tlvc/fs/block_dev.c @@ -130,7 +130,7 @@ size_t block_write(struct inode *inode, struct file *filp, char *buf, size_t cou } if ((loff_t)inode->i_size < filp->f_pos) inode->i_size = (__u32) filp->f_pos; - inode->i_mtime = inode->i_ctime = CURRENT_TIME; + inode->i_mtime = inode->i_ctime = current_time(); inode->i_dirt = 1; return written; } @@ -212,7 +212,7 @@ static int raw_blk_rw(struct inode *inode, register struct file *filp, buffer_seg(bh), chars); } } else { /* moving full sectors */ - unsigned char *o_data; + char *o_data; seg_t o_seg; unsigned char sec_cnt; @@ -222,9 +222,9 @@ static int raw_blk_rw(struct inode *inode, register struct file *filp, ebh->b_blocknr = filp->f_pos >> SECT_SIZE_BITS; o_data = bh->b_data; /* save the 'original' values */ - o_seg = ebh->b_L2seg; - ebh->b_L2seg = current->t_regs.ds; - bh->b_data = (unsigned char *)buf; + o_seg = (seg_t)ebh->b_L2seg; /* may be long (xms active) or int */ + ebh->b_L2seg = (ramdesc_t)current->t_regs.ds; + bh->b_data = buf; ebh->b_nr_sectors = (chars >> SECT_SIZE_BITS); chars &= ~(SECT_SIZE - 1); sec_cnt = ebh->b_nr_sectors; @@ -232,7 +232,7 @@ static int raw_blk_rw(struct inode *inode, register struct file *filp, ll_rw_blk(wr, bh); wait_on_buffer(bh); - ebh->b_L2seg = o_seg; /* restore */ + ebh->b_L2seg = (ramdesc_t)o_seg; /* restore */ bh->b_data = o_data; if (sec_cnt != ebh->b_nr_sectors) { debug_raw("partial raw IO, requested %d, got %d\n", diff --git a/tlvc/fs/buffer.c b/tlvc/fs/buffer.c index b302306b8..aa7d2fa2a 100644 --- a/tlvc/fs/buffer.c +++ b/tlvc/fs/buffer.c @@ -389,6 +389,7 @@ struct buffer_head *get_free_buffer(void) ebh->b_count = 1; ebh->b_nr_sectors = 0; /* non-zero indicate raw IO */ SET_COUNT(ebh); + //debug_blk("GET_FREE_BUF %lx:%x; ", (unsigned long)buffer_seg(bh), buffer_data(bh)); return bh; } @@ -716,6 +717,7 @@ void map_buffer(struct buffer_head *bh) xms_fmemcpyw(bh->b_data, kernel_ds, 0, ebh->b_L2seg, BLOCK_SIZE/2); map_count++; debug_map("MAP: L%02d block %ld\n", i+1, ebh->b_blocknr); + debug_map("data %04x L2s %lx kds 0%04x\n", bh->b_data, (unsigned long)ebh->b_L2seg, kernel_ds); end_map_buffer: ebh->b_mapcount++; } diff --git a/tlvc/fs/devices.c b/tlvc/fs/devices.c index 40cfa9e35..888b460b7 100644 --- a/tlvc/fs/devices.c +++ b/tlvc/fs/devices.c @@ -16,9 +16,6 @@ #include struct device_struct { -#ifdef CONFIG_DEV_NAMES - char *ds_name; -#endif struct file_operations *ds_fops; }; @@ -40,11 +37,6 @@ int register_chrdev(unsigned int major, const char *name, struct file_operations if (major >= MAX_CHRDEV) return -EINVAL; if (dev->ds_fops && (dev->ds_fops != fops)) return -EBUSY; dev->ds_fops = fops; - -#ifdef CONFIG_DEV_NAMES - dev->ds_name = name; -#endif - return 0; } @@ -55,48 +47,9 @@ int register_blkdev(unsigned int major, const char *name, struct file_operations if (major >= MAX_BLKDEV) return -EINVAL; if (dev->ds_fops && dev->ds_fops != fops) return -EBUSY; dev->ds_fops = fops; - -#ifdef CONFIG_DEV_NAMES - dev->ds_name = name; -#endif - return 0; } -#ifdef BLOAT_FS - -/* - * This routine checks whether a removable media has been changed, - * and invalidates all buffer-cache-entries in that case. This - * is a relatively slow routine, so we have to try to minimize using - * it. Thus it is called only upon a 'mount' or 'open'. This - * is the best way of combining speed and utility, I think. - * People changing diskettes in the middle of an operation deserve - * to lose :-) - */ -int check_disk_change(kdev_t dev) -{ - register struct file_operations *fops; - int i; - - i = MAJOR(dev); - if (i >= MAX_BLKDEV || (fops = blkdevs[i].ds_fops) == NULL) return 0; - if (fops->check_media_change == NULL) return 0; - if (!fops->check_media_change(dev)) return 0; - - printk("VFS: Disk change detected on device %s\n", kdevname(dev)); - for (i = 0; i < NR_SUPER; i++) - if (super_blocks[i].s_dev == dev) put_super(super_blocks[i].s_dev); - invalidate_inodes(dev); - invalidate_buffers(dev); - - if (fops->revalidate) - fops->revalidate(dev); - return 1; -} - -#endif - /* * Called every time a block special file is opened */ diff --git a/tlvc/fs/exec.c b/tlvc/fs/exec.c index ea2dd792c..ec1c9c8d9 100644 --- a/tlvc/fs/exec.c +++ b/tlvc/fs/exec.c @@ -31,7 +31,7 @@ * the direct hd/fd drivers. */ -#include +#include #include #include #include @@ -73,7 +73,7 @@ * Read relocations for a particular segment and apply them * Only IA-16 segment relocations are accepted */ -static int relocate(seg_t place_base, lsize_t rsize, segment_s *seg_code, +static int relocate(seg_t place_base, unsigned long rsize, segment_s *seg_code, segment_s *seg_data, struct inode *inode, struct file *filp, size_t tseg) { int retval = 0; @@ -128,14 +128,14 @@ static int relocate(seg_t place_base, lsize_t rsize, segment_s *seg_code, int sys_execve(const char *filename, char *sptr, size_t slen) { - register __ptask currentp; + register struct task_struct *currentp; struct inode *inode; struct file *filp; int retval; __u16 ds; seg_t base_data = 0; - segment_s * seg_code; - segment_s * seg_data; + segment_s *seg_code; + segment_s *seg_data; size_t len, min_len, heap, stack = 0; size_t bytes; segext_t paras; @@ -146,7 +146,7 @@ int sys_execve(const char *filename, char *sptr, size_t slen) #endif /* Open the image */ - debug_file("EXEC: '%t' env %d\n", filename, slen); + debug_file("EXEC(%P): '%t' env %d\n", filename, slen); retval = open_namei(filename, 0, 0, &inode, NULL); @@ -164,7 +164,7 @@ int sys_execve(const char *filename, char *sptr, size_t slen) do { if ((currentp->state <= TASK_STOPPED) && (currentp->t_inode == inode)) { debug("EXEC found copy\n"); - seg_code = currentp->mm.seg_code; + seg_code = currentp->mm[SEG_CODE]; break; } } while (++currentp < &task[max_tasks]); @@ -443,11 +443,11 @@ int sys_execve(const char *filename, char *sptr, size_t slen) /* From this point, exec() will surely succeed */ - currentp->t_endseg = (__pptr)len; /* Needed for sys_brk() */ + currentp->t_endseg = len; /* Needed for sys_brk() */ /* Copy the command line and environment */ currentp->t_begstack = (base_data /* Just above the top of stack */ - ? (__pptr)base_data + ? base_data : currentp->t_endseg) - slen; currentp->t_begstack &= ~1; /* force even stack pointer and argv/envp*/ currentp->t_regs.sp = (__u16)currentp->t_begstack; @@ -457,14 +457,14 @@ int sys_execve(const char *filename, char *sptr, size_t slen) /* From this point, the old code and data segments are not needed anymore */ /* Flush the old binary out. */ - if (currentp->mm.seg_code) seg_put(currentp->mm.seg_code); - if (currentp->mm.seg_data) seg_put(currentp->mm.seg_data); + if (currentp->mm[SEG_CODE]) seg_put(currentp->mm[SEG_CODE]); + if (currentp->mm[SEG_DATA]) seg_put(currentp->mm[SEG_DATA]); debug("EXEC: old binary flushed.\n"); - currentp->mm.seg_code = seg_code; + currentp->mm[SEG_CODE] = seg_code; currentp->t_xregs.cs = seg_code->base; - currentp->mm.seg_data = seg_data; + currentp->mm[SEG_DATA] = seg_data; currentp->t_regs.es = currentp->t_regs.ss = seg_data->base; /* Wipe the BSS */ @@ -513,7 +513,7 @@ int sys_execve(const char *filename, char *sptr, size_t slen) currentp->egid = inode->i_gid; } - currentp->t_enddata = (__pptr) ((__u16)mh.dseg + (__u16)mh.bseg + base_data); + currentp->t_enddata = (size_t)mh.dseg + (size_t)mh.bseg + base_data; currentp->t_endbrk = currentp->t_enddata; /* ease libc memory allocations by setting even break address*/ diff --git a/tlvc/fs/filesystems.c b/tlvc/fs/filesystems.c deleted file mode 100644 index 9478c453a..000000000 --- a/tlvc/fs/filesystems.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * linux/fs/filesystems.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - * - * table of configured filesystems - */ - -#include -#include -#include -#include - -#include -#include -#include -#include - -void INITPROC fs_init(void) -{ -#ifdef CONFIG_MINIX_FS - init_minix_fs(); -#endif - -#ifdef CONFIG_FS_FAT - init_msdos_fs(); -#endif -} diff --git a/tlvc/fs/inode.c b/tlvc/fs/inode.c index 49fa4616f..9b97d1069 100644 --- a/tlvc/fs/inode.c +++ b/tlvc/fs/inode.c @@ -29,7 +29,7 @@ static int nr_free_inodes = NR_INODE; #define DCR_COUNT(i) if(!(--i->i_count))nr_free_inodes++ #define INR_COUNT(i) if(!(i->i_count++))nr_free_inodes-- #define CLR_COUNT(i) if(i->i_count)nr_free_inodes++ -#define SET_COUNT(i) if(--nr_free_inodes < 0) { panic("get_empty_inode: bad free count"); } +#define SET_COUNT(i) if(--nr_free_inodes < 0) { panic("bad free count"); } #else #define DCR_COUNT(i) (i->i_count--) #define INR_COUNT(i) (i->i_count++) @@ -301,7 +301,7 @@ struct inode *new_inode(register struct inode *dir, __u16 mode) if (S_ISLNK(mode)) mode |= 0777; else mode &= ~(current->fs.umask & 0777); inode->i_mode = mode; - inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; + inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(); #ifdef BLOAT_FS inode->i_blocks = inode->i_blksize = 0; @@ -316,7 +316,7 @@ struct inode *iget(struct super_block *sb, ino_t inr) register struct inode *inode; register struct inode *n_ino; - if (!sb) panic("iget sb 0"); + if (!sb) panic("iget0"); debug("iget dev %D ino %lu\n", sb->s_dev, (unsigned long)inr); n_ino = NULL; @@ -473,7 +473,7 @@ int notify_change(register struct inode *inode, register struct iattr *attr) { int retval; - attr->ia_ctime = CURRENT_TIME; + attr->ia_ctime = current_time(); if (attr->ia_valid & (ATTR_ATIME | ATTR_MTIME)) { if (!(attr->ia_valid & ATTR_ATIME_SET)) attr->ia_atime = attr->ia_ctime; if (!(attr->ia_valid & ATTR_MTIME_SET)) attr->ia_mtime = attr->ia_ctime; diff --git a/tlvc/fs/minix/bitmap.c b/tlvc/fs/minix/bitmap.c index 8e984276e..84ef840e9 100644 --- a/tlvc/fs/minix/bitmap.c +++ b/tlvc/fs/minix/bitmap.c @@ -36,7 +36,7 @@ struct buffer_head *get_map_block(kdev_t dev, block_t block) return bh; } -static unsigned short count_used(kdev_t dev, unsigned int map[], +static unsigned int count_used(kdev_t dev, unsigned short *map, unsigned int numblocks, unsigned int numbits) { unsigned int i, j, end, sum = 0; diff --git a/tlvc/fs/minix/inode.c b/tlvc/fs/minix/inode.c index f84ea57d1..4657945b1 100644 --- a/tlvc/fs/minix/inode.c +++ b/tlvc/fs/minix/inode.c @@ -230,7 +230,7 @@ static unsigned short map_izone(register struct inode *inode, block_t block, int if (create && !(*i_zone)) { if ((*i_zone = minix_new_block(inode->i_sb))) { - inode->i_ctime = CURRENT_TIME; + inode->i_ctime = current_time();; inode->i_dirt = 1; } } @@ -269,7 +269,7 @@ unsigned short _minix_bmap(register struct inode *inode, block_t block, int crea * check for overruns in the block num elsewhere.. FIXME */ if (block > (7 + 512 + 512 * 512)) - panic("_minix_bmap: block (%d) >big", block); + panic("minix_bmap: block %d >big", block); #endif if (block < 7) @@ -449,8 +449,3 @@ struct file_system_type minix_fs_type = { minix_read_super, FST_MINIX }; - -int init_minix_fs(void) -{ - return 1; -} diff --git a/tlvc/fs/minix/namei.c b/tlvc/fs/minix/namei.c index 2ccbd2074..744d365aa 100644 --- a/tlvc/fs/minix/namei.c +++ b/tlvc/fs/minix/namei.c @@ -195,7 +195,7 @@ static int minix_add_entry(register struct inode *dir, return -EEXIST; } } - dir->i_mtime = dir->i_ctime = CURRENT_TIME; + dir->i_mtime = dir->i_ctime = current_time(); dir->i_dirt = 1; memcpy_fromfs(de->name, name, namelen); if (info->s_namelen > namelen) @@ -421,7 +421,7 @@ int minix_rmdir(register struct inode *dir, char *name, size_t len) mark_buffer_dirty(bh); inode->i_nlink = 0; inode->i_dirt = 1; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; + inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(); dir->i_nlink--; dir->i_dirt = 1; retval = 0; @@ -471,7 +471,7 @@ int minix_unlink(register struct inode *dir, char *name, size_t len) #endif mark_buffer_dirty(bh); - dir->i_ctime = dir->i_mtime = CURRENT_TIME; + dir->i_ctime = dir->i_mtime = current_time(); dir->i_dirt = 1; inode->i_nlink--; inode->i_ctime = dir->i_ctime; @@ -542,7 +542,7 @@ int minix_link(register struct inode *dir, char *name, size_t len, } else if (!(error = minix_add_entry(dir, name, len, oldinode->i_ino))) { oldinode->i_nlink++; - oldinode->i_ctime = CURRENT_TIME; + oldinode->i_ctime = current_time(); oldinode->i_dirt = 1; } iput(dir); diff --git a/tlvc/fs/minix/truncate.c b/tlvc/fs/minix/truncate.c index f14479051..f8ee5555f 100644 --- a/tlvc/fs/minix/truncate.c +++ b/tlvc/fs/minix/truncate.c @@ -186,6 +186,6 @@ void minix_truncate(register struct inode *inode) if (!retry) break; schedule(); } - inode->i_mtime = inode->i_ctime = CURRENT_TIME; + inode->i_mtime = inode->i_ctime = current_time(); inode->i_dirt = 1; } diff --git a/tlvc/fs/msdos/file.c b/tlvc/fs/msdos/file.c index 96459d690..518a29623 100644 --- a/tlvc/fs/msdos/file.c +++ b/tlvc/fs/msdos/file.c @@ -138,7 +138,7 @@ static size_t msdos_file_write(register struct inode *inode,register struct file mark_buffer_dirty(bh); brelse(bh); } - inode->i_mtime = CURRENT_TIME; + inode->i_mtime = current_time(); inode->u.msdos_i.i_attrs |= ATTR_ARCH; inode->i_dirt = 1; return start == buf ? error : buf-start; diff --git a/tlvc/fs/msdos/inode.c b/tlvc/fs/msdos/inode.c index 43b2600a5..a16908dbb 100644 --- a/tlvc/fs/msdos/inode.c +++ b/tlvc/fs/msdos/inode.c @@ -34,11 +34,6 @@ struct msdos_devdir_entry devnods[DEVDIR_SIZE] = { { "hdb2", S_IFBLK | 0644, MKDEV(3, 34)}, { "hdb3", S_IFBLK | 0644, MKDEV(3, 35)}, { "hdb4", S_IFBLK | 0644, MKDEV(3, 36)}, - { "hdc", S_IFBLK | 0644, MKDEV(3, 64)}, - { "hdc1", S_IFBLK | 0644, MKDEV(3, 65)}, - { "hdc2", S_IFBLK | 0644, MKDEV(3, 66)}, - { "hdc3", S_IFBLK | 0644, MKDEV(3, 67)}, - { "hdc4", S_IFBLK | 0644, MKDEV(3, 68)}, { "df0", S_IFBLK | 0644, MKDEV(2, 0)}, { "df1", S_IFBLK | 0644, MKDEV(2, 1)}, { "fd0", S_IFBLK | 0644, MKDEV(3,128)}, @@ -318,7 +313,7 @@ void msdos_read_inode(register struct inode *inode) inode->i_mode = devnods[(int)inode->i_ino - DEVINO_BASE].mode; inode->i_uid = 0; inode->i_size = 0; - inode->i_mtime= CURRENT_TIME; + inode->i_mtime= current_time(); inode->i_gid = 0; inode->i_nlink= 1; inode->i_rdev = devnods[(int)inode->i_ino - DEVINO_BASE].rdev; @@ -413,7 +408,3 @@ struct file_system_type msdos_fs_type = { FST_MSDOS }; -int init_msdos_fs(void) -{ - return 1; -} diff --git a/tlvc/fs/msdos/namei.c b/tlvc/fs/msdos/namei.c index 4b4f34ec8..22393bfec 100644 --- a/tlvc/fs/msdos/namei.c +++ b/tlvc/fs/msdos/namei.c @@ -189,14 +189,14 @@ static int FATPROC msdos_create_entry(struct inode *dir,const char *name,int is_ memcpy(de->name,name,MSDOS_NAME); de->attr = is_dir ? ATTR_DIR : ATTR_ARCH; de->start = 0; - date_unix2dos(CURRENT_TIME,&de->time,&de->date); + date_unix2dos(current_time(), &de->time, &de->date); de->size = 0; debug_fat("create_entry block write %lu\n", buffer_blocknr(bh)); mark_buffer_dirty(bh); if ((*result = iget(dir->i_sb,ino)) != 0) msdos_read_inode(*result); unmap_brelse(bh); if (!*result) return -EIO; - (*result)->i_mtime = CURRENT_TIME; + (*result)->i_mtime = current_time(); (*result)->i_dirt = 1; return 0; } @@ -303,9 +303,9 @@ int msdos_rmdir(register struct inode *dir,const char *name,int len) inode = NULL; res = -EINVAL; if (len == 1 && get_fs_byte(name) == '.') goto rmdir_done; - if ((res = msdos_find(dir,name,len,&bh,&de,&ino)) < 0) goto rmdir_done; + if ((res = msdos_find(dir, name, len, &bh, &de, &ino)) < 0) goto rmdir_done; res = -ENOENT; - if (!(inode = iget(dir->i_sb,ino))) goto rmdir_done; + if (!(inode = iget(dir->i_sb, ino))) goto rmdir_done; res = -ENOTDIR; if (!S_ISDIR(inode->i_mode)) goto rmdir_done; res = -EBUSY; @@ -317,13 +317,13 @@ int msdos_rmdir(register struct inode *dir,const char *name,int len) dbh = NULL; while (msdos_get_entry(inode,&pos,&dbh,&dde) != (ino_t)-1) if (dde->name[0] && (unsigned char)dde->name[0] != DELETED_FLAG - && strncmp(dde->name,MSDOS_DOT, MSDOS_NAME) - && strncmp(dde->name,MSDOS_DOTDOT, MSDOS_NAME)) + && strncmp(dde->name, MSDOS_DOT, MSDOS_NAME) + && strncmp(dde->name, MSDOS_DOTDOT, MSDOS_NAME)) goto rmdir_done; /* linux bug ??? */ if (dbh) unmap_brelse(dbh); } inode->i_nlink = 0; - dir->i_mtime = CURRENT_TIME; + dir->i_mtime = current_time(); inode->i_dirt = dir->i_dirt = 1; de->name[0] = (unsigned char)DELETED_FLAG; debug_fat("rmdir block write %lu\n", buffer_blocknr(bh)); diff --git a/tlvc/fs/namei.c b/tlvc/fs/namei.c index d9035a10c..b695db8d5 100644 --- a/tlvc/fs/namei.c +++ b/tlvc/fs/namei.c @@ -36,9 +36,10 @@ int permission(register struct inode *inode, int mask) { __u16 mode = inode->i_mode; int error = -EACCES; + struct task_struct *p; if (mask & MAY_WRITE) { /* disallow writing over running programs */ - __ptask p = &task[0]; + p = &task[0]; do { if (p->state <= TASK_STOPPED && (p->t_inode == inode)) return -EBUSY; diff --git a/tlvc/fs/open.c b/tlvc/fs/open.c index 4308e6132..00594a1b9 100644 --- a/tlvc/fs/open.c +++ b/tlvc/fs/open.c @@ -160,7 +160,7 @@ int sys_utime(char *filename, register struct utimbuf *times) if (times) { pinode->i_atime = get_user_long((void *) ×->actime); pinode->i_mtime = get_user_long((void *) ×->modtime); - } else pinode->i_atime = pinode->i_mtime = CURRENT_TIME; + } else pinode->i_atime = pinode->i_mtime = current_time(); pinode->i_dirt = 1; iput(pinode); } @@ -175,7 +175,6 @@ int sys_utime(char *filename, register struct utimbuf *times) int sys_access(char *filename, int mode) { struct inode *inode; - register __ptask currentp = current; uid_t old_euid; gid_t old_egid; int error; @@ -183,42 +182,40 @@ int sys_access(char *filename, int mode) if (mode != (mode & S_IRWXO)) /* where's F_OK, X_OK, W_OK, R_OK? */ error = -EINVAL; else { - old_euid = currentp->euid; - old_egid = currentp->egid; - currentp->euid = currentp->uid; - currentp->egid = currentp->gid; + old_euid = current->euid; + old_egid = current->egid; + current->euid = current->uid; + current->egid = current->gid; error = namei(filename, &inode, 0, mode); if (!error) iput(inode); - currentp->euid = old_euid; - currentp->egid = old_egid; + current->euid = old_euid; + current->egid = old_egid; } return error; } int sys_chdir(char *filename) { - register __ptask currentp = current; struct inode *inode; int error; error = namei(filename, &inode, IS_DIR, MAY_EXEC); if (!error) { - iput(currentp->fs.pwd); - currentp->fs.pwd = inode; + iput(current->fs.pwd); + current->fs.pwd = inode; } return error; } int sys_chroot(char *filename) { - register __ptask currentp = current; struct inode *inode; int error; error = (suser() ? namei(filename, &inode, IS_DIR, 0) : -EPERM); if (!error) { - iput(currentp->fs.root); - currentp->fs.root = inode; + iput(current->fs.root); + current->fs.root = inode; } return error; } diff --git a/tlvc/fs/pipe.c b/tlvc/fs/pipe.c index 91d5e2a5e..7d2b3a941 100644 --- a/tlvc/fs/pipe.c +++ b/tlvc/fs/pipe.c @@ -106,7 +106,7 @@ static size_t pipe_read(register struct inode *inode, struct file *filp, PIPE_LEN(inode) -= count; PIPE_LOCK(inode)--; wake_up_interruptible(&PIPE_WAIT(inode)); - if (count) inode->i_atime = CURRENT_TIME; + if (count) inode->i_atime = current_time(); else if (PIPE_WRITERS(inode)) count = -EAGAIN; return count; } @@ -151,7 +151,7 @@ static size_t pipe_write(register struct inode *inode, struct file *filp, wake_up_interruptible(&PIPE_WAIT(inode)); free = 1; } - inode->i_ctime = inode->i_mtime = CURRENT_TIME; + inode->i_ctime = inode->i_mtime = current_time(); return written; } diff --git a/tlvc/fs/select.c b/tlvc/fs/select.c index 9dafeb48c..120d0220b 100644 --- a/tlvc/fs/select.c +++ b/tlvc/fs/select.c @@ -55,7 +55,7 @@ void select_wait (struct wait_queue *q) int n; struct wait_queue **p; - for (n = 0; n < POLL_MAX; n++) { + for (n = 0; n < MAX_POLLFD; n++) { p = &(current->poll [n]); if (!*p) { *p = q; @@ -63,7 +63,7 @@ void select_wait (struct wait_queue *q) } } - panic ("select_wait:no slot left"); + panic ("select_wait"); /* no slot left */ } /* Return true if queue is polled */ @@ -73,13 +73,13 @@ int select_poll (struct task_struct * t, struct wait_queue *q) int n; struct wait_queue *p; - for (n = 0; n < POLL_MAX; n++) { + for (n = 0; n < MAX_POLLFD; n++) { p = t->poll [n]; if (!p) return 0; if (p == q) return 1; } - panic ("select_poll:no slot found\n"); + panic ("select_poll\n"); /* no slot found */ return 0; } @@ -136,7 +136,7 @@ static int do_select(int n, fd_set * in, fd_set * out, fd_set * ex, * reschedule current task since current->state == TASK_RUNNING by wake_up. */ current->state = TASK_INTERRUPTIBLE; - memset (current->poll, 0, sizeof (struct wait_queue *) * POLL_MAX); + memset (current->poll, 0, sizeof (struct wait_queue *) * MAX_POLLFD); filp = current->files.fd; for (i = 0; i < n; i++, filp++) { if (*filp) { @@ -160,7 +160,7 @@ static int do_select(int n, fd_set * in, fd_set * out, fd_set * ex, goto repeat; } - memset (current->poll, 0, sizeof (struct wait_queue *) * POLL_MAX); + memset (current->poll, 0, sizeof (struct wait_queue *) * MAX_POLLFD); current->state = TASK_RUNNING; wait_clear(&select_queue); return count; diff --git a/tlvc/include/arch/stat.h b/tlvc/include/arch/stat.h index f2a2b202e..311b630ac 100644 --- a/tlvc/include/arch/stat.h +++ b/tlvc/include/arch/stat.h @@ -5,7 +5,7 @@ struct stat { dev_t st_dev; - u_ino_t st_ino; + ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; diff --git a/tlvc/include/arch/system.h b/tlvc/include/arch/system.h index d1f6f5b1b..7c730089e 100644 --- a/tlvc/include/arch/system.h +++ b/tlvc/include/arch/system.h @@ -1,13 +1,23 @@ #ifndef __ARCH_8086_SYSTEM_H #define __ARCH_8086_SYSTEM_H +/* sys_reboot flag parameter */ +#define RB_REBOOT 0x0123 /* hard reset */ +#define RB_SHUTDOWN 0x6789 /* halt system */ +#define RB_POWEROFF 0xDEAD /* call BIOS APM */ + +#ifdef __KERNEL__ #include #include extern byte_t sys_caps; /* system capabilities bits*/ +extern seg_t membase; /* start and end segment of available main memory */ +extern seg_t memend; -extern void INITPROC setup_arch(seg_t *,seg_t *); +extern unsigned int INITPROC setup_arch(void); +void ctrl_alt_del(void); extern void hard_reset_now(void); extern void apm_shutdown_now(void); +#endif #endif diff --git a/tlvc/include/arch/types.h b/tlvc/include/arch/types.h index 797fe9a8e..bca7684d2 100644 --- a/tlvc/include/arch/types.h +++ b/tlvc/include/arch/types.h @@ -1,69 +1,82 @@ -/* arch/i86/include/asm/types.h - Basic Linux/MT data types. */ - #ifndef __ARCH_8086_TYPES_H #define __ARCH_8086_TYPES_H -/*@-namechecks@*/ +/* Basic ELKS data types. */ /* First we define all of the __u and __s types...*/ -#define signed - -typedef unsigned char __u8, *__pu8; -typedef signed char __s8, *__ps8; -typedef unsigned short int __u16, *__pu16; -typedef signed short int __s16, *__ps16; -typedef unsigned long int __u32, *__pu32; -typedef signed long int __s32, *__ps32; - -/* __uint == 16bit here */ - -typedef unsigned short int __uint, *__puint; -typedef signed short int __sint, *__psint; +typedef unsigned char __u8; +typedef signed char __s8; +typedef unsigned short int __u16; +typedef signed short int __s16; +typedef unsigned long int __u32; +typedef signed long int __s32; /* 8086 types */ +typedef __u8 byte_t; +typedef __u16 word_t; +typedef __u32 long_t; + +typedef __u16 seg_t; /* segment value */ +typedef __u16 segext_t; /* paragraph count */ +typedef __u16 segoff_t; /* offset in segment */ +typedef __u16 flag_t; /* CPU flag word */ -typedef __u8 byte_t; -typedef __u16 word_t; -typedef __u32 long_t; -typedef __u16 seg_t; -typedef __u32 addr_t; +typedef __u32 addr_t; /* linear 32-bit address */ +#if defined(__KERNEL__) || defined(__LIBC__) /* Then we define registers, etc... */ /* ordering of saved registers on kernel stack after syscall/interrupt entry*/ -struct _registers { +struct pt_regs { /* SI offset 0 2 4 6 8 10 12*/ __u16 ax, bx, cx, dx, di, si, orig_ax, es, ds, sp, ss; }; -typedef struct _registers __registers, *__pregisters; - struct xregs { - __u16 cs; /* code segment to use in arch_setup_user_stack()*/ - __u16 ksp; /* saved kernel SP used by twsitch()*/ + __u16 cs; /* code segment to use in arch_setup_user_stack()*/ + __u16 ksp; /* saved kernel SP used by twsitch()*/ }; /* ordering of saved registers on user stack after interrupt entry*/ struct uregs { __u16 bp, ip, cs, f; }; +#endif -/* duplicate of _registers*/ -struct pt_regs { - /* SI offset 0 2 4 6 8 10 12*/ - __u16 ax, bx, cx, dx, di, si, orig_ax, es, ds, sp, ss; -}; +#ifndef NULL +#define NULL ((void *) 0) +#endif -/* Changed to unsigned short int as that is what it is here. +/* + * We define various special typedefs here rather than + * including the compiler vendor's headers, which may + * drag in other conflicting definitions. */ -typedef __u16 __pptr; +/* */ +typedef unsigned size_t; +#undef offsetof /* get rids of compiler warnings */ +#define offsetof(__typ,__id) ((size_t)((char *)&(((__typ*)0)->__id) - (char *)0)) -/*@+namechecks@*/ +/* */ +typedef signed int ssize_t; +typedef long long int64_t; -#ifndef NULL -#define NULL ((void *) 0) +/* */ +#ifdef __GNUC__ +typedef int intptr_t; /* ia16-elf-gcc supports small/medium models only */ +typedef unsigned int uintptr_t; #endif -#endif /* !__ARCH_8086_TYPES_H */ +#ifdef __WATCOMC__ +#if defined(__COMPACT__) || defined(__LARGE__) +typedef long intptr_t; +typedef unsigned long uintptr_t; +#else +typedef int intptr_t; +typedef unsigned int uintptr_t; +#endif +#endif + +#endif diff --git a/tlvc/include/linuxmt/dirent.h b/tlvc/include/linuxmt/dirent.h index 5e9f7cf74..4c796ab5d 100644 --- a/tlvc/include/linuxmt/dirent.h +++ b/tlvc/include/linuxmt/dirent.h @@ -6,7 +6,7 @@ #define MAXNAMLEN 26 /* 14 for MINIX, 26 for FAT */ struct dirent { - u_ino_t d_ino; + ino_t d_ino; off_t d_offset; unsigned short d_namlen; char d_name[MAXNAMLEN+1]; diff --git a/tlvc/include/linuxmt/init.h b/tlvc/include/linuxmt/init.h index bc1c666d6..ae6d1272f 100644 --- a/tlvc/include/linuxmt/init.h +++ b/tlvc/include/linuxmt/init.h @@ -3,6 +3,7 @@ /* Assorted initializers */ +#include #include #if defined(CONFIG_FARTEXT_KERNEL) && !defined(__STRICT_ANSI__) @@ -19,10 +20,8 @@ struct gendisk; struct drive_infot; /* kernel init routines*/ -extern void INITPROC kernel_init(void); extern int INITPROC buffer_init(void); -extern void console_init(void); -extern void INITPROC fs_init(void); +extern void INITPROC console_init(void); extern void INITPROC inode_init(void); extern void INITPROC irq_init(void); extern void save_timer_irq(void); @@ -37,13 +36,13 @@ extern void INITPROC tty_init(void); extern void INITPROC device_init(void); extern void INITPROC setup_dev(register struct gendisk *); -extern void tz_init(const char *tzstr); +extern void INITPROC tz_init(const char *tzstr); /* block device init routines*/ extern void INITPROC blk_dev_init(void); -extern int INITPROC bioshd_init(void); -extern int INITPROC get_ide_data(int, struct drive_infot *); -extern int INITPROC directhd_init(void); +extern int INITPROC bioshd_init(void); +extern int INITPROC get_ide_data(int, struct drive_infot *); +extern int INITPROC directhd_init(void); extern void INITPROC floppy_init(void); extern void INITPROC rd_init(void); extern void INITPROC ssd_init(void); diff --git a/tlvc/include/linuxmt/kernel.h b/tlvc/include/linuxmt/kernel.h index cf017b1e0..8b4e27f31 100644 --- a/tlvc/include/linuxmt/kernel.h +++ b/tlvc/include/linuxmt/kernel.h @@ -2,10 +2,10 @@ #define __LINUXMT_KERNEL_H #include -#include +#include /* - * 'kernel.h' contains some often-used function prototypes etc + * 'kernel.h' contains some often-used function prototypes and globals */ #ifdef __KERNEL__ @@ -19,6 +19,8 @@ #define structof(p,t,m) ((t *) ((char *) (p) - offsetof (t,m))) extern char running_qemu; +extern unsigned char arch_cpu; +extern dev_t dev_console; extern int debug_level; extern void do_exit(int); diff --git a/tlvc/include/linuxmt/limits.h b/tlvc/include/linuxmt/limits.h index b9a24dc6d..f7ec10e1a 100644 --- a/tlvc/include/linuxmt/limits.h +++ b/tlvc/include/linuxmt/limits.h @@ -16,7 +16,14 @@ #define KSTACK_GUARD 100 /* bytes before CHECK_KSTACK overflow warning */ -#define POLL_MAX 6 /* Maximum number of polled queues per process */ +#define MAX_POLLFD 6 /* Maximum number of polled filedescs per process */ + +#define MAX_SEGS 5 /* Maximum number of application code/data segments */ + +/* buffers */ +#define NR_MAPBUFS 8 /* Default number of internal L1 buffers */ +#define NR_REQUEST 20 /* Default number of asynch IO request headers, + * see ll_rw_blk.c */ /* filesystem */ #define NR_INODE 96 /* this should be bigger than NR_FILE */ diff --git a/tlvc/include/linuxmt/list.h b/tlvc/include/linuxmt/list.h index d49e97189..3cadf5068 100644 --- a/tlvc/include/linuxmt/list.h +++ b/tlvc/include/linuxmt/list.h @@ -5,17 +5,17 @@ /* Double-linked list */ struct list { - struct list * prev; - struct list * next; + struct list *prev; + struct list *next; }; typedef struct list list_s; -void list_init (list_s * root); +void list_init (list_s *root); -void list_insert_before (list_s * next, list_s * node); -void list_insert_after (list_s * prev, list_s * node); +void list_insert_before (list_s *next, list_s *node); +void list_insert_after (list_s *prev, list_s *node); -void list_remove (list_s * node); +void list_remove (list_s *node); #endif diff --git a/tlvc/include/linuxmt/mm.h b/tlvc/include/linuxmt/mm.h index 76d931a9d..0d83aaaec 100644 --- a/tlvc/include/linuxmt/mm.h +++ b/tlvc/include/linuxmt/mm.h @@ -21,24 +21,21 @@ typedef struct segment segment_s; #define SEG_FLAG_USED 0x80 #define SEG_FLAG_ALIGN1K 0x40 #define SEG_FLAG_TYPE 0x0F -#define SEG_FLAG_CSEG 0x01 -#define SEG_FLAG_DSEG 0x02 -#define SEG_FLAG_EXTBUF 0x03 -#define SEG_FLAG_RAMDSK 0x04 -#define SEG_FLAG_PROG 0x05 +#define SEG_FLAG_CSEG 0x01 /* app code segment */ +#define SEG_FLAG_DSEG 0x02 /* app auto (stack/heap) data segment */ +#define SEG_FLAG_DDAT 0x03 /* app data segment */ +#define SEG_FLAG_FDAT 0x04 /* app fmemalloc far data */ +#define SEG_FLAG_EXTBUF 0x05 /* ext/main memory buffers */ +#define SEG_FLAG_RAMDSK 0x06 /* ram disk buffers */ #ifdef __KERNEL__ #include -/*@-namechecks@*/ - void memcpy_fromfs(void *,void *,size_t); void memcpy_tofs(void *,void *,size_t); int strlen_fromfs(void *,size_t); -/*@+namechecks@*/ - #define VERIFY_READ 0 #define VERIFY_WRITE 1 @@ -59,14 +56,15 @@ int fs_memcmp(const void *,const void *,size_t); segment_s * seg_alloc (segext_t, word_t); void seg_free (segment_s *); - segment_s * seg_get (segment_s *); void seg_put (segment_s *); segment_s * seg_dup (segment_s *); - void seg_free_pid(pid_t pid); +extern list_s _seg_all; + void mm_get_usage (unsigned int * free, unsigned int * used); -#endif // __KERNEL__ -#endif // !__LINUXMT_MM_H +#endif /* __KERNEL__ */ + +#endif diff --git a/tlvc/include/linuxmt/net.h b/tlvc/include/linuxmt/net.h index 99531e661..614609354 100644 --- a/tlvc/include/linuxmt/net.h +++ b/tlvc/include/linuxmt/net.h @@ -1,7 +1,6 @@ #ifndef __LINUXMT_NET_H #define __LINUXMT_NET_H -#include #include #include @@ -18,6 +17,7 @@ typedef enum { SS_DISCONNECTING } socket_state; +#ifdef __KERNEL__ struct socket { unsigned char state; struct wait_queue *wait; @@ -70,6 +70,7 @@ struct proto_ops { int (*getsocketopt) (); int (*fcntl) (); }; +#endif /* careful: option names are close to public SO_ options in socket.h */ #define SF_CLOSING (1 << 0) /* inet */ diff --git a/tlvc/include/linuxmt/sched.h b/tlvc/include/linuxmt/sched.h index 2a2a1bd1b..eeceaeb27 100644 --- a/tlvc/include/linuxmt/sched.h +++ b/tlvc/include/linuxmt/sched.h @@ -2,8 +2,8 @@ #define __LINUXMT_SCHED_H #include -#include #include +#include #include #include #include @@ -12,65 +12,64 @@ #include struct file_struct { - fd_mask_t close_on_exec; - struct file *fd[NR_OPEN]; + fd_mask_t close_on_exec; + struct file *fd[NR_OPEN]; }; struct fs_struct { - unsigned short int umask; - struct inode *root; - struct inode *pwd; -}; - -struct mm_struct { - struct segment *seg_code; - struct segment *seg_data; + unsigned short int umask; + struct inode *root; + struct inode *pwd; }; struct signal_struct { - __kern_sighandler_t handler; + __kern_sighandler_t handler; struct __kern_sigaction_struct action[NSIG]; }; +/* Standard segment entry indices for a.out executables */ +#define SEG_CODE 0 +#define SEG_DATA 1 + struct task_struct { /* Executive stuff */ - struct xregs t_xregs; - __pptr t_enddata; - __pptr t_begstack; - __pptr t_endbrk; - __pptr t_endseg; - int t_minstack; + struct xregs t_xregs; /* CS and kernel SP */ + segoff_t t_enddata; /* start of heap = end of data+bss */ + segoff_t t_endbrk; /* current break (end of heap) */ + segoff_t t_begstack; /* start SP, argc/argv strings above */ + segoff_t t_endseg; /* end of data seg (data+bss+heap+stack) */ + segoff_t t_minstack; /* min stack size */ /* Kernel info */ - pid_t pid; - pid_t ppid; - pid_t pgrp; - pid_t session; - uid_t uid; - uid_t euid; - uid_t suid; - gid_t gid; - gid_t egid; - gid_t sgid; + pid_t pid; + pid_t ppid; + pid_t pgrp; + pid_t session; + uid_t uid; + uid_t euid; + uid_t suid; + gid_t gid; + gid_t egid; + gid_t sgid; /* Scheduling + status variables */ - unsigned char state; - struct wait_queue child_wait; - jiff_t timeout; /* for select() */ - struct wait_queue *waitpt; /* Wait pointer */ - struct wait_queue *poll[POLL_MAX]; /* polled queues */ - struct task_struct *next_run; - struct task_struct *prev_run; - struct file_struct files; /* File system structure */ - struct fs_struct fs; /* File roots */ - struct mm_struct mm; /* Memory blocks */ - struct tty *tty; - struct task_struct *p_parent; - int exit_status; /* process exit status*/ - struct inode *t_inode; - sigset_t signal; /* Signal status */ - struct signal_struct sig; /* Signal block */ + unsigned char state; + struct wait_queue child_wait; + jiff_t timeout; /* for select() */ + struct wait_queue *waitpt; /* Wait pointer */ + struct wait_queue *poll[MAX_POLLFD]; /* polled queues */ + struct task_struct *next_run; + struct task_struct *prev_run; + struct file_struct files; /* File system structure */ + struct fs_struct fs; /* File roots */ + struct segment *mm[MAX_SEGS]; /* App code/data segments */ + struct tty *tty; + struct task_struct *p_parent; + int exit_status; /* process exit status*/ + struct inode *t_inode; + sigset_t signal; /* Signal status */ + struct signal_struct sig; /* Signal block */ #ifdef CONFIG_CPU_USAGE unsigned long average; /* fixed point CPU % usage */ @@ -78,7 +77,8 @@ struct task_struct { #endif #ifdef CONFIG_SUPPLEMENTARY_GROUPS - gid_t groups[NGROUPS]; +#define NGROUPS 13 + gid_t groups[NGROUPS]; #endif /* next two words are only used by CONFIG_TRACE but left in to avoid @@ -86,45 +86,43 @@ struct task_struct { int kstack_max; int kstack_prevmax; - __u16 kstack_magic; /* To detect stack corruption */ - __u16 t_kstack[KSTACK_BYTES/2]; - struct pt_regs t_regs; + unsigned int kstack_magic; /* To detect stack corruption */ + __u16 t_kstack[KSTACK_BYTES/2]; + struct pt_regs t_regs; /* registers on stack during syscall */ }; #define KSTACK_MAGIC 0x5476 /* the order of these matter for signal handling*/ -#define TASK_RUNNING 0 -#define TASK_INTERRUPTIBLE 1 -#define TASK_UNINTERRUPTIBLE 2 -#define TASK_WAITING 3 -#define TASK_STOPPED 4 -#define TASK_ZOMBIE 5 -#define TASK_EXITING 6 -#define TASK_UNUSED 7 - -/*@-namechecks@*/ +#define TASK_RUNNING 0 +#define TASK_INTERRUPTIBLE 1 +#define TASK_UNINTERRUPTIBLE 2 +#define TASK_WAITING 3 +#define TASK_STOPPED 4 +#define TASK_ZOMBIE 5 +#define TASK_EXITING 6 +#define TASK_UNUSED 7 #define DEPRECATED -//#define DEPRECATED __attribute__ ((deprecated)) - -/* We use typedefs to avoid using struct foobar (*) */ -typedef struct task_struct __task, *__ptask; +//#define DEPRECATED __attribute__ ((deprecated)) -extern __task *task; -extern __task *next_task_slot; +extern struct task_struct *task; +extern struct task_struct *current; +extern struct task_struct *next_task_slot; extern int max_tasks; extern int task_slots_unused; -extern volatile jiff_t jiffies; /* ticks updated by the timer interrupt*/ -extern __ptask current; +extern volatile jiff_t jiffies; /* ticks updated by the timer interrupt*/ extern pid_t last_pid; extern int _gint_count; extern struct timeval xtime; extern jiff_t xtime_jiffies; extern int tz_offset; -#define CURRENT_TIME (xtime.tv_sec + (jiffies - xtime_jiffies)/HZ) +extern time_t current_time(void); + +/* return true if time a is after time b */ +#define time_after(a,b) (((long)(b) - (long)(a) < 0)) #define for_each_task(p) \ for (p = &task[0] ; p!=&task[max_tasks]; p++ ) @@ -151,12 +149,8 @@ void prepare_to_wait(struct wait_queue *p); void do_wait(void); void finish_wait(struct wait_queue *p); -/*@-namechecks@*/ - extern void _wake_up(struct wait_queue *,int); -/*@+namechecks@*/ - extern void down(sem_t *); extern void up(sem_t *); diff --git a/tlvc/include/linuxmt/types.h b/tlvc/include/linuxmt/types.h index a49a21661..44e489392 100644 --- a/tlvc/include/linuxmt/types.h +++ b/tlvc/include/linuxmt/types.h @@ -3,61 +3,38 @@ #include -#ifdef __KERNEL__ -#include -#endif - -typedef __s32 loff_t; -typedef __s32 off_t; - -typedef __u32 jiff_t; -typedef __u32 lsize_t; -typedef __u32 speed_t; -typedef __u32 tcflag_t; - -typedef __u16 block_t; -typedef __u32 block32_t; -typedef __u32 sector_t; -typedef __u16 dev_t; -typedef __u16 flag_t; -typedef long cluster_t; - -typedef __u32 u_ino_t; -#ifndef __KERNEL__ -typedef u_ino_t ino_t; -#else -#ifdef CONFIG_32BIT_INODES -typedef __u32 ino_t; -#else -typedef __u16 ino_t; -#endif -#endif /* __KERNEL__*/ -typedef __u16 pid_t; -typedef __u16 uid_t; -typedef __u16 gid_t; - -typedef __u16 mode_t; -typedef __u16 nlink_t; -typedef __u16 segext_t; -typedef __u16 umode_t; +typedef __u16 dev_t; +typedef __u16 pid_t; +typedef __u16 uid_t; +typedef __u16 gid_t; +typedef __u16 mode_t; +typedef __u16 nlink_t; -typedef __u8 cc_t; -typedef __u16 sig_t; +typedef __u32 ino_t; +typedef __u32 time_t; -typedef __s16 sem_t; +typedef __s32 off_t; +typedef __s32 loff_t; -/*@ignore@*/ +typedef __u32 tcflag_t; +typedef __u32 speed_t; +typedef __u8 cc_t; -/* The next three lines cause splint to complain needlessly */ - -typedef __u32 time_t; +#include -/*@end@*/ +typedef __kernel_fd_set fd_set; +typedef __s16 sem_t; -typedef __u32 fd_mask_t; +#if defined(__KERNEL__) || defined(__LIBC__) +typedef __u16 block_t; +typedef __u32 block32_t; +typedef __u32 sector_t; +typedef __s32 cluster_t; -#include +typedef __u16 sig_t; -typedef __kernel_fd_set fd_set; +typedef __u32 jiff_t; +typedef __u32 fd_mask_t; +#endif #endif diff --git a/tlvc/kernel/dma.c b/tlvc/kernel/dma.c index 2839dd285..7c6b20bbb 100644 --- a/tlvc/kernel/dma.c +++ b/tlvc/kernel/dma.c @@ -81,7 +81,7 @@ int get_dma_list(char *buf) int request_dma(unsigned char dma, void *device) { - unsigned char *device_id = (unsigned char *)device; + char *device_id = (char *)device; if (dma >= MAX_DMA_CHANNELS) return -EINVAL; diff --git a/tlvc/kernel/fork.c b/tlvc/kernel/fork.c index f7d35ab08..7a76af8d6 100644 --- a/tlvc/kernel/fork.c +++ b/tlvc/kernel/fork.c @@ -9,7 +9,7 @@ #include int task_slots_unused; -__task *next_task_slot; +struct task_struct *next_task_slot; pid_t last_pid = -1; static pid_t get_pid(void) @@ -37,11 +37,10 @@ static pid_t get_pid(void) struct task_struct *find_empty_process(void) { register struct task_struct *t; - register struct task_struct *currentp = current; if (task_slots_unused <= 1) { printk("Only %d task slots\n", task_slots_unused); - if (!task_slots_unused || currentp->uid) + if (!task_slots_unused || current->uid) return NULL; } t = next_task_slot; @@ -51,7 +50,7 @@ struct task_struct *find_empty_process(void) } next_task_slot = t; task_slots_unused--; - *t = *currentp; + *t = *current; t->state = TASK_UNINTERRUPTIBLE; t->pid = get_pid(); #ifdef CONFIG_CPU_USAGE @@ -76,32 +75,32 @@ pid_t do_fork(int virtual) register struct task_struct *t; int j; struct file *filp; - register __ptask currentp = current; if ((t = find_empty_process()) == NULL) return -EAGAIN; + debug_wait("FORK(%P): -> %d\n", t->pid); /* Fix up what's different */ /* * We do shared text. */ - seg_get(currentp->mm.seg_code); + seg_get(current->mm[SEG_CODE]); if (virtual) { - seg_get(currentp->mm.seg_data); + seg_get(current->mm[SEG_DATA]); } else { - t->mm.seg_data = seg_dup(currentp->mm.seg_data); + t->mm[SEG_DATA] = seg_dup(current->mm[SEG_DATA]); - if (t->mm.seg_data == 0) { - seg_put (currentp->mm.seg_code); + if (t->mm[SEG_DATA] == 0) { + seg_put(current->mm[SEG_CODE]); t->state = TASK_UNUSED; task_slots_unused++; next_task_slot = t; return -ENOMEM; } - t->t_regs.ds = t->t_regs.es = t->t_regs.ss = (t->mm.seg_data)->base; + t->t_regs.ds = t->t_regs.es = t->t_regs.ss = (t->mm[SEG_DATA])->base; } /* Increase the reference count to all open files */ @@ -119,8 +118,8 @@ pid_t do_fork(int virtual) t->exit_status = 0; - t->ppid = currentp->pid; - t->p_parent = currentp; + t->ppid = current->pid; + t->p_parent = current; /* * Build a return stack for t. @@ -145,7 +144,6 @@ pid_t sys_vfork(void) #if 1 return do_fork(0); #else - register __ptask currentp = current; int retval, sc[5]; if ((retval = do_fork(1)) >= 0) { @@ -158,16 +156,16 @@ pid_t sys_vfork(void) * first few bytes at the top of the user stack. Save those * bytes in the parent's kernel stack. */ - memcpy_fromfs(sc, (void *)currentp->t_regs.sp, sizeof(sc)); + memcpy_fromfs(sc, (void *)current->t_regs.sp, sizeof(sc)); /* * Let the child go on first. */ - sleep_on(¤tp->child_wait); + sleep_on(¤t->child_wait); /* * By now, the child should have its own user stack. Restore * the parent's user stack. */ - memcpy_tofs((void *)currentp->t_regs.sp, sc, sizeof(sc)); + memcpy_tofs((void *)current->t_regs.sp, sc, sizeof(sc)); } return retval; #endif diff --git a/tlvc/kernel/sched.c b/tlvc/kernel/sched.c index fbb518d8a..fffa40898 100644 --- a/tlvc/kernel/sched.c +++ b/tlvc/kernel/sched.c @@ -17,9 +17,9 @@ #define idle_task task[0] -__task *task; /* dynamically allocated task array */ -__ptask current; -__ptask previous; +struct task_struct *task; /* dynamically allocated task array */ +struct task_struct *current; +struct task_struct *previous; int max_tasks = MAX_TASKS; extern int intr_count; @@ -33,13 +33,13 @@ void add_to_runqueue(register struct task_struct *p) void del_from_runqueue(register struct task_struct *p) { -#if 0 /* sanity tests */ +#if CHECK_SCHED /* sanity tests */ if (!p->next_run || !p->prev_run) { - printk("task %d not on run-queue (state=%d)\n", p->pid, p->state); + printk("del_fr_runq: %d not found (%d)\n", p->pid, p->state); return; } if (p == &idle_task) { - //printk("idle task may not sleep\n"); + printk("idle task cannot sleep\n"); return; } #endif @@ -65,8 +65,8 @@ static void process_timeout(int __data) void schedule(void) { - register __ptask prev; - register __ptask next; + register struct task_struct *prev; + register struct task_struct *next; struct timer_list timer; jiff_t timeout = 0UL; @@ -76,7 +76,7 @@ void schedule(void) if (_gint_count > 1) { /* neither user nor idle task was running */ /* Taking a timer IRQ during another IRQ or while in kernel space is * quite legal. We just dont switch then */ - panic("schedule from interrupt\n"); + panic("schedule from int"); } #endif diff --git a/tlvc/kernel/signal.c b/tlvc/kernel/signal.c index d0ea438f8..c8778b139 100644 --- a/tlvc/kernel/signal.c +++ b/tlvc/kernel/signal.c @@ -1,5 +1,5 @@ /* - * linux/kernel/signal.c + * tlvc/kernel/signal.c * * Copyright (C) 1991, 1992 Linus Torvalds */ @@ -39,13 +39,12 @@ static void generate(sig_t sig, sigset_t msksig, register struct task_struct *p) int send_sig(sig_t sig, register struct task_struct *p, int priv) { - register __ptask currentp = current; sigset_t msksig; if (sig != SIGCHLD) debug_sig("SIGNAL send_sig %d pid %d\n", sig, p->pid); - if (!priv && ((sig != SIGCONT) || (currentp->session != p->session)) && - (currentp->euid ^ p->suid) && (currentp->euid ^ p->uid) && - (currentp->uid ^ p->suid) && (currentp->uid ^ p->uid) && !suser()) + if (!priv && ((sig != SIGCONT) || (current->session != p->session)) && + (current->euid ^ p->suid) && (current->euid ^ p->uid) && + (current->uid ^ p->suid) && (current->uid ^ p->uid) && !suser()) return -EPERM; msksig = (((sigset_t)1) << (sig - 1)); if (msksig & (SM_SIGKILL | SM_SIGCONT)) { @@ -105,7 +104,6 @@ void kill_all(sig_t sig) int sys_kill(pid_t pid, sig_t sig) { - register __ptask pcurrent = current; register struct task_struct *p; int count, err, retval; @@ -116,7 +114,7 @@ int sys_kill(pid_t pid, sig_t sig) count = retval = 0; if (pid == (pid_t)-1) { for_each_task(p) - if (p->pid > 1 && p != pcurrent && p->state < TASK_ZOMBIE) { + if (p->pid > 1 && p != current && p->state < TASK_ZOMBIE) { count++; if ((err = send_sig(sig, p, 0)) != -EPERM) retval = err; @@ -124,7 +122,7 @@ int sys_kill(pid_t pid, sig_t sig) return (count ? retval : -ESRCH); } if (pid < 1) - return kill_pg((!pid ? pcurrent->pgrp : -pid), sig, 0); + return kill_pg((!pid ? current->pgrp : -pid), sig, 0); return kill_process(pid, sig, 0); } @@ -139,13 +137,12 @@ int sys_signal(int signr, __kern_sighandler_t handler) else if (handler == KERN_SIG_IGN) current->sig.action[signr - 1].sa_dispose = SIGDISP_IGN; else { - if (_FP_SEG(handler) < current->mm.seg_code->base || - _FP_SEG(handler) >= current->mm.seg_code->base - + current->mm.seg_code->size) { - debug_sig("SIGNAL sys_signal supplied handler is bogus!\n"); - debug_sig("SIGNAL sys_signal cs not in [%x, %x)\n", - current->mm.seg_code->base, - current->mm.seg_code->base + current->mm.seg_code->size); + struct segment *s = current->mm[SEG_CODE]; + + if (_FP_SEG(handler) < s->base || _FP_SEG(handler) >= s->base + s->size) { + printk("SIGNAL sys_signal supplied handler is bad\n"); + debug_sig("SIGNAL sys_signal cs not in [%x, %x]\n", + s->base, s->base + s->size); return -EINVAL; } current->sig.handler = handler; diff --git a/tlvc/kernel/sleepwake.c b/tlvc/kernel/sleepwake.c index 2b589dbb9..8211a3c80 100644 --- a/tlvc/kernel/sleepwake.c +++ b/tlvc/kernel/sleepwake.c @@ -66,29 +66,27 @@ void finish_wait(struct wait_queue *p) void wait_set(struct wait_queue *p) { - register __ptask pcurrent = current; -#ifdef CHECK - if (pcurrent->waitpt) - panic("double wait"); +#ifdef CHECK_SCHED + if (current->waitpt) panic("double wait"); #endif - pcurrent->waitpt = p; + current->waitpt = p; } void wait_clear(struct wait_queue *p) { - register __ptask pcurrent = current; -#ifdef CHECK - if (pcurrent->waitpt != p) - panic("wrong waitpt"); +#ifdef CHECK_SCHED + if (current->waitpt != p) panic("wait clear"); #endif - pcurrent->waitpt = NULL; + current->waitpt = NULL; } static void __sleep_on(register struct wait_queue *p, int state) { - //if (current == &task[0]) panic("task[0] trying to sleep from %x", p); +#ifdef CHECK_SCHED + if (current == &task[0]) panic("idle task sleep_on %x", p); +#endif debug_sched("sleep: %d waitq %04x\n", current->pid, p); current->state = state; wait_set(p); diff --git a/tlvc/kernel/sys.c b/tlvc/kernel/sys.c index b9a5542cc..900ce8e81 100644 --- a/tlvc/kernel/sys.c +++ b/tlvc/kernel/sys.c @@ -17,12 +17,6 @@ #include #include -/* - * Indicates whether you can reboot with ctrl-alt-del: the default is yes - */ - -static int C_A_D = 1; - /* * Reboot system call: for obvious reasons only root may call it, and even * root needs to set up some magic numbers in the registers so that some @@ -38,47 +32,28 @@ int sys_reboot(unsigned int magic, unsigned int magic_too, int flag) if (!suser()) return -EPERM; - if (magic == 0x1D1E && magic_too == 0xC0DE) { - switch(flag) { - case 0x4567: - flag = 1; - /* fall through*/ - case 0: - C_A_D = flag; - return 0; - case 0x0123: /* reboot*/ - hard_reset_now(); - printk("Reboot failed\n"); - /* fall through*/ - case 0x6789: /* shutdown*/ - sys_kill(1, SIGKILL); - sys_kill(-1, SIGKILL); - printk("System halted\n"); - do_exit(0); - /* no return*/ - case 0xDEAD: /* poweroff*/ - apm_shutdown_now(); - printk("APM shutdown failed\n"); - } + switch(flag) { + case RB_REBOOT: + hard_reset_now(); + printk("Reboot failed\n"); + /* fall through */ + + case RB_SHUTDOWN: +shutdown: + sys_kill(1, SIGKILL); + sys_kill(-1, SIGKILL); + printk("System halted\n"); + do_exit(0); + /* no return*/ + + case RB_POWEROFF: + apm_shutdown_now(); + printk("Poweroff failed\n"); + goto shutdown; } - return -EINVAL; } -/* - * This function gets called by ctrl-alt-del - ie the keyboard interrupt. - * As it's called within an interrupt, it may NOT sync: the only choice - * is whether to reboot at once, or just ignore the ctrl-alt-del. - */ - -void ctrl_alt_del(void) -{ - if (C_A_D) - hard_reset_now(); - - kill_process(1, (sig_t) SIGINT, 1); -} - /* * This function returns the version number associated with this kernel. */ @@ -94,12 +69,11 @@ int sys_uname(struct utsname *utsname) int sys_setgid(gid_t gid) { - register __ptask currentp = current; if (suser()) - currentp->gid = currentp->egid = currentp->sgid = gid; - else if ((gid == currentp->gid) || (gid == currentp->sgid)) - currentp->egid = gid; + current->gid = current->egid = current->sgid = gid; + else if ((gid == current->gid) || (gid == current->sgid)) + current->egid = gid; else return -EPERM; return 0; @@ -129,11 +103,10 @@ pid_t sys_getpid(int *ppid) unsigned short int sys_umask(unsigned short int mask) { - register __ptask currentp = current; unsigned short int old; - old = currentp->fs.umask; - currentp->fs.umask = mask & ((unsigned short int) S_IRWXUGO); + old = current->fs.umask; + current->fs.umask = mask & ((unsigned short int) S_IRWXUGO); return old; } @@ -151,12 +124,11 @@ unsigned short int sys_umask(unsigned short int mask) int sys_setuid(uid_t uid) { - register __ptask currentp = current; if (suser()) - currentp->uid = currentp->euid = currentp->suid = uid; - else if ((uid == currentp->uid) || (uid == currentp->suid)) - currentp->euid = uid; + current->uid = current->euid = current->suid = uid; + else if ((uid == current->uid) || (uid == current->suid)) + current->euid = uid; else return -EPERM; return 0; @@ -277,15 +249,13 @@ int sys_getsid(pid_t pid) int sys_setsid(void) { - register __ptask currentp = current; - - if (currentp->session == currentp->pid) + if (current->session == current->pid) return -EPERM; - debug_tty("SETSID pgrp %d\n", currentp->pid); - currentp->session = currentp->pgrp = currentp->pid; - currentp->tty = NULL; + debug_tty("SETSID pgrp %d\n", current->pid); + current->session = current->pgrp = current->pid; + current->tty = NULL; - return currentp->pgrp; + return current->pgrp; } #ifdef CONFIG_SUPPLEMENTARY_GROUPS @@ -352,15 +322,15 @@ int sys_setgroups(int gidsetsize, gid_t * grouplist) int in_group_p(gid_t grp) { - register char *p = (char *) current; - - if (grp != ((__ptask) p)->egid) { - register gid_t *pg = ((__ptask) p)->groups - 1; + git_t *pg; + char *p; + if (grp != current->egid) { + pg = current->groups - 1; p = (char *)(pg + NGROUPS); do { - if ((++pg > ((gid_t *) p)) || (*pg == NOGROUP)) { + if ((++pg > ((gid_t *)p)) || (*pg == NOGROUP)) { return 0; } } while (*pg != grp); diff --git a/tlvc/kernel/time.c b/tlvc/kernel/time.c index 7212a1b99..c5d3d674e 100644 --- a/tlvc/kernel/time.c +++ b/tlvc/kernel/time.c @@ -46,7 +46,7 @@ static struct timezone xzone; /* timezone offset (in hours) from CONFIG_TIME_TZ or /bootopts TZ= string */ int tz_offset; -void tz_init(const char *tzstr) +void INITPROC tz_init(const char *tzstr) { if (strlen(tzstr) > 3) { tz_offset = atoi(tzstr+3); @@ -54,6 +54,11 @@ void tz_init(const char *tzstr) } } +time_t current_time(void) +{ + return (xtime.tv_sec + (jiffies - xtime_jiffies)/HZ); +} + /* set the time of day */ int sys_settimeofday(register struct timeval *tv, struct timezone *tz) { diff --git a/tlvc/lib/list.c b/tlvc/lib/list.c index 005d68857..066635aee 100644 --- a/tlvc/lib/list.c +++ b/tlvc/lib/list.c @@ -3,11 +3,11 @@ #include -void list_init (list_s * root) - { +void list_init (list_s *root) +{ root->prev = root; root->next = root; - } +} #define LIST_LINK \ prev->next = node; \ @@ -16,22 +16,22 @@ void list_init (list_s * root) node->next = next; \ /**/ -void list_insert_before (list_s * next, list_s * node) +void list_insert_before (list_s *next, list_s *node) { - list_s * prev = next->prev; + list_s *prev = next->prev; LIST_LINK } -void list_insert_after (list_s * prev, list_s * node) +void list_insert_after (list_s *prev, list_s *node) { - list_s * next = prev->next; + list_s *next = prev->next; LIST_LINK } -void list_remove (list_s * node) +void list_remove (list_s *node) { - list_s * prev = node->prev; - list_s * next = node->next; + list_s *prev = node->prev; + list_s *next = node->next; prev->next = next; next->prev = prev; } diff --git a/tlvccmd/disk_utils/df.c b/tlvccmd/disk_utils/df.c index 5f65d8fe5..11b5e10fe 100644 --- a/tlvccmd/disk_utils/df.c +++ b/tlvccmd/disk_utils/df.c @@ -11,17 +11,16 @@ * Ported to ELKS by Greg Haerr May 2020 */ +#define __LIBC__ /* get all typedefs */ #include -#include -#include #include #include #include #include -#include #include #include #include +#include #include #include #include diff --git a/tlvccmd/inet/telnetd/Makefile b/tlvccmd/inet/telnetd/Makefile index 79aa44ecc..066c0a083 100644 --- a/tlvccmd/inet/telnetd/Makefile +++ b/tlvccmd/inet/telnetd/Makefile @@ -6,7 +6,7 @@ include $(BASEDIR)/Makefile-rules ############################################################################### -SRCS = telnetd.c +SRCS = telnetd.c telnet.c OBJS = $(SRCS:.c=.o) LDFLAGS += -maout-heap=1024 -maout-stack=1024 diff --git a/tlvccmd/man/man1/meminfo.1 b/tlvccmd/man/man1/meminfo.1 index 4c49e15ed..ecb5ace50 100644 --- a/tlvccmd/man/man1/meminfo.1 +++ b/tlvccmd/man/man1/meminfo.1 @@ -4,41 +4,53 @@ meminfo \- list system memory usage .SH SYNOPSIS .B meminfo .RB [ \-a ] +.RB [ \-m ] .RB [ \-f ] .RB [ \-t ] .RB [ \-b ] +.RB [ \-s ] +.RB [ \-h ] .br .SS OPTIONS -Defaults to showing all memory. +Defaults to showing all memory (equivalent to -aftbs). .TP 5 .B -a -Show application memory +Show memory in use by applications +.TP 5 +.B -m +Show main memory sorted by segment .TP 5 .B -f Show free memory .TP 5 .B -t -Show tty memory +Show tty and driver memory .TP 5 .B -b -Show buffer memory +Show system buffer and pipe memory +.TP 5 +.B -s +Show system task, inode and file memory +.TP 5 +.B -h +Show help .SH DESCRIPTION .B meminfo traverses the kernel local heap and displays a line for each in-use or free entry. Since the local heap also manages the system memory outside of the kernel normally available for running application programs, the in-use or free segments of system memory outside the kernel -(sometimes called external or main memory) will also be displayed. +(sometimes called external or simply main memory) will also be displayed. .PP For every line, the local heap address, type and size are displayed. -For external memory, the external memory segment, type, size and access count +For main memory, the main memory segment, type, size and access count are also displayed. Each of these are detailed below. .PP At the bottom of the listing, the total size and free size of the kernel -local heap are displayed, along with the external (main) memory system total, +local heap are displayed, along with the main memory system total, used and free space in kilobytes (KB). .PP -By inspecting the external (main) memory entries, one can determine +By inspecting the main memory entries, one can determine how much contiguous memory is available for running additional programs, as well as the amount of memory used for kernel system buffers, and application program code and data segments. @@ -54,40 +66,52 @@ The type of memory allocated (or free). SIZE The size in bytes of the allocated or free local memory. .PP -For external/main memory (type SEG), the following additional items are displayed: +For main memory (type MEM), the following additional items are displayed: .TP 10 SEG -The segment address of the external/main memory. +The address of the main memory segment. .TP 10 -TYPE -What the external/main memory segment is used for (or free). +STYPE +What the main memory segment is used for (or free). .TP 10 -SIZE -The size in bytes of the allocated or free external/main memory segment. +SSIZE +The size in bytes of the allocated or free main memory segment. .TP 10 CNT The access count (0 is free, >1 is shared). .SH "LOCAL HEAP TYPES" Local memory allocation types can be one of the following: .TP 10 -SEG -External (main) memory segment. +MEM +Main memory segment. .TP 10 TTY TTY input or output buffer. .TP 10 -INT -Interrupt handler trampoline. +NETB +Network buffers and buffer headers. +.TP 10 +DRVR +Direct Floppy or other driver buffers. .TP 10 BUFH -System buffer headers. The buffer data contents may be in extended (main) or XMS memory. +System buffer headers. The buffer data contents may be in main or XMS memory. .TP 10 PIPE -Pipe buffer. +Open pipe buffer. +.TP 10 +TASK +Kernel per process data structure. +.TP 10 +INOD +System inodes. +.TP 10 +FILE +System open files. .TP 10 free Unallocated memory in the local heap. -.SH "EXTERNAL (MAIN) MEMORY TYPES" +.SH "MAIN MEMORY TYPES" Main memory allocation types can be one of the following: .TP 10 CSEG @@ -97,7 +121,7 @@ DSEG Running application data segment. .TP 10 BUF -System buffer data, 1024 bytes per buffer. +Block subsystem buffer data, 1024 bytes per buffer. .TP 10 RDSK Ramdisk data. diff --git a/tlvccmd/man/man5/dir.5 b/tlvccmd/man/man5/dir.5 index 07199f18f..98d4da659 100644 --- a/tlvccmd/man/man5/dir.5 +++ b/tlvccmd/man/man5/dir.5 @@ -13,7 +13,7 @@ following structure defined in : .ta +5n +15n +15n #define MAXNAMLEN 26 /* 14 for MINIX, 26 for FAT */ struct dirent { - u_ino_t d_ino; /* I-node number */ + ino_t d_ino; /* I-node number */ unsigned short d_namlen; char d_name[MAXNAMLEN+1]; /* File name */ }; diff --git a/tlvccmd/misc_utils/fdtest.c b/tlvccmd/misc_utils/fdtest.c index 5eb945275..adbcc18de 100644 --- a/tlvccmd/misc_utils/fdtest.c +++ b/tlvccmd/misc_utils/fdtest.c @@ -1,5 +1,7 @@ /* * fdtest - A program to test floppy disk I/O speed in user space + * Originally by @ghaerr - for ELKS, + * rewritten and expanded byt @mellvik for TLVC 2024 */ #include #include diff --git a/tlvccmd/sys_utils/ps.c b/tlvccmd/sys_utils/ps.c index 2a0d9f93b..5a01b2ea2 100644 --- a/tlvccmd/sys_utils/ps.c +++ b/tlvccmd/sys_utils/ps.c @@ -276,12 +276,12 @@ int main(int argc, char **argv) } #endif /* CSEG*/ - cseg = (word_t)task_table.mm.seg_code; + cseg = (word_t)task_table.mm[SEG_CODE]; if (f_listall) printf(" %4x ", cseg? getword(fd, (word_t)cseg+offsetof(struct segment, base), ds): 0); /* DSEG*/ - dseg = (word_t)task_table.mm.seg_data; + dseg = (word_t)task_table.mm[SEG_DATA]; if (f_listall) printf("%4x", dseg? getword(fd, (word_t)dseg+offsetof(struct segment, base), ds): 0); From e5fe76fe44e26f3e41f6c3a5faaab151e79c7ac6 Mon Sep 17 00:00:00 2001 From: mellvik Date: Fri, 22 Nov 2024 14:41:55 +0100 Subject: [PATCH 2/2] [bootopts] add 1k size enhancement for bootopts --- tlvc/include/linuxmt/config.h | 16 ++---- tlvc/init/main.c | 98 ++++++++++++++++++++------------ tlvc/kernel/exit.c | 10 ++-- tlvccmd/rootfs_template/bootopts | 27 +++++---- 4 files changed, 87 insertions(+), 64 deletions(-) diff --git a/tlvc/include/linuxmt/config.h b/tlvc/include/linuxmt/config.h index 1d72ad8cd..e161b8f59 100644 --- a/tlvc/include/linuxmt/config.h +++ b/tlvc/include/linuxmt/config.h @@ -120,17 +120,16 @@ #endif /* Define segment locations of low memory, must not overlap */ -#define DEF_OPTSEG 0x50 /* 0x200 bytes boot options*/ -#define OPTSEGSZ 0x200 /* max size of /bootopts file (1K max) */ -#define REL_INITSEG 0x70 /* 0x200 bytes setup data */ -#define DMASEG 0x90 /* Start of variable sized DMA/bounce segment */ +#define OPTSEGSZ 0x400 /* max size of /bootopts file (1024 bytes max) */ +#define DEF_OPTSEG 0x50 /* 0x400 bytes boot options*/ +#define REL_INITSEG 0x90 /* 0x200 bytes setup data */ +#define DMASEG 0xB0 /* Start of variable sized DMA/bounce segment */ /* DMASEG is a bouncing buffer of 1K (= BLOCKSIZE) * below the first 64K boundary (= 0x1000:0) * for use with the old 8237 DMA controller. * Also used for floppy sector cache if configured. */ -#if !defined (CONFIG_BLK_DEV_BFD) /* BIOS floppy doesn't work with this setup */ #define XD_BOUNCE_SEG DMASEG /* bounce buffer for XD and Lance drivers */ #if defined(CONFIG_BLK_DEV_XD) || defined(CONFIG_ETH_LANCE) #define XD_BOUNCE_SEGSZ 0x400 @@ -146,14 +145,9 @@ #define FD_CACHE_SEGSZ (CONFIG_FLOPPY_CACHE*1024) /* May be zero */ #define REL_SYSSEG FD_CACHE_SEG + (FD_CACHE_SEGSZ>>4) /* kernel code segment */ -#else -#define DMASEGSZ 0x2400 /* classic 18 sector track buffer for BIOS FD for now */ -#define REL_SYSSEG DMASEG + (DMASEGSZ>>4) -#endif /* CONFIG_BLK_DEV_BFD */ - #define SETUP_DATA REL_INITSEG -#endif +#endif /* ARCH_PC, ARCH_8016X, !ROM */ #if defined(CONFIG_ARCH_PC98) && !defined(CONFIG_ROMCODE) /* Define segment locations of low memory, must not overlap */ diff --git a/tlvc/init/main.c b/tlvc/init/main.c index a791b6c66..671fd9a6b 100644 --- a/tlvc/init/main.c +++ b/tlvc/init/main.c @@ -45,6 +45,7 @@ int root_mountflags = MS_RDONLY; #else int root_mountflags = 0; #endif + struct netif_parms netif_parms[MAX_ETHS] = { /* NOTE: The order must match the defines in netstat.h */ { NE2K_IRQ, NE2K_PORT, 0, NE2K_FLAGS }, @@ -53,16 +54,18 @@ struct netif_parms netif_parms[MAX_ETHS] = { { EE16_IRQ, EE16_PORT, EE16_RAM, EE16_FLAGS }, { LANCE_IRQ, LANCE_PORT, 0, LANCE_FLAGS }, }; -__u16 kernel_cs, kernel_ds; +seg_t kernel_cs, kernel_ds; int tracing; -int nr_map_bufs; -int nr_ext_bufs; +int nr_map_bufs, nr_ext_bufs, nr_xms_bufs; #ifdef CONFIG_CALIBRATE_DELAY void calibrate_delay(void); #endif -#define BOOT_TIMER +#define BOOT_TIMER /* display jiffies at system startup - for benchmarking */ + +/* this needs fixing, hdparms[] should be the size of MAX_ATA_DRIVES */ +/* directhd.c depends on this size when initializing drive geometry */ #define CHS_DRIVES 2 /* # of drives to config in bootopts */ #define CHS_ARR_SIZE CHS_DRIVES * 4 int hdparms[CHS_ARR_SIZE]; /* cover 2 drives */ @@ -72,7 +75,6 @@ int xt_floppy[2]; /* XT floppy types, needed if XT has 720k drive(s) */ int xtideparms[6]; /* config data for xtide controller if present */ int fdcache = -1; /* floppy sector cache size(KB), -1: not configured */ static int boot_console; -static seg_t membase, memend; static char bininit[] = "/bin/init"; static char binshell[] = "/bin/sh"; #ifdef CONFIG_SYS_NO_BININIT @@ -85,7 +87,7 @@ static char *init_command = bininit; /* * Parse /bootopts startup options */ -static char opts; +static char hasopts; static int args = 2; /* room for argc and av[0] */ static int envs; static int argv_slen; @@ -109,17 +111,21 @@ static char * INITPROC option(char *s); #endif -static void init_task(void); +static void INITPROC kernel_init(void); static void INITPROC kernel_banner(seg_t start, seg_t end, seg_t init, seg_t extra); static void INITPROC early_kernel_init(void); +static void init_task(void); /* this procedure is called using temp stack then switched, no local vars allowed */ void start_kernel(void) { + //printk("START\n"); early_kernel_init(); /* read bootopts using kernel interrupt stack */ task = heap_alloc(max_tasks * sizeof(struct task_struct), HEAP_TAG_TASK|HEAP_TAG_CLEAR); if (!task) panic("No task mem"); + + sched_init(); /* set us (the current stack) to be idle task #0*/ setsp(&task->t_regs.ax); /* change to idle task stack */ kernel_init(); /* continue init running on idle task stack */ @@ -143,36 +149,44 @@ void start_kernel(void) static void INITPROC early_kernel_init(void) { - setup_arch(&membase, &memend); /* initializes kernel heap */ - mm_init(membase, memend); /* parse_options may call seg_add */ + unsigned int endbss; + + /* Note: no memory allocation available until after heap_init */ tty_init(); /* parse_options may call rs_setbaud */ +#ifdef CONFIG_TIME_TZ + tz_init(CONFIG_TIME_TZ); /* parse_options may call tz_init */ +#endif + ROOT_DEV = SETUP_ROOT_DEV; /* default root device from boot loader */ + +#ifdef CONFIG_BOOTOPTS + hasopts = parse_options(); /* parse options found in /bootops */ +#endif + + /* create near heap at end of kernel bss */ + heap_init(); /* init near memory allocator */ + endbss = setup_arch(); /* sets membase and memend globals */ + heap_add((void *)endbss, heapsize); + mm_init(membase, memend); /* init far/main memory allocator */ + +/* Add UMB support here */ -/*** Expermiental: Testing the upper 1k of memory for BIOS modifications ****/ +/*** Experimental: Test the upper 1k of memory for BIOS modifications ****/ #if 0 byte_t __far *upper = _MK_FP(0x9fc0, 0); int i = 0; while (i++ < 1024) upper[i] = i; #endif + printk("Early init ok\n"); -#ifdef CONFIG_TIME_TZ - tz_init(CONFIG_TIME_TZ); /* parse_options may call tz_init */ -#endif -#ifdef CONFIG_BOOTOPTS - opts = parse_options(); /* parse options found in /bootops */ -#endif } void INITPROC kernel_init(void) { - /* set us (the current stack) to be idle task #0 */ - sched_init(); - irq_init(); + irq_init(); /* Install timer and DIV fault handlers */ /* set console from /bootopts console= or 0=default */ set_console(boot_console); - - /* init direct, bios or headless console */ - console_init(); + console_init(); /* init direct, bios or headless console */ #ifdef CONFIG_CHAR_DEV_RS serial_init(); @@ -182,17 +196,21 @@ void INITPROC kernel_init(void) if (buffer_init()) /* also enables xms and unreal mode if configured and possible */ panic("No buf mem"); - device_init(); +#ifdef CONFIG_ARCH_IBMPC + outw(0, 0x510); + if (inb(0x511) == 'Q' && inb(0x511) == 'E') + running_qemu = 1; +#endif #ifdef CONFIG_SOCKET sock_init(); #endif - fs_init(); + device_init(); #ifdef CONFIG_BOOTOPTS finalize_options(); - if (!opts) printk("/bootopts not found or bad format/size\n"); + if (!hasopts) printk("/bootopts not found or bad format/size\n"); #endif #ifdef CONFIG_FARTEXT_KERNEL @@ -215,8 +233,8 @@ void INITPROC kernel_init(void) static void INITPROC kernel_banner(seg_t start, seg_t end, seg_t init, seg_t extra) { #ifdef CONFIG_ARCH_IBMPC - printk("PC/%cT class machine (cpu %d), ", (sys_caps & CAP_PC_AT) ? 'A' : 'X', - SETUP_CPU_TYPE); + printk("PC/%cT class, cpu %d, ", (sys_caps & CAP_PC_AT) ? 'A' : 'X', + (int) arch_cpu); #endif #ifdef CONFIG_ARCH_PC98 @@ -259,13 +277,13 @@ static void INITPROC do_init_task(void) printk("[%lu]", jiffies); /* for measuring startup time */ #endif #ifdef CONFIG_SYS_NO_BININIT - /* when no /bin/init, force initial process group on console to make signals work*/ + /* when no /bin/init, force initial process group on console to make signals work */ current->session = current->pgrp = 1; #endif - /* Don't open /dev/console for /bin/init, 0-2 closed immediately and fragments heap*/ + /* Don't open /dev/console for /bin/init, 0-2 closed immediately and fragments heap */ //if (strcmp(init_command, bininit) != 0) { - /* Set stdin/stdout/stderr to /dev/console if not running /bin/init*/ + /* Set stdin/stdout/stderr to /dev/console if not running /bin/init */ num = sys_open(s="/dev/console", O_RDWR, 0); if (num < 0) printk("Unable to open %s (error %d)\n", s, num); @@ -274,20 +292,24 @@ static void INITPROC do_init_task(void) //} #ifdef CONFIG_BOOTOPTS + /* Release /bootopts parsing buffers and the setup data segmnet */ + heap_add(options, OPTSEGSZ); + seg_add(DEF_OPTSEG, DMASEG); /* DEF_OPTSETG through REL_INITSEG */ + /* pass argc/argv/env array to init_command */ - /* unset special sys_wait4() processing if pid 1 not /bin/init*/ + /* unset special sys_wait4() processing if pid 1 not /bin/init */ if (strcmp(init_command, bininit) != 0) - current->ppid = 1; /* turns off auto-child reaping*/ + current->ppid = 1; /* turns off auto-child reaping */ - /* run /bin/init or init= command, normally no return*/ + /* run /bin/init or init= command, normally no return */ run_init_process_sptr(init_command, (char *)argv_init, argv_slen); #else try_exec_process(init_command); #endif /* CONFIG_BOOTOPTS */ printk("No init - running %s\n", binshell); - current->ppid = 1; /* turns off auto-child reaping*/ + current->ppid = 1; /* turns off auto-child reaping */ try_exec_process(binshell); try_exec_process("/bin/sash"); panic("No init or sh found"); @@ -455,8 +477,8 @@ static int INITPROC parse_options(void) fmemcpyb(options, kernel_ds, 0, DEF_OPTSEG, sizeof(options)); #pragma GCC diagnostic ignored "-Wstrict-aliasing" - /* check file starts with ## and max len 511 bytes */ - if (*(unsigned short *)options != 0x2323 || options[OPTSEGSZ-1]) + /* check file starts with ##, one or two sectors, max 1023 bytes */ + if (*(unsigned short *)options != 0x2323 || (options[511] && options[OPTSEGSZ-1])) return 0; #if DEBUG @@ -549,6 +571,10 @@ static int INITPROC parse_options(void) nr_map_bufs = (int)simple_strtol(line+6, 10); continue; } + if (!strncmp(line,"xmsbufs=", 8)) { + nr_xms_bufs = (int)simple_strtol(line+8, 10); + continue; + } if (!strncmp(line,"tasks=", 6)) { max_tasks = (int)simple_strtol(line+6, 10); continue; diff --git a/tlvc/kernel/exit.c b/tlvc/kernel/exit.c index 1a36399f7..76216f06d 100644 --- a/tlvc/kernel/exit.c +++ b/tlvc/kernel/exit.c @@ -104,11 +104,11 @@ void do_exit(int status) /* Let go of the process */ current->state = TASK_EXITING; - if (current->mm.seg_code) - seg_put(current->mm.seg_code); - if (current->mm.seg_data) - seg_put(current->mm.seg_data); - current->mm.seg_code = current->mm.seg_data = 0; + if (current->mm[SEG_CODE]) + seg_put(current->mm[SEG_CODE]); + if (current->mm[SEG_DATA]) + seg_put(current->mm[SEG_DATA]); + current->mm[SEG_CODE] = current->mm[SEG_DATA] = 0; /* free program allocated memory */ seg_free_pid(current->pid); diff --git a/tlvccmd/rootfs_template/bootopts b/tlvccmd/rootfs_template/bootopts index 7c92812ff..47fc8b31c 100644 --- a/tlvccmd/rootfs_template/bootopts +++ b/tlvccmd/rootfs_template/bootopts @@ -1,23 +1,26 @@ -## boot options max 511 bytes -console=ttyS0,57600 debug net=ne0 3 # sercons, multiuser, net +## boot options max 1023 bytes, see wiki for details +console=ttyS0,57600 3 # serial console and init-level (3) +debug=0 +net=ne0 # start netw on boot w/this interface #root=df0 -#QEMU=1 # to use ftp/ftpd in qemu #TZ=MDT7 LOCALIP=10.0.2.15 +GATEWAY=10.0.2.1 HOSTNAME=tlvc15 ne0=12,0x300,,0x80 wd0=2,0x280,0xCC00,0x80 #3c0=11,0x330,,0x80 ee0=11,0x360,,0x80 -comirq=,,7,10 -cache=10 # L1 cache -bufs=24 # L2 -hdparms=306,4,17,128,614,4,17,-1 -netbufs=2,0 -tasks=17 +comirq=,,7,10 # IRQ for com ports, up to 4 +cache=6 # L1 cache +bufs=40 # L2 buffers +xmsbufs=200 # if supported +hdparms=306,4,17,128,614,4,17,-1 # CHSW values for 2 drives, overrides CMOS and drive values +netbufs=2,0 # netw buffers, recv/trans, ne2k only +tasks=12 # max tasks, default 16, max 20 sync=30 # autosync secs -xtflpy=3,1 -fdcache=4 -#xtide=0x300,, +xtflpy=3,1 # meaningful for XT systems w/720k drive(s) (type3) +fdcache=8 # floppy sector cache, for slow systems <= 286 +#xtide=0x300,,,,, # Set addr, IRQ, flgs for 2 XT-IDE drives #init=/bin/init 3 n # multiuser serial no /etc/rc.sys #init=/bin/sh # singleuser shell