dragon-nx32: Swap out over DriveWire
authorTormod Volden <debian.tormod@gmail.com>
Sun, 17 May 2015 08:55:24 +0000 (10:55 +0200)
committerAlan Cox <alan@linux.intel.com>
Sun, 17 May 2015 15:24:43 +0000 (16:24 +0100)
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 <debian.tormod@gmail.com>
Kernel/platform-dragon-nx32/Makefile
Kernel/platform-dragon-nx32/config.h
Kernel/platform-dragon-nx32/devdw.c
Kernel/platform-dragon-nx32/drivewire.s
Kernel/platform-dragon-nx32/main.c

index 5dfc5cc..bb0d3c5 100644 (file)
@@ -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
index 01ee872..702d5d2 100644 (file)
 #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))
index 4d1b81d..9ea39a8 100644 (file)
@@ -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--) {
index f1718ed..dc8010c 100644 (file)
@@ -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
index e7168fb..bc58d0a 100644 (file)
@@ -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)