From: Tormod Volden Date: Sun, 17 May 2015 08:55:24 +0000 (+0200) Subject: dragon-nx32: Swap out over DriveWire X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=110e6f075cab8ee8d132d7cf5b08a333b760d77b;p=FUZIX.git dragon-nx32: Swap out over DriveWire However, swapping in again still needs some work... Note that config.h sets DriveWire disk 1 for swap, change at will. Signed-off-by: Tormod Volden --- diff --git a/Kernel/platform-dragon-nx32/Makefile b/Kernel/platform-dragon-nx32/Makefile index 5dfc5cc4..bb0d3c55 100644 --- a/Kernel/platform-dragon-nx32/Makefile +++ b/Kernel/platform-dragon-nx32/Makefile @@ -30,7 +30,7 @@ image: tricks.o main.o ../timer.o ../kdata.o devfd.o floppy.o devices.o \ drivewire.o devdw.o \ ../devio.o ../filesys.o ../process.o ../inode.o ../syscall_fs.o \ - ../syscall_proc.o ../syscall_other.o ../mm.o \ + ../syscall_proc.o ../syscall_other.o ../mm.o ../swap.o \ ../tty.o ../devsys.o ../usermem.o ../syscall_fs2.o ../syscall_exec16.o \ devlpr.o devtty.o libc.o ../vt.o ../tools/pad256 ../fuzix.bin diff --git a/Kernel/platform-dragon-nx32/config.h b/Kernel/platform-dragon-nx32/config.h index 01ee8728..702d5d26 100644 --- a/Kernel/platform-dragon-nx32/config.h +++ b/Kernel/platform-dragon-nx32/config.h @@ -16,7 +16,11 @@ #define MAP_SIZE 0x7C00U #define CONFIG_BANKS 1 /* And swapping */ -#undef SWAPDEV +#define SWAPDEV 2049 /* DriveWire drive 1 */ +#define SWAP_SIZE 0x80 /* 64K blocks */ +#define SWAPBASE 0x8000 /* We swap the lot in one, include the */ +#define SWAPTOP 0xFF00 /* uarea so its a round number of sectors */ +#define MAX_SWAPS 32 /* Permit large I/O requests to bypass cache and go direct to userspace */ #define CONFIG_LARGE_IO_DIRECT @@ -60,3 +64,4 @@ extern unsigned char vt_mangle_6847(unsigned char c); #define TTYDEV BOOT_TTY /* Device used by kernel for messages, panics */ #define NBUFS 6 /* Number of block buffers */ #define NMOUNTS 2 /* Number of mounts at a time */ +#define swap_map(x) ((uint8_t *)(x)) diff --git a/Kernel/platform-dragon-nx32/devdw.c b/Kernel/platform-dragon-nx32/devdw.c index 4d1b81dc..9ea39a89 100644 --- a/Kernel/platform-dragon-nx32/devdw.c +++ b/Kernel/platform-dragon-nx32/devdw.c @@ -25,22 +25,29 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag) uint8_t err; uint8_t *driveptr = dw_tab + minor; uint8_t cmd[6]; + uint8_t page; irqflags_t irq; - if (rawflag == 0) { + if (rawflag == 0) { + page = 0; dptr = (uint16_t)udata.u_buf->bf_data; block = udata.u_buf->bf_blk; nblock = 2; } else if (rawflag == 1) { if (((uint16_t)udata.u_offset|udata.u_count) & BLKMASK) goto bad2; + page = (uint8_t)udata.u_page; dptr = (uint16_t)udata.u_base; block = udata.u_offset >> 9; nblock = udata.u_count >> 8; + } else if (rawflag == 2) { + page = (uint8_t)swappage; + dptr = (uint16_t)swapbase; + nblock = swapcnt >> 8; + block = swapblk; } else goto bad2; - // kprintf("Issue command: drive %d\n", minor); /* maybe mimicking floppy driver more than needed? */ cmd[0] = is_read ? DW_READ : DW_WRITE; @@ -48,7 +55,7 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag) cmd[2] = (block << 1) & 0xFF; cmd[3] = dptr >> 8; cmd[4] = dptr & 0xFF; - cmd[5] = rawflag; + cmd[5] = page; *driveptr = minor; /* pass minor (drive number) through here for now */ while (nblock--) { diff --git a/Kernel/platform-dragon-nx32/drivewire.s b/Kernel/platform-dragon-nx32/drivewire.s index f1718edf..dc8010cb 100644 --- a/Kernel/platform-dragon-nx32/drivewire.s +++ b/Kernel/platform-dragon-nx32/drivewire.s @@ -11,7 +11,7 @@ .globl _dw_reset ; imported - .globl map_process_always + .globl map_process_a .globl map_kernel .area .common @@ -25,12 +25,11 @@ _dw_operation: pshs y ; get parameters from C, X points to cmd packet ldy 4,s ; driveptr (dw_tab in .bss so kernel bank) - lda ,y ; for now, contains minor = drive number directly - ldb 5,x ; rawflag - pshs b - beq @nomap - jsr map_process_always -@nomap ldb ,x ; write flag + ldb ,y ; for now, contains minor = drive number directly + lda 5,x ; page map + jsr map_process_a ; same as map_process on nx32 + tfr b,a + ldb ,x ; write flag ; buffer location into Y ldy 3,x ; sector number into X @@ -43,9 +42,7 @@ _dw_operation: @done bcs @err bne @err ldx #0 -@fin tst ,s+ - beq @ret - jsr map_kernel +@fin jsr map_kernel @ret puls y,pc @err ldx #0xFFFF bra @fin diff --git a/Kernel/platform-dragon-nx32/main.c b/Kernel/platform-dragon-nx32/main.c index e7168fba..bc58d0a4 100644 --- a/Kernel/platform-dragon-nx32/main.c +++ b/Kernel/platform-dragon-nx32/main.c @@ -25,6 +25,11 @@ void pagemap_init(void) /* map bank 1 last for init, leave 0 for kernel */ for (i = membanks - 1; i > 0; i--) pagemap_add(i); + +#ifdef SWAPDEV + for (i = 0; i < MAX_SWAPS; i++) + swapmap_add(i); +#endif } void map_init(void)