From 1dbf8a06d44a128bbf7f1eb4b0680c43f7ea90bd Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 11 Nov 2014 23:30:02 +0000 Subject: [PATCH] banking: lay the groundwork Unfortunately the current m6809 gcc build banking support is broken and doesn't remember to add the bank names with the .db for the bank so it fails to assemble. Uglies: - We put all syscalls in the same bank to avoid having to have a 'far' pointer form for the syscall table - We don't do this for devices, so will need to rig up some far pointer hackery for this --- Kernel/Makefile | 27 ++- Kernel/cpu-6502/cpu.h | 7 + Kernel/cpu-6809/cpu.h | 15 ++ Kernel/cpu-z80/cpu.h | 7 + Kernel/devio.c | 4 + Kernel/include/kernel.h | 409 ++++++++++++++++---------------- Kernel/include/tty.h | 66 +++--- Kernel/platform-dragon/Makefile | 2 +- Kernel/platform-dragon/config.h | 2 + 9 files changed, 287 insertions(+), 252 deletions(-) diff --git a/Kernel/Makefile b/Kernel/Makefile index bd9d58c1..d59669f3 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -1,6 +1,6 @@ TARGET_LIST = platform-nc100 platform-micropack platform-pcw8256 platform-socz80 platform-zx128 platform-trs80 platform-z80pack platform-z80pack-lite platform-dragon -#export TARGET= msx1 +#export TARGET= zx128 #export CPU = z80 export TARGET = dragon export CPU = 6809 @@ -46,9 +46,10 @@ export CROSS_LD=lwlink export CROSS_CC = m6809-unknown-gcc #export CROSS_CCOPTS=-Wall -O2 -I$(ROOT_DIR)/cpu-6809 -I$(ROOT_DIR)/platform-$(TARGET) -I$(ROOT_DIR)/include export CROSS_CCOPTS=-c -Wall -O2 -msoft-reg-count=4 -I$(ROOT_DIR)/cpu-6809 -I$(ROOT_DIR)/platform-$(TARGET) -I$(ROOT_DIR)/include -export CROSS_CC_SEG2=-mcode-section=.text2 -export CROSS_CC_SEGDISC=-mcode-section=.discard -export CROSS_CC_VIDEO=-mcode-section=.video -mdata-section=.video +export CROSS_CC_SEG1=-mcode-section=.text -mfar-code-page=1 +export CROSS_CC_SEG2=-mcode-section=.text2 -mfar-code-page=2 +export CROSS_CC_SEGDISC=-mcode-section=.discard -mfar-code-page=3 +export CROSS_CC_VIDEO=-mcode-section=.video -mdata-section=.video -mfar-code-page=4 export ASOPTS= export BINEXT = .o endif @@ -73,13 +74,15 @@ ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) # CDSRCS = start.c -C1SRCS = version.c kdata.c filesys.c -C1SRCS += inode.c syscall_fs.c process.c usermem.c timer.c -C2SRCS = devio.c syscall_proc.c -C2SRCS += syscall_fs2.c syscall_other.c syscall_exec.c -C2SRCS += bank16k.c bank32k.c bankfixed.c single.c simple.c -C2SRCS += tty.c devsys.c -C2SRCS += mm.c swap.c +C1SRCS = version.c filesys.c devio.c kdata.c +C1SRCS += inode.c tty.c +# +# Keep all of the syscalls in C2SRCS +# +C2SRCS = syscall_proc.c syscall_fs.c +C2SRCS += syscall_fs2.c syscall_other.c syscall_exec.c process.c +C2SRCS += simple.c single.c bank16k.c bank32k.c bankfixed.c +C2SRCS += devsys.c mm.c swap.c usermem.c timer.c CVIDEOSRCS = vt.c CFONTSRCS = font4x6.c font8x8.c @@ -113,7 +116,7 @@ target: $(MAKE) -C platform-$(TARGET) $(C1OBJS): %$(BINEXT): %.c - $(CROSS_CC) $(CROSS_CCOPTS) $< + $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG1) $< $(CDOBJS): %$(BINEXT): %.c $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEGDISC) $< diff --git a/Kernel/cpu-6502/cpu.h b/Kernel/cpu-6502/cpu.h index f19a19d2..208cb2af 100644 --- a/Kernel/cpu-6502/cpu.h +++ b/Kernel/cpu-6502/cpu.h @@ -24,3 +24,10 @@ extern size_t strlen(const char *); /* FIXME: need to add 64bit helper/struct magic for this compiler */ typedef unsigned long time_t; + +/* We don't yet have bank attributes and banking for Z80 */ +#define CODE1 +#define CODE2 +#define COMMON +#define VIDEO +#define DISCARD diff --git a/Kernel/cpu-6809/cpu.h b/Kernel/cpu-6809/cpu.h index 4953cd0b..96f2eb3b 100644 --- a/Kernel/cpu-6809/cpu.h +++ b/Kernel/cpu-6809/cpu.h @@ -27,3 +27,18 @@ extern size_t strlen(const char *); /* FIXME: should be 64bits - need to add helpers and struct variants */ typedef unsigned long long time_t; + +#ifdef CONFIG_BANKED +#define CODE1 __attribute__((far(1))) +#define CODE2 __attribute__((far(2))) +#define COMMON +#define DISCARD __attribute__((far(3))) +#define VIDEO __attribute__((far(4))) +#else +/* Bank attributes for 6809 in banked code mode */ +#define CODE1 +#define CODE2 +#define COMMON +#define VIDEO +#define DISCARD +#endif diff --git a/Kernel/cpu-z80/cpu.h b/Kernel/cpu-z80/cpu.h index 993150dc..26697f90 100644 --- a/Kernel/cpu-z80/cpu.h +++ b/Kernel/cpu-z80/cpu.h @@ -30,4 +30,11 @@ extern int16_t strlen(const char *p); typedef unsigned long long time_t; +/* We don't yet have bank attributes and banking for Z80 */ +#define CODE1 +#define CODE2 +#define COMMON +#define VIDEO +#define DISCARD + #endif diff --git a/Kernel/devio.c b/Kernel/devio.c index c898f252..ae58ab8d 100644 --- a/Kernel/devio.c +++ b/Kernel/devio.c @@ -208,6 +208,10 @@ udata.u_base should be consulted instead. Any device other than a disk will have only raw access. **********************************************************************/ +/* FIXME: To do banking without true 'far' pointers we need to figure + out some scheme to do a bank call here - do we need a dev_tab bank + entry perhaps ? */ + int bdread(bufptr bp) { uint16_t dev = bp->bf_dev; diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index 79ed3c24..f741d2cd 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -522,152 +522,149 @@ struct selmap { /* functions in common memory */ -/* switches to a temporary stack in common memory */ -void tempstack(void); - /* debug functions */ -void trap_monitor(void); -void idump(void); +COMMON void trap_monitor(void); +CODE1 void idump(void); /* start.c */ -/* kdata.c */ -bool validdev(uint16_t dev); +/* platform/device.c */ +CODE1 bool validdev(uint16_t dev); /* usermem.c */ -usize_t valaddr(const char *base, usize_t size); -int uget(const void *userspace_source, void *dest, usize_t count); -int16_t ugetc(const void *userspace_source); -uint16_t ugetw(const void *userspace_source); -int ugets(const void *userspace_source, void *dest, usize_t maxlen); -int uput (const void *source, void *userspace_dest, usize_t count); -int uputc(uint16_t value, void *userspace_dest); /* u16_t so we don't get wacky 8bit stack games */ -int uputw(uint16_t value, void *userspace_dest); -int uzero(void *userspace_dest, usize_t count); +CODE2 usize_t valaddr(const char *base, usize_t size); +CODE2 int uget(const void *userspace_source, void *dest, usize_t count); +CODE2 int16_t ugetc(const void *userspace_source); +CODE2 uint16_t ugetw(const void *userspace_source); +CODE2 int ugets(const void *userspace_source, void *dest, usize_t maxlen); +CODE2 int uput (const void *source, void *userspace_dest, usize_t count); +CODE2 int uputc(uint16_t value, void *userspace_dest); /* u16_t so we don't get wacky 8bit stack games */ +CODE2 int uputw(uint16_t value, void *userspace_dest); +CODE2 int uzero(void *userspace_dest, usize_t count); /* usermem.c or usermem_std.s */ -usize_t _uget(const uint8_t *user, uint8_t *dst, usize_t count); -int16_t _ugetc(const uint8_t *user); -uint16_t _ugetw(const uint16_t *user); -int _ugets(const uint8_t *user, uint8_t *dest, usize_t maxlen); -int _uput(const uint8_t *source, uint8_t *user, usize_t count); -int _uputc(uint16_t value, uint8_t *user); -int _uputw(uint16_t value, uint16_t *user); -int _uzero(uint8_t *user, usize_t count); - -/* tricks.s */ -void switchout(void); -void doexec(void *start_addr); -void switchin(ptptr process); -int16_t dofork(ptptr child); +COMMON usize_t _uget(const uint8_t *user, uint8_t *dst, usize_t count); +COMMON int16_t _ugetc(const uint8_t *user); +COMMON uint16_t _ugetw(const uint16_t *user); +COMMON int _ugets(const uint8_t *user, uint8_t *dest, usize_t maxlen); +COMMON int _uput(const uint8_t *source, uint8_t *user, usize_t count); +COMMON int _uputc(uint16_t value, uint8_t *user); +COMMON int _uputw(uint16_t value, uint16_t *user); +COMMON int _uzero(uint8_t *user, usize_t count); + +/* platform/tricks.s */ +COMMON void switchout(void); +COMMON void doexec(void *start_addr); +COMMON void switchin(ptptr process); +COMMON int16_t dofork(ptptr child); /* devio.c */ -uint8_t *bread (uint16_t dev, blkno_t blk, bool rewrite); -void brelse(void *bp); -void bawrite(void *bp); -int bfree(bufptr bp, uint8_t dirty); /* dirty: 0=clean, 1=dirty (write back), 2=dirty+immediate write */ -void *tmpbuf(void); -void *zerobuf(void); -void bufsync(void); -bufptr bfind(uint16_t dev, blkno_t blk); -bufptr freebuf(void); -void bufinit(void); -void bufdiscard(bufptr bp); -void bufdump (void); -int bdread(bufptr bp); -int bdwrite(bufptr bp); -int cdread(uint16_t dev, uint8_t flag); -int d_open(uint16_t dev, uint8_t flag); -int d_close(uint16_t dev); -int d_ioctl(uint16_t dev, uint16_t request, char *data); -int cdwrite(uint16_t dev, uint8_t flag); -bool insq(struct s_queue *q, char c); -bool remq(struct s_queue *q, char *cp); -void clrq(struct s_queue *q); -bool uninsq(struct s_queue *q, char *cp); -int psleep_flags(void *event, unsigned char flags); -int nxio_open(uint8_t minor, uint16_t flag); -int no_open(uint8_t minor, uint16_t flag); -int no_close(uint8_t minor); -int no_rdwr(uint8_t minir, uint8_t rawflag, uint8_t flag); -int no_ioctl(uint8_t minor, uint16_t a, char *b); +CODE1 uint8_t *bread (uint16_t dev, blkno_t blk, bool rewrite); +CODE1 void brelse(void *bp); +CODE1 void bawrite(void *bp); +CODE1 int bfree(bufptr bp, uint8_t dirty); /* dirty: 0=clean, 1=dirty (write back), 2=dirty+immediate write */ +CODE1 void *tmpbuf(void); +CODE1 void *zerobuf(void); +CODE1 void bufsync(void); +CODE1 bufptr bfind(uint16_t dev, blkno_t blk); +CODE1 bufptr freebuf(void); +CODE1 void bufinit(void); +CODE1 void bufdiscard(bufptr bp); +CODE1 void bufdump (void); +CODE1 int bdread(bufptr bp); +CODE1 int bdwrite(bufptr bp); +CODE1 int cdread(uint16_t dev, uint8_t flag); +CODE1 int d_open(uint16_t dev, uint8_t flag); +CODE1 int d_close(uint16_t dev); +CODE1 int d_ioctl(uint16_t dev, uint16_t request, char *data); +CODE1 int cdwrite(uint16_t dev, uint8_t flag); +CODE1 bool insq(struct s_queue *q, char c); +CODE1 bool remq(struct s_queue *q, char *cp); +CODE1 void clrq(struct s_queue *q); +CODE1 bool uninsq(struct s_queue *q, char *cp); +CODE1 int psleep_flags(void *event, unsigned char flags); +CODE1 int nxio_open(uint8_t minor, uint16_t flag); +CODE1 int no_open(uint8_t minor, uint16_t flag); +CODE1 int no_close(uint8_t minor); +CODE1 int no_rdwr(uint8_t minir, uint8_t rawflag, uint8_t flag); +CODE1 int no_ioctl(uint8_t minor, uint16_t a, char *b); /* filesys.c */ /* open file, "name" in user address space */ -inoptr n_open(char *uname, inoptr *parent); +CODE1 inoptr n_open(char *uname, inoptr *parent); /* open file, "name" in kernel address space */ -inoptr kn_open(char *uname, inoptr *parent); -inoptr i_open(uint16_t dev, uint16_t ino); -inoptr srch_dir(inoptr wd, char *compname); -inoptr srch_mt(inoptr ino); -bool ch_link(inoptr wd, char *oldname, char *newname, inoptr nindex); -void filename(char *userspace_upath, char *name); +CODE1 inoptr kn_open(char *uname, inoptr *parent); +CODE1 inoptr i_open(uint16_t dev, uint16_t ino); +CODE1 inoptr srch_dir(inoptr wd, char *compname); +CODE1 inoptr srch_mt(inoptr ino); +CODE1 bool ch_link(inoptr wd, char *oldname, char *newname, inoptr nindex); +CODE1 void filename(char *userspace_upath, char *name); /* return true if n1 == n2 */ -bool namecomp(char *n1, char *n2); -inoptr newfile(inoptr pino, char *name); -fsptr getdev(uint16_t dev); -bool baddev(fsptr dev); -uint16_t i_alloc(uint16_t devno); -void i_free(uint16_t devno, uint16_t ino); -blkno_t blk_alloc(uint16_t devno); -void blk_free(uint16_t devno, blkno_t blk); -int8_t oft_alloc(void); -void oft_deref(int8_t of); +CODE1 bool namecomp(char *n1, char *n2); +CODE1 inoptr newfile(inoptr pino, char *name); +CODE1 fsptr getdev(uint16_t dev); +CODE1 bool baddev(fsptr dev); +CODE1 uint16_t i_alloc(uint16_t devno); +CODE1 void i_free(uint16_t devno, uint16_t ino); +CODE1 blkno_t blk_alloc(uint16_t devno); +CODE1 void blk_free(uint16_t devno, blkno_t blk); +CODE1 int8_t oft_alloc(void); +CODE1 void oft_deref(int8_t of); /* returns index of slot, or -1 on failure */ -int8_t uf_alloc(void); +CODE1 int8_t uf_alloc(void); /* returns index of slot, or -1 on failure */ -int8_t uf_alloc_n(int n); -void i_ref(inoptr ino); -void i_deref(inoptr ino); -void wr_inode(inoptr ino); -bool isdevice(inoptr ino); -void f_trunc(inoptr ino); -void freeblk(uint16_t dev, blkno_t blk, uint8_t level); -blkno_t bmap(inoptr ip, blkno_t bn, int rwflg); -void validblk(uint16_t dev, blkno_t num); -inoptr getinode(uint8_t uindex); -bool super(void); -bool esuper(void); -uint8_t getperm(inoptr ino); -void setftime(inoptr ino, uint8_t flag); -uint16_t getmode(inoptr ino); -struct mount *fs_tab_get(uint16_t dev); +CODE1 int8_t uf_alloc_n(int n); +CODE1 void i_ref(inoptr ino); +CODE1 void i_deref(inoptr ino); +CODE1 void wr_inode(inoptr ino); +CODE1 bool isdevice(inoptr ino); +CODE1 void f_trunc(inoptr ino); +CODE1 void freeblk(uint16_t dev, blkno_t blk, uint8_t level); +CODE1 blkno_t bmap(inoptr ip, blkno_t bn, int rwflg); +CODE1 void validblk(uint16_t dev, blkno_t num); +CODE1 inoptr getinode(uint8_t uindex); +CODE1 bool super(void); +CODE1 bool esuper(void); +CODE1 uint8_t getperm(inoptr ino); +CODE1 void setftime(inoptr ino, uint8_t flag); +CODE1 uint16_t getmode(inoptr ino); +CODE1 struct mount *fs_tab_get(uint16_t dev); /* returns true on failure, false on success */ -bool fmount(uint16_t dev, inoptr ino, uint16_t flags); -void magic(inoptr ino); +CODE1 bool fmount(uint16_t dev, inoptr ino, uint16_t flags); +CODE1 void magic(inoptr ino); /* inode.c */ -void readi(inoptr ino, uint8_t flag); -void writei(inoptr ino, uint8_t flag); -int16_t doclose (uint8_t uindex); -inoptr rwsetup (bool is_read, uint8_t *flag); +CODE1 void readi(inoptr ino, uint8_t flag); +CODE1 void writei(inoptr ino, uint8_t flag); +CODE1 int16_t doclose (uint8_t uindex); +CODE1 inoptr rwsetup (bool is_read, uint8_t *flag); /* mm.c */ -unsigned int uputsys(unsigned char *from, unsigned int size); -unsigned int ugetsys(unsigned char *to, unsigned int size); +CODE2 unsigned int uputsys(unsigned char *from, unsigned int size); +CODE2 unsigned int ugetsys(unsigned char *to, unsigned int size); /* process.c */ -void psleep(void *event); -void wakeup(void *event); -void pwake(ptptr p); -ptptr getproc(void); -void newproc(ptptr p); -ptptr ptab_alloc(void); -void ssig(ptptr proc, uint16_t sig); -void chksigs(void); -void program_vectors(uint16_t *pageptr); -void sgrpsig(uint16_t pgrp, uint16_t sig); -void unix_syscall(void); -void timer_interrupt(void); -void doexit (int16_t val, int16_t val2); -void panic(char *deathcry); -void exec_or_die(void); +CODE2 void psleep(void *event); +CODE2 void wakeup(void *event); +CODE2 void pwake(ptptr p); +CODE2 ptptr getproc(void); +CODE2 void newproc(ptptr p); +CODE2 ptptr ptab_alloc(void); +CODE2 void ssig(ptptr proc, uint16_t sig); +CODE2 void chksigs(void); +COMMON void program_vectors(uint16_t *pageptr); +CODE2 void sgrpsig(uint16_t pgrp, uint16_t sig); +CODE2 void unix_syscall(void); +CODE2 void timer_interrupt(void); +CODE2 void doexit (int16_t val, int16_t val2); +CODE2 void panic(char *deathcry); +CODE2 void exec_or_die(void); /* select.c */ -extern void seladdwait(struct selmap *s); -extern void selrmwait(struct selmap *s); -extern void selwake(struct selmap *s); -extern int _select(void); +CODE2 extern void seladdwait(struct selmap *s); +CODE2 extern void selrmwait(struct selmap *s); +CODE2 extern void selwake(struct selmap *s); +CODE2 extern int _select(void); /* swap.c */ extern ptptr swapproc; @@ -675,96 +672,96 @@ extern uint8_t *swapbase; extern unsigned int swapcnt; extern blkno_t swapblk; -extern void swapmap_add(uint8_t swap); -extern ptptr swapneeded(ptptr p, int selfok); -extern void swapper(ptptr p); +CODE2 extern void swapmap_add(uint8_t swap); +CODE2 extern ptptr swapneeded(ptptr p, int selfok); +CODE2 extern void swapper(ptptr p); -/* syscalls_fs.c, syscalls_proc.c, syscall_other.c */ -void updoff(void); -int stcpy(inoptr ino, char *buf); -bool rargs (char **userspace_argv, struct s_argblk *argbuf); -char **wargs(char *userspace_ptr, struct s_argblk *argbuf, int *cnt); -extern int16_t unlinki(inoptr ino, inoptr pino, char *fname); +/* syscalls_fs.c, syscalls_proc.c, syscall_other.c etc */ +CODE2 void updoff(void); +CODE2 int stcpy(inoptr ino, char *buf); +CODE2 bool rargs (char **userspace_argv, struct s_argblk *argbuf); +CODE2 char **wargs(char *userspace_ptr, struct s_argblk *argbuf, int *cnt); +CODE2 extern int16_t unlinki(inoptr ino, inoptr pino, char *fname); /* timer.c */ -void rdtime(time_t *tloc); -void rdtime32(uint32_t *tloc); -void wrtime(time_t *tloc); -extern void updatetod(void); +CODE2 void rdtime(time_t *tloc); +CODE2 void rdtime32(uint32_t *tloc); +CODE2 void wrtime(time_t *tloc); +CODE2 extern void updatetod(void); /* provided by architecture or helpers */ -void device_init(void); /* provided by platform */ -void pagemap_init(void); -void pagemap_add(uint8_t page); -void pagemap_free(ptptr p); -int pagemap_alloc(ptptr p); -int pagemap_realloc(uint16_t p); -uint16_t pagemap_mem_used(void); -uint8_t *swapout_prepare_uarea(ptptr p); -uint8_t *swapin_prepare_uarea(ptptr p); -void map_init(void); -void platform_idle(void); +CODE2 void device_init(void); /* provided by platform */ +CODE2 void pagemap_init(void); +CODE2 void pagemap_add(uint8_t page); +CODE2 void pagemap_free(ptptr p); +CODE2 int pagemap_alloc(ptptr p); +CODE2 int pagemap_realloc(uint16_t p); +CODE2 uint16_t pagemap_mem_used(void); +CODE2 uint8_t *swapout_prepare_uarea(ptptr p); +CODE2 uint8_t *swapin_prepare_uarea(ptptr p); +CODE2 void map_init(void); +CODE2 void platform_idle(void); extern uint8_t *ramtop; /* Note: ramtop must be in common in some cases */ -extern void platform_interrupt(void); - -int16_t __exit(void); /* FUZIX system call 0 */ -int16_t _open(void); /* FUZIX system call 1 */ -int16_t _close(void); /* FUZIX system call 2 */ -int16_t _rename(void); /* FUZIX system call 3 */ -int16_t _mknod(void); /* FUZIX system call 4 */ -int16_t _link(void); /* FUZIX system call 5 */ -int16_t _unlink(void); /* FUZIX system call 6 */ -int16_t _read(void); /* FUZIX system call 7 */ -int16_t _write(void); /* FUZIX system call 8 */ -int16_t _lseek(void); /* FUZIX system call 9 */ -int16_t _chdir(void); /* FUZIX system call 10 */ -int16_t _sync(void); /* FUZIX system call 11 */ -int16_t _access(void); /* FUZIX system call 12 */ -int16_t _chmod(void); /* FUZIX system call 13 */ -int16_t _chown(void); /* FUZIX system call 14 */ -int16_t _stat(void); /* FUZIX system call 15 */ -int16_t _fstat(void); /* FUZIX system call 16 */ -int16_t _dup(void); /* FUZIX system call 17 */ -int16_t _getpid(void); /* FUZIX system call 18 */ -int16_t _getppid(void); /* FUZIX system call 19 */ -int16_t _getuid(void); /* FUZIX system call 20 */ -int16_t _umask(void); /* FUZIX system call 21 */ -int16_t _getfsys(void); /* FUZIX system call 22 */ -int16_t _execve(void); /* FUZIX system call 23 */ -int16_t _getdirent(void); /* FUZIX system call 24 */ -int16_t _setuid(void); /* FUZIX system call 25 */ -int16_t _setgid(void); /* FUZIX system call 26 */ -int16_t _time(void); /* FUZIX system call 27 */ -int16_t _stime(void); /* FUZIX system call 28 */ -int16_t _ioctl(void); /* FUZIX system call 29 */ -int16_t _brk(void); /* FUZIX system call 30 */ -int16_t _sbrk(void); /* FUZIX system call 31 */ -int16_t _fork(void); /* FUZIX system call 32 */ -int16_t _mount(void); /* FUZIX system call 33 */ -int16_t _umount(void); /* FUZIX system call 34 */ -int16_t _signal(void); /* FUZIX system call 35 */ -int16_t _dup2(void); /* FUZIX system call 36 */ -int16_t _pause(void); /* FUZIX system call 37 */ -int16_t _alarm(void); /* FUZIX system call 38 */ -int16_t _kill(void); /* FUZIX system call 39 */ -int16_t _pipe(void); /* FUZIX system call 40 */ -int16_t _getgid(void); /* FUZIX system call 41 */ -int16_t _times(void); /* FUZIX system call 42 */ -int16_t _utime(void); /* FUZIX system call 43 */ -int16_t _geteuid(void); /* FUZIX system call 44 */ -int16_t _getegid(void); /* FUZIX system call 45 */ -int16_t _chroot(void); /* FUZIX system call 46 */ -int16_t _fcntl(void); /* FUZIX system call 47 */ -int16_t _fchdir(void); /* FUZIX system call 48 */ -int16_t _fchmod(void); /* FUZIX system call 49 */ -int16_t _fchown(void); /* FUZIX system call 50 */ -int16_t _mkdir(void); /* FUZIX system call 51 */ -int16_t _rmdir(void); /* FUZIX system call 52 */ -int16_t _setpgrp(void); /* FUZIX system call 53 */ -int16_t _uname(void); /* FUZIX system call 54 */ -int16_t _waitpid(void); /* FUZIX system call 55 */ -int16_t _profil(void); /* FUZIX system call 56 */ -int16_t _uadmin(void); /* FUZIX system call 57 */ -int16_t _nice(void); /* FUZIX system call 58 */ -int16_t _sigdisp(void); /* FUZIX system call 59 */ +CODE2 extern void platform_interrupt(void); + +CODE2 int16_t __exit(void); /* FUZIX system call 0 */ +CODE2 int16_t _open(void); /* FUZIX system call 1 */ +CODE2 int16_t _close(void); /* FUZIX system call 2 */ +CODE2 int16_t _rename(void); /* FUZIX system call 3 */ +CODE2 int16_t _mknod(void); /* FUZIX system call 4 */ +CODE2 int16_t _link(void); /* FUZIX system call 5 */ +CODE2 int16_t _unlink(void); /* FUZIX system call 6 */ +CODE2 int16_t _read(void); /* FUZIX system call 7 */ +CODE2 int16_t _write(void); /* FUZIX system call 8 */ +CODE2 int16_t _lseek(void); /* FUZIX system call 9 */ +CODE2 int16_t _chdir(void); /* FUZIX system call 10 */ +CODE2 int16_t _sync(void); /* FUZIX system call 11 */ +CODE2 int16_t _access(void); /* FUZIX system call 12 */ +CODE2 int16_t _chmod(void); /* FUZIX system call 13 */ +CODE2 int16_t _chown(void); /* FUZIX system call 14 */ +CODE2 int16_t _stat(void); /* FUZIX system call 15 */ +CODE2 int16_t _fstat(void); /* FUZIX system call 16 */ +CODE2 int16_t _dup(void); /* FUZIX system call 17 */ +CODE2 int16_t _getpid(void); /* FUZIX system call 18 */ +CODE2 int16_t _getppid(void); /* FUZIX system call 19 */ +CODE2 int16_t _getuid(void); /* FUZIX system call 20 */ +CODE2 int16_t _umask(void); /* FUZIX system call 21 */ +CODE2 int16_t _getfsys(void); /* FUZIX system call 22 */ +CODE2 int16_t _execve(void); /* FUZIX system call 23 */ +CODE2 int16_t _getdirent(void); /* FUZIX system call 24 */ +CODE2 int16_t _setuid(void); /* FUZIX system call 25 */ +CODE2 int16_t _setgid(void); /* FUZIX system call 26 */ +CODE2 int16_t _time(void); /* FUZIX system call 27 */ +CODE2 int16_t _stime(void); /* FUZIX system call 28 */ +CODE2 int16_t _ioctl(void); /* FUZIX system call 29 */ +CODE2 int16_t _brk(void); /* FUZIX system call 30 */ +CODE2 int16_t _sbrk(void); /* FUZIX system call 31 */ +CODE2 int16_t _fork(void); /* FUZIX system call 32 */ +CODE2 int16_t _mount(void); /* FUZIX system call 33 */ +CODE2 int16_t _umount(void); /* FUZIX system call 34 */ +CODE2 int16_t _signal(void); /* FUZIX system call 35 */ +CODE2 int16_t _dup2(void); /* FUZIX system call 36 */ +CODE2 int16_t _pause(void); /* FUZIX system call 37 */ +CODE2 int16_t _alarm(void); /* FUZIX system call 38 */ +CODE2 int16_t _kill(void); /* FUZIX system call 39 */ +CODE2 int16_t _pipe(void); /* FUZIX system call 40 */ +CODE2 int16_t _getgid(void); /* FUZIX system call 41 */ +CODE2 int16_t _times(void); /* FUZIX system call 42 */ +CODE2 int16_t _utime(void); /* FUZIX system call 43 */ +CODE2 int16_t _geteuid(void); /* FUZIX system call 44 */ +CODE2 int16_t _getegid(void); /* FUZIX system call 45 */ +CODE2 int16_t _chroot(void); /* FUZIX system call 46 */ +CODE2 int16_t _fcntl(void); /* FUZIX system call 47 */ +CODE2 int16_t _fchdir(void); /* FUZIX system call 48 */ +CODE2 int16_t _fchmod(void); /* FUZIX system call 49 */ +CODE2 int16_t _fchown(void); /* FUZIX system call 50 */ +CODE2 int16_t _mkdir(void); /* FUZIX system call 51 */ +CODE2 int16_t _rmdir(void); /* FUZIX system call 52 */ +CODE2 int16_t _setpgrp(void); /* FUZIX system call 53 */ +CODE2 int16_t _uname(void); /* FUZIX system call 54 */ +CODE2 int16_t _waitpid(void); /* FUZIX system call 55 */ +CODE2 int16_t _profil(void); /* FUZIX system call 56 */ +CODE2 int16_t _uadmin(void); /* FUZIX system call 57 */ +CODE2 int16_t _nice(void); /* FUZIX system call 58 */ +CODE2 int16_t _sigdisp(void); /* FUZIX system call 59 */ #endif /* __FUZIX__KERNEL_DOT_H__ */ diff --git a/Kernel/include/tty.h b/Kernel/include/tty.h index 7b190979..2c08a371 100644 --- a/Kernel/include/tty.h +++ b/Kernel/include/tty.h @@ -144,42 +144,42 @@ struct termios { extern struct termios ttydata[NUM_DEV_TTY + 1]; extern uint16_t tty_pgrp[NUM_DEV_TTY + 1]; -extern void tty_init(void); - -extern int tty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int tty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int tty_open(uint8_t minor, uint16_t flag); -extern int tty_close(uint8_t minor); -extern int tty_ioctl(uint8_t minor, uint16_t request, char *data); - -extern void tty_hangup(uint8_t minor); -extern void tty_carrier_drop(uint8_t minor); -extern void tty_carrier_raise(uint8_t minor); - -extern int ptty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int ptty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int ptty_open(uint8_t minor, uint16_t flag); -extern int ptty_close(uint8_t minor); -extern int ptty_ioctl(uint8_t minor, uint16_t request, char *data); - -extern int pty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int pty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); -extern int pty_open(uint8_t minor, uint16_t flag); -extern int pty_close(uint8_t minor); -extern int pty_ioctl(uint8_t minor, uint16_t request, char *data); - -extern int tty_inproc(uint8_t minor, unsigned char c); -extern void tty_outproc(uint8_t minor); -extern void tty_echo(uint8_t minor, unsigned char c); -extern void tty_erase(uint8_t minor); -extern void tty_putc_wait(uint8_t minor, unsigned char c); +extern CODE1 void tty_init(void); + +extern CODE1 int tty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int tty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int tty_open(uint8_t minor, uint16_t flag); +extern CODE1 int tty_close(uint8_t minor); +extern CODE1 int tty_ioctl(uint8_t minor, uint16_t request, char *data); + +extern CODE1 void tty_hangup(uint8_t minor); +extern CODE1 void tty_carrier_drop(uint8_t minor); +extern CODE1 void tty_carrier_raise(uint8_t minor); + +extern CODE1 int ptty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int ptty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int ptty_open(uint8_t minor, uint16_t flag); +extern CODE1 int ptty_close(uint8_t minor); +extern CODE1 int ptty_ioctl(uint8_t minor, uint16_t request, char *data); + +extern CODE1 int pty_read(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int pty_write(uint8_t minor, uint8_t rawflag, uint8_t flag); +extern CODE1 int pty_open(uint8_t minor, uint16_t flag); +extern CODE1 int pty_close(uint8_t minor); +extern CODE1 int pty_ioctl(uint8_t minor, uint16_t request, char *data); + +extern CODE1 int tty_inproc(uint8_t minor, unsigned char c); +extern CODE1 void tty_outproc(uint8_t minor); +extern CODE1 void tty_echo(uint8_t minor, unsigned char c); +extern CODE1 void tty_erase(uint8_t minor); +extern CODE1 void tty_putc_wait(uint8_t minor, unsigned char c); /* provided by platform */ extern struct s_queue ttyinq[NUM_DEV_TTY + 1]; -extern bool tty_writeready(uint8_t minor); -extern void tty_putc(uint8_t minor, unsigned char c); -extern void tty_setup(uint8_t minor); -extern int tty_carrier(uint8_t minor); +extern CODE2 bool tty_writeready(uint8_t minor); +extern CODE2 void tty_putc(uint8_t minor, unsigned char c); +extern CODE2 void tty_setup(uint8_t minor); +extern CODE2 int tty_carrier(uint8_t minor); /* PTY pieces: 8 ptys both sides of */ #ifdef CONFIG_PTY_DEV #define PTY_BUFFERS \ diff --git a/Kernel/platform-dragon/Makefile b/Kernel/platform-dragon/Makefile index abc144c6..0ab882cc 100644 --- a/Kernel/platform-dragon/Makefile +++ b/Kernel/platform-dragon/Makefile @@ -14,7 +14,7 @@ JUNK = $(CSRCS:.c=.o) $(ASRCS:.s=.o) all: $(OBJS) $(COBJS): %$(BINEXT): %.c - $(CROSS_CC) $(CROSS_CCOPTS) -c $< + $(CROSS_CC) $(CROSS_CCOPTS) $(CROSS_CC_SEG2) -c $< $(AOBJS): %$(BINEXT): %.s $(CROSS_AS) $(ASOPTS) $< -o $*.o diff --git a/Kernel/platform-dragon/config.h b/Kernel/platform-dragon/config.h index d8f4a15c..8bd3433c 100644 --- a/Kernel/platform-dragon/config.h +++ b/Kernel/platform-dragon/config.h @@ -13,6 +13,8 @@ /* Pure swap */ #define CONFIG_SWAP_ONLY #define CONFIG_BANKS 1 +/* Banked Kernel: need to fix GCC first */ +#undef CONFIG_BANKED /* FIXME */ #define BANK_PROCESS *((volatile uint8_t *)0xff91) &= ~1 #define BANK_KERNEL *((volatile uint8_t *)0xff91) |= 1 -- 2.34.1