From d42685c6622dde79754d75e5b8f950441f5a53b7 Mon Sep 17 00:00:00 2001 From: hinus Date: Thu, 8 Jul 2021 22:42:01 +0800 Subject: [PATCH] Title: Read data from floppy. Issue: https://gitee.com/hinus/linux_kernel_011/issues/I3ZET1 Description: Read data from floppy. --- bootsect.S | 2 +- fs/Makefile | 5 +- fs/super.c | 37 +++++ include/linux/fdreg.h | 26 +++ include/linux/fs.h | 39 +++++ include/linux/sched.h | 1 + kernel/Makefile | 4 +- kernel/blk_drv/blk.h | 23 ++- kernel/blk_drv/floppy.c | 320 ++++++++++++++++++++++++++++++++++++- kernel/blk_drv/hd.c | 38 ++--- kernel/blk_drv/ll_rw_blk.c | 16 +- kernel/fork.c | 4 +- kernel/main.c | 14 +- kernel/sched.c | 37 ++++- mm/memory.c | 4 + mm/page.S | 1 + tools/build.c | 4 +- 17 files changed, 521 insertions(+), 54 deletions(-) create mode 100644 fs/super.c diff --git a/bootsect.S b/bootsect.S index b3fa63e..39d6ff8 100644 --- a/bootsect.S +++ b/bootsect.S @@ -1,4 +1,4 @@ -SYSSIZE = 2426 +SYSSIZE = 0x3000 SETUPLEN = 4 diff --git a/fs/Makefile b/fs/Makefile index c9c344d..126ced2 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -3,7 +3,7 @@ LD := ld CCFLAG := -I../include -nostdinc -ffreestanding -Wall -fomit-frame-pointer -fno-stack-protector -fno-pic -c -m32 LDFLAG := -Ttext 0x0 -s --oformat binary -m elf_i386 INCDIR := ../include -OBJS := read_write.o buffer.o +OBJS := read_write.o buffer.o super.o fs.o : $(OBJS) $(LD) -m elf_i386 -r -o $@ $^ @@ -14,6 +14,9 @@ read_write.o : read_write.c buffer.o : buffer.c $(GCC) $(CCFLAG) -o $@ $< +super.o : super.c + $(GCC) $(CCFLAG) -o $@ $< + clean : rm *.o diff --git a/fs/super.c b/fs/super.c new file mode 100644 index 0000000..10a1a80 --- /dev/null +++ b/fs/super.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +#include + +int ROOT_DEV = 0; + +struct super_block sb; + +struct super_block * read_super(int dev) { + struct super_block * s = &sb; + struct buffer_head * bh; + if (!(bh = bread(dev,1))) { + printk("read super error!\n"); + } + + brelse(bh); + + *((struct d_super_block *) s) = + *((struct d_super_block *) bh->b_data); + + if (s->s_magic != SUPER_MAGIC) { + printk("read super error!\n"); + return NULL; + } + printk("read super successfully!\n"); + + return &s; +} + +void mount_root() { + struct super_block * p; + if (!(p=read_super(ROOT_DEV))) + printk("Unable to mount root"); +} diff --git a/include/linux/fdreg.h b/include/linux/fdreg.h index cde6852..d5f1dcf 100644 --- a/include/linux/fdreg.h +++ b/include/linux/fdreg.h @@ -1,6 +1,32 @@ #ifndef _FDREG_H #define _FDREG_H +extern int ticks_to_floppy_on(unsigned int nr); +extern void floppy_on(unsigned int nr); +extern void floppy_off(unsigned int nr); +extern void floppy_select(unsigned int nr); +extern void floppy_deselect(unsigned int nr); +#define FD_STATUS 0x3f4 +#define FD_DATA 0x3f5 +#define FD_DOR 0x3f2 +#define FD_DIR 0x3f7 +#define FD_DCR 0x3f7 + +#define STATUS_BUSYMASK 0x0F +#define STATUS_BUSY 0x10 +#define STATUS_DMA 0x20 +#define STATUS_DIR 0x40 +#define STATUS_READY 0x80 + +#define FD_RECALIBRATE 0x07 +#define FD_SEEK 0x0F +#define FD_READ 0xE6 +#define FD_WRITE 0xC5 +#define FD_SENSEI 0x08 +#define FD_SPECIFY 0x03 + +#define DMA_READ 0x46 +#define DMA_WRITE 0x4A #endif diff --git a/include/linux/fs.h b/include/linux/fs.h index 0b8793f..bdbe6e7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -13,6 +13,10 @@ void buffer_init(long buffer_end); #define MAJOR(a) (((unsigned)(a))>>8) #define MINOR(a) ((a)&0xff) +#define I_MAP_SLOTS 8 +#define Z_MAP_SLOTS 8 + +#define SUPER_MAGIC 0x137F #define NR_HASH 307 #define BLOCK_SIZE 1024 @@ -36,6 +40,38 @@ struct buffer_head { struct buffer_head * b_next_free; }; +struct super_block { + unsigned short s_ninodes; + unsigned short s_nzones; + unsigned short s_imap_blocks; + unsigned short s_zmap_blocks; + unsigned short s_firstdatazone; + unsigned short s_log_zone_size; + unsigned long s_max_size; + unsigned short s_magic; + struct buffer_head * s_imap[8]; + struct buffer_head * s_zmap[8]; + unsigned short s_dev; + struct m_inode * s_isup; + struct m_inode * s_imount; + unsigned long s_time; + struct task_struct * s_wait; + unsigned char s_lock; + unsigned char s_rd_only; + unsigned char s_dirt; +}; + +struct d_super_block { + unsigned short s_ninodes; + unsigned short s_nzones; + unsigned short s_imap_blocks; + unsigned short s_zmap_blocks; + unsigned short s_firstdatazone; + unsigned short s_log_zone_size; + unsigned long s_max_size; + unsigned short s_magic; +}; + extern inline void wait_on_buffer(struct buffer_head* bh); extern struct buffer_head * getblk(int dev, int block); @@ -43,4 +79,7 @@ extern void ll_rw_block(int rw, struct buffer_head * bh); extern struct buffer_head * bread(int dev,int block); +extern int ROOT_DEV; +void mount_root(); + #endif diff --git a/include/linux/sched.h b/include/linux/sched.h index 48d27b7..44fe15e 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -36,6 +36,7 @@ extern int free_page_tables(unsigned long from, unsigned long size); void trap_init(); void sched_init(); +void add_timer(long jiffies, void (*fn)(void)); void sleep_on(struct task_struct ** p); void wake_up(struct task_struct ** p); void test_a(); diff --git a/kernel/Makefile b/kernel/Makefile index 3e7bd23..4e22d71 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -51,11 +51,11 @@ blk_drv/blk_drv.a: blk_drv/*.c clean : rm *.o - rm system - rm System.map cd chr_drv; make clean; cd .. cd blk_drv; make clean; cd .. cd ../mm; make clean; cd ../kernel cd ../lib; make clean; cd ../kernel cd ../fs; make clean; cd ../kernel + rm system + rm System.map diff --git a/kernel/blk_drv/blk.h b/kernel/blk_drv/blk.h index 6706289..e07a0a9 100644 --- a/kernel/blk_drv/blk.h +++ b/kernel/blk_drv/blk.h @@ -31,6 +31,8 @@ extern struct blk_dev_struct blk_dev[NR_BLK_DEV]; extern struct request request[NR_REQUEST]; extern struct task_struct * wait_for_request; +extern int * blk_size[NR_BLK_DEV]; + #ifdef MAJOR_NR #if (MAJOR_NR == 2) @@ -59,7 +61,6 @@ void (*DEVICE_INTR)(void) = NULL; #endif extern inline void unlock_buffer(struct buffer_head * bh); -extern inline void end_request(int uptodate); extern inline void lock_buffer(struct buffer_head * bh); #ifdef DEVICE_TIMEOUT @@ -69,7 +70,25 @@ int DEVICE_TIMEOUT = 0; #define SET_INTR(x) (DEVICE_INTR = (x)) #endif -static void (DEVICE_REQUEST)(void); +void (DEVICE_REQUEST)(void); + +static inline void end_request(int uptodate) { + DEVICE_OFF(CURRENT->dev); + if (CURRENT->bh) { + CURRENT->bh->b_uptodate = uptodate; + unlock_buffer(CURRENT->bh); + } + if (!uptodate) { + printk(DEVICE_NAME " I/O error\n\r"); + printk("dev %04x, block %d\n\r",CURRENT->dev, + CURRENT->bh->b_blocknr); + } + wake_up(&CURRENT->waiting); + wake_up(&wait_for_request); + CURRENT->dev = -1; + CURRENT = CURRENT->next; +} + #ifdef DEVICE_TIMEOUT #define CLEAR_DEVICE_TIMEOUT DEVICE_TIMEOUT = 0; diff --git a/kernel/blk_drv/floppy.c b/kernel/blk_drv/floppy.c index a906ecc..2993a0b 100644 --- a/kernel/blk_drv/floppy.c +++ b/kernel/blk_drv/floppy.c @@ -9,18 +9,334 @@ #define MAJOR_NR 2 #include "blk.h" +static int recalibrate = 0; +static int reset = 0; +static int seek = 0; + +extern unsigned char current_DOR; + +#define immoutb_p(val,port) \ +__asm__("outb %0,%1\n\tjmp 1f\n1:\tjmp 1f\n1:"::"a" ((char) (val)),"i" (port)) + +#define TYPE(x) ((x)>>2) +#define DRIVE(x) ((x)&0x03) + +#define MAX_ERRORS 8 +#define MAX_REPLIES 7 +static unsigned char reply_buffer[MAX_REPLIES]; +#define ST0 (reply_buffer[0]) +#define ST1 (reply_buffer[1]) +#define ST2 (reply_buffer[2]) +#define ST3 (reply_buffer[3]) + +static struct floppy_struct { + unsigned int size, sect, head, track, stretch; + unsigned char gap,rate,spec1; +} floppy_type[] = { + { 0, 0,0, 0,0,0x00,0x00,0x00 }, + { 720, 9,2,40,0,0x2A,0x02,0xDF }, + { 2400,15,2,80,0,0x1B,0x00,0xDF }, + { 720, 9,2,40,1,0x2A,0x02,0xDF }, + { 1440, 9,2,80,0,0x2A,0x02,0xDF }, + { 720, 9,2,40,1,0x23,0x01,0xDF }, + { 1440, 9,2,80,0,0x23,0x01,0xDF }, + { 2880,18,2,80,0,0x1B,0x00,0xCF }, +}; + extern void floppy_interrupt(); +extern char tmp_floppy_area[1024]; + +static int cur_spec1 = -1; +static int cur_rate = -1; +static struct floppy_struct * floppy = floppy_type; +static unsigned char current_drive = 0; +static unsigned char sector = 0; +static unsigned char head = 0; +static unsigned char track = 0; +static unsigned char seek_track = 0; +static unsigned char current_track = 255; +static unsigned char command = 0; +unsigned char selected = 0; +struct task_struct * wait_on_floppy_select = NULL; + +#define copy_buffer(from,to) \ +__asm__("cld ; rep ; movsl" \ + ::"c" (BLOCK_SIZE/4),"S" ((long)(from)),"D" ((long)(to)) \ + :) + +void floppy_deselect(unsigned int nr) { + if (nr != (current_DOR & 3)) + printk("floppy_deselect: drive not selected\n\r"); + selected = 0; + wake_up(&wait_on_floppy_select); +} + +int result() { + int i = 0, counter, status; + if (reset) + return -1; + for (counter = 0 ; counter < 10000 ; counter++) { + status = inb_p(FD_STATUS)&(STATUS_DIR|STATUS_READY|STATUS_BUSY); + if (status == STATUS_READY) + return i; + if (status == (STATUS_DIR|STATUS_READY|STATUS_BUSY)) { + if (i >= MAX_REPLIES) + break; + reply_buffer[i++] = inb_p(FD_DATA); + } + } + reset = 1; + printk("Getstatus times out\n\r"); + return -1; +} + +void setup_DMA() { + long addr = (long) CURRENT->buffer; + cli(); + if (addr >= 0x100000) { + addr = (long) tmp_floppy_area; + if (command == FD_WRITE) + copy_buffer(CURRENT->buffer,tmp_floppy_area); + } + immoutb_p(4|2,10); + __asm__("outb %%al,$12\n\tjmp 1f\n1:\tjmp 1f\n1:\t" + "outb %%al,$11\n\tjmp 1f\n1:\tjmp 1f\n1:":: + "a" ((char) ((command == FD_READ)?DMA_READ:DMA_WRITE))); + immoutb_p(addr,4); + addr >>= 8; + immoutb_p(addr,4); + addr >>= 8; + immoutb_p(addr,0x81); + immoutb_p(0xff,5); + immoutb_p(3,5); + immoutb_p(0|2,10); + sti(); +} + +void output_byte(char byte) { + int counter; + unsigned char status; + if (reset) + return; + for(counter = 0 ; counter < 10000 ; counter++) { + status = inb_p(FD_STATUS) & (STATUS_READY | STATUS_DIR); + if (status == STATUS_READY) { + outb(byte,FD_DATA); + return; + } + } + reset = 1; + printk("Unable to send byte to FDC\n\r"); +} + +void rw_interrupt() { + if (result() != 7 || (ST0 & 0xf8) || (ST1 & 0xbf) || (ST2 & 0x73)) { + if (ST1 & 0x02) { + printk("Drive %d is write protected\n\r",current_drive); + floppy_deselect(current_drive); + end_request(0); + } + + do_fd_request(); + return; + } + + if (command == FD_READ && (unsigned long)(CURRENT->buffer) >= 0x100000) + copy_buffer(tmp_floppy_area,CURRENT->buffer); + floppy_deselect(current_drive); + end_request(1); + do_fd_request(); +} + +inline void setup_rw_floppy() { + setup_DMA(); + do_floppy = rw_interrupt; + output_byte(command); + output_byte(head<<2 | current_drive); + output_byte(track); + output_byte(head); + output_byte(sector); + output_byte(2); + output_byte(floppy->sect); + output_byte(floppy->gap); + output_byte(0xFF); + + if (reset) + do_fd_request(); +} + +void seek_interrupt() { + output_byte(FD_SENSEI); + if (result() != 2 || (ST0 & 0xF8) != 0x20 || ST1 != seek_track) { + printk("seek eror\n"); + return; + } + current_track = ST1; + setup_rw_floppy(); +} void unexpected_floppy_interrupt() { - printk("unexpected floppy interrupt.\n"); + output_byte(FD_SENSEI); + int res = result(); + printk("unexpected floppy interrupt %d, %d\n", res, ST0); + if (res != 2 || (ST0 & 0xE0) == 0x60) + reset = 1; + else + recalibrate = 1; +} + +void transfer() { + if (cur_spec1 != floppy->spec1) { + cur_spec1 = floppy->spec1; + output_byte(FD_SPECIFY); + output_byte(cur_spec1); + output_byte(6); + } + if (cur_rate != floppy->rate) + outb_p(cur_rate = floppy->rate,FD_DCR); + + if (reset) { + do_fd_request(); + return; + } + + if (!seek) { + setup_rw_floppy(); + return; + } + do_floppy = seek_interrupt; + if (seek_track) { + output_byte(FD_SEEK); + output_byte(head<<2 | current_drive); + output_byte(seek_track); + } + else { + output_byte(FD_RECALIBRATE); + output_byte(head<<2 | current_drive); + } + + if (reset) + do_fd_request(); +} + +void recal_interrupt() { + output_byte(FD_SENSEI); + if (result()!=2 || (ST0 & 0xE0) == 0x60) + reset = 1; + else + recalibrate = 0; + do_fd_request(); +} + +void recalibrate_floppy() { + recalibrate = 0; + current_track = 0; + do_floppy = recal_interrupt; + output_byte(FD_RECALIBRATE); + output_byte(head<<2 | current_drive); + if (reset) + do_fd_request(); +} + +void reset_interrupt() { + output_byte(FD_SENSEI); + (void) result(); + output_byte(FD_SPECIFY); + output_byte(cur_spec1); + output_byte(6); + do_fd_request(); +} + +void reset_floppy() { + int i; + reset = 0; + cur_spec1 = -1; + cur_rate = -1; + recalibrate = 1; + printk("Reset-floppy called\n\r"); + cli(); + do_floppy = reset_interrupt; + outb_p(current_DOR & ~0x04,FD_DOR); + for (i=0 ; i<100 ; i++) + __asm__("nop"); + outb(current_DOR,FD_DOR); + sti(); +} + +void floppy_on_interrupt() { + selected = 1; + if (current_drive != (current_DOR & 3)) { + current_DOR &= 0xFC; + current_DOR |= current_drive; + outb(current_DOR,FD_DOR); + add_timer(2,&transfer); + } + else { + transfer(); + } } void do_fd_request() { + printk("hinus debug: do_fd_request, reset: %d, recal: %d, current dev:%d\n", + reset, recalibrate, CURRENT->dev); + unsigned int block; + seek = 0; + + if (reset) { + reset_floppy(); + return; + } + + if (recalibrate) { + recalibrate_floppy(); + return; + } + INIT_REQUEST; + floppy = (MINOR(CURRENT->dev)>>2) + floppy_type; + + if (current_drive != CURRENT_DEV) + seek = 1; + + current_drive = CURRENT_DEV; + block = CURRENT->sector; + if (block+2 > floppy->size) { + end_request(0); + goto repeat; + } + + sector = block % floppy->sect; + block /= floppy->sect; + head = block % floppy->head; + track = block / floppy->head; + seek_track = track << floppy->stretch; + + if (seek_track != current_track) + seek = 1; + sector++; + if (CURRENT->cmd == READ) + command = FD_READ; + else if (CURRENT->cmd == WRITE) + command = FD_WRITE; + else + printk("do_fd_request: unknown command"); + + add_timer(ticks_to_floppy_on(current_drive),&floppy_on_interrupt); } +static int floppy_sizes[] ={ + 0, 0, 0, 0, + 360, 360 ,360, 360, + 1200,1200,1200,1200, + 360, 360, 360, 360, + 720, 720, 720, 720, + 360, 360, 360, 360, + 720, 720, 720, 720, + 1440,1440,1440,1440 +}; + void floppy_init() { - //blk_size[MAJOR_NR] = floppy_sizes; + blk_size[MAJOR_NR] = floppy_sizes; blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; set_trap_gate(0x26,&floppy_interrupt); outb(inb_p(0x21)&~0x40,0x21); diff --git a/kernel/blk_drv/hd.c b/kernel/blk_drv/hd.c index 23b40ae..8fc03af 100644 --- a/kernel/blk_drv/hd.c +++ b/kernel/blk_drv/hd.c @@ -19,16 +19,6 @@ inb_p(0x71); \ #define MAX_HD 2 -struct blk_dev_struct blk_dev[NR_BLK_DEV] = { - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, -}; - struct hd_i_struct { int head,sect,cyl,wpcom,lzone,ctl; }; @@ -50,6 +40,7 @@ static struct hd_struct { long nr_sects; } hd[5*MAX_HD]={{0,0},}; +static int hd_sizes[5*MAX_HD] = {0, }; #define port_read(port,buf,nr) \ __asm__("cld;rep;insw"::"d" (port),"D" (buf),"c" (nr):) @@ -166,14 +157,21 @@ int sys_setup(void * BIOS) { hd[i+5*drive].start_sect = p->start_sect; hd[i+5*drive].nr_sects = p->nr_sects; + /* printk("table %d: start at %d, has %d sects\n", drive, hd[i+5*drive].start_sect, hd[i+5*drive].nr_sects); + */ } + brelse(bh); } - add_timer(300, test_b); + for (i=0 ; i<5*MAX_HD ; i++) + hd_sizes[i] = hd[i].nr_sects>>1; + blk_size[MAJOR_NR] = hd_sizes; + add_timer(300, test_b); + mount_root(); return 0; } @@ -272,21 +270,3 @@ void hd_init() { outb(inb_p(0xA1)&0xbf,0xA1); } -inline void end_request(int uptodate) { - printk("end request\n"); - DEVICE_OFF(CURRENT->dev); - if (CURRENT->bh) { - CURRENT->bh->b_uptodate = uptodate; - unlock_buffer(CURRENT->bh); - } - if (!uptodate) { - printk(DEVICE_NAME " I/O error\n\r"); - printk("dev %04x, block %d\n\r",CURRENT->dev, - CURRENT->bh->b_blocknr); - } - wake_up(&CURRENT->waiting); - wake_up(&wait_for_request); - CURRENT->dev = -1; - CURRENT = CURRENT->next; -} - diff --git a/kernel/blk_drv/ll_rw_blk.c b/kernel/blk_drv/ll_rw_blk.c index 2588240..ed35dd8 100644 --- a/kernel/blk_drv/ll_rw_blk.c +++ b/kernel/blk_drv/ll_rw_blk.c @@ -9,6 +9,18 @@ struct request request[NR_REQUEST]; struct task_struct * wait_for_request = NULL; +struct blk_dev_struct blk_dev[NR_BLK_DEV] = { + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, +}; + +int * blk_size[NR_BLK_DEV] = { NULL, NULL, }; + inline void lock_buffer(struct buffer_head * bh) { cli(); while (bh->b_lock) @@ -24,7 +36,7 @@ inline void unlock_buffer(struct buffer_head * bh) { wake_up(&bh->b_wait); } -static void add_request(struct blk_dev_struct * dev, struct request * req) { +void add_request(struct blk_dev_struct * dev, struct request * req) { struct request * tmp; req->next = NULL; cli(); @@ -58,7 +70,7 @@ static void add_request(struct blk_dev_struct * dev, struct request * req) { sti(); } -static void make_request(int major,int rw, struct buffer_head * bh) { +void make_request(int major,int rw, struct buffer_head * bh) { struct request * req; lock_buffer(bh); if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate)) { diff --git a/kernel/fork.c b/kernel/fork.c index 97db425..206ac4e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -13,8 +13,10 @@ int copy_mem(int nr, struct task_struct* p) { data_limit = get_limit(0x17); old_code_base = get_base(current->ldt[1]); old_data_base = get_base(current->ldt[2]); - if (old_data_base != old_code_base) + if (old_data_base != old_code_base) { + //printk("%x, %x\n", old_data_base, old_code_base); printk("We don't support separate I&D\n"); + } if (data_limit < code_limit) printk("Bad data_limit"); diff --git a/kernel/main.c b/kernel/main.c index 21564b6..4364088 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -14,6 +14,7 @@ int errno; #include #include +#include static char printbuf[1024]; @@ -39,15 +40,7 @@ struct drive_info { char dummy[32]; } drive_info; void main(void) { - /* - char* p1 = "hello world!\0"; - short* p = (short*)0xb8000; - while(*p1) { - *p++ = 0xf00 | (*p1++); - } - */ - - //__asm__("int $0x80\n\r"::); + ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; @@ -67,10 +60,9 @@ void main(void) trap_init(); sched_init(); - buffer_init(buffer_memory_end); tty_init(); - printk("\nmemory start at 0x%x, end at 0x%x\n", main_memory_start, memory_end); + buffer_init(buffer_memory_end); blk_dev_init(); hd_init(); diff --git a/kernel/sched.c b/kernel/sched.c index 4541b9f..4153299 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1,7 +1,7 @@ #include #include #include - +#include #include #include @@ -107,6 +107,41 @@ void wake_up(struct task_struct **p) { } } +static struct task_struct * wait_motor[4] = {NULL,NULL,NULL,NULL}; +static int mon_timer[4]={0,0,0,0}; +static int moff_timer[4]={0,0,0,0}; + +unsigned char current_DOR = 0x0C; + +int ticks_to_floppy_on(unsigned int nr) { + extern unsigned char selected; + unsigned char mask = 0x10 << nr; + + if (nr>3) + printk("floppy_on: nr>3"); + moff_timer[nr]=10000; + cli(); + + mask |= current_DOR; + if (!selected) { + mask &= 0xFC; + mask |= nr; + } + if (mask != current_DOR) { + outb(mask,FD_DOR); + if ((mask ^ current_DOR) & 0xf0) + mon_timer[nr] = HZ/2; + else if (mon_timer[nr] < 2) + mon_timer[nr] = 2; + current_DOR = mask; + } + sti(); + return mon_timer[nr]; +} + +void floppy_off(unsigned int nr) { +} + #define TIME_REQUESTS 64 static struct timer_list { diff --git a/mm/memory.c b/mm/memory.c index f45963f..a04a69d 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -127,6 +127,10 @@ void do_wp_page(unsigned long error_code, unsigned long address) { *((unsigned long *) ((address>>20) &0xffc))))); } +void do_no_page(unsigned long error_code,unsigned long address) { + unsigned long a = error_code + address; +} + void mem_init(long start_mem, long end_mem) { int i; diff --git a/mm/page.S b/mm/page.S index 6f8d7a6..68e9f75 100644 --- a/mm/page.S +++ b/mm/page.S @@ -16,6 +16,7 @@ page_fault: pushl %eax testl $1, %eax jne 1f + call do_no_page jmp 2f 1: call do_wp_page 2: addl $8, %esp diff --git a/tools/build.c b/tools/build.c index b48ffc2..df7cf9d 100644 --- a/tools/build.c +++ b/tools/build.c @@ -12,8 +12,8 @@ #define SYS_SIZE 0x2000 -#define DEFAULT_MAJOR_ROOT 3 -#define DEFAULT_MINOR_ROOT 2 +#define DEFAULT_MAJOR_ROOT 2 +#define DEFAULT_MINOR_ROOT 29 #define SETUP_SECTS 4 -- Gitee