From 110a2545d29acd3ce7e57ce0fad80662313dca38 Mon Sep 17 00:00:00 2001 From: nudt Date: Sat, 3 Jul 2021 03:14:06 +0100 Subject: [PATCH] lzh-1 --- linux-0.11-lab/2/README | 6 + .../2/Source-Insight/Linux-0.11.IAB | Bin 0 -> 102400 bytes .../2/Source-Insight/Linux-0.11.IAD | Bin 0 -> 1328 bytes .../2/Source-Insight/Linux-0.11.IMB | Bin 0 -> 81920 bytes .../2/Source-Insight/Linux-0.11.IMD | Bin 0 -> 1128 bytes .../2/Source-Insight/Linux-0.11.PFI | Bin 0 -> 412 bytes linux-0.11-lab/2/Source-Insight/Linux-0.11.PO | Bin 0 -> 776 bytes linux-0.11-lab/2/Source-Insight/Linux-0.11.PR | Bin 0 -> 32648 bytes .../2/Source-Insight/Linux-0.11.PRI | Bin 0 -> 208984 bytes linux-0.11-lab/2/Source-Insight/Linux-0.11.PS | Bin 0 -> 623496 bytes .../2/Source-Insight/Linux-0.11.SearchResults | 2 + .../2/Source-Insight/Linux-0.11.WK3 | Bin 0 -> 8851 bytes linux-0.11-lab/2/linux/Image | Bin 0 -> 131556 bytes linux-0.11-lab/2/linux/Image.bkp | Bin 0 -> 131556 bytes linux-0.11-lab/2/linux/Makefile | 125 ++ linux-0.11-lab/2/linux/System.map | 576 +++++++++ linux-0.11-lab/2/linux/System.map.2 | 1075 +++++++++++++++++ linux-0.11-lab/2/linux/boot/bootsect | Bin 0 -> 544 bytes linux-0.11-lab/2/linux/boot/bootsect.o | Bin 0 -> 923 bytes linux-0.11-lab/2/linux/boot/bootsect.s | 260 ++++ linux-0.11-lab/2/linux/boot/head.o | Bin 0 -> 27012 bytes linux-0.11-lab/2/linux/boot/head.s | 240 ++++ linux-0.11-lab/2/linux/boot/setup | Bin 0 -> 344 bytes linux-0.11-lab/2/linux/boot/setup.o | Bin 0 -> 596 bytes linux-0.11-lab/2/linux/boot/setup.s | 231 ++++ linux-0.11-lab/2/linux/fs/Makefile | 101 ++ linux-0.11-lab/2/linux/fs/bitmap.c | 168 +++ linux-0.11-lab/2/linux/fs/bitmap.o | Bin 0 -> 10280 bytes linux-0.11-lab/2/linux/fs/block_dev.c | 73 ++ linux-0.11-lab/2/linux/fs/block_dev.o | Bin 0 -> 7296 bytes linux-0.11-lab/2/linux/fs/buffer.c | 384 ++++++ linux-0.11-lab/2/linux/fs/buffer.o | Bin 0 -> 13348 bytes linux-0.11-lab/2/linux/fs/char_dev.c | 104 ++ linux-0.11-lab/2/linux/fs/char_dev.o | Bin 0 -> 8288 bytes linux-0.11-lab/2/linux/fs/exec.c | 359 ++++++ linux-0.11-lab/2/linux/fs/exec.o | Bin 0 -> 14936 bytes linux-0.11-lab/2/linux/fs/fcntl.c | 75 ++ linux-0.11-lab/2/linux/fs/fcntl.o | Bin 0 -> 6748 bytes linux-0.11-lab/2/linux/fs/file_dev.c | 90 ++ linux-0.11-lab/2/linux/fs/file_dev.o | Bin 0 -> 7828 bytes linux-0.11-lab/2/linux/fs/file_table.c | 9 + linux-0.11-lab/2/linux/fs/file_table.o | Bin 0 -> 2644 bytes linux-0.11-lab/2/linux/fs/fs.o | Bin 0 -> 142937 bytes linux-0.11-lab/2/linux/fs/inode.c | 340 ++++++ linux-0.11-lab/2/linux/fs/inode.o | Bin 0 -> 14072 bytes linux-0.11-lab/2/linux/fs/ioctl.c | 46 + linux-0.11-lab/2/linux/fs/ioctl.o | Bin 0 -> 5828 bytes linux-0.11-lab/2/linux/fs/namei.c | 783 ++++++++++++ linux-0.11-lab/2/linux/fs/namei.o | Bin 0 -> 20756 bytes linux-0.11-lab/2/linux/fs/open.c | 208 ++++ linux-0.11-lab/2/linux/fs/open.o | Bin 0 -> 11184 bytes linux-0.11-lab/2/linux/fs/pipe.c | 111 ++ linux-0.11-lab/2/linux/fs/pipe.o | Bin 0 -> 8104 bytes linux-0.11-lab/2/linux/fs/read_write.c | 103 ++ linux-0.11-lab/2/linux/fs/read_write.o | Bin 0 -> 7520 bytes linux-0.11-lab/2/linux/fs/select.c | 10 + linux-0.11-lab/2/linux/fs/select.o | Bin 0 -> 1776 bytes linux-0.11-lab/2/linux/fs/stat.c | 66 + linux-0.11-lab/2/linux/fs/stat.o | Bin 0 -> 7212 bytes linux-0.11-lab/2/linux/fs/super.c | 282 +++++ linux-0.11-lab/2/linux/fs/super.o | Bin 0 -> 12284 bytes linux-0.11-lab/2/linux/fs/truncate.c | 65 + linux-0.11-lab/2/linux/fs/truncate.o | Bin 0 -> 6848 bytes linux-0.11-lab/2/linux/include/a.out.h | 220 ++++ linux-0.11-lab/2/linux/include/asm/io.h | 24 + linux-0.11-lab/2/linux/include/asm/memory.h | 15 + linux-0.11-lab/2/linux/include/asm/segment.h | 65 + linux-0.11-lab/2/linux/include/asm/system.h | 66 + linux-0.11-lab/2/linux/include/const.h | 15 + linux-0.11-lab/2/linux/include/ctype.h | 34 + linux-0.11-lab/2/linux/include/errno.h | 60 + linux-0.11-lab/2/linux/include/fcntl.h | 55 + linux-0.11-lab/2/linux/include/linux/config.h | 48 + linux-0.11-lab/2/linux/include/linux/fdreg.h | 71 ++ linux-0.11-lab/2/linux/include/linux/fs.h | 202 ++++ linux-0.11-lab/2/linux/include/linux/hdreg.h | 65 + linux-0.11-lab/2/linux/include/linux/head.h | 20 + linux-0.11-lab/2/linux/include/linux/kernel.h | 22 + linux-0.11-lab/2/linux/include/linux/mm.h | 10 + linux-0.11-lab/2/linux/include/linux/sched.h | 239 ++++ linux-0.11-lab/2/linux/include/linux/sys.h | 111 ++ linux-0.11-lab/2/linux/include/linux/tty.h | 77 ++ linux-0.11-lab/2/linux/include/signal.h | 68 ++ linux-0.11-lab/2/linux/include/stdarg.h | 28 + linux-0.11-lab/2/linux/include/stddef.h | 19 + linux-0.11-lab/2/linux/include/string.h | 405 +++++++ linux-0.11-lab/2/linux/include/sys/stat.h | 60 + linux-0.11-lab/2/linux/include/sys/times.h | 15 + linux-0.11-lab/2/linux/include/sys/types.h | 46 + linux-0.11-lab/2/linux/include/sys/utsname.h | 16 + linux-0.11-lab/2/linux/include/sys/wait.h | 23 + linux-0.11-lab/2/linux/include/termios.h | 228 ++++ linux-0.11-lab/2/linux/include/time.h | 42 + linux-0.11-lab/2/linux/include/unistd.h | 269 +++++ linux-0.11-lab/2/linux/include/utime.h | 13 + linux-0.11-lab/2/linux/init/main.c | 210 ++++ linux-0.11-lab/2/linux/init/main.o | Bin 0 -> 9040 bytes linux-0.11-lab/2/linux/kernel/Makefile | 83 ++ linux-0.11-lab/2/linux/kernel/asm.o | Bin 0 -> 1740 bytes linux-0.11-lab/2/linux/kernel/asm.s | 146 +++ .../2/linux/kernel/blk_drv/Makefile | 58 + linux-0.11-lab/2/linux/kernel/blk_drv/blk.h | 140 +++ .../2/linux/kernel/blk_drv/blk_drv.a | Bin 0 -> 52212 bytes .../2/linux/kernel/blk_drv/floppy.c | 463 +++++++ .../2/linux/kernel/blk_drv/floppy.o | Bin 0 -> 16612 bytes linux-0.11-lab/2/linux/kernel/blk_drv/hd.c | 351 ++++++ linux-0.11-lab/2/linux/kernel/blk_drv/hd.o | Bin 0 -> 15520 bytes .../2/linux/kernel/blk_drv/ll_rw_blk.c | 165 +++ .../2/linux/kernel/blk_drv/ll_rw_blk.o | Bin 0 -> 8740 bytes .../2/linux/kernel/blk_drv/ramdisk.c | 126 ++ .../2/linux/kernel/blk_drv/ramdisk.o | Bin 0 -> 10664 bytes .../2/linux/kernel/chr_drv/Makefile | 68 ++ .../2/linux/kernel/chr_drv/chr_drv.a | Bin 0 -> 68902 bytes .../2/linux/kernel/chr_drv/console.c | 710 +++++++++++ .../2/linux/kernel/chr_drv/console.o | Bin 0 -> 20896 bytes .../2/linux/kernel/chr_drv/keyboard.2.o | Bin 0 -> 6024 bytes .../2/linux/kernel/chr_drv/keyboard.2.s | 466 +++++++ .../2/linux/kernel/chr_drv/keyboard.S | 588 +++++++++ linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.o | Bin 0 -> 1320 bytes linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.s | 147 +++ .../2/linux/kernel/chr_drv/serial.c | 59 + .../2/linux/kernel/chr_drv/serial.o | Bin 0 -> 6752 bytes .../2/linux/kernel/chr_drv/tty_io.c | 349 ++++++ .../2/linux/kernel/chr_drv/tty_io.o | Bin 0 -> 22504 bytes .../2/linux/kernel/chr_drv/tty_ioctl.c | 204 ++++ .../2/linux/kernel/chr_drv/tty_ioctl.o | Bin 0 -> 10648 bytes linux-0.11-lab/2/linux/kernel/exit.c | 197 +++ linux-0.11-lab/2/linux/kernel/exit.o | Bin 0 -> 11164 bytes linux-0.11-lab/2/linux/kernel/fork.c | 148 +++ linux-0.11-lab/2/linux/kernel/fork.o | Bin 0 -> 9640 bytes linux-0.11-lab/2/linux/kernel/kernel.o | Bin 0 -> 84086 bytes linux-0.11-lab/2/linux/kernel/math/Makefile | 43 + linux-0.11-lab/2/linux/kernel/math/math.a | Bin 0 -> 6628 bytes .../2/linux/kernel/math/math_emulate.c | 42 + .../2/linux/kernel/math/math_emulate.o | Bin 0 -> 6464 bytes linux-0.11-lab/2/linux/kernel/mktime.c | 58 + linux-0.11-lab/2/linux/kernel/mktime.o | Bin 0 -> 2872 bytes linux-0.11-lab/2/linux/kernel/panic.c | 24 + linux-0.11-lab/2/linux/kernel/panic.o | Bin 0 -> 5424 bytes linux-0.11-lab/2/linux/kernel/printk.c | 41 + linux-0.11-lab/2/linux/kernel/printk.o | Bin 0 -> 2424 bytes linux-0.11-lab/2/linux/kernel/sched.c | 412 +++++++ linux-0.11-lab/2/linux/kernel/sched.o | Bin 0 -> 22732 bytes linux-0.11-lab/2/linux/kernel/signal.c | 129 ++ linux-0.11-lab/2/linux/kernel/signal.o | Bin 0 -> 8960 bytes linux-0.11-lab/2/linux/kernel/sys.c | 292 +++++ linux-0.11-lab/2/linux/kernel/sys.o | Bin 0 -> 13088 bytes linux-0.11-lab/2/linux/kernel/system_call.o | Bin 0 -> 2520 bytes linux-0.11-lab/2/linux/kernel/system_call.s | 285 +++++ linux-0.11-lab/2/linux/kernel/traps.c | 208 ++++ linux-0.11-lab/2/linux/kernel/traps.o | Bin 0 -> 12972 bytes linux-0.11-lab/2/linux/kernel/vsprintf.c | 233 ++++ linux-0.11-lab/2/linux/kernel/vsprintf.o | Bin 0 -> 6156 bytes linux-0.11-lab/2/linux/mm/Makefile | 38 + linux-0.11-lab/2/linux/mm/memory.c | 431 +++++++ linux-0.11-lab/2/linux/mm/memory.o | Bin 0 -> 12924 bytes linux-0.11-lab/2/linux/mm/mm.o | Bin 0 -> 13048 bytes linux-0.11-lab/2/linux/mm/page.o | Bin 0 -> 640 bytes linux-0.11-lab/2/linux/mm/page.s | 40 + linux-0.11-lab/2/linux/tools/build | Bin 0 -> 15144 bytes linux-0.11-lab/2/linux/tools/build.c | 171 +++ linux-0.11-lab/2/linux/tools/system | Bin 0 -> 286057 bytes 162 files changed, 15668 insertions(+) create mode 100755 linux-0.11-lab/2/README create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.IAB create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.IAD create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.IMB create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.IMD create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.PFI create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.PO create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.PR create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.PRI create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.PS create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.SearchResults create mode 100755 linux-0.11-lab/2/Source-Insight/Linux-0.11.WK3 create mode 100755 linux-0.11-lab/2/linux/Image create mode 100755 linux-0.11-lab/2/linux/Image.bkp create mode 100755 linux-0.11-lab/2/linux/Makefile create mode 100755 linux-0.11-lab/2/linux/System.map create mode 100755 linux-0.11-lab/2/linux/System.map.2 create mode 100755 linux-0.11-lab/2/linux/boot/bootsect create mode 100755 linux-0.11-lab/2/linux/boot/bootsect.o create mode 100755 linux-0.11-lab/2/linux/boot/bootsect.s create mode 100755 linux-0.11-lab/2/linux/boot/head.o create mode 100755 linux-0.11-lab/2/linux/boot/head.s create mode 100755 linux-0.11-lab/2/linux/boot/setup create mode 100755 linux-0.11-lab/2/linux/boot/setup.o create mode 100755 linux-0.11-lab/2/linux/boot/setup.s create mode 100755 linux-0.11-lab/2/linux/fs/Makefile create mode 100755 linux-0.11-lab/2/linux/fs/bitmap.c create mode 100755 linux-0.11-lab/2/linux/fs/bitmap.o create mode 100755 linux-0.11-lab/2/linux/fs/block_dev.c create mode 100755 linux-0.11-lab/2/linux/fs/block_dev.o create mode 100755 linux-0.11-lab/2/linux/fs/buffer.c create mode 100755 linux-0.11-lab/2/linux/fs/buffer.o create mode 100755 linux-0.11-lab/2/linux/fs/char_dev.c create mode 100755 linux-0.11-lab/2/linux/fs/char_dev.o create mode 100755 linux-0.11-lab/2/linux/fs/exec.c create mode 100755 linux-0.11-lab/2/linux/fs/exec.o create mode 100755 linux-0.11-lab/2/linux/fs/fcntl.c create mode 100755 linux-0.11-lab/2/linux/fs/fcntl.o create mode 100755 linux-0.11-lab/2/linux/fs/file_dev.c create mode 100755 linux-0.11-lab/2/linux/fs/file_dev.o create mode 100755 linux-0.11-lab/2/linux/fs/file_table.c create mode 100755 linux-0.11-lab/2/linux/fs/file_table.o create mode 100755 linux-0.11-lab/2/linux/fs/fs.o create mode 100755 linux-0.11-lab/2/linux/fs/inode.c create mode 100755 linux-0.11-lab/2/linux/fs/inode.o create mode 100755 linux-0.11-lab/2/linux/fs/ioctl.c create mode 100755 linux-0.11-lab/2/linux/fs/ioctl.o create mode 100755 linux-0.11-lab/2/linux/fs/namei.c create mode 100755 linux-0.11-lab/2/linux/fs/namei.o create mode 100755 linux-0.11-lab/2/linux/fs/open.c create mode 100755 linux-0.11-lab/2/linux/fs/open.o create mode 100755 linux-0.11-lab/2/linux/fs/pipe.c create mode 100755 linux-0.11-lab/2/linux/fs/pipe.o create mode 100755 linux-0.11-lab/2/linux/fs/read_write.c create mode 100755 linux-0.11-lab/2/linux/fs/read_write.o create mode 100755 linux-0.11-lab/2/linux/fs/select.c create mode 100755 linux-0.11-lab/2/linux/fs/select.o create mode 100755 linux-0.11-lab/2/linux/fs/stat.c create mode 100755 linux-0.11-lab/2/linux/fs/stat.o create mode 100755 linux-0.11-lab/2/linux/fs/super.c create mode 100755 linux-0.11-lab/2/linux/fs/super.o create mode 100755 linux-0.11-lab/2/linux/fs/truncate.c create mode 100755 linux-0.11-lab/2/linux/fs/truncate.o create mode 100755 linux-0.11-lab/2/linux/include/a.out.h create mode 100755 linux-0.11-lab/2/linux/include/asm/io.h create mode 100755 linux-0.11-lab/2/linux/include/asm/memory.h create mode 100755 linux-0.11-lab/2/linux/include/asm/segment.h create mode 100755 linux-0.11-lab/2/linux/include/asm/system.h create mode 100755 linux-0.11-lab/2/linux/include/const.h create mode 100755 linux-0.11-lab/2/linux/include/ctype.h create mode 100755 linux-0.11-lab/2/linux/include/errno.h create mode 100755 linux-0.11-lab/2/linux/include/fcntl.h create mode 100755 linux-0.11-lab/2/linux/include/linux/config.h create mode 100755 linux-0.11-lab/2/linux/include/linux/fdreg.h create mode 100755 linux-0.11-lab/2/linux/include/linux/fs.h create mode 100755 linux-0.11-lab/2/linux/include/linux/hdreg.h create mode 100755 linux-0.11-lab/2/linux/include/linux/head.h create mode 100755 linux-0.11-lab/2/linux/include/linux/kernel.h create mode 100755 linux-0.11-lab/2/linux/include/linux/mm.h create mode 100755 linux-0.11-lab/2/linux/include/linux/sched.h create mode 100755 linux-0.11-lab/2/linux/include/linux/sys.h create mode 100755 linux-0.11-lab/2/linux/include/linux/tty.h create mode 100755 linux-0.11-lab/2/linux/include/signal.h create mode 100755 linux-0.11-lab/2/linux/include/stdarg.h create mode 100755 linux-0.11-lab/2/linux/include/stddef.h create mode 100755 linux-0.11-lab/2/linux/include/string.h create mode 100755 linux-0.11-lab/2/linux/include/sys/stat.h create mode 100755 linux-0.11-lab/2/linux/include/sys/times.h create mode 100755 linux-0.11-lab/2/linux/include/sys/types.h create mode 100755 linux-0.11-lab/2/linux/include/sys/utsname.h create mode 100755 linux-0.11-lab/2/linux/include/sys/wait.h create mode 100755 linux-0.11-lab/2/linux/include/termios.h create mode 100755 linux-0.11-lab/2/linux/include/time.h create mode 100755 linux-0.11-lab/2/linux/include/unistd.h create mode 100755 linux-0.11-lab/2/linux/include/utime.h create mode 100755 linux-0.11-lab/2/linux/init/main.c create mode 100755 linux-0.11-lab/2/linux/init/main.o create mode 100755 linux-0.11-lab/2/linux/kernel/Makefile create mode 100755 linux-0.11-lab/2/linux/kernel/asm.o create mode 100755 linux-0.11-lab/2/linux/kernel/asm.s create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/Makefile create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/blk.h create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/blk_drv.a create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/floppy.c create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/floppy.o create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/hd.c create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/hd.o create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/ll_rw_blk.c create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/ll_rw_blk.o create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/ramdisk.c create mode 100755 linux-0.11-lab/2/linux/kernel/blk_drv/ramdisk.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/Makefile create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/chr_drv.a create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/console.c create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/console.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.2.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.2.s create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.S create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.s create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/serial.c create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/serial.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/tty_io.c create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/tty_io.o create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.c create mode 100755 linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.o create mode 100755 linux-0.11-lab/2/linux/kernel/exit.c create mode 100755 linux-0.11-lab/2/linux/kernel/exit.o create mode 100755 linux-0.11-lab/2/linux/kernel/fork.c create mode 100755 linux-0.11-lab/2/linux/kernel/fork.o create mode 100755 linux-0.11-lab/2/linux/kernel/kernel.o create mode 100755 linux-0.11-lab/2/linux/kernel/math/Makefile create mode 100755 linux-0.11-lab/2/linux/kernel/math/math.a create mode 100755 linux-0.11-lab/2/linux/kernel/math/math_emulate.c create mode 100755 linux-0.11-lab/2/linux/kernel/math/math_emulate.o create mode 100755 linux-0.11-lab/2/linux/kernel/mktime.c create mode 100755 linux-0.11-lab/2/linux/kernel/mktime.o create mode 100755 linux-0.11-lab/2/linux/kernel/panic.c create mode 100755 linux-0.11-lab/2/linux/kernel/panic.o create mode 100755 linux-0.11-lab/2/linux/kernel/printk.c create mode 100755 linux-0.11-lab/2/linux/kernel/printk.o create mode 100755 linux-0.11-lab/2/linux/kernel/sched.c create mode 100755 linux-0.11-lab/2/linux/kernel/sched.o create mode 100755 linux-0.11-lab/2/linux/kernel/signal.c create mode 100755 linux-0.11-lab/2/linux/kernel/signal.o create mode 100755 linux-0.11-lab/2/linux/kernel/sys.c create mode 100755 linux-0.11-lab/2/linux/kernel/sys.o create mode 100755 linux-0.11-lab/2/linux/kernel/system_call.o create mode 100755 linux-0.11-lab/2/linux/kernel/system_call.s create mode 100755 linux-0.11-lab/2/linux/kernel/traps.c create mode 100755 linux-0.11-lab/2/linux/kernel/traps.o create mode 100755 linux-0.11-lab/2/linux/kernel/vsprintf.c create mode 100755 linux-0.11-lab/2/linux/kernel/vsprintf.o create mode 100755 linux-0.11-lab/2/linux/mm/Makefile create mode 100755 linux-0.11-lab/2/linux/mm/memory.c create mode 100755 linux-0.11-lab/2/linux/mm/memory.o create mode 100755 linux-0.11-lab/2/linux/mm/mm.o create mode 100755 linux-0.11-lab/2/linux/mm/page.o create mode 100755 linux-0.11-lab/2/linux/mm/page.s create mode 100755 linux-0.11-lab/2/linux/tools/build create mode 100755 linux-0.11-lab/2/linux/tools/build.c create mode 100755 linux-0.11-lab/2/linux/tools/system diff --git a/linux-0.11-lab/2/README b/linux-0.11-lab/2/README new file mode 100755 index 0000000..2e56a37 --- /dev/null +++ b/linux-0.11-lab/2/README @@ -0,0 +1,6 @@ +revision history: + +版本0: 这是oldlinux.org网站上的linux-0.11-lab.rar中的版本。可能是赵博士在原始0.11版本的基础上修改而成。我做了如下改动: + a) 对一些Makefile做了修改,生成调试信息; + b) 将其移植到ubuntu和debian下,主要修改的地方用 "by wyj"标注。 + diff --git a/linux-0.11-lab/2/Source-Insight/Linux-0.11.IAB b/linux-0.11-lab/2/Source-Insight/Linux-0.11.IAB new file mode 100755 index 0000000000000000000000000000000000000000..27c23b6e1f3379c54bfea8c6c805c76fa235fa7c GIT binary patch literal 102400 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 X+E}E5VH>Ng(M~HVI#}YIPA>QZN3SCK literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/Source-Insight/Linux-0.11.PO b/linux-0.11-lab/2/Source-Insight/Linux-0.11.PO new file mode 100755 index 0000000000000000000000000000000000000000..de8db453c6bceca6363a1974df88a64caed7c9e8 GIT binary patch literal 776 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 >LdwT?$NcJnp;7Il?Z10x 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 ZnP<(9Ox^sRyj^ZyQ^(&fr!Q^I{{xPUk!%0} literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/Source-Insight/Linux-0.11.PS b/linux-0.11-lab/2/Source-Insight/Linux-0.11.PS new file mode 100755 index 0000000000000000000000000000000000000000..2c515c4dd3f2da9176ef09bd338843664bd433cf GIT binary patch literal 623496 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

gTMo^M<*{ia#Sx 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"s":""); diff --git a/linux-0.11-lab/2/Source-Insight/Linux-0.11.WK3 b/linux-0.11-lab/2/Source-Insight/Linux-0.11.WK3 new file mode 100755 index 0000000000000000000000000000000000000000..83b8a91bcf60093c431c8bf17f52b9cdc811bb72 GIT binary patch literal 8851 zcmeHNU1%It6u!xtnA*~$Xr-XiX~mKsXS%y>wTU7LiNV&UjmC=9Tf^+^Bs*kwCd^Nh zNHH%WJ_tr%)Hh!O;vWHv7Hr6aFTp&hPb#}85ivdp6{-&+7{4=fr9)zRgG?RtEm05vc5+GbvNT<&w* z<)&fz<8oTbWMos#@iZT>eMi&fW0q?S7d(FA>iI1m%3F5%YvsY`|HEoNyN$6Q?_z8j zAd%4K;Pc=~;B{aMXuCT&9q`+s8XUhs|4A%n*B-{cM$aO64&&dwkFhJ@jbwRl^3?Km zayiyBIT>pRb>;k8ag5E`*snUC;Tg6id1}to+5Q)J^Yg0wVwZg8tkTL`n$b+l?Pr4n z+AT_J%zQ#ZlkJAniukVJ1g#6y4t$bcjC zR@lD;z7DSPI9l z-cPH|97$!<=~O12KG5C4PrI~*ecZQn-eYTiQMWu->|IM@@469JO4uQ;cxHB*jel7R zGKNXmd_?5F!nrOm=@hwPAP4;ea4$FuyaS!yq{$Cq9_UB^ESTPoX$*}&4Yq)fp*Mk_ z1;~Fl_%(q1Q?y@!PUHUsXkOAg!EXZO^E~(xPy;*;(D=*frym7SgEcjRqc`?f|0pqO z>HFYZ9|p|=^H^)=juQI^CF24x473B^!a)Og8vGD^JPM}Lu>iaU&|AJolR&Z|G5Ji# z^`8k`M+-Z7&bGba;Od&ExQei9scdCfhR4IlrcGEJsBF=vj_5;%si(#8wl#(;S-x^% zu_>yy2^NFLIIp7qmTvOcgRi)Uh4H~EjibfUuQ-zCjqDxRenDuPpV^!!WcB6ZRv#w1$ zi!SR);i-4io;=$&DeQ)sS2W~YkieA0QR2>wm)JZ&`F2F$==&vh@tHE)hc+cS$@Y*~ z{itJD-pEeT+~#=`gJX{2=}n?1UVNj8XtHR+emL)32q%0B{eQ9m=Svid9Z=Bb7QMLj7RH!n^7ZcDFEkY#pO2pW3A8 L(|=0vYl{BA4o;%1 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/Image b/linux-0.11-lab/2/linux/Image new file mode 100755 index 0000000000000000000000000000000000000000..9869a43badb77318312737429c1972e920db1e68 GIT binary patch literal 131556 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 Cri=yv literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/Image.bkp b/linux-0.11-lab/2/linux/Image.bkp new file mode 100755 index 0000000000000000000000000000000000000000..9869a43badb77318312737429c1972e920db1e68 GIT binary patch literal 131556 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

6)D{%45iSNSq&64CS|7De&pK!a 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 GefK}=>%zGJ literal 0 HcmV?d00001

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 Cri=yv literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/Makefile b/linux-0.11-lab/2/linux/Makefile new file mode 100755 index 0000000..ecbcf30 --- /dev/null +++ b/linux-0.11-lab/2/linux/Makefile @@ -0,0 +1,125 @@ +# +# if you want the ram-disk device, define this to be the +# size in blocks. +# +RAMDISK = #-DRAMDISK=512 + +AS86 =as86 -0 -a +LD86 =ld86 -0 + +AS =as +LD =ld +LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 -Map=System.map.2 -N +CC =gcc -march=i386 $(RAMDISK) +CFLAGS =-w -g -fstrength-reduce -fomit-frame-pointer -fno-stack-protector -mcld +CPP =cpp -nostdinc -Iinclude + +# +# ROOT_DEV specifies the default root-device when making the image. +# This can be either FLOPPY, /dev/xxxx or empty, in which case the +# default of /dev/hd6 is used by 'build'. +# +ROOT_DEV= + +ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o +DRIVERS =kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a +MATH =kernel/math/math.a +LIBS =lib/lib.a + +.c.s: + $(CC) $(CFLAGS) \ + -nostdinc -Iinclude -S -o $*.s $< +.s.o: + $(AS) -o $*.o $< +.c.o: + $(CC) $(CFLAGS) \ + -nostdinc -Iinclude -c -o $*.o $< + +all: Image + +Image: boot/bootsect boot/setup tools/system tools/build + cp -f tools/system system.tmp + strip system.tmp + tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) > Image + rm -f system.tmp + sync + +disk: Image + dd bs=8192 if=Image of=/dev/PS0 + +tools/build: tools/build.c + $(CC) $(CFLAGS) \ + -o tools/build tools/build.c + +boot/head.o: boot/head.s + +tools/system: boot/head.o init/main.o \ + $(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS) + $(LD) $(LDFLAGS) boot/head.o init/main.o \ + $(ARCHIVES) \ + $(DRIVERS) \ + $(MATH) \ + $(LIBS) \ + -o tools/system + nm tools/system | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw]\)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort >System.map + +kernel/math/math.a: FORCE + (cd kernel/math; make) + +kernel/blk_drv/blk_drv.a: FORCE + (cd kernel/blk_drv; make) + +kernel/chr_drv/chr_drv.a: FORCE + (cd kernel/chr_drv; make) + +kernel/kernel.o: FORCE + (cd kernel; make) + +mm/mm.o: FORCE + (cd mm; make) + +fs/fs.o: FORCE + (cd fs; make) + +lib/lib.a: FORCE + (cd lib; make) + +FORCE: + +boot/setup: boot/setup.s + $(AS86) -o boot/setup.o boot/setup.s + $(LD86) -s -o boot/setup boot/setup.o + +boot/bootsect: boot/bootsect.s + $(AS86) -o boot/bootsect.o boot/bootsect.s + $(LD86) -s -o boot/bootsect boot/bootsect.o + +tmp.s: boot/bootsect.s tools/system + (echo -n "SYSSIZE = (";ls -l tools/system | grep system \ + | cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s + cat boot/bootsect.s >> tmp.s + +clean: + rm -f Image System.map tmp_make core System.map.2 + rm -f boot/bootsect boot/setup + rm -f init/*.o tools/system tools/build boot/*.o + (cd mm;make clean) + (cd fs;make clean) + (cd kernel;make clean) + (cd lib;make clean) + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + (for i in init/*.c;do echo -n "init/";$(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + (cd fs; make dep) + (cd kernel; make dep) + (cd mm; make dep) + +### Dependencies: +init/main.o : init/main.c include/unistd.h include/sys/stat.h \ + include/sys/types.h include/sys/times.h include/sys/utsname.h \ + include/utime.h include/time.h include/linux/tty.h include/termios.h \ + include/linux/sched.h include/linux/head.h include/linux/fs.h \ + include/linux/mm.h include/signal.h include/asm/system.h include/asm/io.h \ + include/stddef.h include/stdarg.h include/fcntl.h diff --git a/linux-0.11-lab/2/linux/System.map b/linux-0.11-lab/2/linux/System.map new file mode 100755 index 0000000..6e469c2 --- /dev/null +++ b/linux-0.11-lab/2/linux/System.map @@ -0,0 +1,576 @@ +00000000 T pg_dir +00000000 T startup_32 +0000005a t check_x87 +00000073 t setup_idt +00000090 t rp_sidt +000000a3 t setup_gdt +00001000 t pg0 +00002000 t pg1 +00003000 t pg2 +00004000 t pg3 +00005000 T tmp_floppy_area +00005412 t L6 +00005414 t int_msg +00005428 t ignore_int +00005450 t setup_paging +000054ae t idt_descr +000054b6 t gdt_descr +000054c0 T idt +00005cc0 T gdt +000064c0 T fork +000064ef T pause +0000651e T setup +00006555 T sync +00006584 t time_init +00006799 T main +0000690c t printf +0000695b T init +00006bd4 T show_task +00006c59 T show_stat +00006c9f T math_state_restore +00006cfd T schedule +00006eaf T sys_pause +00006ec5 T sleep_on +00006f24 T interruptible_sleep_on +00006fdf T ticks_to_floppy_on +000070aa T floppy_on +000070d9 T floppy_off +000070e9 T do_floppy_timer +000072e1 T do_timer +000073d0 T sys_alarm +0000744f T sys_getpid +0000745b T sys_getppid +00007467 T sys_getuid +00007476 T sys_geteuid +00007486 T sys_getgid +00007496 T sys_getegid +000074a5 T sys_nice +000074d0 T sched_init +00007660 t bad_sys_call +00007668 t reschedule +00007674 T system_call +000076a8 t ret_from_sys_call +000076f0 T coprocessor_error +00007712 T device_not_available +0000774c T timer_interrupt +00007784 T sys_execve +00007794 T sys_fork +000077ac T hd_interrupt +000077e8 T floppy_interrupt +0000781e T parallel_interrupt +00007825 t _get_base +00007857 t die +00007a39 T do_double_fault +00007a5c T do_general_protection +00007a7f T do_divide_error +00007aa2 T do_int3 +00007b6a T do_nmi +00007b8d T do_debug +00007bb0 T do_overflow +00007bd3 T do_bounds +00007bf6 T do_invalid_op +00007c19 T do_device_not_available +00007c3c T do_coprocessor_segment_overrun +00007c5f T do_invalid_TSS +00007c82 T do_segment_not_present +00007ca5 T do_stack_segment +00007cc8 T do_coprocessor_error +00007cfc T do_reserved +00007d1f T trap_init +00008003 T divide_error +00008008 t no_error_code +00008038 T debug +0000803f T nmi +00008046 T int3 +0000804d T overflow +00008054 T bounds +0000805b T invalid_op +00008062 T coprocessor_segment_overrun +00008069 T reserved +00008070 T irq13 +00008085 T double_fault +0000808a t error_code +000080bc T invalid_TSS +000080c3 T segment_not_present +000080ca T stack_segment +000080d1 T general_protection +000080d8 t _get_base +0000810a T verify_area +00008171 T copy_mem +000082cb T copy_process +00008778 T find_empty_process +0000880c T panic +00008847 T printk +00008898 t skip_atoi +000088f3 t number +00008b64 T vsprintf +00008ff0 t get_fs_long +00009006 t put_fs_byte +0000901e t put_fs_long +0000902a T sys_ftime +00009030 T sys_break +00009036 T sys_ptrace +0000903c T sys_stty +00009042 T sys_gtty +00009048 T sys_rename +0000904e T sys_prof +00009054 T sys_setregid +0000910d T sys_setgid +000091a4 T sys_acct +000091aa T sys_phys +000091b0 T sys_lock +000091b6 T sys_mpx +000091bc T sys_ulimit +000091c2 T sys_time +0000921e T sys_setreuid +00009300 T sys_setuid +00009395 T sys_stime +000093eb T sys_times +0000948b T sys_brk +000094cd T sys_setpgid +000095a6 T sys_getpgrp +000095b2 T sys_setsid +0000962c T sys_getgroups +00009632 T sys_setgroups +00009638 T sys_uname +000096a1 T sys_sethostname +000096a7 T sys_getrlimit +000096ad T sys_setrlimit +000096b3 T sys_getrusage +000096b9 T sys_gettimeofday +000096bf T sys_settimeofday +000096c5 T sys_umask +000096f8 t _get_base +0000972a t put_fs_long +00009736 T release +0000979a t send_sig +00009819 t kill_session +00009873 T sys_kill +00009a23 t tell_father +00009aad T do_exit +00009ce1 T sys_exit +00009cfa T sys_waitpid +00009f20 t get_fs_byte +00009f2e t put_fs_byte +00009f46 t put_fs_long +00009f52 T sys_sgetmask +00009f5e T sys_ssetmask +00009f8a T sys_sigpending +00009f90 T sys_sigsuspend +00009f96 t save_old +00009fe9 t get_new +0000a029 T sys_signal +0000a0ad T sys_sigaction +0000a1b7 T do_signal +0000a3a3 T kernel_mktime +0000a4e8 t oom +0000a507 T get_free_page +0000a543 T free_page +0000a5b2 T free_page_tables +0000a6b1 T copy_page_tables +0000a832 T put_page +0000a91e T un_wp_page +0000a9d6 T do_wp_page +0000aa61 T get_empty_page +0000aaa1 t try_to_share +0000ac33 t share_page +0000ace7 T do_no_page +0000ae49 T mem_init +0000aebd T calc_mem +0000afb2 T page_fault +0000afe9 t get_fs_long +0000afff T sys_ustat +0000b005 T sys_utime +0000b0b2 T sys_access +0000b18e T sys_chdir +0000b202 T sys_chroot +0000b276 T sys_chmod +0000b310 T sys_chown +0000b38b T sys_open +0000b62e T sys_creat +0000b651 T sys_close +0000b720 T sys_lseek +0000b837 T sys_read +0000ba2a T sys_write +0000bbd8 t lock_inode +0000bc05 t unlock_inode +0000bc23 T invalidate_inodes +0000bc92 T sync_inodes +0000bce9 t _bmap +0000c0d5 T bmap +0000c0f8 T create_block +0000c11b T iput +0000c28a T get_empty_inode +0000c3df T get_pipe_inode +0000c454 T iget +0000c619 t read_inode +0000c84f T sys_sync +0000c8b2 T sync_dev +0000c9ab T invalidate_buffers +0000ca1d T check_disk_change +0000cac7 t remove_from_queues +0000cbbe t insert_into_queues +0000cc83 t find_buffer +0000cceb T get_hash_table +0000cd6d T getblk +0000cf0b T brelse +0000cf54 T bread +0000cfd9 T bread_page +0000d0fb T breada +0000d1f0 T buffer_init +0000d31f t lock_super +0000d34c t free_super +0000d391 T get_super +0000d400 T put_super +0000d4d3 t read_super +0000d816 T sys_umount +0000d977 T sys_mount +0000dae8 T mount_root +0000dcf6 t get_fs_byte +0000dd04 t put_fs_byte +0000dd1c T block_write +0000de6e T block_read +0000df99 t get_fs_byte +0000dfa7 t put_fs_byte +0000dfbf t rw_ttyx +0000e007 t rw_tty +0000e057 t rw_ram +0000e05d t rw_mem +0000e063 t rw_kmem +0000e069 t rw_port +0000e103 t rw_memory +0000e1d9 T rw_char +0000e243 t get_fs_byte +0000e251 t put_fs_byte +0000e269 T file_read +0000e414 T file_write +0000e60e t put_fs_byte +0000e626 t cp_stat +0000e6fd T sys_stat +0000e747 T sys_lstat +0000e762 T sys_fstat +0000e7bf T sys_readlink +0000e7c5 t _get_base +0000e7f7 t get_fs_byte +0000e805 t get_fs_long +0000e81b t put_fs_byte +0000e833 t put_fs_long +0000e83f t get_fs +0000e853 t get_ds +0000e867 t set_fs +0000e86e T sys_uselib +0000e874 t create_tables +0000e9bf t count +0000e9fe t copy_strings +0000ebba t change_ldt +0000ed3d T do_execve +0000f7bf t get_fs_byte +0000f7cd t put_fs_byte +0000f7e5 t put_fs_long +0000f7f1 T read_pipe +0000fac6 T sys_pipe +0000fcc8 t get_fs_byte +0000fcd6 t permission +0000fd77 t match +0000fddf t find_entry +00010239 t get_dir +00010426 t dir_namei +000104a5 T namei +000105bb T open_namei +0001090e T sys_mknod +00010b3e T sys_mkdir +00010eef t empty_dir +000110cd T sys_rmdir +00011425 T sys_unlink +000116c6 T sys_symlink +000116cc T sys_link +00011926 T free_block +00011a98 T new_block +00011c3c T free_inode +00011da3 T new_inode +00011f7d t dupfd +00012057 T sys_dup2 +0001207e T sys_dup +00012099 T sys_fcntl +000121d8 T sys_ioctl +000122a9 t free_ind +00012348 t free_dind +000123e7 T truncate +0001251c T sys_select +00012522 t lock_buffer +0001254f t unlock_buffer +00012741 t make_request +000128e5 T ll_rw_block +0001293e T blk_dev_init +0001298c t unlock_buffer +000129c1 t end_request +00012a72 T floppy_deselect +00012aa9 T floppy_change +00012b2f t setup_DMA +00012be5 t output_byte +00012c5b t result +00012d18 t bad_flp_intr +00012d77 t rw_interrupt +00012e66 T setup_rw_floppy +00012f27 t seek_interrupt +00012f80 t transfer +000130b5 t recal_interrupt +000130ff T unexpected_floppy_interrupt +00013144 t recalibrate_floppy +000131a6 t reset_interrupt +000131eb t reset_floppy +00013268 t floppy_on_interrupt +000132d3 t do_fd_request +000134d7 T floppy_init +00013529 t unlock_buffer +0001355e t end_request +000135fd T sys_setup +000139b0 t controller_ready +00013a44 t hd_out +00013b31 t drive_busy +00013b97 t reset_controller +00013c14 t reset_hd +00013cac T unexpected_hd_interrupt +00013cbf t bad_rw_intr +00013cfd t read_intr +00013e23 t recal_intr +00013e3d t do_hd_request +0001413e T hd_init +000141b8 t unlock_buffer +000141ed t end_request +0001428c t do_rd_request +000143c2 T rd_init +00014418 T rd_load +000146c4 t get_fs_byte +000146d2 t put_fs_byte +000146ea T tty_init +000146fb T tty_intr +0001476f t sleep_if_empty +000147a7 t sleep_if_full +0001481b T copy_to_cooked +00014dd6 T tty_read +00015144 T tty_write +00015356 T do_tty_interrupt +0001537e T chr_dev_init +0001537f t gotoxy +000153cd t set_origin +00015433 t scrup +00015623 t scrdown +0001571a t lf +00015750 t ri +00015786 t cr +000157a7 t del +000157d9 t csi_J +0001586a t csi_K +0001591c T csi_m +00015983 t set_cursor +000159e9 t respond +00015a41 t insert_char +00015aa4 t insert_line +00015ae8 t delete_char +00015b46 t delete_line +00015b8a t csi_at +00015bc8 t csi_L +00015c06 t csi_P +00015c44 t csi_M +00015c82 t save_cur +00015c97 t restore_cur +00015cb6 T con_write +00016344 T con_init +0001657b T sysbeepstop +000165a4 t sysbeep +00016602 t mode +00016603 t leds +00016604 t e0 +00016605 T keyboard_interrupt +0001662e t e0_e1 +00016659 t set_e0 +00016662 t set_e1 +0001666b t put_queue +000166a4 t ctrl +000166bc t unctrl +000166c0 t unalt +000166d6 t lshift +000166de t unlshift +000166e6 t rshift +000166ee t unrshift +000166f6 t caps +00016718 t set_leds +0001672e t uncaps +00016736 t scroll +0001673f t num +00016748 t cursor +00016768 t cur2 +00016791 t cur +0001679d t ok_cur +000167ab t num_table +000167b8 t cur_table +000167c5 t func +000167e2 t ok_func +000167f5 t end_func +000167f6 t func_table +00016826 t key_map +00016887 t shift_map +00016949 t do_self +000169b1 t none +000169b2 t minus +000169c7 t key_table +00016dc7 t kb_wait +00016dd0 t reboot +00016de2 t die +00016de4 t init +00016e59 T rs_init +00016edc T rs_write +00016f2c T rs1_interrupt +00016f34 T rs2_interrupt +00016f39 t rs_int +00016f50 t rep_int +00016f6d t end +00016f7b t jmp_table +00016f8c t modem_status +00016f94 t line_status +00016f9c t read_char +00017023 t get_fs_byte +00017031 t get_fs_long +00017047 t put_fs_byte +0001705f t put_fs_long +0001706b t change_speed +000170e9 t flush +000170fb t send_break +000170fc t get_termios +00017158 t set_termios +000171a8 t get_termio +00017270 t set_termio +00017334 T tty_ioctl +00017632 t get_fs_byte +00017640 T math_emulate +00017723 T math_error +00017743 T _exit +00017753 T open +0001779c T close +00017810 T dup +00017847 T setsid +00017876 T execve +00017913 T strcpy +0001792f T strncpy +00017954 T strcat +0001797f T strncat +000179b4 T strcmp +000179db T strncmp +00017a09 T strchr +00017a36 T strrchr +00017a65 T strspn +00017aa2 T strcspn +00017adf T strpbrk +00017b16 T strstr +00017b4f T strlen +00017b72 T strtok +00017bf5 T memcpy +00017c15 T memmove +00017c69 T memcmp +00017c93 T memchr +00017ccb T memset +0001bb48 d envp_rc +0001bb5c d envp +0001bb80 D sys_call_table +0001bcdc D NR_syscalls +0001bce0 d init_task +0001cce0 D current +0001cd00 D task +0001ce00 D stack_start +0001ce08 D current_DOR +0001ce20 d thisname.1955 +0001ce60 d month +0001cea0 d last_inode.1935 +0001cea4 D start_buffer +0001cec0 d crw_table +0001cee0 d ioctl_table +0001cf00 d floppy_type +0001cfc0 d cur_spec1 +0001cfc4 d cur_rate +0001cfc8 d floppy +0001cfcc d current_track +0001cfd0 d callable.1844 +0001cfe0 D tty_table +0001f500 D table_list +0001f520 d quotient +0001f540 D _ctype +0001f641 B __bss_start +0001f641 D _edata +0001f660 b printbuf +0001fa60 b memory_end +0001fa64 b buffer_memory_end +0001fa68 b main_memory_start +0001fa80 B jiffies +0001fa84 B startup_time +0001fa88 B last_task_used_math +0001fa9c b mon_timer +0001faac b moff_timer +0001fac0 b timer_list +0001fdc0 b next_timer +0001fdc4 B last_pid +0001fde0 b buf +000201e0 b HIGH_MEMORY +00020200 b mem_map +00021100 B inode_table +00021800 B nr_buffers +00021804 b free_list +00021808 b buffer_wait +0002180c B ROOT_DEV +00021840 B blk_dev +00021878 B do_floppy +0002187c B selected +00021884 b recalibrate +00021888 b reset +0002188c b seek +00021890 b reply_buffer +00021897 b current_drive +00021898 b sector +00021899 b head +0002189a b track +0002189b b seek_track +0002189c b command +000218a0 B do_hd +000218c0 B hd_info +000218f0 b recalibrate +000218f4 b reset +000218f8 b NR_HD +00021900 b hd +00021950 B rd_length +00021954 b cr_flag.1923 +00021960 B beepcount +00021964 b video_type +00021968 b video_num_columns +0002196c b video_size_row +00021970 b video_num_lines +00021974 b video_page +00021978 b video_mem_start +0002197c b video_mem_end +00021980 b video_port_reg +00021982 b video_port_val +00021984 b video_erase_char +00021988 b origin +0002198c b scr_end +00021990 b pos +00021994 b x +00021998 b y +0002199c b top +000219a0 b bottom +000219a4 b state +000219a8 b npar +000219c0 b par +00021a00 b ques +00021a04 b saved_x +00021a08 b saved_y +00021a20 B drive_info +00021a40 B user_stack +00022a40 B hash_table +00022f20 B super_block +00023280 B file_table +00023680 B request +00023b00 B rd_start +00023b04 B _ctmp +00023b08 B errno +00023b0c B ___strtok +00023b10 B end +00023b10 B _end diff --git a/linux-0.11-lab/2/linux/System.map.2 b/linux-0.11-lab/2/linux/System.map.2 new file mode 100755 index 0000000..44e841e --- /dev/null +++ b/linux-0.11-lab/2/linux/System.map.2 @@ -0,0 +1,1075 @@ +Archive member included to satisfy reference by file (symbol) + +kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + fs/fs.o (ll_rw_block) +kernel/blk_drv/blk_drv.a(floppy.o) + kernel/kernel.o (do_floppy) +kernel/blk_drv/blk_drv.a(hd.o) + kernel/kernel.o (do_hd) +kernel/blk_drv/blk_drv.a(ramdisk.o) + kernel/blk_drv/blk_drv.a(hd.o) (rd_load) +kernel/chr_drv/chr_drv.a(tty_io.o) + kernel/kernel.o (tty_table) +kernel/chr_drv/chr_drv.a(console.o) + kernel/chr_drv/chr_drv.a(tty_io.o) (con_write) +kernel/chr_drv/chr_drv.a(keyboard.2.o) + kernel/chr_drv/chr_drv.a(console.o) (keyboard_interrupt) +kernel/chr_drv/chr_drv.a(serial.o) + kernel/chr_drv/chr_drv.a(tty_io.o) (rs_init) +kernel/chr_drv/chr_drv.a(rs_io.o) + kernel/chr_drv/chr_drv.a(serial.o) (rs1_interrupt) +kernel/chr_drv/chr_drv.a(tty_ioctl.o) + fs/fs.o (tty_ioctl) +kernel/math/math.a(math_emulate.o) + kernel/kernel.o (math_emulate) +lib/lib.a(ctype.o) kernel/chr_drv/chr_drv.a(tty_io.o) (_ctmp) +lib/lib.a(_exit.o) init/main.o (_exit) +lib/lib.a(open.o) init/main.o (open) +lib/lib.a(close.o) init/main.o (close) +lib/lib.a(errno.o) init/main.o (errno) +lib/lib.a(write.o) init/main.o (write) +lib/lib.a(dup.o) init/main.o (dup) +lib/lib.a(setsid.o) init/main.o (setsid) +lib/lib.a(execve.o) init/main.o (execve) +lib/lib.a(wait.o) init/main.o (wait) +lib/lib.a(string.o) fs/fs.o (strncpy) + +分配公共符号 +公共符号 大小 文件 + +errno 0x4 lib/lib.a(errno.o) +hash_table 0x4cc fs/fs.o +___strtok 0x4 lib/lib.a(string.o) +rd_start 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) +request 0x480 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) +user_stack 0x1000 kernel/kernel.o +_ctmp 0x1 lib/lib.a(ctype.o) +super_block 0x360 fs/fs.o +drive_info 0x20 init/main.o +file_table 0x400 fs/fs.o + +Discarded input sections + + .note.GNU-stack + 0x0000000000000000 0x0 init/main.o + .note.GNU-stack + 0x0000000000000000 0x0 kernel/kernel.o + .note.GNU-stack + 0x0000000000000000 0x0 mm/mm.o + .note.GNU-stack + 0x0000000000000000 0x0 fs/fs.o + .note.GNU-stack + 0x0000000000000000 0x0 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/blk_drv/blk_drv.a(floppy.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/blk_drv/blk_drv.a(hd.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/blk_drv/blk_drv.a(ramdisk.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/chr_drv/chr_drv.a(tty_io.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/chr_drv/chr_drv.a(console.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .note.GNU-stack + 0x0000000000000000 0x0 kernel/math/math.a(math_emulate.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(ctype.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(_exit.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(open.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(close.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(errno.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(write.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(dup.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(setsid.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(execve.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(wait.o) + .note.GNU-stack + 0x0000000000000000 0x0 lib/lib.a(string.o) + +内存配置 + +名称 来源 长度 属性 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +段 .text 的地址设置为 0x0 +LOAD boot/head.o +LOAD init/main.o +LOAD kernel/kernel.o +LOAD mm/mm.o +LOAD fs/fs.o +LOAD kernel/blk_drv/blk_drv.a +LOAD kernel/chr_drv/chr_drv.a +LOAD kernel/math/math.a +LOAD lib/lib.a + 0x0000000008048000 PROVIDE (__executable_start, 0x8048000) + 0x0000000008048074 . = (0x8048000 + SIZEOF_HEADERS) + +.interp + *(.interp) + +.note.gnu.build-id + *(.note.gnu.build-id) + +.hash + *(.hash) + +.gnu.hash + *(.gnu.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rel.text 0x0000000008048074 0x0 + *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) + .rel.text 0x0000000000000000 0x0 boot/head.o + +.rel.fini + *(.rel.fini) + +.rel.rodata + *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) + +.rel.data.rel.ro + *(.rel.data.rel.ro .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*) + +.rel.data 0x0000000008048074 0x0 + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + .rel.data 0x0000000000000000 0x0 boot/head.o + +.rel.tdata + *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) + +.rel.tbss + *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) + +.rel.ctors + *(.rel.ctors) + +.rel.dtors + *(.rel.dtors) + +.rel.got + *(.rel.got) + +.rel.bss + *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) + +.rel.ifunc + *(.rel.ifunc) + +.rel.plt 0x0000000008048074 0x0 + *(.rel.plt) + 0x0000000008048074 PROVIDE (__rel_iplt_start, .) + *(.rel.iplt) + .rel.iplt 0x0000000000000000 0x0 boot/head.o + 0x0000000008048074 PROVIDE (__rel_iplt_end, .) + +.init + *(SORT(.init)) + +.plt 0x0000000008048080 0x0 + *(.plt) + *(.iplt) + .iplt 0x0000000000000000 0x0 boot/head.o + +.text 0x0000000000000000 0x17cef + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + .text 0x0000000000000000 0x64c0 boot/head.o + 0x0000000000000000 startup_32 + 0x0000000000000000 pg_dir + 0x0000000000005000 tmp_floppy_area + 0x00000000000054c0 idt + 0x0000000000005cc0 gdt + .text 0x00000000000064c0 0x713 init/main.o + 0x00000000000064c0 fork + 0x00000000000064ef pause + 0x000000000000651e setup + 0x0000000000006555 sync + 0x0000000000006799 main + 0x000000000000695b init + *fill* 0x0000000000006bd3 0x1 + .text 0x0000000000006bd4 0x3914 kernel/kernel.o + 0x0000000000006bd4 show_task + 0x0000000000006c59 show_stat + 0x0000000000006c9f math_state_restore + 0x0000000000006cfd schedule + 0x0000000000006eaf sys_pause + 0x0000000000006ec5 sleep_on + 0x0000000000006f24 interruptible_sleep_on + 0x0000000000006fb7 wake_up + 0x0000000000006fdf ticks_to_floppy_on + 0x00000000000070aa floppy_on + 0x00000000000070d9 floppy_off + 0x00000000000070e9 do_floppy_timer + 0x00000000000071bd add_timer + 0x00000000000072e1 do_timer + 0x00000000000073d0 sys_alarm + 0x000000000000744f sys_getpid + 0x000000000000745b sys_getppid + 0x0000000000007467 sys_getuid + 0x0000000000007476 sys_geteuid + 0x0000000000007486 sys_getgid + 0x0000000000007496 sys_getegid + 0x00000000000074a5 sys_nice + 0x00000000000074d0 sched_init + 0x0000000000007674 system_call + 0x00000000000076f0 coprocessor_error + 0x0000000000007712 device_not_available + 0x000000000000774c timer_interrupt + 0x0000000000007784 sys_execve + 0x0000000000007794 sys_fork + 0x00000000000077ac hd_interrupt + 0x00000000000077e8 floppy_interrupt + 0x000000000000781e parallel_interrupt + 0x0000000000007a39 do_double_fault + 0x0000000000007a5c do_general_protection + 0x0000000000007a7f do_divide_error + 0x0000000000007aa2 do_int3 + 0x0000000000007b6a do_nmi + 0x0000000000007b8d do_debug + 0x0000000000007bb0 do_overflow + 0x0000000000007bd3 do_bounds + 0x0000000000007bf6 do_invalid_op + 0x0000000000007c19 do_device_not_available + 0x0000000000007c3c do_coprocessor_segment_overrun + 0x0000000000007c5f do_invalid_TSS + 0x0000000000007c82 do_segment_not_present + 0x0000000000007ca5 do_stack_segment + 0x0000000000007cc8 do_coprocessor_error + 0x0000000000007cfc do_reserved + 0x0000000000007d1f trap_init + 0x0000000000008003 divide_error + 0x0000000000008038 debug + 0x000000000000803f nmi + 0x0000000000008046 int3 + 0x000000000000804d overflow + 0x0000000000008054 bounds + 0x000000000000805b invalid_op + 0x0000000000008062 coprocessor_segment_overrun + 0x0000000000008069 reserved + 0x0000000000008070 irq13 + 0x0000000000008085 double_fault + 0x00000000000080bc invalid_TSS + 0x00000000000080c3 segment_not_present + 0x00000000000080ca stack_segment + 0x00000000000080d1 general_protection + 0x000000000000810a verify_area + 0x0000000000008171 copy_mem + 0x00000000000082cb copy_process + 0x0000000000008778 find_empty_process + 0x000000000000880c panic + 0x0000000000008847 printk + 0x0000000000008b64 vsprintf + 0x000000000000902a sys_ftime + 0x0000000000009030 sys_break + 0x0000000000009036 sys_ptrace + 0x000000000000903c sys_stty + 0x0000000000009042 sys_gtty + 0x0000000000009048 sys_rename + 0x000000000000904e sys_prof + 0x0000000000009054 sys_setregid + 0x000000000000910d sys_setgid + 0x00000000000091a4 sys_acct + 0x00000000000091aa sys_phys + 0x00000000000091b0 sys_lock + 0x00000000000091b6 sys_mpx + 0x00000000000091bc sys_ulimit + 0x00000000000091c2 sys_time + 0x000000000000921e sys_setreuid + 0x0000000000009300 sys_setuid + 0x0000000000009395 sys_stime + 0x00000000000093eb sys_times + 0x000000000000948b sys_brk + 0x00000000000094cd sys_setpgid + 0x00000000000095a6 sys_getpgrp + 0x00000000000095b2 sys_setsid + 0x000000000000962c sys_getgroups + 0x0000000000009632 sys_setgroups + 0x0000000000009638 sys_uname + 0x00000000000096a1 sys_sethostname + 0x00000000000096a7 sys_getrlimit + 0x00000000000096ad sys_setrlimit + 0x00000000000096b3 sys_getrusage + 0x00000000000096b9 sys_gettimeofday + 0x00000000000096bf sys_settimeofday + 0x00000000000096c5 sys_umask + 0x0000000000009736 release + 0x0000000000009873 sys_kill + 0x0000000000009aad do_exit + 0x0000000000009ce1 sys_exit + 0x0000000000009cfa sys_waitpid + 0x0000000000009f52 sys_sgetmask + 0x0000000000009f5e sys_ssetmask + 0x0000000000009f8a sys_sigpending + 0x0000000000009f90 sys_sigsuspend + 0x000000000000a029 sys_signal + 0x000000000000a0ad sys_sigaction + 0x000000000000a1b7 do_signal + 0x000000000000a3a3 kernel_mktime + .text 0x000000000000a4e8 0xb01 mm/mm.o + 0x000000000000a507 get_free_page + 0x000000000000a543 free_page + 0x000000000000a5b2 free_page_tables + 0x000000000000a6b1 copy_page_tables + 0x000000000000a832 put_page + 0x000000000000a91e un_wp_page + 0x000000000000a9d6 do_wp_page + 0x000000000000aa08 write_verify + 0x000000000000aa61 get_empty_page + 0x000000000000ace7 do_no_page + 0x000000000000ae49 mem_init + 0x000000000000aebd calc_mem + 0x000000000000afb2 page_fault + .text 0x000000000000afe9 0x7539 fs/fs.o + 0x000000000000afff sys_ustat + 0x000000000000b005 sys_utime + 0x000000000000b0b2 sys_access + 0x000000000000b18e sys_chdir + 0x000000000000b202 sys_chroot + 0x000000000000b276 sys_chmod + 0x000000000000b310 sys_chown + 0x000000000000b38b sys_open + 0x000000000000b62e sys_creat + 0x000000000000b651 sys_close + 0x000000000000b720 sys_lseek + 0x000000000000b837 sys_read + 0x000000000000ba2a sys_write + 0x000000000000bc23 invalidate_inodes + 0x000000000000bc92 sync_inodes + 0x000000000000c0d5 bmap + 0x000000000000c0f8 create_block + 0x000000000000c11b iput + 0x000000000000c28a get_empty_inode + 0x000000000000c3df get_pipe_inode + 0x000000000000c454 iget + 0x000000000000c84f sys_sync + 0x000000000000c8b2 sync_dev + 0x000000000000c9ab invalidate_buffers + 0x000000000000ca1d check_disk_change + 0x000000000000cceb get_hash_table + 0x000000000000cd6d getblk + 0x000000000000cf0b brelse + 0x000000000000cf54 bread + 0x000000000000cfd9 bread_page + 0x000000000000d0fb breada + 0x000000000000d1f0 buffer_init + 0x000000000000d391 get_super + 0x000000000000d400 put_super + 0x000000000000d816 sys_umount + 0x000000000000d977 sys_mount + 0x000000000000dae8 mount_root + 0x000000000000dd1c block_write + 0x000000000000de6e block_read + 0x000000000000e1d9 rw_char + 0x000000000000e269 file_read + 0x000000000000e414 file_write + 0x000000000000e6fd sys_stat + 0x000000000000e747 sys_lstat + 0x000000000000e762 sys_fstat + 0x000000000000e7bf sys_readlink + 0x000000000000e86e sys_uselib + 0x000000000000ed3d do_execve + 0x000000000000f7f1 read_pipe + 0x000000000000f947 write_pipe + 0x000000000000fac6 sys_pipe + 0x00000000000104a5 namei + 0x00000000000105bb open_namei + 0x000000000001090e sys_mknod + 0x0000000000010b3e sys_mkdir + 0x00000000000110cd sys_rmdir + 0x0000000000011425 sys_unlink + 0x00000000000116c6 sys_symlink + 0x00000000000116cc sys_link + 0x0000000000011926 free_block + 0x0000000000011a98 new_block + 0x0000000000011c3c free_inode + 0x0000000000011da3 new_inode + 0x0000000000012057 sys_dup2 + 0x000000000001207e sys_dup + 0x0000000000012099 sys_fcntl + 0x00000000000121d8 sys_ioctl + 0x00000000000123e7 truncate + 0x000000000001251c sys_select + .text 0x0000000000012522 0x46a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x00000000000128e5 ll_rw_block + 0x000000000001293e blk_dev_init + .text 0x000000000001298c 0xb9d kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000012a72 floppy_deselect + 0x0000000000012aa9 floppy_change + 0x0000000000012e66 setup_rw_floppy + 0x00000000000130ff unexpected_floppy_interrupt + 0x00000000000134d7 floppy_init + .text 0x0000000000013529 0xc8f kernel/blk_drv/blk_drv.a(hd.o) + 0x00000000000135fd sys_setup + 0x0000000000013cac unexpected_hd_interrupt + 0x000000000001413e hd_init + .text 0x00000000000141b8 0x50c kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x00000000000143c2 rd_init + 0x0000000000014418 rd_load + .text 0x00000000000146c4 0xcbb kernel/chr_drv/chr_drv.a(tty_io.o) + 0x00000000000146ea tty_init + 0x00000000000146fb tty_intr + 0x0000000000014808 wait_for_keypress + 0x000000000001481b copy_to_cooked + 0x0000000000014dd6 tty_read + 0x0000000000015144 tty_write + 0x0000000000015356 do_tty_interrupt + 0x000000000001537e chr_dev_init + .text 0x000000000001537f 0x1283 kernel/chr_drv/chr_drv.a(console.o) + 0x000000000001591c csi_m + 0x0000000000015cb6 con_write + 0x0000000000016344 con_init + 0x000000000001657b sysbeepstop + .text 0x0000000000016602 0x7e2 kernel/chr_drv/chr_drv.a(keyboard.2.o) + 0x0000000000016605 keyboard_interrupt + .text 0x0000000000016de4 0x145 kernel/chr_drv/chr_drv.a(serial.o) + 0x0000000000016e59 rs_init + 0x0000000000016edc rs_write + *fill* 0x0000000000016f29 0x3 + .text 0x0000000000016f2c 0xf7 kernel/chr_drv/chr_drv.a(rs_io.o) + 0x0000000000016f2c rs1_interrupt + 0x0000000000016f34 rs2_interrupt + .text 0x0000000000017023 0x60f kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x0000000000017334 tty_ioctl + .text 0x0000000000017632 0x111 kernel/math/math.a(math_emulate.o) + 0x0000000000017640 math_emulate + 0x0000000000017723 math_error + .text 0x0000000000017743 0x0 lib/lib.a(ctype.o) + .text 0x0000000000017743 0x10 lib/lib.a(_exit.o) + 0x0000000000017743 _exit + .text 0x0000000000017753 0x49 lib/lib.a(open.o) + 0x0000000000017753 open + .text 0x000000000001779c 0x37 lib/lib.a(close.o) + 0x000000000001779c close + .text 0x00000000000177d3 0x0 lib/lib.a(errno.o) + .text 0x00000000000177d3 0x3d lib/lib.a(write.o) + 0x00000000000177d3 write + .text 0x0000000000017810 0x37 lib/lib.a(dup.o) + 0x0000000000017810 dup + .text 0x0000000000017847 0x2f lib/lib.a(setsid.o) + 0x0000000000017847 setsid + .text 0x0000000000017876 0x3d lib/lib.a(execve.o) + 0x0000000000017876 execve + .text 0x00000000000178b3 0x60 lib/lib.a(wait.o) + 0x00000000000178b3 waitpid + 0x00000000000178f0 wait + .text 0x0000000000017913 0x3dc lib/lib.a(string.o) + 0x0000000000017913 strcpy + 0x000000000001792f strncpy + 0x0000000000017954 strcat + 0x000000000001797f strncat + 0x00000000000179b4 strcmp + 0x00000000000179db strncmp + 0x0000000000017a09 strchr + 0x0000000000017a36 strrchr + 0x0000000000017a65 strspn + 0x0000000000017aa2 strcspn + 0x0000000000017adf strpbrk + 0x0000000000017b16 strstr + 0x0000000000017b4f strlen + 0x0000000000017b72 strtok + 0x0000000000017bf5 memcpy + 0x0000000000017c15 memmove + 0x0000000000017c69 memcmp + 0x0000000000017c93 memchr + 0x0000000000017ccb memset + *(.gnu.warning) + +.fini + *(SORT(.fini)) + 0x0000000000017cef PROVIDE (__etext, .) + 0x0000000000017cef PROVIDE (_etext, .) + 0x0000000000017cef PROVIDE (etext, .) + +.rodata 0x0000000000017cf0 0x13ca + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata 0x0000000000017cf0 0xad init/main.o + *fill* 0x0000000000017d9d 0x3 + .rodata 0x0000000000017da0 0x438 kernel/kernel.o + .rodata 0x00000000000181d8 0x18f mm/mm.o + *fill* 0x0000000000018367 0x1 + .rodata 0x0000000000018368 0x62c fs/fs.o + .rodata 0x0000000000018994 0x7a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + *fill* 0x0000000000018a0e 0x2 + .rodata 0x0000000000018a10 0x133 kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x0000000000018b43 0x1 + .rodata 0x0000000000018b44 0x19b kernel/blk_drv/blk_drv.a(hd.o) + *fill* 0x0000000000018cdf 0x1 + .rodata 0x0000000000018ce0 0x188 kernel/blk_drv/blk_drv.a(ramdisk.o) + .rodata 0x0000000000018e68 0x17d kernel/chr_drv/chr_drv.a(console.o) + *fill* 0x0000000000018fe5 0x3 + .rodata 0x0000000000018fe8 0x80 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .rodata 0x0000000000019068 0x52 kernel/math/math.a(math_emulate.o) + +.rodata1 + *(.rodata1) + +.eh_frame_hdr + *(.eh_frame_hdr) + +.eh_frame 0x00000000000190bc 0x2a6c + *(.eh_frame) + .eh_frame 0x00000000000190bc 0xf0 init/main.o + .eh_frame 0x00000000000191ac 0xb04 kernel/kernel.o + 0xbf4 (size before relaxing) + .eh_frame 0x0000000000019cb0 0x194 mm/mm.o + 0x1ac (size before relaxing) + .eh_frame 0x0000000000019e44 0xdd8 fs/fs.o + 0xf70 (size before relaxing) + .eh_frame 0x000000000001ac1c 0x98 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000001acb4 0x23c kernel/blk_drv/blk_drv.a(floppy.o) + 0x254 (size before relaxing) + .eh_frame 0x000000000001aef0 0x1e8 kernel/blk_drv/blk_drv.a(hd.o) + 0x200 (size before relaxing) + .eh_frame 0x000000000001b0d8 0xac kernel/blk_drv/blk_drv.a(ramdisk.o) + 0xc4 (size before relaxing) + .eh_frame 0x000000000001b184 0x12c kernel/chr_drv/chr_drv.a(tty_io.o) + 0x144 (size before relaxing) + .eh_frame 0x000000000001b2b0 0x2c0 kernel/chr_drv/chr_drv.a(console.o) + 0x2d8 (size before relaxing) + .eh_frame 0x000000000001b570 0x54 kernel/chr_drv/chr_drv.a(serial.o) + 0x6c (size before relaxing) + .eh_frame 0x000000000001b5c4 0x148 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x160 (size before relaxing) + .eh_frame 0x000000000001b70c 0x5c kernel/math/math.a(math_emulate.o) + 0x74 (size before relaxing) + .eh_frame 0x000000000001b768 0x1c lib/lib.a(_exit.o) + 0x34 (size before relaxing) + .eh_frame 0x000000000001b784 0x24 lib/lib.a(open.o) + 0x3c (size before relaxing) + .eh_frame 0x000000000001b7a8 0x20 lib/lib.a(close.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001b7c8 0x20 lib/lib.a(write.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001b7e8 0x20 lib/lib.a(dup.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001b808 0x18 lib/lib.a(setsid.o) + 0x30 (size before relaxing) + .eh_frame 0x000000000001b820 0x20 lib/lib.a(execve.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001b840 0x38 lib/lib.a(wait.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000001b878 0x2b0 lib/lib.a(string.o) + 0x2c8 (size before relaxing) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.exception_ranges + *(.exception_ranges .exception_ranges*) + 0x000000000001bb28 . = . + +.eh_frame + *(.eh_frame) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.exception_ranges + *(.exception_ranges .exception_ranges*) + +.tdata + *(.tdata .tdata.* .gnu.linkonce.td.*) + +.tbss + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + +.preinit_array 0x000000000001bb28 0x0 + 0x000000000001bb28 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x000000000001bb28 PROVIDE (__preinit_array_end, .) + +.init_array 0x000000000001bb28 0x0 + 0x000000000001bb28 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*) SORT(.ctors.*)) + *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors) + 0x000000000001bb28 PROVIDE (__init_array_end, .) + +.fini_array 0x000000000001bb28 0x0 + 0x000000000001bb28 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*) SORT(.dtors.*)) + *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors) + 0x000000000001bb28 PROVIDE (__fini_array_end, .) + +.ctors + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + +.dtors + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + +.jcr + *(.jcr) + +.data.rel.ro + *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) + *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) + +.dynamic + *(.dynamic) + +.got + *(.got) + *(.igot) + +.got.plt 0x000000000001bb28 0x0 + *(.got.plt) + *(.igot.plt) + .igot.plt 0x0000000000000000 0x0 boot/head.o + +.data 0x000000000001bb40 0x3b01 + *(.data .data.* .gnu.linkonce.d.*) + .data 0x000000000001bb40 0x0 boot/head.o + .data 0x000000000001bb40 0x28 init/main.o + *fill* 0x000000000001bb68 0x18 + .data 0x000000000001bb80 0x1310 kernel/kernel.o + 0x000000000001bb80 sys_call_table + 0x000000000001bcdc NR_syscalls + 0x000000000001cce0 current + 0x000000000001cd00 task + 0x000000000001ce00 stack_start + 0x000000000001ce08 current_DOR + .data 0x000000000001ce90 0x0 mm/mm.o + *fill* 0x000000000001ce90 0x10 + .data 0x000000000001cea0 0x60 fs/fs.o + 0x000000000001cea4 start_buffer + .data 0x000000000001cf00 0x0 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .data 0x000000000001cf00 0xcd kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x000000000001cfcd 0x3 + .data 0x000000000001cfd0 0x4 kernel/blk_drv/blk_drv.a(hd.o) + .data 0x000000000001cfd4 0x0 kernel/blk_drv/blk_drv.a(ramdisk.o) + *fill* 0x000000000001cfd4 0xc + .data 0x000000000001cfe0 0x2538 kernel/chr_drv/chr_drv.a(tty_io.o) + 0x000000000001cfe0 tty_table + 0x000000000001f500 table_list + .data 0x000000000001f518 0x1 kernel/chr_drv/chr_drv.a(console.o) + .data 0x000000000001f519 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .data 0x000000000001f519 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .data 0x000000000001f519 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + *fill* 0x000000000001f519 0x7 + .data 0x000000000001f520 0x20 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .data 0x000000000001f540 0x0 kernel/math/math.a(math_emulate.o) + .data 0x000000000001f540 0x101 lib/lib.a(ctype.o) + 0x000000000001f540 _ctype + .data 0x000000000001f641 0x0 lib/lib.a(_exit.o) + .data 0x000000000001f641 0x0 lib/lib.a(open.o) + .data 0x000000000001f641 0x0 lib/lib.a(close.o) + .data 0x000000000001f641 0x0 lib/lib.a(errno.o) + .data 0x000000000001f641 0x0 lib/lib.a(write.o) + .data 0x000000000001f641 0x0 lib/lib.a(dup.o) + .data 0x000000000001f641 0x0 lib/lib.a(setsid.o) + .data 0x000000000001f641 0x0 lib/lib.a(execve.o) + .data 0x000000000001f641 0x0 lib/lib.a(wait.o) + .data 0x000000000001f641 0x0 lib/lib.a(string.o) + +.data1 + *(.data1) + 0x000000000001f641 _edata = . + 0x000000000001f641 PROVIDE (edata, .) + 0x000000000001f641 . = . + 0x000000000001f641 __bss_start = . + +.bss 0x000000000001f660 0x44b0 + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + .bss 0x000000000001f660 0x0 boot/head.o + .bss 0x000000000001f660 0x40c init/main.o + *fill* 0x000000000001fa6c 0x14 + .bss 0x000000000001fa80 0x760 kernel/kernel.o + 0x000000000001fa80 jiffies + 0x000000000001fa84 startup_time + 0x000000000001fa88 last_task_used_math + 0x000000000001fdc4 last_pid + .bss 0x00000000000201e0 0xf20 mm/mm.o + .bss 0x0000000000021100 0x710 fs/fs.o + 0x0000000000021100 inode_table + 0x0000000000021800 nr_buffers + 0x000000000002180c ROOT_DEV + *fill* 0x0000000000021810 0x10 + .bss 0x0000000000021820 0x58 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000021820 wait_for_request + 0x0000000000021840 blk_dev + .bss 0x0000000000021878 0x25 kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000021878 do_floppy + 0x000000000002187c selected + 0x0000000000021880 wait_on_floppy_select + *fill* 0x000000000002189d 0x3 + .bss 0x00000000000218a0 0xb0 kernel/blk_drv/blk_drv.a(hd.o) + 0x00000000000218a0 do_hd + 0x00000000000218c0 hd_info + .bss 0x0000000000021950 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000021950 rd_length + .bss 0x0000000000021954 0x4 kernel/chr_drv/chr_drv.a(tty_io.o) + *fill* 0x0000000000021958 0x8 + .bss 0x0000000000021960 0xac kernel/chr_drv/chr_drv.a(console.o) + 0x0000000000021960 beepcount + .bss 0x0000000000021a0c 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .bss 0x0000000000021a0c 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .bss 0x0000000000021a0c 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + .bss 0x0000000000021a0c 0x0 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .bss 0x0000000000021a0c 0x0 kernel/math/math.a(math_emulate.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(ctype.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(_exit.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(open.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(close.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(errno.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(write.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(dup.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(setsid.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(execve.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(wait.o) + .bss 0x0000000000021a0c 0x0 lib/lib.a(string.o) + *(COMMON) + *fill* 0x0000000000021a0c 0x14 + COMMON 0x0000000000021a20 0x20 init/main.o + 0x0000000000021a20 drive_info + COMMON 0x0000000000021a40 0x1000 kernel/kernel.o + 0x0000000000021a40 user_stack + COMMON 0x0000000000022a40 0xc40 fs/fs.o + 0x0000000000022a40 hash_table + 0x0000000000022f20 super_block + 0x0000000000023280 file_table + COMMON 0x0000000000023680 0x480 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000023680 request + COMMON 0x0000000000023b00 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000023b00 rd_start + COMMON 0x0000000000023b04 0x1 lib/lib.a(ctype.o) + 0x0000000000023b04 _ctmp + *fill* 0x0000000000023b05 0x3 + COMMON 0x0000000000023b08 0x4 lib/lib.a(errno.o) + 0x0000000000023b08 errno + COMMON 0x0000000000023b0c 0x4 lib/lib.a(string.o) + 0x0000000000023b0c ___strtok + 0x0000000000023b10 . = ALIGN ((. != 0x0)?0x4:0x1) + 0x0000000000023b10 . = ALIGN (0x4) + 0x0000000000023b10 . = SEGMENT_START ("ldata-segment", .) + 0x0000000000023b10 . = ALIGN (0x4) + 0x0000000000023b10 _end = . + 0x0000000000023b10 PROVIDE (end, .) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x0000000000000000 0x29 + *(.comment) + .comment 0x0000000000000000 0x29 init/main.o + 0x2a (size before relaxing) + .comment 0x0000000000000000 0x1a4 kernel/kernel.o + .comment 0x0000000000000000 0x2a mm/mm.o + .comment 0x0000000000000000 0x2f4 fs/fs.o + .comment 0x0000000000000000 0x2a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .comment 0x0000000000000000 0x2a kernel/blk_drv/blk_drv.a(floppy.o) + .comment 0x0000000000000000 0x2a kernel/blk_drv/blk_drv.a(hd.o) + .comment 0x0000000000000000 0x2a kernel/blk_drv/blk_drv.a(ramdisk.o) + .comment 0x0000000000000000 0x2a kernel/chr_drv/chr_drv.a(tty_io.o) + .comment 0x0000000000000000 0x2a kernel/chr_drv/chr_drv.a(console.o) + .comment 0x0000000000000000 0x2a kernel/chr_drv/chr_drv.a(serial.o) + .comment 0x0000000000000000 0x2a kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .comment 0x0000000000000000 0x2a kernel/math/math.a(math_emulate.o) + .comment 0x0000000000000000 0x2a lib/lib.a(ctype.o) + .comment 0x0000000000000000 0x2a lib/lib.a(_exit.o) + .comment 0x0000000000000000 0x2a lib/lib.a(open.o) + .comment 0x0000000000000000 0x2a lib/lib.a(close.o) + .comment 0x0000000000000000 0x2a lib/lib.a(errno.o) + .comment 0x0000000000000000 0x2a lib/lib.a(write.o) + .comment 0x0000000000000000 0x2a lib/lib.a(dup.o) + .comment 0x0000000000000000 0x2a lib/lib.a(setsid.o) + .comment 0x0000000000000000 0x2a lib/lib.a(execve.o) + .comment 0x0000000000000000 0x2a lib/lib.a(wait.o) + .comment 0x0000000000000000 0x2a lib/lib.a(string.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x0000000000000000 0x628 + *(.debug_aranges) + .debug_aranges + 0x0000000000000000 0x20 init/main.o + .debug_aranges + 0x0000000000000020 0x140 kernel/kernel.o + .debug_aranges + 0x0000000000000160 0x20 mm/mm.o + .debug_aranges + 0x0000000000000180 0x238 fs/fs.o + .debug_aranges + 0x00000000000003b8 0x20 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_aranges + 0x00000000000003d8 0x20 kernel/blk_drv/blk_drv.a(floppy.o) + .debug_aranges + 0x00000000000003f8 0x20 kernel/blk_drv/blk_drv.a(hd.o) + .debug_aranges + 0x0000000000000418 0x20 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_aranges + 0x0000000000000438 0x20 kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_aranges + 0x0000000000000458 0x20 kernel/chr_drv/chr_drv.a(console.o) + .debug_aranges + 0x0000000000000478 0x20 kernel/chr_drv/chr_drv.a(serial.o) + .debug_aranges + 0x0000000000000498 0x20 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_aranges + 0x00000000000004b8 0x20 kernel/math/math.a(math_emulate.o) + .debug_aranges + 0x00000000000004d8 0x18 lib/lib.a(ctype.o) + .debug_aranges + 0x00000000000004f0 0x20 lib/lib.a(_exit.o) + .debug_aranges + 0x0000000000000510 0x20 lib/lib.a(open.o) + .debug_aranges + 0x0000000000000530 0x20 lib/lib.a(close.o) + .debug_aranges + 0x0000000000000550 0x18 lib/lib.a(errno.o) + .debug_aranges + 0x0000000000000568 0x20 lib/lib.a(write.o) + .debug_aranges + 0x0000000000000588 0x20 lib/lib.a(dup.o) + .debug_aranges + 0x00000000000005a8 0x20 lib/lib.a(setsid.o) + .debug_aranges + 0x00000000000005c8 0x20 lib/lib.a(execve.o) + .debug_aranges + 0x00000000000005e8 0x20 lib/lib.a(wait.o) + .debug_aranges + 0x0000000000000608 0x20 lib/lib.a(string.o) + +.debug_pubnames + *(.debug_pubnames) + +.debug_info 0x0000000000000000 0x16d23 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x0000000000000000 0x553 init/main.o + .debug_info 0x0000000000000553 0x4cb6 kernel/kernel.o + .debug_info 0x0000000000005209 0xb2b mm/mm.o + .debug_info 0x0000000000005d34 0xa290 fs/fs.o + .debug_info 0x000000000000ffc4 0x932 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_info 0x00000000000108f6 0xc9f kernel/blk_drv/blk_drv.a(floppy.o) + .debug_info 0x0000000000011595 0xd5f kernel/blk_drv/blk_drv.a(hd.o) + .debug_info 0x00000000000122f4 0xad5 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_info 0x0000000000012dc9 0xacd kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_info 0x0000000000013896 0xdb0 kernel/chr_drv/chr_drv.a(console.o) + .debug_info 0x0000000000014646 0x85c kernel/chr_drv/chr_drv.a(serial.o) + .debug_info 0x0000000000014ea2 0xb47 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_info 0x00000000000159e9 0x7b5 kernel/math/math.a(math_emulate.o) + .debug_info 0x000000000001619e 0x66 lib/lib.a(ctype.o) + .debug_info 0x0000000000016204 0x77 lib/lib.a(_exit.o) + .debug_info 0x000000000001627b 0xd0 lib/lib.a(open.o) + .debug_info 0x000000000001634b 0x97 lib/lib.a(close.o) + .debug_info 0x00000000000163e2 0x36 lib/lib.a(errno.o) + .debug_info 0x0000000000016418 0xc9 lib/lib.a(write.o) + .debug_info 0x00000000000164e1 0x97 lib/lib.a(dup.o) + .debug_info 0x0000000000016578 0x95 lib/lib.a(setsid.o) + .debug_info 0x000000000001660d 0xcb lib/lib.a(execve.o) + .debug_info 0x00000000000166d8 0xed lib/lib.a(wait.o) + .debug_info 0x00000000000167c5 0x55e lib/lib.a(string.o) + +.debug_abbrev 0x0000000000000000 0x43b9 + *(.debug_abbrev) + .debug_abbrev 0x0000000000000000 0x1d3 init/main.o + .debug_abbrev 0x00000000000001d3 0xf63 kernel/kernel.o + .debug_abbrev 0x0000000000001136 0x20b mm/mm.o + .debug_abbrev 0x0000000000001341 0x19f1 fs/fs.o + .debug_abbrev 0x0000000000002d32 0x169 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_abbrev 0x0000000000002e9b 0x27d kernel/blk_drv/blk_drv.a(floppy.o) + .debug_abbrev 0x0000000000003118 0x23c kernel/blk_drv/blk_drv.a(hd.o) + .debug_abbrev 0x0000000000003354 0x1a8 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_abbrev 0x00000000000034fc 0x279 kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_abbrev 0x0000000000003775 0x26b kernel/chr_drv/chr_drv.a(console.o) + .debug_abbrev 0x00000000000039e0 0x175 kernel/chr_drv/chr_drv.a(serial.o) + .debug_abbrev 0x0000000000003b55 0x18d kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_abbrev 0x0000000000003ce2 0x163 kernel/math/math.a(math_emulate.o) + .debug_abbrev 0x0000000000003e45 0x3e lib/lib.a(ctype.o) + .debug_abbrev 0x0000000000003e83 0x51 lib/lib.a(_exit.o) + .debug_abbrev 0x0000000000003ed4 0x97 lib/lib.a(open.o) + .debug_abbrev 0x0000000000003f6b 0x75 lib/lib.a(close.o) + .debug_abbrev 0x0000000000003fe0 0x2c lib/lib.a(errno.o) + .debug_abbrev 0x000000000000400c 0xa1 lib/lib.a(write.o) + .debug_abbrev 0x00000000000040ad 0x75 lib/lib.a(dup.o) + .debug_abbrev 0x0000000000004122 0x73 lib/lib.a(setsid.o) + .debug_abbrev 0x0000000000004195 0x85 lib/lib.a(execve.o) + .debug_abbrev 0x000000000000421a 0xb6 lib/lib.a(wait.o) + .debug_abbrev 0x00000000000042d0 0xe9 lib/lib.a(string.o) + +.debug_line 0x0000000000000000 0x4599 + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x0000000000000000 0x1a7 init/main.o + .debug_line 0x00000000000001a7 0xe86 kernel/kernel.o + .debug_line 0x000000000000102d 0x274 mm/mm.o + .debug_line 0x00000000000012a1 0x1c50 fs/fs.o + .debug_line 0x0000000000002ef1 0x197 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_line 0x0000000000003088 0x24c kernel/blk_drv/blk_drv.a(floppy.o) + .debug_line 0x00000000000032d4 0x2bf kernel/blk_drv/blk_drv.a(hd.o) + .debug_line 0x0000000000003593 0x160 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_line 0x00000000000036f3 0x33b kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_line 0x0000000000003a2e 0x3ab kernel/chr_drv/chr_drv.a(console.o) + .debug_line 0x0000000000003dd9 0xd9 kernel/chr_drv/chr_drv.a(serial.o) + .debug_line 0x0000000000003eb2 0x1db kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_line 0x000000000000408d 0xe1 kernel/math/math.a(math_emulate.o) + .debug_line 0x000000000000416e 0x28 lib/lib.a(ctype.o) + .debug_line 0x0000000000004196 0x39 lib/lib.a(_exit.o) + .debug_line 0x00000000000041cf 0x62 lib/lib.a(open.o) + .debug_line 0x0000000000004231 0x5c lib/lib.a(close.o) + .debug_line 0x000000000000428d 0x28 lib/lib.a(errno.o) + .debug_line 0x00000000000042b5 0x76 lib/lib.a(write.o) + .debug_line 0x000000000000432b 0x5a lib/lib.a(dup.o) + .debug_line 0x0000000000004385 0x77 lib/lib.a(setsid.o) + .debug_line 0x00000000000043fc 0x5d lib/lib.a(execve.o) + .debug_line 0x0000000000004459 0x7a lib/lib.a(wait.o) + .debug_line 0x00000000000044d3 0xc6 lib/lib.a(string.o) + +.debug_frame + *(.debug_frame) + +.debug_str 0x0000000000000000 0x2093 + *(.debug_str) + .debug_str 0x0000000000000000 0x1c0 init/main.o + 0x1ff (size before relaxing) + .debug_str 0x00000000000001c0 0xac0 kernel/kernel.o + 0x2332 (size before relaxing) + .debug_str 0x0000000000000c80 0x185 mm/mm.o + 0x4e0 (size before relaxing) + .debug_str 0x0000000000000e05 0x904 fs/fs.o + 0x49ab (size before relaxing) + .debug_str 0x0000000000001709 0xf0 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x491 (size before relaxing) + .debug_str 0x00000000000017f9 0x1cf kernel/blk_drv/blk_drv.a(floppy.o) + 0x673 (size before relaxing) + .debug_str 0x00000000000019c8 0x15e kernel/blk_drv/blk_drv.a(hd.o) + 0x5e8 (size before relaxing) + .debug_str 0x0000000000001b26 0x43 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x58a (size before relaxing) + .debug_str 0x0000000000001b69 0xfb kernel/chr_drv/chr_drv.a(tty_io.o) + 0x4e3 (size before relaxing) + .debug_str 0x0000000000001c64 0x1b9 kernel/chr_drv/chr_drv.a(console.o) + 0x5b7 (size before relaxing) + .debug_str 0x0000000000001e1d 0x1a kernel/chr_drv/chr_drv.a(serial.o) + 0x3fc (size before relaxing) + .debug_str 0x0000000000001e37 0x8b kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x4a7 (size before relaxing) + .debug_str 0x0000000000001ec2 0x70 kernel/math/math.a(math_emulate.o) + 0x392 (size before relaxing) + .debug_str 0x0000000000001f32 0x8d lib/lib.a(ctype.o) + 0xb6 (size before relaxing) + .debug_str 0x0000000000001fbf 0x8 lib/lib.a(_exit.o) + 0xe2 (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(open.o) + 0xf2 (size before relaxing) + .debug_str 0x0000000000001fc7 0x8 lib/lib.a(close.o) + 0xe4 (size before relaxing) + .debug_str 0x0000000000001fcf 0x8 lib/lib.a(errno.o) + 0x93 (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(write.o) + 0xf0 (size before relaxing) + .debug_str 0x0000000000001fd7 0x6 lib/lib.a(dup.o) + 0xdc (size before relaxing) + .debug_str 0x0000000000001fdd 0x9 lib/lib.a(setsid.o) + 0xec (size before relaxing) + .debug_str 0x0000000000001fe6 0x9 lib/lib.a(execve.o) + 0xf5 (size before relaxing) + .debug_str 0x0000000000001fef 0x11 lib/lib.a(wait.o) + 0x102 (size before relaxing) + .debug_str 0x0000000000002000 0x93 lib/lib.a(string.o) + 0x147 (size before relaxing) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges 0x0000000000000000 0x18 + *(.debug_ranges) + .debug_ranges 0x0000000000000000 0x18 init/main.o + +.debug_macro + *(.debug_macro) + +.gnu.attributes + *(.gnu.attributes) + +/DISCARD/ + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) +OUTPUT(tools/system elf32-i386) diff --git a/linux-0.11-lab/2/linux/boot/bootsect b/linux-0.11-lab/2/linux/boot/bootsect new file mode 100755 index 0000000000000000000000000000000000000000..4fbb8f823afe23687f1887d48deeb19fdcf83049 GIT binary patch literal 544 zcmZQ%7GP0e00JfufdrZ$>>UT#`)=%Dn9z4%Cj+DAH_iW_m%fre~uHUSwNXN9*i=ymehGJ;Ln!ff#WtiVnQ zhTZH8d+ix_Fbba)*ufysci@E)!;7N~dJF$B+A=VditBaD0d;UNHUH)>;o2bsq=ibD zUjNfu{D<)s1B1c@RhzFW-(_8 zyWs)N8wX!-zAym_G6SXbtl4ZCONDkYGHA2SVkl+#&o+l)@hk?z1B+)cfHa*h-qdq| z733tt+pm`g1P2Cni_Kx^=9|Ib*m1R6Y!*YuwM`6-j~E!Y0DW7;8WkBGaTw@dps&vg zgE+6x1nv67yn*3e)L{k&UM`>f#FWgubcN!|;*!){1wB1IUM^lPq<|j0Og84wRRH+h BgWdoD literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/boot/bootsect.o b/linux-0.11-lab/2/linux/boot/bootsect.o new file mode 100755 index 0000000000000000000000000000000000000000..e35422ec017a165928bfcbec5f9f0363b4a9e75c GIT binary patch literal 923 zcmYjPe@GKy7=FH+PB$=@gOrLGSb;@HGl?KZQ#V8qHK&qRjLn^EOg*`~_2a*bAQEj2 z`bR7R8DjO1Ax5YD;D!W64T2~X>5mFT9P~#*1c~eYW`BB3fn$y+MeVjqc)FB7D{5ZwQc zlnx;W9UDX^enV$llvLXoyfYO9Z}$=84ic;$V`O7tS=LmkPeZ`p+0`EKHzCjy2sHQl zw}lpeD-uHysXwTY5sDOw1Y=|-4_TXAn>%^rd%=iw84Yc11;O9ydW>fq~$ltjP-a7_y>584mLI>~!sq4M`D5Ly@qm@(>AWA%vwU zr%{<_+X|nde;^cvTBwf1Bxp*gFV1T;>8i$^g?NcKSG5q0@!xcE+`au;IbOSyoY+a~ z{!PR`f4ixx+SO^8CCMcNsiZj%R`aVSzcIBg=v7dW8hevmN}95U=#^i zr)no|09j{lb(WIStn(?vkzMq|I|{AlEXVU%$9xr@m*6E`j|&EKW*r6`Npr0hYp)?r zZZZ#$s1!#JP?cts3OD|gYj$Hl#R^TxZHehkwhp*b#dJ@BG4oNrJhA0o88bcbDr`}l zq`HQqR(%{jBbm%s8(UUwT8Z1NS<0;0*6J{lvGC1C@wAnkO^FJFf$S6TC5rM^{XXi` zL>k>@nq232gLmrem|4t+bg$&5+XH7iM)#1fVRRQc{Pnj!5uJed*5_GV{{}WkC!rMg z_MAVrNM}JOl67*Dd*89})A9sAdKZB*dkfv2*ih7^UQ;z`&?SnZugqR%-#z8CTDl%r F<1c(7E-?TA literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/boot/bootsect.s b/linux-0.11-lab/2/linux/boot/bootsect.s new file mode 100755 index 0000000..711f103 --- /dev/null +++ b/linux-0.11-lab/2/linux/boot/bootsect.s @@ -0,0 +1,260 @@ +! +! SYS_SIZE is the number of clicks (16 bytes) to be loaded. +! 0x3000 is 0x30000 bytes = 196kB, more than enough for current +! versions of linux +! +SYSSIZE = 0x3000 +! +! bootsect.s (C) 1991 Linus Torvalds +! +! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves +! iself out of the way to address 0x90000, and jumps there. +! +! It then loads 'setup' directly after itself (0x90200), and the system +! at 0x10000, using BIOS interrupts. +! +! NOTE! currently system is at most 8*65536 bytes long. This should be no +! problem, even in the future. I want to keep it simple. This 512 kB +! kernel size should be enough, especially as this doesn't contain the +! buffer cache as in minix +! +! The loader has been made as simple as possible, and continuos +! read errors will result in a unbreakable loop. Reboot by hand. It +! loads pretty fast by getting whole sectors at a time whenever possible. + +.globl begtext, begdata, begbss, endtext, enddata, endbss +.text +begtext: +.data +begdata: +.bss +begbss: +.text + +SETUPLEN = 4 ! nr of setup-sectors +BOOTSEG = 0x07c0 ! original address of boot-sector +INITSEG = 0x9000 ! we move boot here - out of the way +SETUPSEG = 0x9020 ! setup starts here +SYSSEG = 0x1000 ! system loaded at 0x10000 (65536). +ENDSEG = SYSSEG + SYSSIZE ! where to stop loading + +! ROOT_DEV: 0x000 - same type of floppy as boot. +! 0x301 - first partition on first drive etc +ROOT_DEV = 0x306 + +entry start +start: + mov ax,#BOOTSEG + mov ds,ax + mov ax,#INITSEG + mov es,ax + mov cx,#256 + sub si,si + sub di,di + rep + movw + jmpi go,INITSEG +go: mov ax,cs + mov ds,ax + mov es,ax +! put stack at 0x9ff00. + mov ss,ax + mov sp,#0xFF00 ! arbitrary value >>512 + +! load the setup-sectors directly after the bootblock. +! Note that 'es' is already set up. + +load_setup: + mov dx,#0x0000 ! drive 0, head 0 + mov cx,#0x0002 ! sector 2, track 0 + mov bx,#0x0200 ! address = 512, in INITSEG + mov ax,#0x0200+SETUPLEN ! service 2, nr of sectors + int 0x13 ! read it + jnc ok_load_setup ! ok - continue + mov dx,#0x0000 + mov ax,#0x0000 ! reset the diskette + int 0x13 + j load_setup + +ok_load_setup: + +! Get disk drive parameters, specifically nr of sectors/track + + mov dl,#0x00 + mov ax,#0x0800 ! AH=8 is get drive parameters + int 0x13 + mov ch,#0x00 + seg cs + mov sectors,cx + mov ax,#INITSEG + mov es,ax + +! Print some inane message + + mov ah,#0x03 ! read cursor pos + xor bh,bh + int 0x10 + + mov cx,#24 + mov bx,#0x0007 ! page 0, attribute 7 (normal) + mov bp,#msg1 + mov ax,#0x1301 ! write string, move cursor + int 0x10 + +! ok, we've written the message, now +! we want to load the system (at 0x10000) + + mov ax,#SYSSEG + mov es,ax ! segment of 0x010000 + call read_it + call kill_motor + +! After that we check which root-device to use. If the device is +! defined (!= 0), nothing is done and the given device is used. +! Otherwise, either /dev/PS0 (2,28) or /dev/at0 (2,8), depending +! on the number of sectors that the BIOS reports currently. + + seg cs + mov ax,root_dev + cmp ax,#0 + jne root_defined + seg cs + mov bx,sectors + mov ax,#0x0208 ! /dev/ps0 - 1.2Mb + cmp bx,#15 + je root_defined + mov ax,#0x021c ! /dev/PS0 - 1.44Mb + cmp bx,#18 + je root_defined +undef_root: + jmp undef_root +root_defined: + seg cs + mov root_dev,ax + +! after that (everyting loaded), we jump to +! the setup-routine loaded directly after +! the bootblock: + + jmpi 0,SETUPSEG + +! This routine loads the system at address 0x10000, making sure +! no 64kB boundaries are crossed. We try to load it as fast as +! possible, loading whole tracks whenever we can. +! +! in: es - starting address segment (normally 0x1000) +! +sread: .word 1+SETUPLEN ! sectors read of current track +head: .word 0 ! current head +track: .word 0 ! current track + +read_it: + mov ax,es + test ax,#0x0fff +die: jne die ! es must be at 64kB boundary + xor bx,bx ! bx is starting address within segment +rp_read: + mov ax,es + cmp ax,#ENDSEG ! have we loaded all yet? + jb ok1_read + ret +ok1_read: + seg cs + mov ax,sectors + sub ax,sread + mov cx,ax + shl cx,#9 + add cx,bx + jnc ok2_read + je ok2_read + xor ax,ax + sub ax,bx + shr ax,#9 +ok2_read: + call read_track + mov cx,ax + add ax,sread + seg cs + cmp ax,sectors + jne ok3_read + mov ax,#1 + sub ax,head + jne ok4_read + inc track +ok4_read: + mov head,ax + xor ax,ax +ok3_read: + mov sread,ax + shl cx,#9 + add bx,cx + jnc rp_read + mov ax,es + add ax,#0x1000 + mov es,ax + xor bx,bx + jmp rp_read + +read_track: + push ax + push bx + push cx + push dx + mov dx,track + mov cx,sread + inc cx + mov ch,dl + mov dx,head + mov dh,dl + mov dl,#0 + and dx,#0x0100 + mov ah,#2 + int 0x13 + jc bad_rt + pop dx + pop cx + pop bx + pop ax + ret +bad_rt: mov ax,#0 + mov dx,#0 + int 0x13 + pop dx + pop cx + pop bx + pop ax + jmp read_track + +/* + * This procedure turns off the floppy drive motor, so + * that we enter the kernel in a known state, and + * don't have to worry about it later. + */ +kill_motor: + push dx + mov dx,#0x3f2 + mov al,#0 + outb + pop dx + ret + +sectors: + .word 0 + +msg1: + .byte 13,10 + .ascii "Loading system ..." + .byte 13,10,13,10 + +.org 508 +root_dev: + .word ROOT_DEV +boot_flag: + .word 0xAA55 + +.text +endtext: +.data +enddata: +.bss +endbss: diff --git a/linux-0.11-lab/2/linux/boot/head.o b/linux-0.11-lab/2/linux/boot/head.o new file mode 100755 index 0000000000000000000000000000000000000000..a4c55649c84336692e2f017e7d3b9dc5fd3082ba GIT binary patch literal 27012 zcmeI5O=ule7>2)-rn#v$OwS%uL!8 z6a%qn7P*Sc3jRisn&iB4& z&iUrdGdG*FIOn4m54>cIk-Qk$Ah(^!ke}VzorWRlmW`=8*Nf1++Dw|)n=8(lL2X<) zq}4H0_qtn3hEHg(eMrzN@gL4WGWd|l-26`+&h}(Q)Bb+)4UucVe)-Gw{Sx<}!~D%I z+*?{aEZ2TpTI?Ts6R8Drs4QHmT#)ACbDHqHPI#fPaIkZJx%=grzZ~<#59qk$nEtaG zwGRskkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@{I3YSFZx$|7#nQXbmBLjzwysojfuwek;Xv15&K~{ z6T}bn$jEE2Z|!ovS+gN%tq)^XR$HyssPk=M+o88dFJpht^U^0$N=mKOKTj>|UZ7II z4x`H(J5>#+>Q=Qw)n--0B9~TQ#eSfLn=SeK)YI5gR6e{_N}TOiv2kb*y3Aqg&{f?# zRHRiv)sBntlbK~r0wh2JBtQZrur3L-9K81NMAG<0vMw3$rAdGUNPq-LVBHWXMn|V& zZ%m3&9A>eWtI(e;#{O(9#j+QBQXGq-`^K^jJ@x#QE<0i`Vp6sSL02)fJdSHqsHM(blD3iP(3Pv78q7&_8 zM*5-k_?fI2(eEHwXv&I_5`-Qfll%P;pXV0YUx3zAW3po86$m{&CikN%^o7%6cM$*qTtc_Ysx=5yrWmz#Y0Wq@1&%*1%SXPY8K_u4qV*JPI(}(IbjC`7P zOl$R@sT#=|)qkDIv{wK99Ukv?m%n(Im&lK20=Hg{t*Sze*ZlDbcXsa{@hVv2a|5sH zyZGms^dqTP8`GihV(m}Dz>RbuF1PGQ!HL`fm@lJ4uYeu7y6z=u@~z6cI{M&Nu>=k<<%P!gh--%^>djmB1Ic# zG~x&OiAMa0zq0GKeRF1UbBAE`q28r)_-9Aob|_S NJgpJWKc}%z4Mb on a 4Mb machine). + * + * NOTE! Although all physical memory should be identity + * mapped by this routine, only the kernel page functions + * use the >1Mb addresses directly. All "normal" functions + * use just the lower 1Mb, or the local data space, which + * will be mapped to some other place - mm keeps track of + * that. + * + * For those with more memory than 16 Mb - tough luck. I've + * not got it, why should you :-) The source is here. Change + * it. (Seriously - it shouldn't be too difficult. Mostly + * change some constants etc. I left it at 16Mb, as my machine + * even cannot be extended past that (ok, but it was cheap :-) + * I've tried to show which constants to change by having + * some kind of marker at them (search for "16Mb"), but I + * won't guarantee that's all :-( ) + */ +.align 4 +setup_paging: + movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */ + xorl %eax,%eax + xorl %edi,%edi /* pg_dir is at 0x000 */ + cld;rep;stosl + movl $pg0+7,pg_dir /* set present bit/user r/w */ + movl $pg1+7,pg_dir+4 /* --------- " " --------- */ + movl $pg2+7,pg_dir+8 /* --------- " " --------- */ + movl $pg3+7,pg_dir+12 /* --------- " " --------- */ + movl $pg3+4092,%edi + movl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */ + std +1: stosl /* fill pages backwards - more efficient :-) */ + subl $0x1000,%eax + jge 1b + xorl %eax,%eax /* pg_dir is at 0x0000 */ + movl %eax,%cr3 /* cr3 - page directory start */ + movl %cr0,%eax + orl $0x80000000,%eax + movl %eax,%cr0 /* set paging (PG) bit */ + cld /* by wyj */ + ret /* this also flushes prefetch-queue */ + +.align 4 +.word 0 +idt_descr: + .word 256*8-1 # idt contains 256 entries + .long idt +.align 4 +.word 0 +gdt_descr: + .word 256*8-1 # so does gdt (not that that's any + .long gdt # magic number, but it works for me :^) + + .align 8 +idt: .fill 256,8,0 # idt is uninitialized + +gdt: .quad 0x0000000000000000 /* NULL descriptor */ + .quad 0x00c09a0000000fff /* 16Mb */ + .quad 0x00c0920000000fff /* 16Mb */ + .quad 0x0000000000000000 /* TEMPORARY - don't use */ + .fill 252,8,0 /* space for LDT's and TSS's etc */ diff --git a/linux-0.11-lab/2/linux/boot/setup b/linux-0.11-lab/2/linux/boot/setup new file mode 100755 index 0000000000000000000000000000000000000000..0e70f4846819f560fb2e22a8eb1e7186c7956ab0 GIT binary patch literal 344 zcmZQ%7GP0eU|_Id1QJNVq7lN`!7!ok#ujFS|7Qg{#TXd2bet7k%*3#TAIOzsVOY$@ zutjLIz*&LC91NXuTnwFjJPbP+82WA;HDh4}X+5yNfnlcr!{;SXQ3*l_<@!izwL4T8@UUNgLAc(wpUZcuop2&OfjEda<7{%Xg;=gL$t<~Tutazx3hbYqSrLZVca%ibUp9b?$HkVw;4TnF?Rz@46w`UObliF2LrIX1l zD$%Xa$Sgt^u2&7@|GQ@O1M(N{a&->*XRca94ek$5^Qt@KbHx4WGu-r2)9WkibQgy407%ZoGynhq literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/boot/setup.s b/linux-0.11-lab/2/linux/boot/setup.s new file mode 100755 index 0000000..2329d00 --- /dev/null +++ b/linux-0.11-lab/2/linux/boot/setup.s @@ -0,0 +1,231 @@ +! +! setup.s (C) 1991 Linus Torvalds +! +! setup.s is responsible for getting the system data from the BIOS, +! and putting them into the appropriate places in system memory. +! both setup.s and system has been loaded by the bootblock. +! +! This code asks the bios for memory/disk/other parameters, and +! puts them in a "safe" place: 0x90000-0x901FF, ie where the +! boot-block used to be. It is then up to the protected mode +! system to read them from there before the area is overwritten +! for buffer-blocks. +! + +! NOTE! These had better be the same as in bootsect.s! + +INITSEG = 0x9000 ! we move boot here - out of the way +SYSSEG = 0x1000 ! system loaded at 0x10000 (65536). +SETUPSEG = 0x9020 ! this is the current segment + +.globl begtext, begdata, begbss, endtext, enddata, endbss +.text +begtext: +.data +begdata: +.bss +begbss: +.text + +entry start +start: + +! ok, the read went well so we get current cursor position and save it for +! posterity. + + mov ax,#INITSEG ! this is done in bootsect already, but... + mov ds,ax + mov ah,#0x03 ! read cursor pos + xor bh,bh + int 0x10 ! save it in known place, con_init fetches + mov [0],dx ! it from 0x90000. + +! Get memory size (extended mem, kB) + + mov ah,#0x88 + int 0x15 + mov [2],ax + +! Get video-card data: + + mov ah,#0x0f + int 0x10 + mov [4],bx ! bh = display page + mov [6],ax ! al = video mode, ah = window width + +! check for EGA/VGA and some config parameters + + mov ah,#0x12 + mov bl,#0x10 + int 0x10 + mov [8],ax + mov [10],bx + mov [12],cx + +! Get hd0 data + + mov ax,#0x0000 + mov ds,ax + lds si,[4*0x41] + mov ax,#INITSEG + mov es,ax + mov di,#0x0080 + mov cx,#0x10 + rep + movsb + +! Get hd1 data + + mov ax,#0x0000 + mov ds,ax + lds si,[4*0x46] + mov ax,#INITSEG + mov es,ax + mov di,#0x0090 + mov cx,#0x10 + rep + movsb + +! Check that there IS a hd1 :-) + + mov ax,#0x01500 + mov dl,#0x81 + int 0x13 + jc no_disk1 + cmp ah,#3 + je is_disk1 +no_disk1: + mov ax,#INITSEG + mov es,ax + mov di,#0x0090 + mov cx,#0x10 + mov ax,#0x00 + rep + stosb +is_disk1: + +! now we want to move to protected mode ... + + cli ! no interrupts allowed ! + +! first we move the system to it's rightful place + + mov ax,#0x0000 + cld ! 'direction'=0, movs moves forward +do_move: + mov es,ax ! destination segment + add ax,#0x1000 + cmp ax,#0x9000 + jz end_move + mov ds,ax ! source segment + sub di,di + sub si,si + mov cx,#0x8000 + rep + movsw + jmp do_move + +! then we load the segment descriptors + +end_move: + mov ax,#SETUPSEG ! right, forgot this at first. didn't work :-) + mov ds,ax + lidt idt_48 ! load idt with 0,0 + lgdt gdt_48 ! load gdt with whatever appropriate + +! that was painless, now we enable A20 + + call empty_8042 + mov al,#0xD1 ! command write + out #0x64,al + call empty_8042 + mov al,#0xDF ! A20 on + out #0x60,al + call empty_8042 + +! well, that went ok, I hope. Now we have to reprogram the interrupts :-( +! we put them right after the intel-reserved hardware interrupts, at +! int 0x20-0x2F. There they won't mess up anything. Sadly IBM really +! messed this up with the original PC, and they haven't been able to +! rectify it afterwards. Thus the bios puts interrupts at 0x08-0x0f, +! which is used for the internal hardware interrupts as well. We just +! have to reprogram the 8259's, and it isn't fun. + + mov al,#0x11 ! initialization sequence + out #0x20,al ! send it to 8259A-1 + .word 0x00eb,0x00eb ! jmp $+2, jmp $+2 + out #0xA0,al ! and to 8259A-2 + .word 0x00eb,0x00eb + mov al,#0x20 ! start of hardware int's (0x20) + out #0x21,al + .word 0x00eb,0x00eb + mov al,#0x28 ! start of hardware int's 2 (0x28) + out #0xA1,al + .word 0x00eb,0x00eb + mov al,#0x04 ! 8259-1 is master + out #0x21,al + .word 0x00eb,0x00eb + mov al,#0x02 ! 8259-2 is slave + out #0xA1,al + .word 0x00eb,0x00eb + mov al,#0x01 ! 8086 mode for both + out #0x21,al + .word 0x00eb,0x00eb + out #0xA1,al + .word 0x00eb,0x00eb + mov al,#0xFF ! mask off all interrupts for now + out #0x21,al + .word 0x00eb,0x00eb + out #0xA1,al + +! well, that certainly wasn't fun :-(. Hopefully it works, and we don't +! need no steenking BIOS anyway (except for the initial loading :-). +! The BIOS-routine wants lots of unnecessary data, and it's less +! "interesting" anyway. This is how REAL programmers do it. +! +! Well, now's the time to actually move into protected mode. To make +! things as simple as possible, we do no register set-up or anything, +! we let the gnu-compiled 32-bit programs do that. We just jump to +! absolute address 0x00000, in 32-bit protected mode. + + mov ax,#0x0001 ! protected mode (PE) bit + lmsw ax ! This is it! + jmpi 0,8 ! jmp offset 0 of segment 8 (cs) + +! This routine checks that the keyboard command queue is empty +! No timeout is used - if this hangs there is something wrong with +! the machine, and we probably couldn't proceed anyway. +empty_8042: + .word 0x00eb,0x00eb + in al,#0x64 ! 8042 status port + test al,#2 ! is input buffer full? + jnz empty_8042 ! yes - loop + ret + +gdt: + .word 0,0,0,0 ! dummy + + .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb) + .word 0x0000 ! base address=0 + .word 0x9A00 ! code read/exec + .word 0x00C0 ! granularity=4096, 386 + + .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb) + .word 0x0000 ! base address=0 + .word 0x9200 ! data read/write + .word 0x00C0 ! granularity=4096, 386 + +idt_48: + .word 0 ! idt limit=0 + .word 0,0 ! idt base=0L + +gdt_48: + .word 0x800 ! gdt limit=2048, 256 GDT entries + .word 512+gdt,0x9 ! gdt base = 0X9xxxx + +.text +endtext: +.data +enddata: +.bss +endbss: diff --git a/linux-0.11-lab/2/linux/fs/Makefile b/linux-0.11-lab/2/linux/fs/Makefile new file mode 100755 index 0000000..970acd4 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/Makefile @@ -0,0 +1,101 @@ +AR =ar +AS =as +LD =ld +LDFLAGS =-s -x +CC =gcc -march=i386 +CFLAGS =-w -g -fstrength-reduce -fomit-frame-pointer -mcld \ + -finline-functions -nostdinc -fno-stack-protector -I../include +CPP =gcc -E -nostdinc -I../include + +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< +.c.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< +.s.o: + $(AS) -o $*.o $< + +OBJS= open.o read_write.o inode.o file_table.o buffer.o super.o \ + block_dev.o char_dev.o file_dev.o stat.o exec.o pipe.o namei.o \ + bitmap.o fcntl.o ioctl.o truncate.o select.o + +fs.o: $(OBJS) + $(LD) -r -o fs.o $(OBJS) + +clean: + rm -f core *.o *.a tmp_make + for i in *.c;do rm -f `basename $$i .c`.s;done + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + (for i in *.c;do $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + +### Dependencies: +bitmap.o : bitmap.c ../include/string.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h +block_dev.o : block_dev.c ../include/errno.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/segment.h ../include/asm/system.h +buffer.o : buffer.c ../include/stdarg.h ../include/linux/config.h \ + ../include/linux/sched.h ../include/linux/head.h ../include/linux/fs.h \ + ../include/sys/types.h ../include/linux/mm.h ../include/signal.h \ + ../include/linux/kernel.h ../include/asm/system.h ../include/asm/io.h +char_dev.o : char_dev.c ../include/errno.h ../include/sys/types.h \ + ../include/linux/sched.h ../include/linux/head.h ../include/linux/fs.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/segment.h ../include/asm/io.h +exec.o : exec.c ../include/errno.h ../include/string.h \ + ../include/sys/stat.h ../include/sys/types.h ../include/a.out.h \ + ../include/linux/fs.h ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/segment.h +fcntl.o : fcntl.c ../include/string.h ../include/errno.h \ + ../include/linux/sched.h ../include/linux/head.h ../include/linux/fs.h \ + ../include/sys/types.h ../include/linux/mm.h ../include/signal.h \ + ../include/linux/kernel.h ../include/asm/segment.h ../include/fcntl.h \ + ../include/sys/stat.h +file_dev.o : file_dev.c ../include/errno.h ../include/fcntl.h \ + ../include/sys/types.h ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/linux/mm.h ../include/signal.h \ + ../include/linux/kernel.h ../include/asm/segment.h +file_table.o : file_table.c ../include/linux/fs.h ../include/sys/types.h +inode.o : inode.c ../include/string.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/linux/mm.h ../include/signal.h \ + ../include/linux/kernel.h ../include/asm/system.h +ioctl.o : ioctl.c ../include/string.h ../include/errno.h \ + ../include/sys/stat.h ../include/sys/types.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \ + ../include/signal.h +namei.o : namei.c ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/sys/types.h ../include/linux/mm.h \ + ../include/signal.h ../include/linux/kernel.h ../include/asm/segment.h \ + ../include/string.h ../include/fcntl.h ../include/errno.h \ + ../include/const.h ../include/sys/stat.h +open.o : open.c ../include/string.h ../include/errno.h ../include/fcntl.h \ + ../include/sys/types.h ../include/utime.h ../include/sys/stat.h \ + ../include/linux/sched.h ../include/linux/head.h ../include/linux/fs.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/tty.h \ + ../include/termios.h ../include/linux/kernel.h ../include/asm/segment.h +pipe.o : pipe.c ../include/signal.h ../include/sys/types.h \ + ../include/linux/sched.h ../include/linux/head.h ../include/linux/fs.h \ + ../include/linux/mm.h ../include/asm/segment.h +read_write.o : read_write.c ../include/sys/stat.h ../include/sys/types.h \ + ../include/errno.h ../include/linux/kernel.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \ + ../include/signal.h ../include/asm/segment.h +stat.o : stat.c ../include/errno.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/linux/fs.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/mm.h ../include/signal.h \ + ../include/linux/kernel.h ../include/asm/segment.h +super.o : super.c ../include/linux/config.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/system.h ../include/errno.h ../include/sys/stat.h +truncate.o : truncate.c ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/sys/types.h ../include/linux/mm.h \ + ../include/signal.h ../include/sys/stat.h diff --git a/linux-0.11-lab/2/linux/fs/bitmap.c b/linux-0.11-lab/2/linux/fs/bitmap.c new file mode 100755 index 0000000..73951a8 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/bitmap.c @@ -0,0 +1,168 @@ +/* + * linux/fs/bitmap.c + * + * (C) 1991 Linus Torvalds + */ + +/* bitmap.c contains the code that handles the inode and block bitmaps */ +#include + +#include +#include + +#define clear_block(addr) \ +__asm__ __volatile__ ("cld\n\t" \ + "rep\n\t" \ + "stosl" \ + ::"a" (0),"c" (BLOCK_SIZE/4),"D" ((long) (addr))) + +#define set_bit(nr,addr) ({\ +register int res __asm__("ax"); \ +__asm__ __volatile__("btsl %2,%3\n\tsetb %%al": \ +"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \ +res;}) + +#define clear_bit(nr,addr) ({\ +register int res __asm__("ax"); \ +__asm__ __volatile__("btrl %2,%3\n\tsetnb %%al": \ +"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \ +res;}) + +#define find_first_zero(addr) ({ \ +int __res; \ +__asm__ __volatile__ ("cld\n" \ + "1:\tlodsl\n\t" \ + "notl %%eax\n\t" \ + "bsfl %%eax,%%edx\n\t" \ + "je 2f\n\t" \ + "addl %%edx,%%ecx\n\t" \ + "jmp 3f\n" \ + "2:\taddl $32,%%ecx\n\t" \ + "cmpl $8192,%%ecx\n\t" \ + "jl 1b\n" \ + "3:" \ + :"=c" (__res):"c" (0),"S" (addr)); \ +__res;}) + +void free_block(int dev, int block) +{ + struct super_block * sb; + struct buffer_head * bh; + + if (!(sb = get_super(dev))) + panic("trying to free block on nonexistent device"); + if (block < sb->s_firstdatazone || block >= sb->s_nzones) + panic("trying to free block not in datazone"); + bh = get_hash_table(dev,block); + if (bh) { + if (bh->b_count != 1) { + printk("trying to free block (%04x:%d), count=%d\n", + dev,block,bh->b_count); + return; + } + bh->b_dirt=0; + bh->b_uptodate=0; + brelse(bh); + } + block -= sb->s_firstdatazone - 1 ; + if (clear_bit(block&8191,sb->s_zmap[block/8192]->b_data)) { + printk("block (%04x:%d) ",dev,block+sb->s_firstdatazone-1); + panic("free_block: bit already cleared"); + } + sb->s_zmap[block/8192]->b_dirt = 1; +} + +int new_block(int dev) +{ + struct buffer_head * bh; + struct super_block * sb; + int i,j; + + if (!(sb = get_super(dev))) + panic("trying to get new block from nonexistant device"); + j = 8192; + for (i=0 ; i<8 ; i++) + if (bh=sb->s_zmap[i]) + if ((j=find_first_zero(bh->b_data))<8192) + break; + if (i>=8 || !bh || j>=8192) + return 0; + if (set_bit(j,bh->b_data)) + panic("new_block: bit already set"); + bh->b_dirt = 1; + j += i*8192 + sb->s_firstdatazone-1; + if (j >= sb->s_nzones) + return 0; + if (!(bh=getblk(dev,j))) + panic("new_block: cannot get block"); + if (bh->b_count != 1) + panic("new block: count is != 1"); + clear_block(bh->b_data); + bh->b_uptodate = 1; + bh->b_dirt = 1; + brelse(bh); + return j; +} + +void free_inode(struct m_inode * inode) +{ + struct super_block * sb; + struct buffer_head * bh; + + if (!inode) + return; + if (!inode->i_dev) { + memset(inode,0,sizeof(*inode)); + return; + } + if (inode->i_count>1) { + printk("trying to free inode with count=%d\n",inode->i_count); + panic("free_inode"); + } + if (inode->i_nlinks) + panic("trying to free inode with links"); + if (!(sb = get_super(inode->i_dev))) + panic("trying to free inode on nonexistent device"); + if (inode->i_num < 1 || inode->i_num > sb->s_ninodes) + panic("trying to free inode 0 or nonexistant inode"); + if (!(bh=sb->s_imap[inode->i_num>>13])) + panic("nonexistent imap in superblock"); + if (clear_bit(inode->i_num&8191,bh->b_data)) + printk("free_inode: bit already cleared.\n\r"); + bh->b_dirt = 1; + memset(inode,0,sizeof(*inode)); +} + +struct m_inode * new_inode(int dev) +{ + struct m_inode * inode; + struct super_block * sb; + struct buffer_head * bh; + int i,j; + + if (!(inode=get_empty_inode())) + return NULL; + if (!(sb = get_super(dev))) + panic("new_inode with unknown device"); + j = 8192; + for (i=0 ; i<8 ; i++) + if (bh=sb->s_imap[i]) + if ((j=find_first_zero(bh->b_data))<8192) + break; + if (!bh || j >= 8192 || j+i*8192 > sb->s_ninodes) { + iput(inode); + return NULL; + } + if (set_bit(j,bh->b_data)) + panic("new_inode: bit already set"); + bh->b_dirt = 1; + inode->i_count=1; + inode->i_nlinks=1; + inode->i_dev=dev; + inode->i_uid=current->euid; + inode->i_gid=current->egid; + inode->i_dirt=1; + inode->i_num = j + i*8192; + inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; + return inode; +} diff --git a/linux-0.11-lab/2/linux/fs/bitmap.o b/linux-0.11-lab/2/linux/fs/bitmap.o new file mode 100755 index 0000000000000000000000000000000000000000..501d3c5e3fb1a044792589a0bdde55cbb41cfaa2 GIT binary patch literal 10280 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 J@|j5fe*vQQ&y@fG literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/block_dev.c b/linux-0.11-lab/2/linux/fs/block_dev.c new file mode 100755 index 0000000..a50ae3f --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/block_dev.c @@ -0,0 +1,73 @@ +/* + * linux/fs/block_dev.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#include +#include +#include +#include + +int block_write(int dev, long * pos, char * buf, int count) +{ + int block = *pos >> BLOCK_SIZE_BITS; + int offset = *pos & (BLOCK_SIZE-1); + int chars; + int written = 0; + struct buffer_head * bh; + register char * p; + + while (count>0) { + chars = BLOCK_SIZE - offset; + if (chars > count) + chars=count; + if (chars == BLOCK_SIZE) + bh = getblk(dev,block); + else + bh = breada(dev,block,block+1,block+2,-1); + block++; + if (!bh) + return written?written:-EIO; + p = offset + bh->b_data; + offset = 0; + *pos += chars; + written += chars; + count -= chars; + while (chars-->0) + *(p++) = get_fs_byte(buf++); + bh->b_dirt = 1; + brelse(bh); + } + return written; +} + +int block_read(int dev, unsigned long * pos, char * buf, int count) +{ + int block = *pos >> BLOCK_SIZE_BITS; + int offset = *pos & (BLOCK_SIZE-1); + int chars; + int read = 0; + struct buffer_head * bh; + register char * p; + + while (count>0) { + chars = BLOCK_SIZE-offset; + if (chars > count) + chars = count; + if (!(bh = breada(dev,block,block+1,block+2,-1))) + return read?read:-EIO; + block++; + p = offset + bh->b_data; + offset = 0; + *pos += chars; + read += chars; + count -= chars; + while (chars-->0) + put_fs_byte(*(p++),buf++); + brelse(bh); + } + return read; +} diff --git a/linux-0.11-lab/2/linux/fs/block_dev.o b/linux-0.11-lab/2/linux/fs/block_dev.o new file mode 100755 index 0000000000000000000000000000000000000000..e5e9334ce9a4697061730271c4c9d92fcf4aa105 GIT binary patch literal 7296 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 + +#include +#include +#include +#include +#include + +extern void put_super(int dev); +extern void invalidate_inodes(int dev); + +extern int end; +struct buffer_head * start_buffer = (struct buffer_head *) &end; +struct buffer_head * hash_table[NR_HASH]; +static struct buffer_head * free_list; +static struct task_struct * buffer_wait = NULL; +int NR_BUFFERS = 0; + +static inline void wait_on_buffer(struct buffer_head * bh) +{ + cli(); + while (bh->b_lock) + sleep_on(&bh->b_wait); + sti(); +} + +int sys_sync(void) +{ + int i; + struct buffer_head * bh; + + sync_inodes(); /* write out inodes into buffers */ + bh = start_buffer; + for (i=0 ; ib_dirt) + ll_rw_block(WRITE,bh); + } + return 0; +} + +int sync_dev(int dev) +{ + int i; + struct buffer_head * bh; + + bh = start_buffer; + for (i=0 ; ib_dev != dev) + continue; + wait_on_buffer(bh); + if (bh->b_dev == dev && bh->b_dirt) + ll_rw_block(WRITE,bh); + } + sync_inodes(); + bh = start_buffer; + for (i=0 ; ib_dev != dev) + continue; + wait_on_buffer(bh); + if (bh->b_dev == dev && bh->b_dirt) + ll_rw_block(WRITE,bh); + } + return 0; +} + +void inline invalidate_buffers(int dev) +{ + int i; + struct buffer_head * bh; + + bh = start_buffer; + for (i=0 ; ib_dev != dev) + continue; + wait_on_buffer(bh); + if (bh->b_dev == dev) + bh->b_uptodate = bh->b_dirt = 0; + } +} + +/* + * This routine checks whether a floppy 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 loose :-) + * + * NOTE! Although currently this is only for floppies, the idea is + * that any additional removable block-device will use this routine, + * and that mount/open needn't know that floppies/whatever are + * special. + */ +void check_disk_change(int dev) +{ + int i; + + if (MAJOR(dev) != 2) + return; + if (!floppy_change(dev & 0x03)) + return; + for (i=0 ; ib_next) + bh->b_next->b_prev = bh->b_prev; + if (bh->b_prev) + bh->b_prev->b_next = bh->b_next; + if (hash(bh->b_dev,bh->b_blocknr) == bh) + hash(bh->b_dev,bh->b_blocknr) = bh->b_next; +/* remove from free list */ + if (!(bh->b_prev_free) || !(bh->b_next_free)) + panic("Free block list corrupted"); + bh->b_prev_free->b_next_free = bh->b_next_free; + bh->b_next_free->b_prev_free = bh->b_prev_free; + if (free_list == bh) + free_list = bh->b_next_free; +} + +static inline void insert_into_queues(struct buffer_head * bh) +{ +/* put at end of free list */ + bh->b_next_free = free_list; + bh->b_prev_free = free_list->b_prev_free; + free_list->b_prev_free->b_next_free = bh; + free_list->b_prev_free = bh; +/* put the buffer in new hash-queue if it has a device */ + bh->b_prev = NULL; + bh->b_next = NULL; + if (!bh->b_dev) + return; + bh->b_next = hash(bh->b_dev,bh->b_blocknr); + hash(bh->b_dev,bh->b_blocknr) = bh; + bh->b_next->b_prev = bh; +} + +static struct buffer_head * find_buffer(int dev, int block) +{ + struct buffer_head * tmp; + + for (tmp = hash(dev,block) ; tmp != NULL ; tmp = tmp->b_next) + if (tmp->b_dev==dev && tmp->b_blocknr==block) + return tmp; + return NULL; +} + +/* + * Why like this, I hear you say... The reason is race-conditions. + * As we don't lock buffers (unless we are readint them, that is), + * something might happen to it while we sleep (ie a read-error + * will force it bad). This shouldn't really happen currently, but + * the code is ready. + */ +struct buffer_head * get_hash_table(int dev, int block) +{ + struct buffer_head * bh; + + for (;;) { + if (!(bh=find_buffer(dev,block))) + return NULL; + bh->b_count++; + wait_on_buffer(bh); + if (bh->b_dev == dev && bh->b_blocknr == block) + return bh; + bh->b_count--; + } +} + +/* + * Ok, this is getblk, and it isn't very clear, again to hinder + * race-conditions. Most of the code is seldom used, (ie repeating), + * so it should be much more efficient than it looks. + * + * The algoritm is changed: hopefully better, and an elusive bug removed. + */ +#define BADNESS(bh) (((bh)->b_dirt<<1)+(bh)->b_lock) +struct buffer_head * getblk(int dev,int block) +{ + struct buffer_head * tmp, * bh; + +repeat: + if (bh = get_hash_table(dev,block)) + return bh; + tmp = free_list; + do { + if (tmp->b_count) + continue; + if (!bh || BADNESS(tmp)b_next_free) != free_list); + if (!bh) { + sleep_on(&buffer_wait); + goto repeat; + } + wait_on_buffer(bh); + if (bh->b_count) + goto repeat; + while (bh->b_dirt) { + sync_dev(bh->b_dev); + wait_on_buffer(bh); + if (bh->b_count) + goto repeat; + } +/* NOTE!! While we slept waiting for this block, somebody else might */ +/* already have added "this" block to the cache. check it */ + if (find_buffer(dev,block)) + goto repeat; +/* OK, FINALLY we know that this buffer is the only one of it's kind, */ +/* and that it's unused (b_count=0), unlocked (b_lock=0), and clean */ + bh->b_count=1; + bh->b_dirt=0; + bh->b_uptodate=0; + remove_from_queues(bh); + bh->b_dev=dev; + bh->b_blocknr=block; + insert_into_queues(bh); + return bh; +} + +void brelse(struct buffer_head * buf) +{ + if (!buf) + return; + wait_on_buffer(buf); + if (!(buf->b_count--)) + panic("Trying to free free buffer"); + wake_up(&buffer_wait); +} + +/* + * bread() reads a specified block and returns the buffer that contains + * it. It returns NULL if the block was unreadable. + */ +struct buffer_head * bread(int dev,int block) +{ + struct buffer_head * bh; + + if (!(bh=getblk(dev,block))) + panic("bread: getblk returned NULL\n"); + if (bh->b_uptodate) + return bh; + ll_rw_block(READ,bh); + wait_on_buffer(bh); + if (bh->b_uptodate) + return bh; + brelse(bh); + return NULL; +} + +#define COPYBLK(from,to) \ +__asm__("cld\n\t" \ + "rep\n\t" \ + "movsl\n\t" \ + ::"c" (BLOCK_SIZE/4),"S" (from),"D" (to) \ + ) + +/* + * bread_page reads four buffers into memory at the desired address. It's + * a function of its own, as there is some speed to be got by reading them + * all at the same time, not waiting for one to be read, and then another + * etc. + */ +void bread_page(unsigned long address,int dev,int b[4]) +{ + struct buffer_head * bh[4]; + int i; + + for (i=0 ; i<4 ; i++) + if (b[i]) { + if (bh[i] = getblk(dev,b[i])) + if (!bh[i]->b_uptodate) + ll_rw_block(READ,bh[i]); + } else + bh[i] = NULL; + for (i=0 ; i<4 ; i++,address += BLOCK_SIZE) + if (bh[i]) { + wait_on_buffer(bh[i]); + if (bh[i]->b_uptodate) + COPYBLK((unsigned long) bh[i]->b_data,address); + brelse(bh[i]); + } +} + +/* + * Ok, breada can be used as bread, but additionally to mark other + * blocks for reading as well. End the argument list with a negative + * number. + */ +struct buffer_head * breada(int dev,int first, ...) +{ + va_list args; + struct buffer_head * bh, *tmp; + + va_start(args,first); + if (!(bh=getblk(dev,first))) + panic("bread: getblk returned NULL\n"); + if (!bh->b_uptodate) + ll_rw_block(READ,bh); + while ((first=va_arg(args,int))>=0) { + tmp=getblk(dev,first); + if (tmp) { + if (!tmp->b_uptodate) + ll_rw_block(READA,bh); + tmp->b_count--; + } + } + va_end(args); + wait_on_buffer(bh); + if (bh->b_uptodate) + return bh; + brelse(bh); + return (NULL); +} + +void buffer_init(long buffer_end) +{ + struct buffer_head * h = start_buffer; + void * b; + int i; + + if (buffer_end == 1<<20) + b = (void *) (640*1024); + else + b = (void *) buffer_end; + while ( (b -= BLOCK_SIZE) >= ((void *) (h+1)) ) { + h->b_dev = 0; + h->b_dirt = 0; + h->b_count = 0; + h->b_lock = 0; + h->b_uptodate = 0; + h->b_wait = NULL; + h->b_next = NULL; + h->b_prev = NULL; + h->b_data = (char *) b; + h->b_prev_free = h-1; + h->b_next_free = h+1; + h++; + NR_BUFFERS++; + if (b == (void *) 0x100000) + b = (void *) 0xA0000; + } + h--; + free_list = start_buffer; + free_list->b_prev_free = h; + h->b_next_free = free_list; + for (i=0;iQ6+~nZ1VPZCP{pdlWadpWGMO3Y4-glv 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 +#include + +#include +#include + +#include +#include + +extern int tty_read(unsigned minor,char * buf,int count); +extern int tty_write(unsigned minor,char * buf,int count); + +typedef (*crw_ptr)(int rw,unsigned minor,char * buf,int count,off_t * pos); + +static int rw_ttyx(int rw,unsigned minor,char * buf,int count,off_t * pos) +{ + return ((rw==READ)?tty_read(minor,buf,count): + tty_write(minor,buf,count)); +} + +static int rw_tty(int rw,unsigned minor,char * buf,int count, off_t * pos) +{ + if (current->tty<0) + return -EPERM; + return rw_ttyx(rw,current->tty,buf,count,pos); +} + +static int rw_ram(int rw,char * buf, int count, off_t *pos) +{ + return -EIO; +} + +static int rw_mem(int rw,char * buf, int count, off_t * pos) +{ + return -EIO; +} + +static int rw_kmem(int rw,char * buf, int count, off_t * pos) +{ + return -EIO; +} + +static int rw_port(int rw,char * buf, int count, off_t * pos) +{ + int i=*pos; + + while (count-->0 && i<65536) { + if (rw==READ) + put_fs_byte(inb(i),buf++); + else + outb(get_fs_byte(buf++),i); + i++; + } + i -= *pos; + *pos += i; + return i; +} + +static int rw_memory(int rw, unsigned minor, char * buf, int count, off_t * pos) +{ + switch(minor) { + case 0: + return rw_ram(rw,buf,count,pos); + case 1: + return rw_mem(rw,buf,count,pos); + case 2: + return rw_kmem(rw,buf,count,pos); + case 3: + return (rw==READ)?0:count; /* rw_null */ + case 4: + return rw_port(rw,buf,count,pos); + default: + return -EIO; + } +} + +#define NRDEVS ((sizeof (crw_table))/(sizeof (crw_ptr))) + +static crw_ptr crw_table[]={ + NULL, /* nodev */ + rw_memory, /* /dev/mem etc */ + NULL, /* /dev/fd */ + NULL, /* /dev/hd */ + rw_ttyx, /* /dev/ttyx */ + rw_tty, /* /dev/tty */ + NULL, /* /dev/lp */ + NULL}; /* unnamed pipes */ + +int rw_char(int rw,int dev, char * buf, int count, off_t * pos) +{ + crw_ptr call_addr; + + if (MAJOR(dev)>=NRDEVS) + return -ENODEV; + if (!(call_addr=crw_table[MAJOR(dev)])) + return -ENODEV; + return call_addr(rw,MINOR(dev),buf,count,pos); +} diff --git a/linux-0.11-lab/2/linux/fs/char_dev.o b/linux-0.11-lab/2/linux/fs/char_dev.o new file mode 100755 index 0000000000000000000000000000000000000000..2977060a7c0b215e10aa16a8395ed973d52837cd GIT binary patch literal 8288 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 O%Ys)0UlIH-!T$wZ8WjQn literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/exec.c b/linux-0.11-lab/2/linux/fs/exec.c new file mode 100755 index 0000000..2ff220e --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/exec.c @@ -0,0 +1,359 @@ +/* + * linux/fs/exec.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * #!-checking implemented by tytso. + */ + +/* + * Demand-loading implemented 01.12.91 - no need to read anything but + * the header into memory. The inode of the executable is put into + * "current->executable", and page faults do the actual loading. Clean. + * + * Once more I can proudly say that linux stood up to being changed: it + * was less than 2 hours work to get demand-loading completely implemented. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +extern int sys_exit(int exit_code); +extern int sys_close(int fd); + +/* + * MAX_ARG_PAGES defines the number of pages allocated for arguments + * and envelope for the new program. 32 should suffice, this gives + * a maximum env+arg of 128kB ! + */ +#define MAX_ARG_PAGES 32 + + +int sys_uselib() +{ + return -ENOSYS; +} + +/* + * create_tables() parses the env- and arg-strings in new user + * memory and creates the pointer tables from them, and puts their + * addresses on the "stack", returning the new stack pointer value. + */ +static unsigned long * create_tables(char * p,int argc,int envc) +{ + unsigned long *argv,*envp; + unsigned long * sp; + + sp = (unsigned long *) (0xfffffffc & (unsigned long) p); + sp -= envc+1; + envp = sp; + sp -= argc+1; + argv = sp; + put_fs_long((unsigned long)envp,--sp); + put_fs_long((unsigned long)argv,--sp); + put_fs_long((unsigned long)argc,--sp); + while (argc-->0) { + put_fs_long((unsigned long) p,argv++); + while (get_fs_byte(p++)) /* nothing */ ; + } + put_fs_long(0,argv); + while (envc-->0) { + put_fs_long((unsigned long) p,envp++); + while (get_fs_byte(p++)) /* nothing */ ; + } + put_fs_long(0,envp); + return sp; +} + +/* + * count() counts the number of arguments/envelopes + */ +static int count(char ** argv) +{ + int i=0; + char ** tmp; + + if (tmp = argv) + while (get_fs_long((unsigned long *) (tmp++))) + i++; + + return i; +} + +/* + * 'copy_string()' copies argument/envelope strings from user + * memory to free pages in kernel mem. These are in a format ready + * to be put directly into the top of new user memory. + * + * Modified by TYT, 11/24/91 to add the from_kmem argument, which specifies + * whether the string and the string array are from user or kernel segments: + * + * from_kmem argv * argv ** + * 0 user space user space + * 1 kernel space user space + * 2 kernel space kernel space + * + * We do this by playing games with the fs segment register. Since it + * it is expensive to load a segment register, we try to avoid calling + * set_fs() unless we absolutely have to. + */ +static unsigned long copy_strings(int argc,char ** argv,unsigned long *page, + unsigned long p, int from_kmem) +{ + char *tmp, *pag; + int len, offset = 0; + unsigned long old_fs, new_fs; + + if (!p) + return 0; /* bullet-proofing */ + new_fs = get_ds(); + old_fs = get_fs(); + if (from_kmem==2) + set_fs(new_fs); + while (argc-- > 0) { + if (from_kmem == 1) + set_fs(new_fs); + if (!(tmp = (char *)get_fs_long(((unsigned long *)argv)+argc))) + panic("argc is wrong"); + if (from_kmem == 1) + set_fs(old_fs); + len=0; /* remember zero-padding */ + do { + len++; + } while (get_fs_byte(tmp++)); + if (p-len < 0) { /* this shouldn't happen - 128kB */ + set_fs(old_fs); + return 0; + } + while (len) { + --p; --tmp; --len; + if (--offset < 0) { + offset = p % PAGE_SIZE; + if (from_kmem==2) + set_fs(old_fs); + if (!(pag = (char *) page[p/PAGE_SIZE]) && + !(pag = (char *) (page[p/PAGE_SIZE] = + (unsigned long *) get_free_page()))) + return 0; + if (from_kmem==2) + set_fs(new_fs); + + } + *(pag + offset) = get_fs_byte(tmp); + } + } + if (from_kmem==2) + set_fs(old_fs); + return p; +} + +static unsigned long change_ldt(unsigned long text_size,unsigned long * page) +{ + unsigned long code_limit,data_limit,code_base,data_base; + int i; + + code_limit = text_size+PAGE_SIZE -1; + code_limit &= 0xFFFFF000; + data_limit = 0x4000000; + code_base = get_base(current->ldt[1]); + data_base = code_base; + set_base(current->ldt[1],code_base); + set_limit(current->ldt[1],code_limit); + set_base(current->ldt[2],data_base); + set_limit(current->ldt[2],data_limit); +/* make sure fs points to the NEW data segment */ + __asm__("pushl $0x17\n\tpop %%fs"::); + data_base += data_limit; + for (i=MAX_ARG_PAGES-1 ; i>=0 ; i--) { + data_base -= PAGE_SIZE; + if (page[i]) + put_page(page[i],data_base); + } + return data_limit; +} + +/* + * 'do_execve()' executes a new program. + */ +int do_execve(unsigned long * eip,long tmp,char * filename, + char ** argv, char ** envp) +{ + struct m_inode * inode; + struct buffer_head * bh; + struct exec ex; + unsigned long page[MAX_ARG_PAGES]; + int i,argc,envc; + int e_uid, e_gid; + int retval; + int sh_bang = 0; + unsigned long p=PAGE_SIZE*MAX_ARG_PAGES-4; + + if ((0xffff & eip[1]) != 0x000f) + panic("execve called from supervisor mode"); + for (i=0 ; ii_mode)) { /* must be regular file */ + retval = -EACCES; + goto exec_error2; + } + i = inode->i_mode; + e_uid = (i & S_ISUID) ? inode->i_uid : current->euid; + e_gid = (i & S_ISGID) ? inode->i_gid : current->egid; + if (current->euid == inode->i_uid) + i >>= 6; + else if (current->egid == inode->i_gid) + i >>= 3; + if (!(i & 1) && + !((inode->i_mode & 0111) && suser())) { + retval = -ENOEXEC; + goto exec_error2; + } + if (!(bh = bread(inode->i_dev,inode->i_zone[0]))) { + retval = -EACCES; + goto exec_error2; + } + ex = *((struct exec *) bh->b_data); /* read exec-header */ + if ((bh->b_data[0] == '#') && (bh->b_data[1] == '!') && (!sh_bang)) { + /* + * This section does the #! interpretation. + * Sorta complicated, but hopefully it will work. -TYT + */ + + char buf[1023], *cp, *interp, *i_name, *i_arg; + unsigned long old_fs; + + strncpy(buf, bh->b_data+2, 1022); + brelse(bh); + iput(inode); + buf[1022] = '\0'; + if (cp = strchr(buf, '\n')) { + *cp = '\0'; + for (cp = buf; (*cp == ' ') || (*cp == '\t'); cp++); + } + if (!cp || *cp == '\0') { + retval = -ENOEXEC; /* No interpreter name found */ + goto exec_error1; + } + interp = i_name = cp; + i_arg = 0; + for ( ; *cp && (*cp != ' ') && (*cp != '\t'); cp++) { + if (*cp == '/') + i_name = cp+1; + } + if (*cp) { + *cp++ = '\0'; + i_arg = cp; + } + /* + * OK, we've parsed out the interpreter name and + * (optional) argument. + */ + if (sh_bang++ == 0) { + p = copy_strings(envc, envp, page, p, 0); + p = copy_strings(--argc, argv+1, page, p, 0); + } + /* + * Splice in (1) the interpreter's name for argv[0] + * (2) (optional) argument to interpreter + * (3) filename of shell script + * + * This is done in reverse order, because of how the + * user environment and arguments are stored. + */ + p = copy_strings(1, &filename, page, p, 1); + argc++; + if (i_arg) { + p = copy_strings(1, &i_arg, page, p, 2); + argc++; + } + p = copy_strings(1, &i_name, page, p, 2); + argc++; + if (!p) { + retval = -ENOMEM; + goto exec_error1; + } + /* + * OK, now restart the process with the interpreter's inode. + */ + old_fs = get_fs(); + set_fs(get_ds()); + if (!(inode=namei(interp))) { /* get executables inode */ + set_fs(old_fs); + retval = -ENOENT; + goto exec_error1; + } + set_fs(old_fs); + goto restart_interp; + } + brelse(bh); + if (N_MAGIC(ex) != ZMAGIC || ex.a_trsize || ex.a_drsize || + ex.a_text+ex.a_data+ex.a_bss>0x3000000 || + inode->i_size < ex.a_text+ex.a_data+ex.a_syms+N_TXTOFF(ex)) { + retval = -ENOEXEC; + goto exec_error2; + } + if (N_TXTOFF(ex) != BLOCK_SIZE) { + printk("%s: N_TXTOFF != BLOCK_SIZE. See a.out.h.", filename); + retval = -ENOEXEC; + goto exec_error2; + } + if (!sh_bang) { + p = copy_strings(envc,envp,page,p,0); + p = copy_strings(argc,argv,page,p,0); + if (!p) { + retval = -ENOMEM; + goto exec_error2; + } + } +/* OK, This is the point of no return */ + if (current->executable) + iput(current->executable); + current->executable = inode; + for (i=0 ; i<32 ; i++) + current->sigaction[i].sa_handler = NULL; + for (i=0 ; iclose_on_exec>>i)&1) + sys_close(i); + current->close_on_exec = 0; + free_page_tables(get_base(current->ldt[1]),get_limit(0x0f)); + free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); + if (last_task_used_math == current) + last_task_used_math = NULL; + current->used_math = 0; + p += change_ldt(ex.a_text,page)-MAX_ARG_PAGES*PAGE_SIZE; + p = (unsigned long) create_tables((char *)p,argc,envc); + current->brk = ex.a_bss + + (current->end_data = ex.a_data + + (current->end_code = ex.a_text)); + current->start_stack = p & 0xfffff000; + current->euid = e_uid; + current->egid = e_gid; + i = ex.a_text+ex.a_data; + while (i&0xfff) + put_fs_byte(0,(char *) (i++)); + eip[0] = ex.a_entry; /* eip, magic happens :-) */ + eip[3] = p; /* stack pointer */ + return 0; +exec_error2: + iput(inode); +exec_error1: + for (i=0 ; ifk_u6V*Yk91+DAroFcU|k2`}@7; zf07~6?H--;`+vXx_y2yJ_nh$HtsP4Y!%*I3D4!bRlzQ`8SJSGYK}}YZ)XIT3Ylap_ z>IROOL#rZn!)yIR9pH{m*fVQS=;*68$)TFT(}Rm6K^O%Gj@PU^wi1+`*rRqI+x_CY zW3GE`Vn~%3LF%W~ZhvHtKZ3Zy#BOuoxc?Z0ez108(4=Sbp)*OiRaJi%Hw1TOFJ3I8 z&lk=dJNVLt3m0He2flvb%!krkWVq8f$o_od^wBe>A&ElCUWNadvUVUH2{OeRCO5b$ z;ve)!&fSL=JVkA(;?@#HxKz;y#rfHYQ#;)0M;Ln5qjCRWZRA`vlzXA8M;6f4vxy)4 z;lhQTM~bgQjN~pr9Nu;0!S6Ey-A?)=?8~|5VW#8OxN({0Xx#5YIX-UpSX@+uaU&A9 zrZnyYFhg4y$U2m=_9P0x_8_W*S#aQiNKh57Jnz5Y)-UL`9vnpGA-L{3QalUWnt|iB z$1ri);2)+x{5n*zT#v)+k6_B3n+P=anBuHD7xAQu~_2a&_W|EZ%k!oE=zgI={h`!L7>({Q zG*aCLHHP8r>rDAVN2CM4M*Jf9g%K*Ost0$vO?S+=P^~z*DMuHWrEVgD7@#|jo(qm8 zy3{zWS3(1f8&t97qXxtE<~b%j=o|7Osu)htwL2dhYeQE;u?@@-glT{yK&QV20e1Uf z8&TD}<{=mq?e4I*?>bWb@RKOuSR|e8({N!j1IOFe9lHmE*Giv&^ewU@fmm6k&j&i;5dv`S9!dcijrX5~tmN2VJ{D%7`X!B?8P7Y2y`cE~xL%Zj!9kU&p z%ocV$!zPB8Tj*qD`O!CmFs^~|o>|*}`L_Me?up`YhE`rvn(>;_jBcuN@Dfc??KP!M zbyML>Hg*4$>c^3C7@J5V=1#*jBzS(wjx^>PRtYo>W8;hoIiz+SDNMhF7=3BP0@Pay zM;dd=9px?GVfcaLt?TYP_UU_8?s&5%pwx#acSb(+vlvQ&d>`b87YsGDGZKb&;D~=n zRe$%$!28t&&UY?XJ$+zmL(l8{R2Y*vxpQZ$M7rQg1`cb*v~53wNdrsTRXwsqIP?YLK0R z{9VRucVmv)As~~5D`AGR6$@D-p^`)GCi;86T2Gba(DsEGK?vaWrrV(F1sYz};o^HthuX#3JppL4L2NP8Knq?P1N&lJm#x&^Y%&v0G$()FUCG_%Fb2MwDaIAdTd zY!y3qfX*yKJ`+o`PO@84iT7EFIq2$G0(k13_9C=5vWq2i2HkxPsbhQys_4bh6@6=h zjzi6m8r~my3dG>CgNUvMUl@F4@aVf=MPOIGN6npHz3U6U5|4JsuBzU(6*9!vbFX?= zy3_)P0W1Lf50GKG`-c}tW_lAx0++BHSdTriGjbjCg}1*PSn7!`y$2ndB&b3gLXkQl zW-fPr0;Vp-qD8LZ!kc4ES>flS5h_Q;*vq{N=}P~bH5vfTwz%O4;LZRrDvbbM=ckWG zncH0CgktOM;x;~+okt3nkJ*O{V=2rnD?UA{f!Wo<@Ts%k>!`>OoXvw{^<4{6*t>V_ zMouW7`&@SS1B^j%cxR*)79ef7>7|GogXA(~`P1k);&T6hlq(ny?+Xv<#rt2!^ckWmJKAHq7C;JAwilwlK(XhJycr+T8M*Gr7 zqW#GbdW=gFy5}PyFnidSu_g5$m*zJhI(Pr?boMWk&XGnnwgJ(7P8zb8+B?J0(}(&y zVJ=Ia8|vQI?}DO4-wgfhCqB?Ixj?;`FnJ2>yb6@DxCPvE;IPMJK%REV_|X2yL6DFf z1{lwPI6~s|Jaosmc@cQM$#(jO9=gc#C^W}uNn)%SoH-yoA2=9>zwzu%&*U#!L%ZD_ zVbs2G4ZKSRoNp1{qllZmUU(}n+Eo4;CLA)r9~pIoyu@67jKz27+@EykOy{IQByR@C z#@sJG+9Q~TdZ!-R-VYL!GgQKQW8#YT>!J?sr6ER^+dr@K(>ygL3y;3)H%_0_n(>d` z7fQWuaJ}|EfN02=zPpe9-!}$N>qm-yo>AtdaB-~AwxinpcJ(3# zbLdeG+G_OlHuW7;bN$$P&v_((lV`{%qH9}MmdliSX_@%G@32+(zPv)S<~550qX8)&6Zq{!$^ zgh>v5P9GOM8P5@r>C?f*%kVVP$7eV zc+?x@5s1WaXAl(YGHAN51-OTt&p3oq=rbJ2?E%4KVBZ3?e+oN%luTP!s7G^t+&@fyLdE5Gq~xEmY5y@2h3 z*9V-pxJ>_qvj!n>C&1?qq%s9%niForc$kLmgNy%3XeNXkUF$cr!s>@2PzFWVZ~Zeg z);A#cPavtRo9JcF0O_~Bf(HF%q;2ajNSBiiT5D)iLAu8JCFvmPT5A#R{z}qy)*jkd zk*;T=lhDKj|5~u78K`Fh(_jz@EPfDqSS^qTZv8Rt%Ccb@Si)rd7C*TJZo3(G+qyLX zdg%htWHOD~SMs<)niaS9V|p=}K!h;s-hgaIdjC*x>Dhplhw&r0*bIXRW3E zouuon#~7!RbXeK-XzZ}hxP$K2GH8rW)=*g=hqrMTX}|S2yp6j_+g3N_D@g~fd*NiP zYQQpQ60REc-V)e0nyRTC?nnWLC4Eb!OS^G}BDIS=IrW%Y@DHuG~gpB4*jg zMl}s)d0#4_j5Q41XqG)fjb>WRvJ8{aOsiRzXK2l|nPm@;YUY~dMFv>Q>bAp&oz%=i zv+MzM-(?n?<=r$}N3$h}#sHdGYL*2US~JVdvLBII&vZJ>vO%VEFPToW>;!!@v&t;< zF|=k@n`M79s#$NA9U5gem}QSMzKQ%FG(x|~^o1!Qe^|whH_nG1>z6?gdyp{0DTZ%6bceK$O;|wGi%s4emt#K5b&8 zZRAR71i}fDmX~w_adWv)}>DgA)0G%P-YVq(H$dbOnx{`Ds={eQ_<9~+q zjVjOt=bAu)^|V&gsK^GCwTtv7(x&x3>CL45)_NwHFnEV*jhK^X3tuQyRvx5v#)0eztshSJ)1Mc zwmNCkx)%4Ks-kH%J^)licEev0;Dk$Qt(z7RoK?eQ2F`GMt zb%KViv`|(K6*q1m?XS$|Ta+<}v~6vs{6^A2$Y&{|jdYFmFz&`pq-!C+UKux&uB(ja zW-H^9r0XjkCO(&R*t!RmH0F_xR64PKW!yr#q0)(abYrEH@aUFGr^};TE1f*z%%^=D zBW#MV-d-vl`Pj{k{!rW8Ml(`tW1DhLUL7Q669?pS66m} zTuO3%rCyrLNN=z<;%+P_ov<2Nu@xIo!yZ*p0pL>BrJbfKmV)L_N&CGoTHL)F0Ok;s~RB5kgJulNB z39s7dCT03)Wvs-c`)5ceuLU3TMr+6KGW?83ZG3jnjhYildhQ{&&3^b-K|Go4 zWebp-IrScpb=vnw3X{wvPUtM+@l`^MipbTn{&7&UE-3FxX=~S5e z{7e^yb$?){%_O(tSF3&hCrotLW^sX=`?jjOVTPYWvoDOA{U6V)%`>}f7R}~80TYx0 zeg4g87W3$fKC7vD*!ZsHI{i9+`2GO9%lYQxYh`ZV0<{7r#-mw$51Y~lv5e8AFJe%9 zt@K0(CY?p*9%qNLm>j-2Zs+<#-Kd|(6>2e^eK)$QK6N?VmG3S_`2fw#2O5ul8%<5p zA?_l{u}LZ4O1G*0+CncPta3F4RE`N<{wc=Euv<4FlfydY6u#xSX=YqsiJEbJ{gbX^ z(it}wo1M$LbqP*-h?=bHRpYk!8Mou<+P+w~@(I^dn|3nFhh@(^6QL0nMYs*2gN%}Q zW3CSIq2h7t)#Xpn^f4-b2gQKS_!rE$oW;`$^xVzyF*iql=v_v9!i|^+{SSr^ZbRrx zj4#~!5MS**F3tLV#m%utUBOZI9VXk4rap%@jYt0%Ch8P!S-!(=TWX4~^IZn5CUk<9Kj0I{+?THH>QTNUJlvW47S}rc%6Bxz=J)M?Fr>@> z3|j`fjX55Z97B3?36}`z$t7H8=pB^Gcigq?2sN-;!YvJLqwXJF-GJIK{#X#xpC^nA@~iDCCYA54@9I>CH`T@w z>n*nyt3oXt6XDuJCq_BnzP;N*6Pbcm`u07v&7BdyVHUo9haXfQ`##uWg&w}PX7kFVGMHq zP5&&(JtUPe(U?&cs_<1^Q8m$+WYr)KGlGr%7Ko6Dkf?(HGUcnfx#E)*%R+d7hYVj; zMFm*{tW`OxYpcLUQ;h&Lv$a{kGb<}GLodt0+HS-)uoZ@}EW~KRtJJbkGvZX17=W#s zY+N&y2Gs!=;0ZigT{9IsdlPbDm}{mk3$YLFb$_)`+f53Lre$K&4z*sy)`FGhsh#|B z9rUuXXcxtrf>;li#_>vF z0%Sf`fq|Q3u^Q8)TY+UE_9N_SFbQ-SQP``;4CYUri;7JjD}*b+DG9@lABI`qdGp?L zNw;CDnEE+j7{9NoRQO9hl2G^=O-;?IOgvpoIL+x)rr57a1hIT?30p!o=eOjQ%Ex=0 zL{ksLf8CY{Wf1z%_ z&$lrgTGP-zVy_tB|N6gX`v6|04J)kgcH*2p?-HUFo%42`ZKlaGJGH_$d3ndK;(>kp ziiZvq51EnBq2eLxcJj8u-niz_*;B5>ewQM91@E8cZO7(f@p~kEIs0=OKl7w7Y&R7T ztys7I)WCqfX285DWL_WA_u3T$2L|kJb9yyRt>xC16}?{@`KCRO&6%fov!`iQ!FtR- zd%#{}ud|CIYi*sX^$rbq^S#EKRn(?hss%rBrS`}H`_KS&FYxw@6?SN3t=Wc~tp%3d zWckX>s}1z@?AZZxMu;Udt!HVCk0XBHv(`V6w!Ungg44)I^Ql)gPo=5Np0%DkWzT!r z9x&&JeC6gc!<-u`j^MV5#DS4}51q2lo*n72=bzP{OwF+DH3WMH4u9axS(AXKZgDjz zpEa{%WbF%fH*N@v{|}6;KWjJJSJBL^PF{PWI;ZRxBq!_fv*ryU{D1bq3ubf3Yz&<` zWbgR#F1u*Y!++hncJ^=Id)IE>^vkhGdiX3vDw^e3De-I(ABGaysQZaZ#dA)q;6w|t zt~5^R`9dsLh~ggKsJfyFXA|$SLQEx`d>ryzFlynCXZS zizd@C5QSVU?nJv%h2B`7N<}kRkQ?(LVue(%ql)^DH;L<2u{W0AsFJZlkCRiyypxFb zf>yWP@u~2laBEXrQ)_r;Z!8z@nU|W~HV1S(oe0nD4$n+xdsBs($y}`0nc0`c7cVCV zVTvs|Gn2(kypYOf@(^XRGj*qC_T{n#Ctk?r^s-ht$L+CpWs-Tv*$C*>RYGewVlOB} z@lFzrvV(;zwYu|gEI2BS?|or@YD>ZgU-eSazEq!ss=0M`_*n(JOBB6Ir@GKyfrs>@ zRHz%V@#@2NyyA96GfqER%sGzACX>+ucN6AN&>0u?K&dVaP?YsleMP1hWgZy4Xuc0M zSH%psAbfdbW=@nzBqgI%6h%S#yP{p`Yu7k2HiYn6UJP{)7iWe&1UpuMtxER^b#?g%%(W%w$5ObsgDNq zd~}zpws9@7)99Te--Ahs`LDxE2~p_W7I<>*r`&nh8+FSTcefsP$6d-;6MDVtV#_Ay z=m|eIM`m$fLuQFI((S?wE@br_hLoE~Hpgm71Ne04EoXFW6ZQ^w_T}AV^lZvyvjwGY zTeRrraKop%uqPMYoo?p!Ma|9HHmkL%rS%i8l&25Adh;^2-mQ!WY~zZc-@hA&6`q#( zoeFsg%qrp<`WLTxccQ zSdNQ?j-w8I=y?ukOEtx_y*$OLrVO5WO?aBR&p_A5>A_CT9q+$=@gH%a6#9bqhn4l>&RDZ3Wf&_^G! zfh~x4FVMT#E-$VHFE;sM*q!$#bBV4EbZI}Hoz2g$Za?_B!t2M<5+9JN|4P)zOQJ-_ z*WuE3x1pe6$h^zbam|&sd-^7KeXxF%d+qju_IyC9FC*SuuSg}j6zI};XAqC|WIVjb zj>g*pn(T~Y?sj^zFhGVk(2m$pe=Ym-v{8%flH<~KmL z%eZW_G~R3Ixc)afkn{55x!l;jRPI;5y)dR>yizUs(iX`3^%&8Id%6kxNkVfEC(pnC zwd2Qqn>@$B+po#b0q^b8HN`%!zYps~w0+FMuVyJ)0Y56;xF%ct-es^s!1d>$*ge0t=@1U^-z z2EcwDKejvx`LXZb#c|&6F+lRHg?EwvhQ|QOe+NJBxxjee8>c@ujz2Yy|Is-9#c}-4 z#__L>aY|N`{E}UOtZZj%s6vdO5Z0vt8*4zVygj`o1BjX#(D2aaN&*yra6 zE)wh%%nEK5d|dFGg8I+f@PA48vw~6VwJdy{w)-!FuL+i8 z(Nf+i_!mI)D*Q1R8@+k8QlBJFS86#ig3njP8A|cHCgTnep}!f=LAE;|Xnq{)ojl^= zTdBq=K>F7U|4G5m2tGpnHP}am|B2vlC~v^?2Adb-MS$e5CI1QJA@ZAqUnu;Of(Hfv zQSe>CAaZ5Au;90W%5sTXY?OR95GM;xC1Pw*DrG>3l(fECaGu~|LGGFK zzen(1!7jm!Aop3?eO~a-1-~rFy@dLw1)mY*o_jo|MECtxkpE+jZj@H)X8 z1s4hO-vrTqonW^h|I|kLc0v9XkNlSezbg1`!S4y468wqaF9hEf{7=Cts4e5o61+ul zh2UyI{l{+DJt+K_1ivQu9l;}l`rmNC{w3jmCHS78;d9%)LhuH`g@Shqt`~ev@JYdg zg2x3<3%)FPPVhZJ9v0ZoprGC#z(<5{5u7WyRB)Bx2Enu-|5X;_?G(hHV>SP`f?pT> z2f?F)KNLJ8XmB54UV?Rk5y2M0xq>mlqk^vpz9IPk1gp63AnwNn?-8uw{sVcvU{o+g z#Mtx;|9Qc`6g(jMZwmjs;432kweYprw;2C&BI4aB{1U+qk*9>;Cb(PVUlsma!apbc zzY71h@E-^tD0ADZCZfG-g>MsFBDhMhPjD*{_JhJ76nsYHKN9}ug1;7=Q0}%jU+{Lp zb%OT`7Kn&HApAbT1A-%hhXhXvz9#q<5&l!L@3WrQ2;LyLNH8t%D+1AM+fUoJSChab4 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/fcntl.c b/linux-0.11-lab/2/linux/fs/fcntl.c new file mode 100755 index 0000000..c201aa8 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/fcntl.c @@ -0,0 +1,75 @@ +/* + * linux/fs/fcntl.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include +#include +#include +#include + +#include +#include + +extern int sys_close(int fd); + +static int dupfd(unsigned int fd, unsigned int arg) +{ + if (fd >= NR_OPEN || !current->filp[fd]) + return -EBADF; + if (arg >= NR_OPEN) + return -EINVAL; + while (arg < NR_OPEN) + if (current->filp[arg]) + arg++; + else + break; + if (arg >= NR_OPEN) + return -EMFILE; + current->close_on_exec &= ~(1<filp[arg] = current->filp[fd])->f_count++; + return arg; +} + +int sys_dup2(unsigned int oldfd, unsigned int newfd) +{ + sys_close(newfd); + return dupfd(oldfd,newfd); +} + +int sys_dup(unsigned int fildes) +{ + return dupfd(fildes,0); +} + +int sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct file * filp; + + if (fd >= NR_OPEN || !(filp = current->filp[fd])) + return -EBADF; + switch (cmd) { + case F_DUPFD: + return dupfd(fd,arg); + case F_GETFD: + return (current->close_on_exec>>fd)&1; + case F_SETFD: + if (arg&1) + current->close_on_exec |= (1<close_on_exec &= ~(1<f_flags; + case F_SETFL: + filp->f_flags &= ~(O_APPEND | O_NONBLOCK); + filp->f_flags |= arg & (O_APPEND | O_NONBLOCK); + return 0; + case F_GETLK: case F_SETLK: case F_SETLKW: + return -1; + default: + return -1; + } +} diff --git a/linux-0.11-lab/2/linux/fs/fcntl.o b/linux-0.11-lab/2/linux/fs/fcntl.o new file mode 100755 index 0000000000000000000000000000000000000000..17a6ecacd50cb07b4337da65f94d880d02b367a8 GIT binary patch literal 6748 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/file_dev.c b/linux-0.11-lab/2/linux/fs/file_dev.c new file mode 100755 index 0000000..0c50eaa --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/file_dev.c @@ -0,0 +1,90 @@ +/* + * linux/fs/file_dev.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include + +#include +#include +#include + +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + +int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) +{ + int left,chars,nr; + struct buffer_head * bh; + + if ((left=count)<=0) + return 0; + while (left) { + if (nr = bmap(inode,(filp->f_pos)/BLOCK_SIZE)) { + if (!(bh=bread(inode->i_dev,nr))) + break; + } else + bh = NULL; + nr = filp->f_pos % BLOCK_SIZE; + chars = MIN( BLOCK_SIZE-nr , left ); + filp->f_pos += chars; + left -= chars; + if (bh) { + char * p = nr + bh->b_data; + while (chars-->0) + put_fs_byte(*(p++),buf++); + brelse(bh); + } else { + while (chars-->0) + put_fs_byte(0,buf++); + } + } + inode->i_atime = CURRENT_TIME; + return (count-left)?(count-left):-ERROR; +} + +int file_write(struct m_inode * inode, struct file * filp, char * buf, int count) +{ + off_t pos; + int block,c; + struct buffer_head * bh; + char * p; + int i=0; + +/* + * ok, append may not work when many processes are writing at the same time + * but so what. That way leads to madness anyway. + */ + if (filp->f_flags & O_APPEND) + pos = inode->i_size; + else + pos = filp->f_pos; + while (ii_dev,block))) + break; + c = pos % BLOCK_SIZE; + p = c + bh->b_data; + bh->b_dirt = 1; + c = BLOCK_SIZE-c; + if (c > count-i) c = count-i; + pos += c; + if (pos > inode->i_size) { + inode->i_size = pos; + inode->i_dirt = 1; + } + i += c; + while (c-->0) + *(p++) = get_fs_byte(buf++); + brelse(bh); + } + inode->i_mtime = CURRENT_TIME; + if (!(filp->f_flags & O_APPEND)) { + filp->f_pos = pos; + inode->i_ctime = CURRENT_TIME; + } + return (i?i:-1); +} diff --git a/linux-0.11-lab/2/linux/fs/file_dev.o b/linux-0.11-lab/2/linux/fs/file_dev.o new file mode 100755 index 0000000000000000000000000000000000000000..e1ba8a5aa9f848cbe07cc40a116357db631d2c89 GIT binary patch literal 7828 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 SclH@D3RwcTDjZc + +struct file file_table[NR_FILE]; diff --git a/linux-0.11-lab/2/linux/fs/file_table.o b/linux-0.11-lab/2/linux/fs/file_table.o new file mode 100755 index 0000000000000000000000000000000000000000..422bcb331f1423abef699440aa5b0f0ff3a8b671 GIT binary patch literal 2644 zcma)8ONbmr7_OR`-P!Hgo!w=9BnF`a8xkecvzttkb&W;|x+aF`!4(DLY)?=3Ogq!v zV?VOl_&SK&K#0s-B=xPW^?j%FhrbeTlMCJwT9?XVawWCSbyVX|l2jSv>;r0{YaW6k_^T zz^c43M3{C3LO#m~p?wD-+vFv!O1}9tWJUXp+$5jUK4*OA9`G6MD!D~It9?Y?9e~%h zNpi;q*R@lSvd7#dtx0>I{E+r8?Jnm!to=&<9J!$#WXynkS-U~|kmDcG>f|2zQB7xz zPu|k*q&*-%ra=ffB0sKOX3X>CC&cs`U|z-_!=_!MBjE%>dy4!bc}e?}e2cuIh2)nQ zKBe73zWo5~GpHxaSY_e9qLcMJC2H@1m#062oG8PB_yu{OzE~^Q_tocb$KXq%R=Xc6 z!W5mtG`ERzeXVwH?aU$)7onWoi!GZ&EG<G-(`FDL5GCjLkzBG)c>s!O5Yd43kpIj0J zL$ni?^gGLma)}S#8gV?s>Amp;_i=x>NJiF;9-MAS< z4d33%KD)7OtgJMKW~aHF8JbRnjKu9i4g+f-0>^2`Q2fM$^wI?~uoxN5N}`rr)!X zkOgp0bB?ivVFjLNqo#(BEj4ghvMo+e;Qti+cm>cWRebh7?!!!*IMC1w&2`!#>Rb)&9ZYkHg8gkiQ-5obM!ho&zcta4TOYQ7!kK zhn{n~t|E>PMc#7XSs04*p2N$^c{neB7xH;8faf`&;yT9LBvCE*xzNe^-E4CxbDRBJaN~jlSq|VjswDS1$X0~#=Lq&ga zCz+rAOpXJ}=@*Vw_-pAt>oj4i1@Xtt-Oowk-9QNMj)Y*HB&K4`iTsa2WPK#+q${0w zg!W?!)3XcxL8Yf>6#9nJ`D4X+Q{jsW-%$9r!fOgYRQQR)FBEb=InIv?e^L0SLLMmk uXB6&HxTJ7d;Yo#$D11WUrb18Qw!+sGzNPRTh3_l;TH*IZ6fvzQ&gs8hV_9GT literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/fs.o b/linux-0.11-lab/2/linux/fs/fs.o new file mode 100755 index 0000000000000000000000000000000000000000..86ce3ba38e0ee4154487cb990d4dbcff00fb67a3 GIT binary patch literal 142937 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/inode.c b/linux-0.11-lab/2/linux/fs/inode.c new file mode 100755 index 0000000..9bb10b3 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/inode.c @@ -0,0 +1,340 @@ +/* + * linux/fs/inode.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include + +#include +#include +#include +#include + +struct m_inode inode_table[NR_INODE]={{0,},}; + +static void read_inode(struct m_inode * inode); +static void write_inode(struct m_inode * inode); + +static inline void wait_on_inode(struct m_inode * inode) +{ + cli(); + while (inode->i_lock) + sleep_on(&inode->i_wait); + sti(); +} + +static inline void lock_inode(struct m_inode * inode) +{ + cli(); + while (inode->i_lock) + sleep_on(&inode->i_wait); + inode->i_lock=1; + sti(); +} + +static inline void unlock_inode(struct m_inode * inode) +{ + inode->i_lock=0; + wake_up(&inode->i_wait); +} + +void invalidate_inodes(int dev) +{ + int i; + struct m_inode * inode; + + inode = 0+inode_table; + for(i=0 ; ii_dev == dev) { + if (inode->i_count) + printk("inode in use on removed disk\n\r"); + inode->i_dev = inode->i_dirt = 0; + } + } +} + +void sync_inodes(void) +{ + int i; + struct m_inode * inode; + + inode = 0+inode_table; + for(i=0 ; ii_dirt && !inode->i_pipe) + write_inode(inode); + } +} + +static int _bmap(struct m_inode * inode,int block,int create) +{ + struct buffer_head * bh; + int i; + + if (block<0) + panic("_bmap: block<0"); + if (block >= 7+512+512*512) + panic("_bmap: block>big"); + if (block<7) { + if (create && !inode->i_zone[block]) + if (inode->i_zone[block]=new_block(inode->i_dev)) { + inode->i_ctime=CURRENT_TIME; + inode->i_dirt=1; + } + return inode->i_zone[block]; + } + block -= 7; + if (block<512) { + if (create && !inode->i_zone[7]) + if (inode->i_zone[7]=new_block(inode->i_dev)) { + inode->i_dirt=1; + inode->i_ctime=CURRENT_TIME; + } + if (!inode->i_zone[7]) + return 0; + if (!(bh = bread(inode->i_dev,inode->i_zone[7]))) + return 0; + i = ((unsigned short *) (bh->b_data))[block]; + if (create && !i) + if (i=new_block(inode->i_dev)) { + ((unsigned short *) (bh->b_data))[block]=i; + bh->b_dirt=1; + } + brelse(bh); + return i; + } + block -= 512; + if (create && !inode->i_zone[8]) + if (inode->i_zone[8]=new_block(inode->i_dev)) { + inode->i_dirt=1; + inode->i_ctime=CURRENT_TIME; + } + if (!inode->i_zone[8]) + return 0; + if (!(bh=bread(inode->i_dev,inode->i_zone[8]))) + return 0; + i = ((unsigned short *)bh->b_data)[block>>9]; + if (create && !i) + if (i=new_block(inode->i_dev)) { + ((unsigned short *) (bh->b_data))[block>>9]=i; + bh->b_dirt=1; + } + brelse(bh); + if (!i) + return 0; + if (!(bh=bread(inode->i_dev,i))) + return 0; + i = ((unsigned short *)bh->b_data)[block&511]; + if (create && !i) + if (i=new_block(inode->i_dev)) { + ((unsigned short *) (bh->b_data))[block&511]=i; + bh->b_dirt=1; + } + brelse(bh); + return i; +} + +int bmap(struct m_inode * inode,int block) +{ + return _bmap(inode,block,0); +} + +int create_block(struct m_inode * inode, int block) +{ + return _bmap(inode,block,1); +} + +void iput(struct m_inode * inode) +{ + if (!inode) + return; + wait_on_inode(inode); + if (!inode->i_count) + panic("iput: trying to free free inode"); + if (inode->i_pipe) { + wake_up(&inode->i_wait); + if (--inode->i_count) + return; + free_page(inode->i_size); + inode->i_count=0; + inode->i_dirt=0; + inode->i_pipe=0; + return; + } + if (!inode->i_dev) { + inode->i_count--; + return; + } + if (S_ISBLK(inode->i_mode)) { + sync_dev(inode->i_zone[0]); + wait_on_inode(inode); + } +repeat: + if (inode->i_count>1) { + inode->i_count--; + return; + } + if (!inode->i_nlinks) { + truncate(inode); + free_inode(inode); + return; + } + if (inode->i_dirt) { + write_inode(inode); /* we can sleep - so do again */ + wait_on_inode(inode); + goto repeat; + } + inode->i_count--; + return; +} + +struct m_inode * get_empty_inode(void) +{ + struct m_inode * inode; + static struct m_inode * last_inode = inode_table; + int i; + + do { + inode = NULL; + for (i = NR_INODE; i ; i--) { + if (++last_inode >= inode_table + NR_INODE) + last_inode = inode_table; + if (!last_inode->i_count) { + inode = last_inode; + if (!inode->i_dirt && !inode->i_lock) + break; + } + } + if (!inode) { + for (i=0 ; ii_dirt) { + write_inode(inode); + wait_on_inode(inode); + } + } while (inode->i_count); + memset(inode,0,sizeof(*inode)); + inode->i_count = 1; + return inode; +} + +struct m_inode * get_pipe_inode(void) +{ + struct m_inode * inode; + + if (!(inode = get_empty_inode())) + return NULL; + if (!(inode->i_size=get_free_page())) { + inode->i_count = 0; + return NULL; + } + inode->i_count = 2; /* sum of readers/writers */ + PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0; + inode->i_pipe = 1; + return inode; +} + +struct m_inode * iget(int dev,int nr) +{ + struct m_inode * inode, * empty; + + if (!dev) + panic("iget with dev==0"); + empty = get_empty_inode(); + inode = inode_table; + while (inode < NR_INODE+inode_table) { + if (inode->i_dev != dev || inode->i_num != nr) { + inode++; + continue; + } + wait_on_inode(inode); + if (inode->i_dev != dev || inode->i_num != nr) { + inode = inode_table; + continue; + } + inode->i_count++; + if (inode->i_mount) { + int i; + + for (i = 0 ; i= NR_SUPER) { + printk("Mounted inode hasn't got sb\n"); + if (empty) + iput(empty); + return inode; + } + iput(inode); + dev = super_block[i].s_dev; + nr = ROOT_INO; + inode = inode_table; + continue; + } + if (empty) + iput(empty); + return inode; + } + if (!empty) + return (NULL); + inode=empty; + inode->i_dev = dev; + inode->i_num = nr; + read_inode(inode); + return inode; +} + +static void read_inode(struct m_inode * inode) +{ + struct super_block * sb; + struct buffer_head * bh; + int block; + + lock_inode(inode); + if (!(sb=get_super(inode->i_dev))) + panic("trying to read inode without dev"); + block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks + + (inode->i_num-1)/INODES_PER_BLOCK; + if (!(bh=bread(inode->i_dev,block))) + panic("unable to read i-node block"); + __asm__ volatile ("cld"); /* by wyj */ + *(struct d_inode *)inode = + ((struct d_inode *)bh->b_data) + [(inode->i_num-1)%INODES_PER_BLOCK]; + brelse(bh); + unlock_inode(inode); +} + +static void write_inode(struct m_inode * inode) +{ + struct super_block * sb; + struct buffer_head * bh; + int block; + + lock_inode(inode); + if (!inode->i_dirt || !inode->i_dev) { + unlock_inode(inode); + return; + } + if (!(sb=get_super(inode->i_dev))) + panic("trying to write inode without device"); + block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks + + (inode->i_num-1)/INODES_PER_BLOCK; + if (!(bh=bread(inode->i_dev,block))) + panic("unable to read i-node block"); + __asm__ volatile ("cld"); /* by wyj */ + ((struct d_inode *)bh->b_data) + [(inode->i_num-1)%INODES_PER_BLOCK] = + *(struct d_inode *)inode; + bh->b_dirt=1; + inode->i_dirt=0; + brelse(bh); + unlock_inode(inode); +} diff --git a/linux-0.11-lab/2/linux/fs/inode.o b/linux-0.11-lab/2/linux/fs/inode.o new file mode 100755 index 0000000000000000000000000000000000000000..dd67bfa4d43e1073c47e0226043fc43f5f0e9153 GIT binary patch literal 14072 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 I1a}MmH>)TywEzGB literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/ioctl.c b/linux-0.11-lab/2/linux/fs/ioctl.c new file mode 100755 index 0000000..36fc976 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/ioctl.c @@ -0,0 +1,46 @@ +/* + * linux/fs/ioctl.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include +#include + +#include + +extern int tty_ioctl(int dev, int cmd, int arg); + +typedef int (*ioctl_ptr)(int dev,int cmd,int arg); + +#define NRDEVS ((sizeof (ioctl_table))/(sizeof (ioctl_ptr))) + +static ioctl_ptr ioctl_table[]={ + NULL, /* nodev */ + NULL, /* /dev/mem */ + NULL, /* /dev/fd */ + NULL, /* /dev/hd */ + tty_ioctl, /* /dev/ttyx */ + tty_ioctl, /* /dev/tty */ + NULL, /* /dev/lp */ + NULL}; /* named pipes */ + + +int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct file * filp; + int dev,mode; + + if (fd >= NR_OPEN || !(filp = current->filp[fd])) + return -EBADF; + mode=filp->f_inode->i_mode; + if (!S_ISCHR(mode) && !S_ISBLK(mode)) + return -EINVAL; + dev = filp->f_inode->i_zone[0]; + if (MAJOR(dev) >= NRDEVS) + return -ENODEV; + if (!ioctl_table[MAJOR(dev)]) + return -ENOTTY; + return ioctl_table[MAJOR(dev)](dev,cmd,arg); +} diff --git a/linux-0.11-lab/2/linux/fs/ioctl.o b/linux-0.11-lab/2/linux/fs/ioctl.o new file mode 100755 index 0000000000000000000000000000000000000000..1f1f33c5568ad7f154251149e1ecc40766da48c1 GIT binary patch literal 5828 zcmbVQd#oH)89(#bxjVaix3}Hf7ZllRZqr-n-MhEFrI*suOIu0{O@pPC3N72&-PyZC z_r=U?AEYX_HnBEJ@qqy`s4+oEOh`bi0TrlGqe1HJ_tV#I-=b-nh?^!1F)Io2ayIIjkT4?Vi+SSsUsoJII$X>h zy5w8bp4v5B{LHi8Br{K++&sJlol8VFb>{u^=g+_X0QFFwno6D$bAIqN3>HCNv{d{< zi1i{bM7Xd=-VeF&%o`Z_rmKe4PEBQ_frHQtKJ!}g_`muN_MLf)MpH_4$~=LI#EGZ7 zeP{l{j%62ioZ3D-i9jb#ZXZsb+%;^151t$xK7a1`Pgk7f$p5qD`h+m$SW|O>+Ac$g z8}!KAZSp54&=_XIYlTAB`#wpfmOKP=^CIv>eg*nr{i5u!evFPp2CAfP z9s^j8&=VxWDl2Bv+=Y3cc?%6M!SqiV#*QyzsQnT&#*OqT>=RHJA0s#I$6#;lBv0Dk zqy8rHj6FcUYpx~4KZ!-+O$rlwYG_87)KkBh5!UJHE*;#m79*$h z6pJ?!HtMOpSbijI*3;88yOm~J^wbaOKnh#+)GHh#h3oayhm2q^!`ZHf4;BHiYfDOHVhdp)l%eAe_TIK_HCV ze}+PQO-Ci%4f_lydKe@6Zvsh*gawb2=Dzy@_C?T}GDu;6KwhG?Zaz%%w5_EyOI?GLE0-UrL9?ZB~FW8LNLDcVeP?6AF$Hg)n5`zdmdbFHu+ zf~9#odBL8~u?NVD_Ic_X^uN-6fxJn+%6<=bvqe5(|B}2-zS=%Z-XXujeozCygM5uh zd;x<8%#fM1-=a~M6A0U)(Lr+E-c5dp+_bkdh{H5b+7EEzBP@mt^2s!suff#nTMAWz z=VZVtjw9dpYS>%j>-Y??--g~=`8xgBLr_?&xb;bUiZ&CQV3QG9n$Dpfj_F~b&)f(| zWZ}PIj64BuRahO%S%tz1$S)%|t&se3@}yPsI>J~%p0R2b?EfhFfK_X^g;5|M1c!c% ze388Y{*5BtFA*84ST3?Saw0K~$p2uh;?cKP({O?o!ahyDn%uO4peT$h$dmS0sb52$ zfqq;VljH;T{nTGcJ_!9vVXP%zWL5lC!nlfjiRCizb>w;5#=ORQ@?pz$4h!RI@)66e z#C(P2R%2eY+;Yq(EH{9k4YZ$x9(;;?9rT_st|6boSn!SHo1quRCep1I)3up&JE9cE zwWK#%RnRS@yQ~`Mb)rqp1f-Rj{Jsg$Y)(--os||jLOtr zDl+5Xyi}_DOrF4ugCW<&T3wi5LL#&|JE7?__uxL46>&+`c&w7J^SY%XnNFV4=@=2-&^ z;eA-7(^o?UBSn)as|CWyu1#N+-j;*UoMvRxX^I*|t6vz&sBbcjY39HI&63hA5u4dC zQ!Z$h>Jbw{qdWQ-Jk;McPpWATh&t42^|qQrCP(msSACl;+D!@ z*mOF=E48qw0|AH=dQDe!qkGc{4v3l))?Ht81Gidgf{W{R?9Ok>PZTB#6Zz4m<5%kI zy;YM}fL9vT{OELkwAOBV;b_fwn(k<)jqfqnhtlID?r5#ss)Sy<6+qQ$kIG<2JAONK zD`DG52!ZP!05scOe8|D`8tS||T_nZ{UD0T_rt|#9tHGq|qO;?5T;VhvzbRaPz0}ki zIX2EfyH+b94~N}KH+0GkI6D%QrSAAb zW(yTl^N?nl;!-DsSnA+~38k#JZd28~=uG<^;c``Sv<$O>V*?MR5`zodEQhM+hpYhP zO~w~Ri+Ywtip;`+S7JIuv*fjyT5L7<%R{1BN+GH_UThSWssyK0cUsj3CWJfR4N!&* zUwMg7a}dpN$niqqx7#6JF`G86&5!IZ!+AG452Gu)QX2o%_(Y*Nu{_d>K|Tu5v^#eS z?PyZFIAfZh!!v<;K9ktwb7)hxs6UrAMIkuSL~uYXUt&FGzS}5-?%_}r$mF3el<}U8 zM7P|XM%=ZwC{!hP%4HvA)zjmC))Wjp}$h(e{^Y_dEGEgZ`N4t#V>qcLv1 zB#(9!_y2Og6h>ICz?)6B3EX?1yX<4T7?&+sbZg*^!Jj<3$*kWz(&2oEOeH zFLMyjyBRzl11fGt5LfmnV*2s_vO5juc@9u5w%ZB0ci!(Tm|ZXR@w^^*JcceFMdvdl zs>OXSQVbHz$Nk*t*=7iAT2C{?oF0kubLF$mKt|@zin5o_12#Sb<{`r6Qi^VJ zbo|WieN5x$zItKLzPjVr7=|)R4THZ%#F8IXNPikOg?mHf`O|P_Gep!W_ngQWiTH37 z8VYKNhz%T3dOjoAzh2>Hh1(R$Gm8FwN-irrq42aqS+lTvSjpd4_>98m6uzMFRfX>= zWWh6zeuc{vUZZe_!dn&A6&_P~x59@NKB4feLjD^?|9@2YhQjw1n#c|N=PJBh;k62P zDl92%D11cW6AGVI_-lnPDtuMpI|~1;FoiwkybBb5RAE8kT7_E_?o@c2!rK)dRCr9` z7ZrY8;X?`^Q}`2wzf$ +#include +#include + +#include +#include +#include +#include +#include + +#define ACC_MODE(x) ("\004\002\006\377"[(x)&O_ACCMODE]) + +/* + * comment out this line if you want names > NAME_LEN chars to be + * truncated. Else they will be disallowed. + */ +/* #define NO_TRUNCATE */ + +#define MAY_EXEC 1 +#define MAY_WRITE 2 +#define MAY_READ 4 + +/* + * permission() + * + * is used to check for read/write/execute permissions on a file. + * I don't know if we should look at just the euid or both euid and + * uid, but that should be easily changed. + */ +static int permission(struct m_inode * inode,int mask) +{ + int mode = inode->i_mode; + +/* special case: not even root can read/write a deleted file */ + if (inode->i_dev && !inode->i_nlinks) + return 0; + else if (current->euid==inode->i_uid) + mode >>= 6; + else if (current->egid==inode->i_gid) + mode >>= 3; + if (((mode & mask & 0007) == mask) || suser()) + return 1; + return 0; +} + +/* + * ok, we cannot use strncmp, as the name is not in our data space. + * Thus we'll have to use match. No big problem. Match also makes + * some sanity tests. + * + * NOTE! unlike strncmp, match returns 1 for success, 0 for failure. + */ +static int match(int len,const char * name,struct dir_entry * de) +{ + register int same __asm__("ax"); + + if (!de || !de->inode || len > NAME_LEN) + return 0; + if (len < NAME_LEN && de->name[len]) + return 0; + __asm__("cld\n\t" + "fs ; repe ; cmpsb\n\t" + "setz %%al" + :"=a" (same) + :"0" (0),"S" ((long) name),"D" ((long) de->name),"c" (len) + ); + return same; +} + +/* + * find_entry() + * + * finds an entry in the specified directory with the wanted name. It + * returns the cache buffer in which the entry was found, and the entry + * itself (as a parameter - res_dir). It does NOT read the inode of the + * entry - you'll have to do that yourself if you want to. + * + * This also takes care of the few special cases due to '..'-traversal + * over a pseudo-root and a mount point. + */ +static struct buffer_head * find_entry(struct m_inode ** dir, + const char * name, int namelen, struct dir_entry ** res_dir) +{ + int entries; + int block,i; + struct buffer_head * bh; + struct dir_entry * de; + struct super_block * sb; + +#ifdef NO_TRUNCATE + if (namelen > NAME_LEN) + return NULL; +#else + if (namelen > NAME_LEN) + namelen = NAME_LEN; +#endif + entries = (*dir)->i_size / (sizeof (struct dir_entry)); + *res_dir = NULL; + if (!namelen) + return NULL; +/* check for '..', as we might have to do some "magic" for it */ + if (namelen==2 && get_fs_byte(name)=='.' && get_fs_byte(name+1)=='.') { +/* '..' in a pseudo-root results in a faked '.' (just change namelen) */ + if ((*dir) == current->root) + namelen=1; + else if ((*dir)->i_num == ROOT_INO) { +/* '..' over a mount-point results in 'dir' being exchanged for the mounted + directory-inode. NOTE! We set mounted, so that we can iput the new dir */ + sb=get_super((*dir)->i_dev); + if (sb->s_imount) { + iput(*dir); + (*dir)=sb->s_imount; + (*dir)->i_count++; + } + } + } + if (!(block = (*dir)->i_zone[0])) + return NULL; + if (!(bh = bread((*dir)->i_dev,block))) + return NULL; + i = 0; + de = (struct dir_entry *) bh->b_data; + while (i < entries) { + if ((char *)de >= BLOCK_SIZE+bh->b_data) { + brelse(bh); + bh = NULL; + if (!(block = bmap(*dir,i/DIR_ENTRIES_PER_BLOCK)) || + !(bh = bread((*dir)->i_dev,block))) { + i += DIR_ENTRIES_PER_BLOCK; + continue; + } + de = (struct dir_entry *) bh->b_data; + } + if (match(namelen,name,de)) { + *res_dir = de; + return bh; + } + de++; + i++; + } + brelse(bh); + return NULL; +} + +/* + * add_entry() + * + * adds a file entry to the specified directory, using the same + * semantics as find_entry(). It returns NULL if it failed. + * + * NOTE!! The inode part of 'de' is left at 0 - which means you + * may not sleep between calling this and putting something into + * the entry, as someone else might have used it while you slept. + */ +static struct buffer_head * add_entry(struct m_inode * dir, + const char * name, int namelen, struct dir_entry ** res_dir) +{ + int block,i; + struct buffer_head * bh; + struct dir_entry * de; + + *res_dir = NULL; +#ifdef NO_TRUNCATE + if (namelen > NAME_LEN) + return NULL; +#else + if (namelen > NAME_LEN) + namelen = NAME_LEN; +#endif + if (!namelen) + return NULL; + if (!(block = dir->i_zone[0])) + return NULL; + if (!(bh = bread(dir->i_dev,block))) + return NULL; + i = 0; + de = (struct dir_entry *) bh->b_data; + while (1) { + if ((char *)de >= BLOCK_SIZE+bh->b_data) { + brelse(bh); + bh = NULL; + block = create_block(dir,i/DIR_ENTRIES_PER_BLOCK); + if (!block) + return NULL; + if (!(bh = bread(dir->i_dev,block))) { + i += DIR_ENTRIES_PER_BLOCK; + continue; + } + de = (struct dir_entry *) bh->b_data; + } + if (i*sizeof(struct dir_entry) >= dir->i_size) { + de->inode=0; + dir->i_size = (i+1)*sizeof(struct dir_entry); + dir->i_dirt = 1; + dir->i_ctime = CURRENT_TIME; + } + if (!de->inode) { + dir->i_mtime = CURRENT_TIME; + for (i=0; i < NAME_LEN ; i++) + de->name[i]=(ib_dirt = 1; + *res_dir = de; + return bh; + } + de++; + i++; + } + brelse(bh); + return NULL; +} + +/* + * get_dir() + * + * Getdir traverses the pathname until it hits the topmost directory. + * It returns NULL on failure. + */ +static struct m_inode * get_dir(const char * pathname) +{ + char c; + const char * thisname; + struct m_inode * inode; + struct buffer_head * bh; + int namelen,inr,idev; + struct dir_entry * de; + + if (!current->root || !current->root->i_count) + panic("No root inode"); + if (!current->pwd || !current->pwd->i_count) + panic("No cwd inode"); + if ((c=get_fs_byte(pathname))=='/') { + inode = current->root; + pathname++; + } else if (c) + inode = current->pwd; + else + return NULL; /* empty name is bad */ + inode->i_count++; + while (1) { + thisname = pathname; + if (!S_ISDIR(inode->i_mode) || !permission(inode,MAY_EXEC)) { + iput(inode); + return NULL; + } + for(namelen=0;(c=get_fs_byte(pathname++))&&(c!='/');namelen++) + /* nothing */ ; + if (!c) + return inode; + if (!(bh = find_entry(&inode,thisname,namelen,&de))) { + iput(inode); + return NULL; + } + inr = de->inode; + idev = inode->i_dev; + brelse(bh); + iput(inode); + if (!(inode = iget(idev,inr))) + return NULL; + } +} + +/* + * dir_namei() + * + * dir_namei() returns the inode of the directory of the + * specified name, and the name within that directory. + */ +static struct m_inode * dir_namei(const char * pathname, + int * namelen, const char ** name) +{ + char c; + const char * basename; + struct m_inode * dir; + + if (!(dir = get_dir(pathname))) + return NULL; + basename = pathname; + while (c=get_fs_byte(pathname++)) + if (c=='/') + basename=pathname; + *namelen = pathname-basename-1; + *name = basename; + return dir; +} + +/* + * namei() + * + * is used by most simple commands to get the inode of a specified name. + * Open, link etc use their own routines, but this is enough for things + * like 'chmod' etc. + */ +struct m_inode * namei(const char * pathname) +{ + const char * basename; + int inr,dev,namelen; + struct m_inode * dir; + struct buffer_head * bh; + struct dir_entry * de; + + if (!(dir = dir_namei(pathname,&namelen,&basename))) + return NULL; + if (!namelen) /* special case: '/usr/' etc */ + return dir; + bh = find_entry(&dir,basename,namelen,&de); + if (!bh) { + iput(dir); + return NULL; + } + inr = de->inode; + dev = dir->i_dev; + brelse(bh); + iput(dir); + dir=iget(dev,inr); + if (dir) { + dir->i_atime=CURRENT_TIME; + dir->i_dirt=1; + } + return dir; +} + +/* + * open_namei() + * + * namei for open - this is in fact almost the whole open-routine. + */ +int open_namei(const char * pathname, int flag, int mode, + struct m_inode ** res_inode) +{ + const char * basename; + int inr,dev,namelen; + struct m_inode * dir, *inode; + struct buffer_head * bh; + struct dir_entry * de; + + if ((flag & O_TRUNC) && !(flag & O_ACCMODE)) + flag |= O_WRONLY; + mode &= 0777 & ~current->umask; + mode |= I_REGULAR; + if (!(dir = dir_namei(pathname,&namelen,&basename))) + return -ENOENT; + if (!namelen) { /* special case: '/usr/' etc */ + if (!(flag & (O_ACCMODE|O_CREAT|O_TRUNC))) { + *res_inode=dir; + return 0; + } + iput(dir); + return -EISDIR; + } + bh = find_entry(&dir,basename,namelen,&de); + if (!bh) { + if (!(flag & O_CREAT)) { + iput(dir); + return -ENOENT; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + return -EACCES; + } + inode = new_inode(dir->i_dev); + if (!inode) { + iput(dir); + return -ENOSPC; + } + inode->i_uid = current->euid; + inode->i_mode = mode; + inode->i_dirt = 1; + bh = add_entry(dir,basename,namelen,&de); + if (!bh) { + inode->i_nlinks--; + iput(inode); + iput(dir); + return -ENOSPC; + } + de->inode = inode->i_num; + bh->b_dirt = 1; + brelse(bh); + iput(dir); + *res_inode = inode; + return 0; + } + inr = de->inode; + dev = dir->i_dev; + brelse(bh); + iput(dir); + if (flag & O_EXCL) + return -EEXIST; + if (!(inode=iget(dev,inr))) + return -EACCES; + if ((S_ISDIR(inode->i_mode) && (flag & O_ACCMODE)) || + !permission(inode,ACC_MODE(flag))) { + iput(inode); + return -EPERM; + } + inode->i_atime = CURRENT_TIME; + if (flag & O_TRUNC) + truncate(inode); + *res_inode = inode; + return 0; +} + +int sys_mknod(const char * filename, int mode, int dev) +{ + const char * basename; + int namelen; + struct m_inode * dir, * inode; + struct buffer_head * bh; + struct dir_entry * de; + + if (!suser()) + return -EPERM; + if (!(dir = dir_namei(filename,&namelen,&basename))) + return -ENOENT; + if (!namelen) { + iput(dir); + return -ENOENT; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + return -EPERM; + } + bh = find_entry(&dir,basename,namelen,&de); + if (bh) { + brelse(bh); + iput(dir); + return -EEXIST; + } + inode = new_inode(dir->i_dev); + if (!inode) { + iput(dir); + return -ENOSPC; + } + inode->i_mode = mode; + if (S_ISBLK(mode) || S_ISCHR(mode)) + inode->i_zone[0] = dev; + inode->i_mtime = inode->i_atime = CURRENT_TIME; + inode->i_dirt = 1; + bh = add_entry(dir,basename,namelen,&de); + if (!bh) { + iput(dir); + inode->i_nlinks=0; + iput(inode); + return -ENOSPC; + } + de->inode = inode->i_num; + bh->b_dirt = 1; + iput(dir); + iput(inode); + brelse(bh); + return 0; +} + +int sys_mkdir(const char * pathname, int mode) +{ + const char * basename; + int namelen; + struct m_inode * dir, * inode; + struct buffer_head * bh, *dir_block; + struct dir_entry * de; + + if (!suser()) + return -EPERM; + if (!(dir = dir_namei(pathname,&namelen,&basename))) + return -ENOENT; + if (!namelen) { + iput(dir); + return -ENOENT; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + return -EPERM; + } + bh = find_entry(&dir,basename,namelen,&de); + if (bh) { + brelse(bh); + iput(dir); + return -EEXIST; + } + inode = new_inode(dir->i_dev); + if (!inode) { + iput(dir); + return -ENOSPC; + } + inode->i_size = 32; + inode->i_dirt = 1; + inode->i_mtime = inode->i_atime = CURRENT_TIME; + if (!(inode->i_zone[0]=new_block(inode->i_dev))) { + iput(dir); + inode->i_nlinks--; + iput(inode); + return -ENOSPC; + } + inode->i_dirt = 1; + if (!(dir_block=bread(inode->i_dev,inode->i_zone[0]))) { + iput(dir); + free_block(inode->i_dev,inode->i_zone[0]); + inode->i_nlinks--; + iput(inode); + return -ERROR; + } + de = (struct dir_entry *) dir_block->b_data; + de->inode=inode->i_num; + strcpy(de->name,"."); + de++; + de->inode = dir->i_num; + strcpy(de->name,".."); + inode->i_nlinks = 2; + dir_block->b_dirt = 1; + brelse(dir_block); + inode->i_mode = I_DIRECTORY | (mode & 0777 & ~current->umask); + inode->i_dirt = 1; + bh = add_entry(dir,basename,namelen,&de); + if (!bh) { + iput(dir); + free_block(inode->i_dev,inode->i_zone[0]); + inode->i_nlinks=0; + iput(inode); + return -ENOSPC; + } + de->inode = inode->i_num; + bh->b_dirt = 1; + dir->i_nlinks++; + dir->i_dirt = 1; + iput(dir); + iput(inode); + brelse(bh); + return 0; +} + +/* + * routine to check that the specified directory is empty (for rmdir) + */ +static int empty_dir(struct m_inode * inode) +{ + int nr,block; + int len; + struct buffer_head * bh; + struct dir_entry * de; + + len = inode->i_size / sizeof (struct dir_entry); + if (len<2 || !inode->i_zone[0] || + !(bh=bread(inode->i_dev,inode->i_zone[0]))) { + printk("warning - bad directory on dev %04x\n",inode->i_dev); + return 0; + } + de = (struct dir_entry *) bh->b_data; + if (de[0].inode != inode->i_num || !de[1].inode || + strcmp(".",de[0].name) || strcmp("..",de[1].name)) { + printk("warning - bad directory on dev %04x\n",inode->i_dev); + return 0; + } + nr = 2; + de += 2; + while (nr= (void *) (bh->b_data+BLOCK_SIZE)) { + brelse(bh); + block=bmap(inode,nr/DIR_ENTRIES_PER_BLOCK); + if (!block) { + nr += DIR_ENTRIES_PER_BLOCK; + continue; + } + if (!(bh=bread(inode->i_dev,block))) + return 0; + de = (struct dir_entry *) bh->b_data; + } + if (de->inode) { + brelse(bh); + return 0; + } + de++; + nr++; + } + brelse(bh); + return 1; +} + +int sys_rmdir(const char * name) +{ + const char * basename; + int namelen; + struct m_inode * dir, * inode; + struct buffer_head * bh; + struct dir_entry * de; + + if (!suser()) + return -EPERM; + if (!(dir = dir_namei(name,&namelen,&basename))) + return -ENOENT; + if (!namelen) { + iput(dir); + return -ENOENT; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + return -EPERM; + } + bh = find_entry(&dir,basename,namelen,&de); + if (!bh) { + iput(dir); + return -ENOENT; + } + if (!(inode = iget(dir->i_dev, de->inode))) { + iput(dir); + brelse(bh); + return -EPERM; + } + if ((dir->i_mode & S_ISVTX) && current->euid && + inode->i_uid != current->euid) { + iput(dir); + iput(inode); + brelse(bh); + return -EPERM; + } + if (inode->i_dev != dir->i_dev || inode->i_count>1) { + iput(dir); + iput(inode); + brelse(bh); + return -EPERM; + } + if (inode == dir) { /* we may not delete ".", but "../dir" is ok */ + iput(inode); + iput(dir); + brelse(bh); + return -EPERM; + } + if (!S_ISDIR(inode->i_mode)) { + iput(inode); + iput(dir); + brelse(bh); + return -ENOTDIR; + } + if (!empty_dir(inode)) { + iput(inode); + iput(dir); + brelse(bh); + return -ENOTEMPTY; + } + if (inode->i_nlinks != 2) + printk("empty directory has nlink!=2 (%d)",inode->i_nlinks); + de->inode = 0; + bh->b_dirt = 1; + brelse(bh); + inode->i_nlinks=0; + inode->i_dirt=1; + dir->i_nlinks--; + dir->i_ctime = dir->i_mtime = CURRENT_TIME; + dir->i_dirt=1; + iput(dir); + iput(inode); + return 0; +} + +int sys_unlink(const char * name) +{ + const char * basename; + int namelen; + struct m_inode * dir, * inode; + struct buffer_head * bh; + struct dir_entry * de; + + if (!(dir = dir_namei(name,&namelen,&basename))) + return -ENOENT; + if (!namelen) { + iput(dir); + return -ENOENT; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + return -EPERM; + } + bh = find_entry(&dir,basename,namelen,&de); + if (!bh) { + iput(dir); + return -ENOENT; + } + if (!(inode = iget(dir->i_dev, de->inode))) { + iput(dir); + brelse(bh); + return -ENOENT; + } + if ((dir->i_mode & S_ISVTX) && !suser() && + current->euid != inode->i_uid && + current->euid != dir->i_uid) { + iput(dir); + iput(inode); + brelse(bh); + return -EPERM; + } + if (S_ISDIR(inode->i_mode)) { + iput(inode); + iput(dir); + brelse(bh); + return -EPERM; + } + if (!inode->i_nlinks) { + printk("Deleting nonexistent file (%04x:%d), %d\n", + inode->i_dev,inode->i_num,inode->i_nlinks); + inode->i_nlinks=1; + } + de->inode = 0; + bh->b_dirt = 1; + brelse(bh); + inode->i_nlinks--; + inode->i_dirt = 1; + inode->i_ctime = CURRENT_TIME; + iput(inode); + iput(dir); + return 0; +} + +int sys_symlink() +{ + return -ENOSYS; +} + +int sys_link(const char * oldname, const char * newname) +{ + struct dir_entry * de; + struct m_inode * oldinode, * dir; + struct buffer_head * bh; + const char * basename; + int namelen; + + oldinode=namei(oldname); + if (!oldinode) + return -ENOENT; + if (S_ISDIR(oldinode->i_mode)) { + iput(oldinode); + return -EPERM; + } + dir = dir_namei(newname,&namelen,&basename); + if (!dir) { + iput(oldinode); + return -EACCES; + } + if (!namelen) { + iput(oldinode); + iput(dir); + return -EPERM; + } + if (dir->i_dev != oldinode->i_dev) { + iput(dir); + iput(oldinode); + return -EXDEV; + } + if (!permission(dir,MAY_WRITE)) { + iput(dir); + iput(oldinode); + return -EACCES; + } + bh = find_entry(&dir,basename,namelen,&de); + if (bh) { + brelse(bh); + iput(dir); + iput(oldinode); + return -EEXIST; + } + bh = add_entry(dir,basename,namelen,&de); + if (!bh) { + iput(dir); + iput(oldinode); + return -ENOSPC; + } + de->inode = oldinode->i_num; + bh->b_dirt = 1; + brelse(bh); + iput(dir); + oldinode->i_nlinks++; + oldinode->i_ctime = CURRENT_TIME; + oldinode->i_dirt = 1; + iput(oldinode); + return 0; +} diff --git a/linux-0.11-lab/2/linux/fs/namei.o b/linux-0.11-lab/2/linux/fs/namei.o new file mode 100755 index 0000000000000000000000000000000000000000..0514463113d5878e35d040844344865d47c7032e GIT binary patch literal 20756 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 a@7aEaV1r +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +int sys_ustat(int dev, struct ustat * ubuf) +{ + return -ENOSYS; +} + +int sys_utime(char * filename, struct utimbuf * times) +{ + struct m_inode * inode; + long actime,modtime; + + if (!(inode=namei(filename))) + return -ENOENT; + if (times) { + actime = get_fs_long((unsigned long *) ×->actime); + modtime = get_fs_long((unsigned long *) ×->modtime); + } else + actime = modtime = CURRENT_TIME; + inode->i_atime = actime; + inode->i_mtime = modtime; + inode->i_dirt = 1; + iput(inode); + return 0; +} + +/* + * XXX should we use the real or effective uid? BSD uses the real uid, + * so as to make this call useful to setuid programs. + */ +int sys_access(const char * filename,int mode) +{ + struct m_inode * inode; + int res, i_mode; + + mode &= 0007; + if (!(inode=namei(filename))) + return -EACCES; + i_mode = res = inode->i_mode & 0777; + iput(inode); + if (current->uid == inode->i_uid) + res >>= 6; + else if (current->gid == inode->i_gid) + res >>= 6; + if ((res & 0007 & mode) == mode) + return 0; + /* + * XXX we are doing this test last because we really should be + * swapping the effective with the real user id (temporarily), + * and then calling suser() routine. If we do call the + * suser() routine, it needs to be called last. + */ + if ((!current->uid) && + (!(mode & 1) || (i_mode & 0111))) + return 0; + return -EACCES; +} + +int sys_chdir(const char * filename) +{ + struct m_inode * inode; + + if (!(inode = namei(filename))) + return -ENOENT; + if (!S_ISDIR(inode->i_mode)) { + iput(inode); + return -ENOTDIR; + } + iput(current->pwd); + current->pwd = inode; + return (0); +} + +int sys_chroot(const char * filename) +{ + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + if (!S_ISDIR(inode->i_mode)) { + iput(inode); + return -ENOTDIR; + } + iput(current->root); + current->root = inode; + return (0); +} + +int sys_chmod(const char * filename,int mode) +{ + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + if ((current->euid != inode->i_uid) && !suser()) { + iput(inode); + return -EACCES; + } + inode->i_mode = (mode & 07777) | (inode->i_mode & ~07777); + inode->i_dirt = 1; + iput(inode); + return 0; +} + +int sys_chown(const char * filename,int uid,int gid) +{ + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + if (!suser()) { + iput(inode); + return -EACCES; + } + inode->i_uid=uid; + inode->i_gid=gid; + inode->i_dirt=1; + iput(inode); + return 0; +} + +int sys_open(const char * filename,int flag,int mode) +{ + struct m_inode * inode; + struct file * f; + int i,fd; + + mode &= 0777 & ~current->umask; + for(fd=0 ; fdfilp[fd]) + break; + if (fd>=NR_OPEN) + return -EINVAL; + current->close_on_exec &= ~(1<f_count) break; + if (i>=NR_FILE) + return -EINVAL; + (current->filp[fd]=f)->f_count++; + if ((i=open_namei(filename,flag,mode,&inode))<0) { + current->filp[fd]=NULL; + f->f_count=0; + return i; + } +/* ttys are somewhat special (ttyxx major==4, tty major==5) */ + if (S_ISCHR(inode->i_mode)) + if (MAJOR(inode->i_zone[0])==4) { + if (current->leader && current->tty<0) { + current->tty = MINOR(inode->i_zone[0]); + tty_table[current->tty].pgrp = current->pgrp; + } + } else if (MAJOR(inode->i_zone[0])==5) + if (current->tty<0) { + iput(inode); + current->filp[fd]=NULL; + f->f_count=0; + return -EPERM; + } +/* Likewise with block-devices: check for floppy_change */ + if (S_ISBLK(inode->i_mode)) + check_disk_change(inode->i_zone[0]); + f->f_mode = inode->i_mode; + f->f_flags = flag; + f->f_count = 1; + f->f_inode = inode; + f->f_pos = 0; + return (fd); +} + +int sys_creat(const char * pathname, int mode) +{ + return sys_open(pathname, O_CREAT | O_TRUNC, mode); +} + +int sys_close(unsigned int fd) +{ + struct file * filp; + + if (fd >= NR_OPEN) + return -EINVAL; + current->close_on_exec &= ~(1<filp[fd])) + return -EINVAL; + current->filp[fd] = NULL; + if (filp->f_count == 0) + panic("Close: file count is 0"); + if (--filp->f_count) + return (0); + iput(filp->f_inode); + return (0); +} diff --git a/linux-0.11-lab/2/linux/fs/open.o b/linux-0.11-lab/2/linux/fs/open.o new file mode 100755 index 0000000000000000000000000000000000000000..aceb4b8d44365ee59ea3c9bb01413542e9cf0177 GIT binary patch literal 11184 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/fs/pipe.c b/linux-0.11-lab/2/linux/fs/pipe.c new file mode 100755 index 0000000..dfc4480 --- /dev/null +++ b/linux-0.11-lab/2/linux/fs/pipe.c @@ -0,0 +1,111 @@ +/* + * linux/fs/pipe.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#include +#include /* for get_free_page */ +#include + +int read_pipe(struct m_inode * inode, char * buf, int count) +{ + int chars, size, read = 0; + + while (count>0) { + while (!(size=PIPE_SIZE(*inode))) { + wake_up(&inode->i_wait); + if (inode->i_count != 2) /* are there any writers? */ + return read; + sleep_on(&inode->i_wait); + } + chars = PAGE_SIZE-PIPE_TAIL(*inode); + if (chars > count) + chars = count; + if (chars > size) + chars = size; + count -= chars; + read += chars; + size = PIPE_TAIL(*inode); + PIPE_TAIL(*inode) += chars; + PIPE_TAIL(*inode) &= (PAGE_SIZE-1); + while (chars-->0) + put_fs_byte(((char *)inode->i_size)[size++],buf++); + } + wake_up(&inode->i_wait); + return read; +} + +int write_pipe(struct m_inode * inode, char * buf, int count) +{ + int chars, size, written = 0; + + while (count>0) { + while (!(size=(PAGE_SIZE-1)-PIPE_SIZE(*inode))) { + wake_up(&inode->i_wait); + if (inode->i_count != 2) { /* no readers */ + current->signal |= (1<<(SIGPIPE-1)); + return written?written:-1; + } + sleep_on(&inode->i_wait); + } + chars = PAGE_SIZE-PIPE_HEAD(*inode); + if (chars > count) + chars = count; + if (chars > size) + chars = size; + count -= chars; + written += chars; + size = PIPE_HEAD(*inode); + PIPE_HEAD(*inode) += chars; + PIPE_HEAD(*inode) &= (PAGE_SIZE-1); + while (chars-->0) + ((char *)inode->i_size)[size++]=get_fs_byte(buf++); + } + wake_up(&inode->i_wait); + return written; +} + +int sys_pipe(unsigned long * fildes) +{ + struct m_inode * inode; + struct file * f[2]; + int fd[2]; + int i,j; + + j=0; + for(i=0;j<2 && if_count++; + if (j==1) + f[0]->f_count=0; + if (j<2) + return -1; + j=0; + for(i=0;j<2 && ifilp[i]) { + current->filp[ fd[j]=i ] = f[j]; + j++; + } + if (j==1) + current->filp[fd[0]]=NULL; + if (j<2) { + f[0]->f_count=f[1]->f_count=0; + return -1; + } + if (!(inode=get_pipe_inode())) { + current->filp[fd[0]] = + current->filp[fd[1]] = NULL; + f[0]->f_count = f[1]->f_count = 0; + return -1; + } + f[0]->f_inode = f[1]->f_inode = inode; + f[0]->f_pos = f[1]->f_pos = 0; + f[0]->f_mode = 1; /* read */ + f[1]->f_mode = 2; /* write */ + put_fs_long(fd[0],0+fildes); + put_fs_long(fd[1],1+fildes); + return 0; +} diff --git a/linux-0.11-lab/2/linux/fs/pipe.o b/linux-0.11-lab/2/linux/fs/pipe.o new file mode 100755 index 0000000000000000000000000000000000000000..d5b5db26c38f6881a408d3b6291aeb9d28c67659 GIT binary patch literal 8104 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 Jg} +#include +#include + +#include +#include +#include + +extern int rw_char(int rw,int dev, char * buf, int count, off_t * pos); +extern int read_pipe(struct m_inode * inode, char * buf, int count); +extern int write_pipe(struct m_inode * inode, char * buf, int count); +extern int block_read(int dev, off_t * pos, char * buf, int count); +extern int block_write(int dev, off_t * pos, char * buf, int count); +extern int file_read(struct m_inode * inode, struct file * filp, + char * buf, int count); +extern int file_write(struct m_inode * inode, struct file * filp, + char * buf, int count); + +int sys_lseek(unsigned int fd,off_t offset, int origin) +{ + struct file * file; + int tmp; + + if (fd >= NR_OPEN || !(file=current->filp[fd]) || !(file->f_inode) + || !IS_SEEKABLE(MAJOR(file->f_inode->i_dev))) + return -EBADF; + if (file->f_inode->i_pipe) + return -ESPIPE; + switch (origin) { + case 0: + if (offset<0) return -EINVAL; + file->f_pos=offset; + break; + case 1: + if (file->f_pos+offset<0) return -EINVAL; + file->f_pos += offset; + break; + case 2: + if ((tmp=file->f_inode->i_size+offset) < 0) + return -EINVAL; + file->f_pos = tmp; + break; + default: + return -EINVAL; + } + return file->f_pos; +} + +int sys_read(unsigned int fd,char * buf,int count) +{ + struct file * file; + struct m_inode * inode; + + if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd])) + return -EINVAL; + if (!count) + return 0; + verify_area(buf,count); + inode = file->f_inode; + if (inode->i_pipe) + return (file->f_mode&1)?read_pipe(inode,buf,count):-EIO; + if (S_ISCHR(inode->i_mode)) + return rw_char(READ,inode->i_zone[0],buf,count,&file->f_pos); + if (S_ISBLK(inode->i_mode)) + return block_read(inode->i_zone[0],&file->f_pos,buf,count); + if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode)) { + if (count+file->f_pos > inode->i_size) + count = inode->i_size - file->f_pos; + if (count<=0) + return 0; + return file_read(inode,file,buf,count); + } + printk("(Read)inode->i_mode=%06o\n\r",inode->i_mode); + return -EINVAL; +} + +int sys_write(unsigned int fd,char * buf,int count) +{ + struct file * file; + struct m_inode * inode; + + if (fd>=NR_OPEN || count <0 || !(file=current->filp[fd])) + return -EINVAL; + if (!count) + return 0; + inode=file->f_inode; + if (inode->i_pipe) + return (file->f_mode&2)?write_pipe(inode,buf,count):-EIO; + if (S_ISCHR(inode->i_mode)) + return rw_char(WRITE,inode->i_zone[0],buf,count,&file->f_pos); + if (S_ISBLK(inode->i_mode)) + return block_write(inode->i_zone[0],&file->f_pos,buf,count); + if (S_ISREG(inode->i_mode)) + return file_write(inode,file,buf,count); + printk("(Write)inode->i_mode=%06o\n\r",inode->i_mode); + return -EINVAL; +} diff --git a/linux-0.11-lab/2/linux/fs/read_write.o b/linux-0.11-lab/2/linux/fs/read_write.o new file mode 100755 index 0000000000000000000000000000000000000000..998aad95c9e243e4bfcae9647b34d9235f717844 GIT binary patch literal 7520 zcmbVQYiu0Xb-wf1;mmSLQCvzEBRN?cD{Ezw%cVq1v`kvGMN5?Yh^&V#Id)e2nB}gu zukOx@q+v9+7!{=nR}lg_n!NhJNvN*AKtHNnh1&}46z~!@%^Y@GbSM+Hi&+) z_;%mobMb-b+=o9$?eekszzdgui_HAQ(sVq6%82lGEQ2mj+2<~K+Z0`%8Y+DCs$GC; zV2x_=J>yLH^>=UFxN+@EjO6>iI5qb1OJ4Z(A5i~kU%zGXJdej%Du+ZXEIWMdE6BC9h62MA z*FFygV$Ps-_G5ajP3=Mn;$%Hxqn(z}dF12FaS1v7nUqezq2$`NXa9Tx3EU5_B zL$CjYX`J?3NG#KDtN2$TCPhq$*1Zh&l1x{kusqd^+NERhKFsb6Fan$gvIpkZ%{V(N zJ9h0yU~pX(?-b(gl<{Vm{vh7}iuG{ZTvFY;_QjjTnG(X=ur~Pf2%cx~W!c#o?aC5o zF|j;l-gEiPMoHx)B4Ls3mzS=f%QG^`AM27yzCH~b=81h{o|vy84vfA_LB5zxe^jjM z9J8Fe#WyB?t|@!ilpGHtFFl zG?T&>J^VrFd?BWHXB(%L5ZA*9sf2{yT`%Q@agw2j^l+UuQb_6H?=qSc#`N%HTNp>8+rvEJx4)o5!!}`*qrI4X_Fzhoh5X`%-#!?RyM(FD@9{_~zL|4j2;x%w9$JMc&t58@?@;k{*%Ok&w+_nm(x-f>wBUT}Y`5z|l zvkJAEFp}g0;LwkdZ*m?(d?Us1TSSB^E*H5tq9XJNM)WtvPHuhY01d}zA)MbPznk2& zn$46jc9Gl8%hc~Ck3c^vjB)Zl=ZnmvPvfOOI$1JyrID2V74n6o3`2_SOVcbtX1z+$7$fuzf z#y-*+i|LvseHgtI#)G7Xtvu*{(qmQu^Z@AzYZi2d^eId3xr5}VoD`nMA@aP#H>UB> zLFBV2B0s`pbC1f@en><{!TD3E?lQRpBN@0H2(-Fb|3^riHYk?`YIr1RpZPrM`wMyK zx$5)_BKi)}r44df>KDxDH>E@${enHf<*sdJOZtWR4PK=#v@L#}CpJ#PNZU=3q2H0= zLwI$`@Viy`{%orNt0fg4pnTfl@A1Qz2WHvW9_|(WLQ!n|1Byo(J`5F43+*%cApFr) z;g7BgFMZnKkFN^H=1fZEM%|d~h12YwZX1EEo#gGu) z9YG*QH0@xN!Fz5K2csjf@7D7k2pa5;4Px7%5bKlL-a$Xmw!wo@j$&%lryh`& z{h@Zp^i4uUA*v2g92i?AZh)vp!P<>Ci~Fm7+*?*W_YO{=6F38qIQ)<(`Q#(Gu8<$X z9O~jMn5O-tw+B!8iN~2uCPzxuT)CBZN6MvYYhH9HnhVViQHTaERp~iipOQI-EkaHf z1;R9QMOV>6(^q*5b(a+VYL;fJnKC$*6Q)o0)ELyJaNE%=&(af7$?T+MPhR}?Mf-MD z(RwxISM*ygdopETgyKx=k+xqvda-rUo_zIHY4t-qb^9B58Yiri_Cxx;Q9O34*oQ3p zA^U=TvenY>7_b*lu8Hz9W26}9jwrlz6S>RPTDb8wy-dSP(njZDr>XG>lsQy0i-nt2qZbQK9d-2};arHU(B^0_LwP87g;d-OyxjC=aK!2L9dm2!Y<3!}$)RmrfIcCol zrke6DakVbaq-CWDdWXrC|B6De`0AbV3 zI&vghRW21bucG^jE~U|1-O>dyJwbU2k99UU%bvLh*9F@l#|I|sR9rXghZux<(^B%33bI~Q|P$2|hd zI=WPCRRjhAP>qn_(w-a3FZ#M!xarHmwlsj9X z9E{rcG6Zg*9mQzx!l0frx>Af)nPNQ7^hz-V7E4Dl1SY$q7&4 + +int sys_select() +{ + return -ENOSYS; +} + diff --git a/linux-0.11-lab/2/linux/fs/select.o b/linux-0.11-lab/2/linux/fs/select.o new file mode 100755 index 0000000000000000000000000000000000000000..d61f73a39bf58c107d845f3825c695fe69663502 GIT binary patch literal 1776 zcma)7&ubG=5T2J!Yc*|X8^x9irr?h%?k3TorD`oLDvI>~7iJXeveV zCY}@#J&1bs?8UqPfKX4Kdi3hqL;YsoPO~}bz`U9HX5P%3>16x#`kfm}DH2j-P~Rf@ zl+m7QEas>{P2kmV>r<>uh}!akeCds_eOT8?M2Wg)X97y zXXIz{6KZmJ{3ubzqHEJeej#@`cdNkQ($w4KX(HnU<#LNTV+09~f%U6&dCo2MSm&o^ z=r~TL{^ZAS#{HoyMWNGi>XB9FIHI9A%~auDMj@)y@?EFobsJI14^7W`RO+<7ZqF=R zm5SN1Yo)RVO3jdNuC5hVidAdgsuoSx4(hF|?F;i4q1QW&qPbBto4(tQ%w}M_j=AZh zUncKQJrYawEG&Ru~0ZwnU4Z zUPM;Ij%>1OVMtcsbgYI`>u#*Ky`~RWtlPC(;57dvg*F;I@kis zL)RAOsi&aRIIZ<~a{8_RbIu@$_g4DiB@mtO%TCWGy1^hwHd9;uxYGc5+5Qz*MvUa< z9Gq{Nm4w8{zmS6hLcYY~mLMmkQ0ApQ$Ac%gz;MoiD`Am=g*R7#1j7tNTI!1mRP(~3C{b&IOkWGJ +#include + +#include +#include +#include +#include + +static void cp_stat(struct m_inode * inode, struct stat * statbuf) +{ + struct stat tmp; + int i; + + verify_area(statbuf,sizeof (* statbuf)); + tmp.st_dev = inode->i_dev; + tmp.st_ino = inode->i_num; + tmp.st_mode = inode->i_mode; + tmp.st_nlink = inode->i_nlinks; + tmp.st_uid = inode->i_uid; + tmp.st_gid = inode->i_gid; + tmp.st_rdev = inode->i_zone[0]; + tmp.st_size = inode->i_size; + tmp.st_atime = inode->i_atime; + tmp.st_mtime = inode->i_mtime; + tmp.st_ctime = inode->i_ctime; + for (i=0 ; i= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode)) + return -EBADF; + cp_stat(inode,statbuf); + return 0; +} + +int sys_readlink() +{ + return -ENOSYS; +} diff --git a/linux-0.11-lab/2/linux/fs/stat.o b/linux-0.11-lab/2/linux/fs/stat.o new file mode 100755 index 0000000000000000000000000000000000000000..fdb41d331a01a0b46c2a069b24d4be4631d5abd0 GIT binary patch literal 7212 zcma)AYiu0Xb-p`0bGggq@+rw=MBA%mWl;&aBqhe870O~QS(aqVkR3Xb65H$9-C6Eh z`^wI&9jje5U6!i13^*!XwVu^()5u+ zL6b)PzB^~ARsOU??0nyO+;h)8_s*R=eDdz41F=|4MORG4)pbd!KN$`!a|R~V1~sHs ze`2rg&nC{>*$Z}dZ8_UlI&ZCBwBKC)$cw$(f}k@ar>9?{H!_|1o$tL!W`BOY$6%OY*A_X#QMivXhpWtC42CF&QO0c{hxLA6 z{}FuN{Jn%yHiIiW_89K5c}uCw`0@I4nRLtUIRzSj4f=R$7c7?T{13pkooXXc@js?@ z^e7Eh&$lSt%iCCinph$ghwu^`e}F#mo6%!@v!VY<)6ItNVUt_fBz`w(ChVwZFB)1g zeFC122W!UGdtuk_Kweh7{1)ZO3-{aLo{ zI|kmX?M%T$a`GeFCTFD%RV|PN> zU?u+x{W!;2pHVB>pv4H|R&o>$p^&k93+maN_&IIEmTS+|OnypI-_mKths8o3o-M7k~1jae5d1Xl8XrcsmdE~6Lev%fP-3G4h=LCizM78T}RV8sqQK9(kR7r@o1C z8su~OA92@B@{j8G$Xn#M>&x`{H2E&&Y(e8e9k7ymkcJLBPCcewUj3rWnGpti>45wrG4k=W$HW)NGx{|8b@q^F)1G@qId_szq`hLqC(~Xj;xlQl z5b?RR=OfNu`p-iTzDT|ReN{QXMZSo(;CGSlhh91RNDro2uKlD-$Wl3XlO9c%Ko5{E zr^}%CkRDI3fF2}$C~Y3fL*$R@5996}CNJrKCck$Z>RC~#zs2oZrv4DOt&!GJLl;rF*cjp{?y|A39)oT8lv{)HRVb`y&Wv24VT>;(>ls^Z_%0Te zH9+t8OpBM%V&oF)X$^3ZThFMGXN?ODXt6PW zSt@^q-(mb>U;Qbg9%0mM*t0~4=^rji(4zSH8#)ohM2xCm&5Mx?m zs7>eD!5mvHqt(NvRU55_%O&WyLS7%vTr`}rvTkQxF@P|MU11UxHTpi2*voJ{DPS%z zkg->})GlxXQ?a4g*8Y)Hynl25P;6Ka-URooN~P|E3de#?D&D_4^|92U5iEPrBN=BT z7Vl4`XoIaBI+->>V?b_*m?P7i=pY99~T9 zdE=dLeB&Mb;lgRndVx1<>kuHO59?=->`kn6;C152p2VIbi$)!2YkCCA6Gui)STT$k zxwL~k?!}X;_|b|EqeJvHK@BSRn0dr@{>M@8&vC_ z>V)^Y>z`C*H>h}R)$zSjz7B2%tnRt*!OXtQTy8!$mzk=&?P6t5b?5x;;Kf=gGqsYL zDmUxZV5;19>)uqWi8Hv@hO)|@ys2`hQ4Ffhh7VPvIb|}QYPFkzR}7kMbdj$&OCGV> zXd*4&^G*Wl%?{4;=xCR6OQkjq)yL`P2A--l8!H)}^)adW8g;51hN>;!J1W^!T60&1IQwV0gWLKRh~!O8VXrt@;X z7$%v=08vVl)eRoiJP)3Th4_A@*$y%{m|LA7U-t8bvltTIP&2&E^0ouR?X)nB$OR*8 zV`)hqob)2=)oNFp?J5qH)qKf2#SFvwWU4GwvDWmxe6x|~xG=b?v}3Wbu<65<=bBkH`IXHKaLzc9p6_G2u_#X= zPO;N&9Vs#+`UmhxBw*xRh6 z2~tDF5d*cYwlQ_)Su<&dN#ofv4-DF{DJIJVaDzgp42iW^8sy7?lR$D{iAyLk6I2&&Pwp=aThB5z7+U4||OYm_O}S1J!Oe@z^w)@Kg8f z+qXM2@n8W@QYULqh z_@MUnCzkthq5z!}9gh^yAGO}?x2a#kFFF)JKVuyT^(E+|7d`ZuV-n{a^wF!__@C&v z2cdfozv!I|ijM>TY#k3MFldKZiCEjKq#p}gk2 z!3L~l_ZyBjUOW^f4GV9t;P^2C%71y$hi@1hHx!ROlzC#|btMWAipECz5&Y=?fB7+= z?huUk1vZo`vduv5&hPukkDsv24@Z{u{1(BZHlXT>Uc6Yl6cK&kH~jts$C?Zq$QAkV z1G>B4AEQuQGwhdXMs@MPqc)&w7@ux-mm;DrY~AsGj(Cj2ct~|U-lxIYhU4b7DXr9p z*qL0k@y9jY?RUqJQv3>tuE_7RP>@Gg5q{lQWcxCdUM7(%>bJX3n!djg|D}Kur_1$ttULScj<*e_;*J01rQF>EW!uaVeYrPTs1Wxba_&i#yRW!ek=HeGg)f4xE505rRL0HB zUw4S(i@f`aD|`TSU2#*9>x#HaukW4IvQ88DMSJ5g@|&eWF4}iR0+8|oe$k#u{{xVt zy^``#$k9dr5;ChdH6@pa#Q(uiI>r@VHxd^YdmbYb4&=B>n2Kvh-Y-*vX)J1cz0 zN3Zi6P9^A*`-+7H_TNM-u1R!lVNLPhPZko(17lb_=KBf{7AqOUv(0r#gvlUJ|1m7` zEkrzctQYN5g1ZG-2kJjA$Z=CP&pYrjkvoD<39bn~FUU2|c3&5KP4ErDw*=o6yexP{ z@Ty>(<3pSQ!Oeo(1a}G^6g(pMNx`yUTkr|N3xdxJzAX4n!S4wEwcw8he=V3oEtwbp zlT6$y$p2zfUJ@(|`hrgheopW!g8VRMyKf8fpP!U}Ac+4t8rj05O8tP~xZrld6+vI{ zNx?P2FA2UZ_?qAwf^P}FD|lJ(ir`g2{u9{bA-Gv^o8V5ty@K}&9v3VLwgk@!o)>&h z@KwRL1>Y6CEO +#include +#include +#include + +#include +#include + +int sync_dev(int dev); +void wait_for_keypress(void); + +/* set_bit uses setb, as gas doesn't recognize setc */ +#define set_bit(bitnr,addr) ({ \ +register int __res __asm__("ax"); \ +__asm__("bt %2,%3;setb %%al":"=a" (__res):"a" (0),"r" (bitnr),"m" (*(addr))); \ +__res; }) + +struct super_block super_block[NR_SUPER]; +/* this is initialized in init/main.c */ +int ROOT_DEV = 0; + +static void lock_super(struct super_block * sb) +{ + cli(); + while (sb->s_lock) + sleep_on(&(sb->s_wait)); + sb->s_lock = 1; + sti(); +} + +static void free_super(struct super_block * sb) +{ + cli(); + sb->s_lock = 0; + wake_up(&(sb->s_wait)); + sti(); +} + +static void wait_on_super(struct super_block * sb) +{ + cli(); + while (sb->s_lock) + sleep_on(&(sb->s_wait)); + sti(); +} + +struct super_block * get_super(int dev) +{ + struct super_block * s; + + if (!dev) + return NULL; + s = 0+super_block; + while (s < NR_SUPER+super_block) + if (s->s_dev == dev) { + wait_on_super(s); + if (s->s_dev == dev) + return s; + s = 0+super_block; + } else + s++; + return NULL; +} + +void put_super(int dev) +{ + struct super_block * sb; +/* struct m_inode * inode; */ + int i; + + if (dev == ROOT_DEV) { + printk("root diskette changed: prepare for armageddon\n\r"); + return; + } + if (!(sb = get_super(dev))) + return; + if (sb->s_imount) { + printk("Mounted disk changed - tssk, tssk\n\r"); + return; + } + lock_super(sb); + sb->s_dev = 0; + for(i=0;is_imap[i]); + for(i=0;is_zmap[i]); + free_super(sb); + return; +} + +static struct super_block * read_super(int dev) +{ + struct super_block * s; + struct buffer_head * bh; + int i,block; + + if (!dev) + return NULL; + check_disk_change(dev); + if (s = get_super(dev)) + return s; + for (s = 0+super_block ;; s++) { + if (s >= NR_SUPER+super_block) + return NULL; + if (!s->s_dev) + break; + } + s->s_dev = dev; + s->s_isup = NULL; + s->s_imount = NULL; + s->s_time = 0; + s->s_rd_only = 0; + s->s_dirt = 0; + lock_super(s); + if (!(bh = bread(dev,1))) { + s->s_dev=0; + free_super(s); + return NULL; + } + __asm__ volatile ("cld"); /* by wyj */ + *((struct d_super_block *) s) = + *((struct d_super_block *) bh->b_data); + brelse(bh); + if (s->s_magic != SUPER_MAGIC) { + s->s_dev = 0; + free_super(s); + return NULL; + } + for (i=0;is_imap[i] = NULL; + for (i=0;is_zmap[i] = NULL; + block=2; + for (i=0 ; i < s->s_imap_blocks ; i++) + if (s->s_imap[i]=bread(dev,block)) + block++; + else + break; + for (i=0 ; i < s->s_zmap_blocks ; i++) + if (s->s_zmap[i]=bread(dev,block)) + block++; + else + break; + if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) { + for(i=0;is_imap[i]); + for(i=0;is_zmap[i]); + s->s_dev=0; + free_super(s); + return NULL; + } + s->s_imap[0]->b_data[0] |= 1; + s->s_zmap[0]->b_data[0] |= 1; + free_super(s); + return s; +} + +int sys_umount(char * dev_name) +{ + struct m_inode * inode; + struct super_block * sb; + int dev; + + if (!(inode=namei(dev_name))) + return -ENOENT; + dev = inode->i_zone[0]; + if (!S_ISBLK(inode->i_mode)) { + iput(inode); + return -ENOTBLK; + } + iput(inode); + if (dev==ROOT_DEV) + return -EBUSY; + if (!(sb=get_super(dev)) || !(sb->s_imount)) + return -ENOENT; + if (!sb->s_imount->i_mount) + printk("Mounted inode has i_mount=0\n"); + for (inode=inode_table+0 ; inodei_dev==dev && inode->i_count) + return -EBUSY; + sb->s_imount->i_mount=0; + iput(sb->s_imount); + sb->s_imount = NULL; + iput(sb->s_isup); + sb->s_isup = NULL; + put_super(dev); + sync_dev(dev); + return 0; +} + +int sys_mount(char * dev_name, char * dir_name, int rw_flag) +{ + struct m_inode * dev_i, * dir_i; + struct super_block * sb; + int dev; + + if (!(dev_i=namei(dev_name))) + return -ENOENT; + dev = dev_i->i_zone[0]; + if (!S_ISBLK(dev_i->i_mode)) { + iput(dev_i); + return -EPERM; + } + iput(dev_i); + if (!(dir_i=namei(dir_name))) + return -ENOENT; + if (dir_i->i_count != 1 || dir_i->i_num == ROOT_INO) { + iput(dir_i); + return -EBUSY; + } + if (!S_ISDIR(dir_i->i_mode)) { + iput(dir_i); + return -EPERM; + } + if (!(sb=read_super(dev))) { + iput(dir_i); + return -EBUSY; + } + if (sb->s_imount) { + iput(dir_i); + return -EBUSY; + } + if (dir_i->i_mount) { + iput(dir_i); + return -EPERM; + } + sb->s_imount=dir_i; + dir_i->i_mount=1; + dir_i->i_dirt=1; /* NOTE! we don't iput(dir_i) */ + return 0; /* we do that in umount */ +} + +void mount_root(void) +{ + int i,free; + struct super_block * p; + struct m_inode * mi; + + if (32 != sizeof (struct d_inode)) + panic("bad i-node size"); + for(i=0;is_dev = 0; + p->s_lock = 0; + p->s_wait = NULL; + } + if (!(p=read_super(ROOT_DEV))) + panic("Unable to mount root"); + if (!(mi=iget(ROOT_DEV,ROOT_INO))) + panic("Unable to read root i-node"); + mi->i_count += 3 ; /* NOTE! it is logically used 4 times, not 1 */ + p->s_isup = p->s_imount = mi; + current->pwd = mi; + current->root = mi; + free=0; + i=p->s_nzones; + while (-- i >= 0) + if (!set_bit(i&8191,p->s_zmap[i>>13]->b_data)) + free++; + printk("%d/%d free blocks\n\r",free,p->s_nzones); + free=0; + i=p->s_ninodes+1; + while (-- i >= 0) + if (!set_bit(i&8191,p->s_imap[i>>13]->b_data)) + free++; + printk("%d/%d free inodes\n\r",free,p->s_ninodes); +} diff --git a/linux-0.11-lab/2/linux/fs/super.o b/linux-0.11-lab/2/linux/fs/super.o new file mode 100755 index 0000000000000000000000000000000000000000..b551798da16bfa699c2dc2848c061720be0e1b2a GIT binary patch literal 12284 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 + +#include + +static void free_ind(int dev,int block) +{ + struct buffer_head * bh; + unsigned short * p; + int i; + + if (!block) + return; + if (bh=bread(dev,block)) { + p = (unsigned short *) bh->b_data; + for (i=0;i<512;i++,p++) + if (*p) + free_block(dev,*p); + brelse(bh); + } + free_block(dev,block); +} + +static void free_dind(int dev,int block) +{ + struct buffer_head * bh; + unsigned short * p; + int i; + + if (!block) + return; + if (bh=bread(dev,block)) { + p = (unsigned short *) bh->b_data; + for (i=0;i<512;i++,p++) + if (*p) + free_ind(dev,*p); + brelse(bh); + } + free_block(dev,block); +} + +void truncate(struct m_inode * inode) +{ + int i; + + if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) + return; + for (i=0;i<7;i++) + if (inode->i_zone[i]) { + free_block(inode->i_dev,inode->i_zone[i]); + inode->i_zone[i]=0; + } + free_ind(inode->i_dev,inode->i_zone[7]); + free_dind(inode->i_dev,inode->i_zone[8]); + inode->i_zone[7] = inode->i_zone[8] = 0; + inode->i_size = 0; + inode->i_dirt = 1; + inode->i_mtime = inode->i_ctime = CURRENT_TIME; +} + diff --git a/linux-0.11-lab/2/linux/fs/truncate.o b/linux-0.11-lab/2/linux/fs/truncate.o new file mode 100755 index 0000000000000000000000000000000000000000..8975b924958105c719b40601717933b390dce7b0 GIT binary patch literal 6848 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 T&knY~U11EUL+(?^{YLp;_3Udb literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/include/a.out.h b/linux-0.11-lab/2/linux/include/a.out.h new file mode 100755 index 0000000..3e67974 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/a.out.h @@ -0,0 +1,220 @@ +#ifndef _A_OUT_H +#define _A_OUT_H + +#define __GNU_EXEC_MACROS__ + +struct exec { + unsigned long a_magic; /* Use macros N_MAGIC, etc for access */ + unsigned a_text; /* length of text, in bytes */ + unsigned a_data; /* length of data, in bytes */ + unsigned a_bss; /* length of uninitialized data area for file, in bytes */ + unsigned a_syms; /* length of symbol table data in file, in bytes */ + unsigned a_entry; /* start address */ + unsigned a_trsize; /* length of relocation info for text, in bytes */ + unsigned a_drsize; /* length of relocation info for data, in bytes */ +}; + +#ifndef N_MAGIC +#define N_MAGIC(exec) ((exec).a_magic) +#endif + +#ifndef OMAGIC +/* Code indicating object file or impure executable. */ +#define OMAGIC 0407 +/* Code indicating pure executable. */ +#define NMAGIC 0410 +/* Code indicating demand-paged executable. */ +#define ZMAGIC 0413 +#endif /* not OMAGIC */ + +#ifndef N_BADMAG +#define N_BADMAG(x) \ + (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC) +#endif + +#define _N_BADMAG(x) \ + (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC) + +#define _N_HDROFF(x) (SEGMENT_SIZE - sizeof (struct exec)) + +#ifndef N_TXTOFF +#define N_TXTOFF(x) \ + (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec)) +#endif + +#ifndef N_DATOFF +#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) +#endif + +#ifndef N_TRELOFF +#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) +#endif + +#ifndef N_DRELOFF +#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) +#endif + +#ifndef N_SYMOFF +#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize) +#endif + +#ifndef N_STROFF +#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) +#endif + +/* Address of text segment in memory after it is loaded. */ +#ifndef N_TXTADDR +#define N_TXTADDR(x) 0 +#endif + +/* Address of data segment in memory after it is loaded. + Note that it is up to you to define SEGMENT_SIZE + on machines not listed here. */ +#if defined(vax) || defined(hp300) || defined(pyr) +#define SEGMENT_SIZE PAGE_SIZE +#endif +#ifdef hp300 +#define PAGE_SIZE 4096 +#endif +#ifdef sony +#define SEGMENT_SIZE 0x2000 +#endif /* Sony. */ +#ifdef is68k +#define SEGMENT_SIZE 0x20000 +#endif +#if defined(m68k) && defined(PORTAR) +#define PAGE_SIZE 0x400 +#define SEGMENT_SIZE PAGE_SIZE +#endif + +#define PAGE_SIZE 4096 +#define SEGMENT_SIZE 1024 + +#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1)) + +#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) + +#ifndef N_DATADDR +#define N_DATADDR(x) \ + (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ + : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) +#endif + +/* Address of bss segment in memory after it is loaded. */ +#ifndef N_BSSADDR +#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) +#endif + +#ifndef N_NLIST_DECLARED +struct nlist { + union { + char *n_name; + struct nlist *n_next; + long n_strx; + } n_un; + unsigned char n_type; + char n_other; + short n_desc; + unsigned long n_value; +}; +#endif + +#ifndef N_UNDF +#define N_UNDF 0 +#endif +#ifndef N_ABS +#define N_ABS 2 +#endif +#ifndef N_TEXT +#define N_TEXT 4 +#endif +#ifndef N_DATA +#define N_DATA 6 +#endif +#ifndef N_BSS +#define N_BSS 8 +#endif +#ifndef N_COMM +#define N_COMM 18 +#endif +#ifndef N_FN +#define N_FN 15 +#endif + +#ifndef N_EXT +#define N_EXT 1 +#endif +#ifndef N_TYPE +#define N_TYPE 036 +#endif +#ifndef N_STAB +#define N_STAB 0340 +#endif + +/* The following type indicates the definition of a symbol as being + an indirect reference to another symbol. The other symbol + appears as an undefined reference, immediately following this symbol. + + Indirection is asymmetrical. The other symbol's value will be used + to satisfy requests for the indirect symbol, but not vice versa. + If the other symbol does not have a definition, libraries will + be searched to find a definition. */ +#define N_INDR 0xa + +/* The following symbols refer to set elements. + All the N_SET[ATDB] symbols with the same name form one set. + Space is allocated for the set in the text section, and each set + element's value is stored into one word of the space. + The first word of the space is the length of the set (number of elements). + + The address of the set is made into an N_SETV symbol + whose name is the same as the name of the set. + This symbol acts like a N_DATA global symbol + in that it can satisfy undefined external references. */ + +/* These appear as input to LD, in a .o file. */ +#define N_SETA 0x14 /* Absolute set element symbol */ +#define N_SETT 0x16 /* Text set element symbol */ +#define N_SETD 0x18 /* Data set element symbol */ +#define N_SETB 0x1A /* Bss set element symbol */ + +/* This is output from LD. */ +#define N_SETV 0x1C /* Pointer to set vector in data area. */ + +#ifndef N_RELOCATION_INFO_DECLARED + +/* This structure describes a single relocation to be performed. + The text-relocation section of the file is a vector of these structures, + all of which apply to the text section. + Likewise, the data-relocation section applies to the data section. */ + +struct relocation_info +{ + /* Address (within segment) to be relocated. */ + int r_address; + /* The meaning of r_symbolnum depends on r_extern. */ + unsigned int r_symbolnum:24; + /* Nonzero means value is a pc-relative offset + and it should be relocated for changes in its own address + as well as for changes in the symbol or section specified. */ + unsigned int r_pcrel:1; + /* Length (as exponent of 2) of the field to be relocated. + Thus, a value of 2 indicates 1<<2 bytes. */ + unsigned int r_length:2; + /* 1 => relocate with value of symbol. + r_symbolnum is the index of the symbol + in file's the symbol table. + 0 => relocate with the address of a segment. + r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS + (the N_EXT bit may be set also, but signifies nothing). */ + unsigned int r_extern:1; + /* Four bits that aren't used, but when writing an object file + it is desirable to clear them. */ + unsigned int r_pad:4; +}; +#endif /* no N_RELOCATION_INFO_DECLARED. */ + + +#endif /* __A_OUT_GNU_H__ */ diff --git a/linux-0.11-lab/2/linux/include/asm/io.h b/linux-0.11-lab/2/linux/include/asm/io.h new file mode 100755 index 0000000..d5cc42a --- /dev/null +++ b/linux-0.11-lab/2/linux/include/asm/io.h @@ -0,0 +1,24 @@ +#define outb(value,port) \ +__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port)) + + +#define inb(port) ({ \ +unsigned char _v; \ +__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \ +_v; \ +}) + +#define outb_p(value,port) \ +__asm__ ("outb %%al,%%dx\n" \ + "\tjmp 1f\n" \ + "1:\tjmp 1f\n" \ + "1:"::"a" (value),"d" (port)) + +#define inb_p(port) ({ \ +unsigned char _v; \ +__asm__ volatile ("inb %%dx,%%al\n" \ + "\tjmp 1f\n" \ + "1:\tjmp 1f\n" \ + "1:":"=a" (_v):"d" (port)); \ +_v; \ +}) diff --git a/linux-0.11-lab/2/linux/include/asm/memory.h b/linux-0.11-lab/2/linux/include/asm/memory.h new file mode 100755 index 0000000..51b69e7 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/asm/memory.h @@ -0,0 +1,15 @@ +/* + * NOTE!!! memcpy(dest,src,n) assumes ds=es=normal data segment. This + * goes for all kernel functions (ds=es=kernel space, fs=local data, + * gs=null), as well as for all well-behaving user programs (ds=es= + * user data space). This is NOT a bug, as any user program that changes + * es deserves to die if it isn't careful. + */ +#define memcpy(dest,src,n) ({ \ +void * _res = dest; \ +__asm__ ("cld;rep;movsb" \ + ::"D" ((long)(_res)),"S" ((long)(src)),"c" ((long) (n)) \ + ); \ +_res; \ +}) + diff --git a/linux-0.11-lab/2/linux/include/asm/segment.h b/linux-0.11-lab/2/linux/include/asm/segment.h new file mode 100755 index 0000000..94dd102 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/asm/segment.h @@ -0,0 +1,65 @@ +static inline unsigned char get_fs_byte(const char * addr) +{ + unsigned register char _v; + + __asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr)); + return _v; +} + +static inline unsigned short get_fs_word(const unsigned short *addr) +{ + unsigned short _v; + + __asm__ ("movw %%fs:%1,%0":"=r" (_v):"m" (*addr)); + return _v; +} + +static inline unsigned long get_fs_long(const unsigned long *addr) +{ + unsigned long _v; + + __asm__ ("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \ + return _v; +} + +static inline void put_fs_byte(char val,char *addr) +{ +__asm__ ("movb %0,%%fs:%1"::"r" (val),"m" (*addr)); +} + +static inline void put_fs_word(short val,short * addr) +{ +__asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr)); +} + +static inline void put_fs_long(unsigned long val,unsigned long * addr) +{ +__asm__ ("movl %0,%%fs:%1"::"r" (val),"m" (*addr)); +} + +/* + * Someone who knows GNU asm better than I should double check the followig. + * It seems to work, but I don't know if I'm doing something subtly wrong. + * --- TYT, 11/24/91 + * [ nothing wrong here, Linus ] + */ + +static inline unsigned long get_fs() +{ + unsigned short _v; + __asm__("mov %%fs,%%ax":"=a" (_v):); + return _v; +} + +static inline unsigned long get_ds() +{ + unsigned short _v; + __asm__("mov %%ds,%%ax":"=a" (_v):); + return _v; +} + +static inline void set_fs(unsigned long val) +{ + __asm__("mov %0,%%fs"::"a" ((unsigned short) val)); +} + diff --git a/linux-0.11-lab/2/linux/include/asm/system.h b/linux-0.11-lab/2/linux/include/asm/system.h new file mode 100755 index 0000000..0b5a21d --- /dev/null +++ b/linux-0.11-lab/2/linux/include/asm/system.h @@ -0,0 +1,66 @@ +#define move_to_user_mode() \ +__asm__ ("movl %%esp,%%eax\n\t" \ + "pushl $0x17\n\t" \ + "pushl %%eax\n\t" \ + "pushfl\n\t" \ + "pushl $0x0f\n\t" \ + "pushl $1f\n\t" \ + "iret\n" \ + "1:\tmovl $0x17,%%eax\n\t" \ + "movw %%ax,%%ds\n\t" \ + "movw %%ax,%%es\n\t" \ + "movw %%ax,%%fs\n\t" \ + "movw %%ax,%%gs" \ + :::"ax") + +#define sti() __asm__ ("sti"::) +#define cli() __asm__ ("cli"::) +#define nop() __asm__ ("nop"::) + +#define iret() __asm__ ("iret"::) + +#define _set_gate(gate_addr,type,dpl,addr) \ +__asm__ ("movw %%dx,%%ax\n\t" \ + "movw %0,%%dx\n\t" \ + "movl %%eax,%1\n\t" \ + "movl %%edx,%2" \ + : \ + : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \ + "o" (*((char *) (gate_addr))), \ + "o" (*(4+(char *) (gate_addr))), \ + "d" ((char *) (addr)),"a" (0x00080000)) + +#define set_intr_gate(n,addr) \ + _set_gate(&idt[n],14,0,addr) + +#define set_trap_gate(n,addr) \ + _set_gate(&idt[n],15,0,addr) + +#define set_system_gate(n,addr) \ + _set_gate(&idt[n],15,3,addr) + +#define _set_seg_desc(gate_addr,type,dpl,base,limit) {\ + *(gate_addr) = ((base) & 0xff000000) | \ + (((base) & 0x00ff0000)>>16) | \ + ((limit) & 0xf0000) | \ + ((dpl)<<13) | \ + (0x00408000) | \ + ((type)<<8); \ + *((gate_addr)+1) = (((base) & 0x0000ffff)<<16) | \ + ((limit) & 0x0ffff); } + +#define _set_tssldt_desc(n,addr,type) \ +__asm__ ("movw $104,%1\n\t" \ + "movw %%ax,%2\n\t" \ + "rorl $16,%%eax\n\t" \ + "movb %%al,%3\n\t" \ + "movb $" type ",%4\n\t" \ + "movb $0x00,%5\n\t" \ + "movb %%ah,%6\n\t" \ + "rorl $16,%%eax" \ + ::"a" (addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), \ + "m" (*(n+5)), "m" (*(n+6)), "m" (*(n+7)) \ + ) + +#define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x89") +#define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x82") diff --git a/linux-0.11-lab/2/linux/include/const.h b/linux-0.11-lab/2/linux/include/const.h new file mode 100755 index 0000000..7828e61 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/const.h @@ -0,0 +1,15 @@ +#ifndef _CONST_H +#define _CONST_H + +#define BUFFER_END 0x200000 + +#define I_TYPE 0170000 +#define I_DIRECTORY 0040000 +#define I_REGULAR 0100000 +#define I_BLOCK_SPECIAL 0060000 +#define I_CHAR_SPECIAL 0020000 +#define I_NAMED_PIPE 0010000 +#define I_SET_UID_BIT 0004000 +#define I_SET_GID_BIT 0002000 + +#endif diff --git a/linux-0.11-lab/2/linux/include/ctype.h b/linux-0.11-lab/2/linux/include/ctype.h new file mode 100755 index 0000000..7acf55d --- /dev/null +++ b/linux-0.11-lab/2/linux/include/ctype.h @@ -0,0 +1,34 @@ +#ifndef _CTYPE_H +#define _CTYPE_H + +#define _U 0x01 /* upper */ +#define _L 0x02 /* lower */ +#define _D 0x04 /* digit */ +#define _C 0x08 /* cntrl */ +#define _P 0x10 /* punct */ +#define _S 0x20 /* white space (space/lf/tab) */ +#define _X 0x40 /* hex digit */ +#define _SP 0x80 /* hard space (0x20) */ + +extern unsigned char _ctype[]; +extern char _ctmp; + +#define isalnum(c) ((_ctype+1)[c]&(_U|_L|_D)) +#define isalpha(c) ((_ctype+1)[c]&(_U|_L)) +#define iscntrl(c) ((_ctype+1)[c]&(_C)) +#define isdigit(c) ((_ctype+1)[c]&(_D)) +#define isgraph(c) ((_ctype+1)[c]&(_P|_U|_L|_D)) +#define islower(c) ((_ctype+1)[c]&(_L)) +#define isprint(c) ((_ctype+1)[c]&(_P|_U|_L|_D|_SP)) +#define ispunct(c) ((_ctype+1)[c]&(_P)) +#define isspace(c) ((_ctype+1)[c]&(_S)) +#define isupper(c) ((_ctype+1)[c]&(_U)) +#define isxdigit(c) ((_ctype+1)[c]&(_D|_X)) + +#define isascii(c) (((unsigned) c)<=0x7f) +#define toascii(c) (((unsigned) c)&0x7f) + +#define tolower(c) (_ctmp=c,isupper(_ctmp)?_ctmp-('A'-'a'):_ctmp) +#define toupper(c) (_ctmp=c,islower(_ctmp)?_ctmp-('a'-'A'):_ctmp) + +#endif diff --git a/linux-0.11-lab/2/linux/include/errno.h b/linux-0.11-lab/2/linux/include/errno.h new file mode 100755 index 0000000..c282f69 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/errno.h @@ -0,0 +1,60 @@ +#ifndef _ERRNO_H +#define _ERRNO_H + +/* + * ok, as I hadn't got any other source of information about + * possible error numbers, I was forced to use the same numbers + * as minix. + * Hopefully these are posix or something. I wouldn't know (and posix + * isn't telling me - they want $$$ for their f***ing standard). + * + * We don't use the _SIGN cludge of minix, so kernel returns must + * see to the sign by themselves. + * + * NOTE! Remember to change strerror() if you change this file! + */ + +extern int errno; + +#define ERROR 99 +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 35 +#define ENAMETOOLONG 36 +#define ENOLCK 37 +#define ENOSYS 38 +#define ENOTEMPTY 39 + +#endif diff --git a/linux-0.11-lab/2/linux/include/fcntl.h b/linux-0.11-lab/2/linux/include/fcntl.h new file mode 100755 index 0000000..a5bf9af --- /dev/null +++ b/linux-0.11-lab/2/linux/include/fcntl.h @@ -0,0 +1,55 @@ +#ifndef _FCNTL_H +#define _FCNTL_H + +#include + +/* open/fcntl - NOCTTY, NDELAY isn't implemented yet */ +#define O_ACCMODE 00003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 00100 /* not fcntl */ +#define O_EXCL 00200 /* not fcntl */ +#define O_NOCTTY 00400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_APPEND 02000 +#define O_NONBLOCK 04000 /* not fcntl */ +#define O_NDELAY O_NONBLOCK + +/* Defines for fcntl-commands. Note that currently + * locking isn't supported, and other things aren't really + * tested. + */ +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get f_flags */ +#define F_SETFD 2 /* set f_flags */ +#define F_GETFL 3 /* more flags (cloexec) */ +#define F_SETFL 4 +#define F_GETLK 5 /* not implemented */ +#define F_SETLK 6 +#define F_SETLKW 7 + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* Ok, these are locking features, and aren't implemented at any + * level. POSIX wants them. + */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* Once again - not implemented, but ... */ +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +extern int creat(const char * filename,mode_t mode); +extern int fcntl(int fildes,int cmd, ...); +extern int open(const char * filename, int flags, ...); + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/config.h b/linux-0.11-lab/2/linux/include/linux/config.h new file mode 100755 index 0000000..c979fb3 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/config.h @@ -0,0 +1,48 @@ +#ifndef _CONFIG_H +#define _CONFIG_H + +/* + * The root-device is no longer hard-coded. You can change the default + * root-device by changing the line ROOT_DEV = XXX in boot/bootsect.s + */ + +/* + * define your keyboard here - + * KBD_FINNISH for Finnish keyboards + * KBD_US for US-type + * KBD_GR for German keyboards + * KBD_FR for Frech keyboard + */ +#define KBD_US +/*#define KBD_GR */ +/*#define KBD_FR */ +/*#define KBD_FINNISH */ + +/* + * Normally, Linux can get the drive parameters from the BIOS at + * startup, but if this for some unfathomable reason fails, you'd + * be left stranded. For this case, you can define HD_TYPE, which + * contains all necessary info on your harddisk. + * + * The HD_TYPE macro should look like this: + * + * #define HD_TYPE { head, sect, cyl, wpcom, lzone, ctl} + * + * In case of two harddisks, the info should be sepatated by + * commas: + * + * #define HD_TYPE { h,s,c,wpcom,lz,ctl },{ h,s,c,wpcom,lz,ctl } + */ +/* + This is an example, two drives, first is type 2, second is type 3: + +#define HD_TYPE { 4,17,615,300,615,8 }, { 6,17,615,300,615,0 } + + NOTE: ctl is 0 for all drives with heads<=8, and ctl=8 for drives + with more than 8 heads. + + If you want the BIOS to tell what kind of drive you have, just + leave HD_TYPE undefined. This is the normal thing to do. +*/ + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/fdreg.h b/linux-0.11-lab/2/linux/include/linux/fdreg.h new file mode 100755 index 0000000..01355af --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/fdreg.h @@ -0,0 +1,71 @@ +/* + * This file contains some defines for the floppy disk controller. + * Various sources. Mostly "IBM Microcomputers: A Programmers + * Handbook", Sanches and Canton. + */ +#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); + +/* Fd controller regs. S&C, about page 340 */ +#define FD_STATUS 0x3f4 +#define FD_DATA 0x3f5 +#define FD_DOR 0x3f2 /* Digital Output Register */ +#define FD_DIR 0x3f7 /* Digital Input Register (read) */ +#define FD_DCR 0x3f7 /* Diskette Control Register (write)*/ + +/* Bits of main status register */ +#define STATUS_BUSYMASK 0x0F /* drive busy mask */ +#define STATUS_BUSY 0x10 /* FDC busy */ +#define STATUS_DMA 0x20 /* 0- DMA mode */ +#define STATUS_DIR 0x40 /* 0- cpu->fdc */ +#define STATUS_READY 0x80 /* Data reg ready */ + +/* Bits of FD_ST0 */ +#define ST0_DS 0x03 /* drive select mask */ +#define ST0_HA 0x04 /* Head (Address) */ +#define ST0_NR 0x08 /* Not Ready */ +#define ST0_ECE 0x10 /* Equipment chech error */ +#define ST0_SE 0x20 /* Seek end */ +#define ST0_INTR 0xC0 /* Interrupt code mask */ + +/* Bits of FD_ST1 */ +#define ST1_MAM 0x01 /* Missing Address Mark */ +#define ST1_WP 0x02 /* Write Protect */ +#define ST1_ND 0x04 /* No Data - unreadable */ +#define ST1_OR 0x10 /* OverRun */ +#define ST1_CRC 0x20 /* CRC error in data or addr */ +#define ST1_EOC 0x80 /* End Of Cylinder */ + +/* Bits of FD_ST2 */ +#define ST2_MAM 0x01 /* Missing Addess Mark (again) */ +#define ST2_BC 0x02 /* Bad Cylinder */ +#define ST2_SNS 0x04 /* Scan Not Satisfied */ +#define ST2_SEH 0x08 /* Scan Equal Hit */ +#define ST2_WC 0x10 /* Wrong Cylinder */ +#define ST2_CRC 0x20 /* CRC error in data field */ +#define ST2_CM 0x40 /* Control Mark = deleted */ + +/* Bits of FD_ST3 */ +#define ST3_HA 0x04 /* Head (Address) */ +#define ST3_TZ 0x10 /* Track Zero signal (1=track 0) */ +#define ST3_WP 0x40 /* Write Protect */ + +/* Values for FD_COMMAND */ +#define FD_RECALIBRATE 0x07 /* move to track 0 */ +#define FD_SEEK 0x0F /* seek track */ +#define FD_READ 0xE6 /* read with MT, MFM, SKip deleted */ +#define FD_WRITE 0xC5 /* write with MT, MFM */ +#define FD_SENSEI 0x08 /* Sense Interrupt Status */ +#define FD_SPECIFY 0x03 /* specify HUT etc */ + +/* DMA commands */ +#define DMA_READ 0x46 +#define DMA_WRITE 0x4A + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/fs.h b/linux-0.11-lab/2/linux/include/linux/fs.h new file mode 100755 index 0000000..7a90b10 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/fs.h @@ -0,0 +1,202 @@ +/* + * This file has definitions for some important file table + * structures etc. + */ + +#ifndef _FS_H +#define _FS_H + +#include + +/* devices are as follows: (same as minix, so we can use the minix + * file system. These are major numbers.) + * + * 0 - unused (nodev) + * 1 - /dev/mem + * 2 - /dev/fd + * 3 - /dev/hd + * 4 - /dev/ttyx + * 5 - /dev/tty + * 6 - /dev/lp + * 7 - unnamed pipes + */ + +#define IS_SEEKABLE(x) ((x)>=1 && (x)<=3) + +#define READ 0 +#define WRITE 1 +#define READA 2 /* read-ahead - don't pause */ +#define WRITEA 3 /* "write-ahead" - silly, but somewhat useful */ + +void buffer_init(long buffer_end); + +#define MAJOR(a) (((unsigned)(a))>>8) +#define MINOR(a) ((a)&0xff) + +#define NAME_LEN 14 +#define ROOT_INO 1 + +#define I_MAP_SLOTS 8 +#define Z_MAP_SLOTS 8 +#define SUPER_MAGIC 0x137F + +#define NR_OPEN 20 +#define NR_INODE 32 +#define NR_FILE 64 +#define NR_SUPER 8 +#define NR_HASH 307 +#define NR_BUFFERS nr_buffers +#define BLOCK_SIZE 1024 +#define BLOCK_SIZE_BITS 10 +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#define INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct d_inode))) +#define DIR_ENTRIES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct dir_entry))) + +#define PIPE_HEAD(inode) ((inode).i_zone[0]) +#define PIPE_TAIL(inode) ((inode).i_zone[1]) +#define PIPE_SIZE(inode) ((PIPE_HEAD(inode)-PIPE_TAIL(inode))&(PAGE_SIZE-1)) +#define PIPE_EMPTY(inode) (PIPE_HEAD(inode)==PIPE_TAIL(inode)) +#define PIPE_FULL(inode) (PIPE_SIZE(inode)==(PAGE_SIZE-1)) +#define INC_PIPE(head) \ +__asm__("incl %0\n\tandl $4095,%0"::"m" (head)) + +typedef char buffer_block[BLOCK_SIZE]; + +struct buffer_head { + char * b_data; /* pointer to data block (1024 bytes) */ + unsigned long b_blocknr; /* block number */ + unsigned short b_dev; /* device (0 = free) */ + unsigned char b_uptodate; + unsigned char b_dirt; /* 0-clean,1-dirty */ + unsigned char b_count; /* users using this block */ + unsigned char b_lock; /* 0 - ok, 1 -locked */ + struct task_struct * b_wait; + struct buffer_head * b_prev; + struct buffer_head * b_next; + struct buffer_head * b_prev_free; + struct buffer_head * b_next_free; +}; + +struct d_inode { + unsigned short i_mode; + unsigned short i_uid; + unsigned long i_size; + unsigned long i_time; + unsigned char i_gid; + unsigned char i_nlinks; + unsigned short i_zone[9]; +}; + +struct m_inode { + unsigned short i_mode; + unsigned short i_uid; + unsigned long i_size; + unsigned long i_mtime; + unsigned char i_gid; + unsigned char i_nlinks; + unsigned short i_zone[9]; +/* these are in memory also */ + struct task_struct * i_wait; + unsigned long i_atime; + unsigned long i_ctime; + unsigned short i_dev; + unsigned short i_num; + unsigned short i_count; + unsigned char i_lock; + unsigned char i_dirt; + unsigned char i_pipe; + unsigned char i_mount; + unsigned char i_seek; + unsigned char i_update; +}; + +struct file { + unsigned short f_mode; + unsigned short f_flags; + unsigned short f_count; + struct m_inode * f_inode; + off_t f_pos; +}; + +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; +/* These are only in memory */ + 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; +}; + +struct dir_entry { + unsigned short inode; + char name[NAME_LEN]; +}; + +extern struct m_inode inode_table[NR_INODE]; +extern struct file file_table[NR_FILE]; +extern struct super_block super_block[NR_SUPER]; +extern struct buffer_head * start_buffer; +extern int nr_buffers; + +extern void check_disk_change(int dev); +extern int floppy_change(unsigned int nr); +extern int ticks_to_floppy_on(unsigned int dev); +extern void floppy_on(unsigned int dev); +extern void floppy_off(unsigned int dev); +extern void truncate(struct m_inode * inode); +extern void sync_inodes(void); +extern void wait_on(struct m_inode * inode); +extern int bmap(struct m_inode * inode,int block); +extern int create_block(struct m_inode * inode,int block); +extern struct m_inode * namei(const char * pathname); +extern int open_namei(const char * pathname, int flag, int mode, + struct m_inode ** res_inode); +extern void iput(struct m_inode * inode); +extern struct m_inode * iget(int dev,int nr); +extern struct m_inode * get_empty_inode(void); +extern struct m_inode * get_pipe_inode(void); +extern struct buffer_head * get_hash_table(int dev, int block); +extern struct buffer_head * getblk(int dev, int block); +extern void ll_rw_block(int rw, struct buffer_head * bh); +extern void brelse(struct buffer_head * buf); +extern struct buffer_head * bread(int dev,int block); +extern void bread_page(unsigned long addr,int dev,int b[4]); +extern struct buffer_head * breada(int dev,int block,...); +extern int new_block(int dev); +extern void free_block(int dev, int block); +extern struct m_inode * new_inode(int dev); +extern void free_inode(struct m_inode * inode); +extern int sync_dev(int dev); +extern struct super_block * get_super(int dev); +extern int ROOT_DEV; + +extern void mount_root(void); + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/hdreg.h b/linux-0.11-lab/2/linux/include/linux/hdreg.h new file mode 100755 index 0000000..e6c593f --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/hdreg.h @@ -0,0 +1,65 @@ +/* + * This file contains some defines for the AT-hd-controller. + * Various sources. Check out some definitions (see comments with + * a ques). + */ +#ifndef _HDREG_H +#define _HDREG_H + +/* Hd controller regs. Ref: IBM AT Bios-listing */ +#define HD_DATA 0x1f0 /* _CTL when writing */ +#define HD_ERROR 0x1f1 /* see err-bits */ +#define HD_NSECTOR 0x1f2 /* nr of sectors to read/write */ +#define HD_SECTOR 0x1f3 /* starting sector */ +#define HD_LCYL 0x1f4 /* starting cylinder */ +#define HD_HCYL 0x1f5 /* high byte of starting cyl */ +#define HD_CURRENT 0x1f6 /* 101dhhhh , d=drive, hhhh=head */ +#define HD_STATUS 0x1f7 /* see status-bits */ +#define HD_PRECOMP HD_ERROR /* same io address, read=error, write=precomp */ +#define HD_COMMAND HD_STATUS /* same io address, read=status, write=cmd */ + +#define HD_CMD 0x3f6 + +/* Bits of HD_STATUS */ +#define ERR_STAT 0x01 +#define INDEX_STAT 0x02 +#define ECC_STAT 0x04 /* Corrected error */ +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define WRERR_STAT 0x20 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 + +/* Values for HD_COMMAND */ +#define WIN_RESTORE 0x10 +#define WIN_READ 0x20 +#define WIN_WRITE 0x30 +#define WIN_VERIFY 0x40 +#define WIN_FORMAT 0x50 +#define WIN_INIT 0x60 +#define WIN_SEEK 0x70 +#define WIN_DIAGNOSE 0x90 +#define WIN_SPECIFY 0x91 + +/* Bits for HD_ERROR */ +#define MARK_ERR 0x01 /* Bad address mark ? */ +#define TRK0_ERR 0x02 /* couldn't find track 0 */ +#define ABRT_ERR 0x04 /* ? */ +#define ID_ERR 0x10 /* ? */ +#define ECC_ERR 0x40 /* ? */ +#define BBD_ERR 0x80 /* ? */ + +struct partition { + unsigned char boot_ind; /* 0x80 - active (unused) */ + unsigned char head; /* ? */ + unsigned char sector; /* ? */ + unsigned char cyl; /* ? */ + unsigned char sys_ind; /* ? */ + unsigned char end_head; /* ? */ + unsigned char end_sector; /* ? */ + unsigned char end_cyl; /* ? */ + unsigned int start_sect; /* starting sector counting from 0 */ + unsigned int nr_sects; /* nr of sectors in partition */ +}; + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/head.h b/linux-0.11-lab/2/linux/include/linux/head.h new file mode 100755 index 0000000..db3dda2 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/head.h @@ -0,0 +1,20 @@ +#ifndef _HEAD_H +#define _HEAD_H + +typedef struct desc_struct { + unsigned long a,b; +} desc_table[256]; + +extern unsigned long pg_dir[1024]; +extern desc_table idt,gdt; + +#define GDT_NUL 0 +#define GDT_CODE 1 +#define GDT_DATA 2 +#define GDT_TMP 3 + +#define LDT_NUL 0 +#define LDT_CODE 1 +#define LDT_DATA 2 + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/kernel.h b/linux-0.11-lab/2/linux/include/linux/kernel.h new file mode 100755 index 0000000..cb40dd5 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/kernel.h @@ -0,0 +1,22 @@ +/* + * 'kernel.h' contains some often-used function prototypes etc + */ +void verify_area(void * addr,int count); +volatile void panic(const char * str); +int printf(const char * fmt, ...); +int printk(const char * fmt, ...); +int tty_write(unsigned ch,char * buf,int count); +void * malloc(unsigned int size); +void free_s(void * obj, int size); + +#define free(x) free_s((x), 0) + +/* + * This is defined as a macro, but at some point this might become a + * real subroutine that sets a flag if it returns true (to do + * BSD-style accounting where the process is flagged if it uses root + * privs). The implication of this is that you should do normal + * permissions checks first, and check suser() last. + */ +#define suser() (current->euid == 0) + diff --git a/linux-0.11-lab/2/linux/include/linux/mm.h b/linux-0.11-lab/2/linux/include/linux/mm.h new file mode 100755 index 0000000..5a160f3 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/mm.h @@ -0,0 +1,10 @@ +#ifndef _MM_H +#define _MM_H + +#define PAGE_SIZE 4096 + +extern unsigned long get_free_page(void); +extern unsigned long put_page(unsigned long page,unsigned long address); +extern void free_page(unsigned long addr); + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/sched.h b/linux-0.11-lab/2/linux/include/linux/sched.h new file mode 100755 index 0000000..772646a --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/sched.h @@ -0,0 +1,239 @@ +#ifndef _SCHED_H +#define _SCHED_H + +#define NR_TASKS 64 +#define HZ 100 + +#define FIRST_TASK task[0] +#define LAST_TASK task[NR_TASKS-1] + +#include +#include +#include +#include + +#if (NR_OPEN > 32) +#error "Currently the close-on-exec-flags are in one word, max 32 files/proc" +#endif + +#define TASK_RUNNING 0 +#define TASK_INTERRUPTIBLE 1 +#define TASK_UNINTERRUPTIBLE 2 +#define TASK_ZOMBIE 3 +#define TASK_STOPPED 4 + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +extern int copy_page_tables(unsigned long from, unsigned long to, long size); +extern int free_page_tables(unsigned long from, unsigned long size); + +extern void sched_init(void); +extern void schedule(void); +extern void trap_init(void); +extern void panic(const char * str); +extern int tty_write(unsigned minor,char * buf,int count); + +typedef int (*fn_ptr)(); + +struct i387_struct { + long cwd; + long swd; + long twd; + long fip; + long fcs; + long foo; + long fos; + long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */ +}; + +struct tss_struct { + long back_link; /* 16 high bits zero */ + long esp0; + long ss0; /* 16 high bits zero */ + long esp1; + long ss1; /* 16 high bits zero */ + long esp2; + long ss2; /* 16 high bits zero */ + long cr3; + long eip; + long eflags; + long eax,ecx,edx,ebx; + long esp; + long ebp; + long esi; + long edi; + long es; /* 16 high bits zero */ + long cs; /* 16 high bits zero */ + long ss; /* 16 high bits zero */ + long ds; /* 16 high bits zero */ + long fs; /* 16 high bits zero */ + long gs; /* 16 high bits zero */ + long ldt; /* 16 high bits zero */ + long trace_bitmap; /* bits: trace 0, bitmap 16-31 */ + struct i387_struct i387; +}; + +struct task_struct { +/* these are hardcoded - don't touch */ + long state; /* -1 unrunnable, 0 runnable, >0 stopped */ + long counter; + long priority; + long signal; + struct sigaction sigaction[32]; + long blocked; /* bitmap of masked signals */ +/* various fields */ + int exit_code; + unsigned long start_code,end_code,end_data,brk,start_stack; + long pid,father,pgrp,session,leader; + unsigned short uid,euid,suid; + unsigned short gid,egid,sgid; + long alarm; + long utime,stime,cutime,cstime,start_time; + unsigned short used_math; +/* file system info */ + int tty; /* -1 if no tty, so it must be signed */ + unsigned short umask; + struct m_inode * pwd; + struct m_inode * root; + struct m_inode * executable; + unsigned long close_on_exec; + struct file * filp[NR_OPEN]; +/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */ + struct desc_struct ldt[3]; +/* tss for this task */ + struct tss_struct tss; +}; + +/* + * INIT_TASK is used to set up the first task table, touch at + * your own risk!. Base=0, limit=0x9ffff (=640kB) + */ +#define INIT_TASK \ +/* state etc */ { 0,15,15, \ +/* signals */ 0,{{},},0, \ +/* ec,brk... */ 0,0,0,0,0,0, \ +/* pid etc.. */ 0,-1,0,0,0, \ +/* uid etc */ 0,0,0,0,0,0, \ +/* alarm */ 0,0,0,0,0,0, \ +/* math */ 0, \ +/* fs info */ -1,0022,NULL,NULL,NULL,0, \ +/* filp */ {NULL,}, \ + { \ + {0,0}, \ +/* ldt */ {0x9f,0xc0fa00}, \ + {0x9f,0xc0f200}, \ + }, \ +/*tss*/ {0,PAGE_SIZE+(long)&init_task,0x10,0,0,0,0,(long)&pg_dir,\ + 0,0,0,0,0,0,0,0, \ + 0,0,0x17,0x17,0x17,0x17,0x17,0x17, \ + _LDT(0),0x80000000, \ + {} \ + }, \ +} + +extern struct task_struct *task[NR_TASKS]; +extern struct task_struct *last_task_used_math; +extern struct task_struct *current; +extern long volatile jiffies; +extern long startup_time; + +#define CURRENT_TIME (startup_time+jiffies/HZ) + +extern void add_timer(long jiffies, void (*fn)(void)); +extern void sleep_on(struct task_struct ** p); +extern void interruptible_sleep_on(struct task_struct ** p); +extern void wake_up(struct task_struct ** p); + +/* + * Entry into gdt where to find first TSS. 0-nul, 1-cs, 2-ds, 3-syscall + * 4-TSS0, 5-LDT0, 6-TSS1 etc ... + */ +#define FIRST_TSS_ENTRY 4 +#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1) +#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3)) +#define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3)) +#define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n))) +#define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n))) +#define str(n) \ +__asm__("str %%ax\n\t" \ + "subl %2,%%eax\n\t" \ + "shrl $4,%%eax" \ + :"=a" (n) \ + :"a" (0),"i" (FIRST_TSS_ENTRY<<3)) +/* + * switch_to(n) should switch tasks to task nr n, first + * checking that n isn't the current task, in which case it does nothing. + * This also clears the TS-flag if the task we switched to has used + * tha math co-processor latest. + */ +#define switch_to(n) {\ +struct {long a,b;} __tmp; \ +__asm__("cmpl %%ecx,current\n\t" \ + "je 1f\n\t" \ + "movw %%dx,%1\n\t" \ + "xchgl %%ecx,current\n\t" \ + "ljmp *%0\n\t" \ + "cmpl %%ecx,last_task_used_math\n\t" \ + "jne 1f\n\t" \ + "clts\n" \ + "1:" \ + ::"m" (*&__tmp.a),"m" (*&__tmp.b), \ + "d" (_TSS(n)),"c" ((long) task[n])); \ +} + +#define PAGE_ALIGN(n) (((n)+0xfff)&0xfffff000) + +#define _set_base(addr,base) \ +__asm__ ("push %%edx\n\t" \ + "movw %%dx,%0\n\t" \ + "rorl $16,%%edx\n\t" \ + "movb %%dl,%1\n\t" \ + "movb %%dh,%2\n\t" \ + "pop %%edx" \ + ::"m" (*((addr)+2)), \ + "m" (*((addr)+4)), \ + "m" (*((addr)+7)), \ + "d" (base) \ + ) + +#define _set_limit(addr,limit) \ +__asm__ ("push %%edx\n\t" \ + "movw %%dx,%0\n\t" \ + "rorl $16,%%edx\n\t" \ + "movb %1,%%dh\n\t" \ + "andb $0xf0,%%dh\n\t" \ + "orb %%dh,%%dl\n\t" \ + "movb %%dl,%1\n\t" \ + "pop %%edx" \ + ::"m" (*(addr)), \ + "m" (*((addr)+6)), \ + "d" (limit) \ + ) + +#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , (base) ) +#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , (limit-1)>>12 ) + +static inline unsigned long _get_base(char * addr) +{ + unsigned long __base; + __asm__("movb %3,%%dh\n\t" + "movb %2,%%dl\n\t" + "shll $16,%%edx\n\t" + "movw %1,%%dx" + :"=&d" (__base) + :"m" (*((addr)+2)), + "m" (*((addr)+4)), + "m" (*((addr)+7))); + return __base; +} + +#define get_base(ldt) _get_base( ((char *)&(ldt)) ) + +#define get_limit(segment) ({ \ +unsigned long __limit; \ +__asm__("lsll %1,%0\n\tincl %0":"=r" (__limit):"r" (segment)); \ +__limit;}) + +#endif diff --git a/linux-0.11-lab/2/linux/include/linux/sys.h b/linux-0.11-lab/2/linux/include/linux/sys.h new file mode 100755 index 0000000..2a1c8be --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/sys.h @@ -0,0 +1,111 @@ +/* + * Why isn't this a .c file? Enquiring minds.... + */ + +extern int sys_setup(); +extern int sys_exit(); +extern int sys_fork(); +extern int sys_read(); +extern int sys_write(); +extern int sys_open(); +extern int sys_close(); +extern int sys_waitpid(); +extern int sys_creat(); +extern int sys_link(); +extern int sys_unlink(); +extern int sys_execve(); +extern int sys_chdir(); +extern int sys_time(); +extern int sys_mknod(); +extern int sys_chmod(); +extern int sys_chown(); +extern int sys_break(); +extern int sys_stat(); +extern int sys_lseek(); +extern int sys_getpid(); +extern int sys_mount(); +extern int sys_umount(); +extern int sys_setuid(); +extern int sys_getuid(); +extern int sys_stime(); +extern int sys_ptrace(); +extern int sys_alarm(); +extern int sys_fstat(); +extern int sys_pause(); +extern int sys_utime(); +extern int sys_stty(); +extern int sys_gtty(); +extern int sys_access(); +extern int sys_nice(); +extern int sys_ftime(); +extern int sys_sync(); +extern int sys_kill(); +extern int sys_rename(); +extern int sys_mkdir(); +extern int sys_rmdir(); +extern int sys_dup(); +extern int sys_pipe(); +extern int sys_times(); +extern int sys_prof(); +extern int sys_brk(); +extern int sys_setgid(); +extern int sys_getgid(); +extern int sys_signal(); +extern int sys_geteuid(); +extern int sys_getegid(); +extern int sys_acct(); +extern int sys_phys(); +extern int sys_lock(); +extern int sys_ioctl(); +extern int sys_fcntl(); +extern int sys_mpx(); +extern int sys_setpgid(); +extern int sys_ulimit(); +extern int sys_uname(); +extern int sys_umask(); +extern int sys_chroot(); +extern int sys_ustat(); +extern int sys_dup2(); +extern int sys_getppid(); +extern int sys_getpgrp(); +extern int sys_setsid(); +extern int sys_sigaction(); +extern int sys_sgetmask(); +extern int sys_ssetmask(); +extern int sys_setreuid(); +extern int sys_setregid(); +extern int sys_sigpending(); +extern int sys_sigsuspend(); +extern int sys_sethostname(); +extern int sys_setrlimit(); +extern int sys_getrlimit(); +extern int sys_getrusage(); +extern int sys_gettimeofday(); +extern int sys_settimeofday(); +extern int sys_getgroups(); +extern int sys_setgroups(); +extern int sys_select(); +extern int sys_symlink(); +extern int sys_lstat(); +extern int sys_readlink(); +extern int sys_uselib(); + +fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read, +sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link, +sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod, +sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount, +sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm, +sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access, +sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir, +sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid, +sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys, +sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit, +sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid, +sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask, +sys_setreuid,sys_setregid, sys_sigsuspend, sys_sigpending, sys_sethostname, +sys_setrlimit, sys_getrlimit, sys_getrusage, sys_gettimeofday, +sys_settimeofday, sys_getgroups, sys_setgroups, sys_select, sys_symlink, +sys_lstat, sys_readlink, sys_uselib }; + +/* So we don't have to do any more manual updating.... */ +int NR_syscalls = sizeof(sys_call_table)/sizeof(fn_ptr); diff --git a/linux-0.11-lab/2/linux/include/linux/tty.h b/linux-0.11-lab/2/linux/include/linux/tty.h new file mode 100755 index 0000000..ad846b3 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/linux/tty.h @@ -0,0 +1,77 @@ +/* + * 'tty.h' defines some structures used by tty_io.c and some defines. + * + * NOTE! Don't touch this without checking that nothing in rs_io.s or + * con_io.s breaks. Some constants are hardwired into the system (mainly + * offsets into 'tty_queue' + */ + +#ifndef _TTY_H +#define _TTY_H + +#include + +#define TTY_BUF_SIZE 1024 + +struct tty_queue { + unsigned long data; + unsigned long head; + unsigned long tail; + struct task_struct * proc_list; + char buf[TTY_BUF_SIZE]; +}; + +#define INC(a) ((a) = ((a)+1) & (TTY_BUF_SIZE-1)) +#define DEC(a) ((a) = ((a)-1) & (TTY_BUF_SIZE-1)) +#define EMPTY(a) ((a).head == (a).tail) +#define LEFT(a) (((a).tail-(a).head-1)&(TTY_BUF_SIZE-1)) +#define LAST(a) ((a).buf[(TTY_BUF_SIZE-1)&((a).head-1)]) +#define FULL(a) (!LEFT(a)) +#define CHARS(a) (((a).head-(a).tail)&(TTY_BUF_SIZE-1)) +#define GETCH(queue,c) \ +(void)({c=(queue).buf[(queue).tail];INC((queue).tail);}) +#define PUTCH(c,queue) \ +(void)({(queue).buf[(queue).head]=(c);INC((queue).head);}) + +#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR]) +#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT]) +#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE]) +#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL]) +#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF]) +#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART]) +#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP]) +#define SUSPEND_CHAR(tty) ((tty)->termios.c_cc[VSUSP]) + +struct tty_struct { + struct termios termios; + int pgrp; + int stopped; + void (*write)(struct tty_struct * tty); + struct tty_queue read_q; + struct tty_queue write_q; + struct tty_queue secondary; + }; + +extern struct tty_struct tty_table[]; + +/* intr=^C quit=^| erase=del kill=^U + eof=^D vtime=\0 vmin=\1 sxtc=\0 + start=^Q stop=^S susp=^Z eol=\0 + reprint=^R discard=^U werase=^W lnext=^V + eol2=\0 +*/ +#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" + +void rs_init(void); +void con_init(void); +void tty_init(void); + +int tty_read(unsigned c, char * buf, int n); +int tty_write(unsigned c, char * buf, int n); + +void rs_write(struct tty_struct * tty); +void con_write(struct tty_struct * tty); + +void copy_to_cooked(struct tty_struct * tty); + +#endif diff --git a/linux-0.11-lab/2/linux/include/signal.h b/linux-0.11-lab/2/linux/include/signal.h new file mode 100755 index 0000000..0eea9a3 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/signal.h @@ -0,0 +1,68 @@ +#ifndef _SIGNAL_H +#define _SIGNAL_H + +#include + +typedef int sig_atomic_t; +typedef unsigned int sigset_t; /* 32 bits */ + +#define _NSIG 32 +#define NSIG _NSIG + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGUNUSED 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 + +/* Ok, I haven't implemented sigactions, but trying to keep headers POSIX */ +#define SA_NOCLDSTOP 1 +#define SA_NOMASK 0x40000000 +#define SA_ONESHOT 0x80000000 + +#define SIG_BLOCK 0 /* for blocking signals */ +#define SIG_UNBLOCK 1 /* for unblocking signals */ +#define SIG_SETMASK 2 /* for setting the signal mask */ + +#define SIG_DFL ((void (*)(int))0) /* default signal handling */ +#define SIG_IGN ((void (*)(int))1) /* ignore signal */ + +struct sigaction { + void (*sa_handler)(int); + sigset_t sa_mask; + int sa_flags; + void (*sa_restorer)(void); +}; + +void (*signal(int _sig, void (*_func)(int)))(int); +int raise(int sig); +int kill(pid_t pid, int sig); +int sigaddset(sigset_t *mask, int signo); +int sigdelset(sigset_t *mask, int signo); +int sigemptyset(sigset_t *mask); +int sigfillset(sigset_t *mask); +int sigismember(sigset_t *mask, int signo); /* 1 - is, 0 - not, -1 error */ +int sigpending(sigset_t *set); +int sigprocmask(int how, sigset_t *set, sigset_t *oldset); +int sigsuspend(sigset_t *sigmask); +int sigaction(int sig, struct sigaction *act, struct sigaction *oldact); + +#endif /* _SIGNAL_H */ diff --git a/linux-0.11-lab/2/linux/include/stdarg.h b/linux-0.11-lab/2/linux/include/stdarg.h new file mode 100755 index 0000000..fd79ec0 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/stdarg.h @@ -0,0 +1,28 @@ +#ifndef _STDARG_H +#define _STDARG_H + +typedef char *va_list; + +/* Amount of space required in an argument list for an arg of type TYPE. + TYPE may alternatively be an expression whose type is used. */ + +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) + +#ifndef __sparc__ +#define va_start(AP, LASTARG) \ + (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) +#else +#define va_start(AP, LASTARG) \ + (__builtin_saveregs (), \ + AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) +#endif + +void va_end (va_list); /* Defined in gnulib */ +#define va_end(AP) + +#define va_arg(AP, TYPE) \ + (AP += __va_rounded_size (TYPE), \ + *((TYPE *) (AP - __va_rounded_size (TYPE)))) + +#endif /* _STDARG_H */ diff --git a/linux-0.11-lab/2/linux/include/stddef.h b/linux-0.11-lab/2/linux/include/stddef.h new file mode 100755 index 0000000..97f72ff --- /dev/null +++ b/linux-0.11-lab/2/linux/include/stddef.h @@ -0,0 +1,19 @@ +#ifndef _STDDEF_H +#define _STDDEF_H + +#ifndef _PTRDIFF_T +#define _PTRDIFF_T +typedef long ptrdiff_t; +#endif + +#ifndef _SIZE_T +#define _SIZE_T +typedef unsigned long size_t; +#endif + +#undef NULL +#define NULL ((void *)0) + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +#endif diff --git a/linux-0.11-lab/2/linux/include/string.h b/linux-0.11-lab/2/linux/include/string.h new file mode 100755 index 0000000..48b91e5 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/string.h @@ -0,0 +1,405 @@ +#ifndef _STRING_H_ +#define _STRING_H_ + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef _SIZE_T +#define _SIZE_T +typedef unsigned int size_t; +#endif + +extern char * strerror(int errno); + +/* + * This string-include defines all string functions as inline + * functions. Use gcc. It also assumes ds=es=data space, this should be + * normal. Most of the string-functions are rather heavily hand-optimized, + * see especially strtok,strstr,str[c]spn. They should work, but are not + * very easy to understand. Everything is done entirely within the register + * set, making the functions fast and clean. String instructions have been + * used through-out, making for "slightly" unclear code :-) + * + * (C) 1991 Linus Torvalds + */ + +extern inline char * strcpy(char * dest,const char *src) +{ +__asm__("cld\n" + "1:\tlodsb\n\t" + "stosb\n\t" + "testb %%al,%%al\n\t" + "jne 1b" + ::"S" (src),"D" (dest)); +return dest; +} + +extern inline char * strncpy(char * dest,const char *src,int count) +{ +__asm__("cld\n" + "1:\tdecl %2\n\t" + "js 2f\n\t" + "lodsb\n\t" + "stosb\n\t" + "testb %%al,%%al\n\t" + "jne 1b\n\t" + "rep\n\t" + "stosb\n" + "2:" + ::"S" (src),"D" (dest),"c" (count)); +return dest; +} + +extern inline char * strcat(char * dest,const char * src) +{ +__asm__("cld\n\t" + "repne\n\t" + "scasb\n\t" + "decl %1\n" + "1:\tlodsb\n\t" + "stosb\n\t" + "testb %%al,%%al\n\t" + "jne 1b" + ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff)); +return dest; +} + +extern inline char * strncat(char * dest,const char * src,int count) +{ +__asm__("cld\n\t" + "repne\n\t" + "scasb\n\t" + "decl %1\n\t" + "movl %4,%3\n" + "1:\tdecl %3\n\t" + "js 2f\n\t" + "lodsb\n\t" + "stosb\n\t" + "testb %%al,%%al\n\t" + "jne 1b\n" + "2:\txorl %2,%2\n\t" + "stosb" + ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count) + ); +return dest; +} + +extern inline int strcmp(const char * cs,const char * ct) +{ +register int __res __asm__("ax"); +__asm__("cld\n" + "1:\tlodsb\n\t" + "scasb\n\t" + "jne 2f\n\t" + "testb %%al,%%al\n\t" + "jne 1b\n\t" + "xorl %%eax,%%eax\n\t" + "jmp 3f\n" + "2:\tmovl $1,%%eax\n\t" + "jl 3f\n\t" + "negl %%eax\n" + "3:" + :"=a" (__res):"D" (cs),"S" (ct)); +return __res; +} + +extern inline int strncmp(const char * cs,const char * ct,int count) +{ +register int __res __asm__("ax"); +__asm__("cld\n" + "1:\tdecl %3\n\t" + "js 2f\n\t" + "lodsb\n\t" + "scasb\n\t" + "jne 3f\n\t" + "testb %%al,%%al\n\t" + "jne 1b\n" + "2:\txorl %%eax,%%eax\n\t" + "jmp 4f\n" + "3:\tmovl $1,%%eax\n\t" + "jl 4f\n\t" + "negl %%eax\n" + "4:" + :"=a" (__res):"D" (cs),"S" (ct),"c" (count)); +return __res; +} + +extern inline char * strchr(const char * s,char c) +{ +register char * __res __asm__("ax"); +__asm__("cld\n\t" + "movb %%al,%%ah\n" + "1:\tlodsb\n\t" + "cmpb %%ah,%%al\n\t" + "je 2f\n\t" + "testb %%al,%%al\n\t" + "jne 1b\n\t" + "movl $1,%1\n" + "2:\tmovl %1,%0\n\t" + "decl %0" + :"=a" (__res):"S" (s),"0" (c)); +return __res; +} + +extern inline char * strrchr(const char * s,char c) +{ +register char * __res __asm__("dx"); +__asm__("cld\n\t" + "movb %%al,%%ah\n" + "1:\tlodsb\n\t" + "cmpb %%ah,%%al\n\t" + "jne 2f\n\t" + "movl %%esi,%0\n\t" + "decl %0\n" + "2:\ttestb %%al,%%al\n\t" + "jne 1b" + :"=d" (__res):"0" (0),"S" (s),"a" (c)); +return __res; +} + +extern inline int strspn(const char * cs, const char * ct) +{ +register char * __res __asm__("si"); +__asm__("cld\n\t" + "movl %4,%%edi\n\t" + "repne\n\t" + "scasb\n\t" + "notl %%ecx\n\t" + "decl %%ecx\n\t" + "movl %%ecx,%%edx\n" + "1:\tlodsb\n\t" + "testb %%al,%%al\n\t" + "je 2f\n\t" + "movl %4,%%edi\n\t" + "movl %%edx,%%ecx\n\t" + "repne\n\t" + "scasb\n\t" + "je 1b\n" + "2:\tdecl %0" + :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) + ); +return __res-cs; +} + +extern inline int strcspn(const char * cs, const char * ct) +{ +register char * __res __asm__("si"); +__asm__("cld\n\t" + "movl %4,%%edi\n\t" + "repne\n\t" + "scasb\n\t" + "notl %%ecx\n\t" + "decl %%ecx\n\t" + "movl %%ecx,%%edx\n" + "1:\tlodsb\n\t" + "testb %%al,%%al\n\t" + "je 2f\n\t" + "movl %4,%%edi\n\t" + "movl %%edx,%%ecx\n\t" + "repne\n\t" + "scasb\n\t" + "jne 1b\n" + "2:\tdecl %0" + :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) + ); +return __res-cs; +} + +extern inline char * strpbrk(const char * cs,const char * ct) +{ +register char * __res __asm__("si"); +__asm__("cld\n\t" + "movl %4,%%edi\n\t" + "repne\n\t" + "scasb\n\t" + "notl %%ecx\n\t" + "decl %%ecx\n\t" + "movl %%ecx,%%edx\n" + "1:\tlodsb\n\t" + "testb %%al,%%al\n\t" + "je 2f\n\t" + "movl %4,%%edi\n\t" + "movl %%edx,%%ecx\n\t" + "repne\n\t" + "scasb\n\t" + "jne 1b\n\t" + "decl %0\n\t" + "jmp 3f\n" + "2:\txorl %0,%0\n" + "3:" + :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) + ); +return __res; +} + +extern inline char * strstr(const char * cs,const char * ct) +{ +register char * __res __asm__("ax"); +__asm__("cld\n\t" \ + "movl %4,%%edi\n\t" + "repne\n\t" + "scasb\n\t" + "notl %%ecx\n\t" + "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */ + "movl %%ecx,%%edx\n" + "1:\tmovl %4,%%edi\n\t" + "movl %%esi,%%eax\n\t" + "movl %%edx,%%ecx\n\t" + "repe\n\t" + "cmpsb\n\t" + "je 2f\n\t" /* also works for empty string, see above */ + "xchgl %%eax,%%esi\n\t" + "incl %%esi\n\t" + "cmpb $0,-1(%%eax)\n\t" + "jne 1b\n\t" + "xorl %%eax,%%eax\n\t" + "2:" + :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct) + ); +return __res; +} + +extern inline int strlen(const char * s) +{ +register int __res ; +__asm__("cld\n\t" + "repne\n\t" + "scasb\n\t" + "notl %0\n\t" + "decl %0" + :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff)); +return __res; +} + +extern char * ___strtok; + +extern inline char * strtok(char * s,const char * ct) +{ +register char * __res __asm__("si"); +__asm__("testl %1,%1\n\t" + "jne 1f\n\t" + "testl %0,%0\n\t" + "je 8f\n\t" + "movl %0,%1\n" + "1:\txorl %0,%0\n\t" + "movl $-1,%%ecx\n\t" + "xorl %%eax,%%eax\n\t" + "cld\n\t" + "movl %4,%%edi\n\t" + "repne\n\t" + "scasb\n\t" + "notl %%ecx\n\t" + "decl %%ecx\n\t" + "je 7f\n\t" /* empty delimeter-string */ + "movl %%ecx,%%edx\n" + "2:\tlodsb\n\t" + "testb %%al,%%al\n\t" + "je 7f\n\t" + "movl %4,%%edi\n\t" + "movl %%edx,%%ecx\n\t" + "repne\n\t" + "scasb\n\t" + "je 2b\n\t" + "decl %1\n\t" + "cmpb $0,(%1)\n\t" + "je 7f\n\t" + "movl %1,%0\n" + "3:\tlodsb\n\t" + "testb %%al,%%al\n\t" + "je 5f\n\t" + "movl %4,%%edi\n\t" + "movl %%edx,%%ecx\n\t" + "repne\n\t" + "scasb\n\t" + "jne 3b\n\t" + "decl %1\n\t" + "cmpb $0,(%1)\n\t" + "je 5f\n\t" + "movb $0,(%1)\n\t" + "incl %1\n\t" + "jmp 6f\n" + "5:\txorl %1,%1\n" + "6:\tcmpb $0,(%0)\n\t" + "jne 7f\n\t" + "xorl %0,%0\n" + "7:\ttestl %0,%0\n\t" + "jne 8f\n\t" + "movl %0,%1\n" + "8:" + :"=b" (__res),"=S" (___strtok) + :"0" (___strtok),"1" (s),"g" (ct) + ); +return __res; +} + +extern inline void * memcpy(void * dest,const void * src, int n) +{ +__asm__("cld\n\t" + "rep\n\t" + "movsb" + ::"c" (n),"S" (src),"D" (dest) + ); +return dest; +} + +extern inline void * memmove(void * dest,const void * src, int n) +{ +if (dest + +struct stat { + dev_t st_dev; + ino_t st_ino; + umode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + +#define S_IFMT 00170000 +#define S_IFLNK 0120000 +#define S_IFREG 0100000 +#define S_IFBLK 0060000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 + +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) + +#define S_IRWXU 00700 +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 + +#define S_IRWXG 00070 +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 + +#define S_IRWXO 00007 +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 + +extern int chmod(const char *_path, mode_t mode); +extern int fstat(int fildes, struct stat *stat_buf); +extern int mkdir(const char *_path, mode_t mode); +extern int mkfifo(const char *_path, mode_t mode); +extern int stat(const char *filename, struct stat *stat_buf); +extern mode_t umask(mode_t mask); + +#endif diff --git a/linux-0.11-lab/2/linux/include/sys/times.h b/linux-0.11-lab/2/linux/include/sys/times.h new file mode 100755 index 0000000..68d5bfb --- /dev/null +++ b/linux-0.11-lab/2/linux/include/sys/times.h @@ -0,0 +1,15 @@ +#ifndef _TIMES_H +#define _TIMES_H + +#include + +struct tms { + time_t tms_utime; + time_t tms_stime; + time_t tms_cutime; + time_t tms_cstime; +}; + +extern time_t times(struct tms * tp); + +#endif diff --git a/linux-0.11-lab/2/linux/include/sys/types.h b/linux-0.11-lab/2/linux/include/sys/types.h new file mode 100755 index 0000000..557aa31 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/sys/types.h @@ -0,0 +1,46 @@ +#ifndef _SYS_TYPES_H +#define _SYS_TYPES_H + +#ifndef _SIZE_T +#define _SIZE_T +typedef unsigned int size_t; +#endif + +#ifndef _TIME_T +#define _TIME_T +typedef long time_t; +#endif + +#ifndef _PTRDIFF_T +#define _PTRDIFF_T +typedef long ptrdiff_t; +#endif + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +typedef int pid_t; +typedef unsigned short uid_t; +typedef unsigned char gid_t; +typedef unsigned short dev_t; +typedef unsigned short ino_t; +typedef unsigned short mode_t; +typedef unsigned short umode_t; +typedef unsigned char nlink_t; +typedef int daddr_t; +typedef long off_t; +typedef unsigned char u_char; +typedef unsigned short ushort; + +typedef struct { int quot,rem; } div_t; +typedef struct { long quot,rem; } ldiv_t; + +struct ustat { + daddr_t f_tfree; + ino_t f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +#endif diff --git a/linux-0.11-lab/2/linux/include/sys/utsname.h b/linux-0.11-lab/2/linux/include/sys/utsname.h new file mode 100755 index 0000000..0a1c5a0 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/sys/utsname.h @@ -0,0 +1,16 @@ +#ifndef _SYS_UTSNAME_H +#define _SYS_UTSNAME_H + +#include + +struct utsname { + char sysname[9]; + char nodename[9]; + char release[9]; + char version[9]; + char machine[9]; +}; + +extern int uname(struct utsname * utsbuf); + +#endif diff --git a/linux-0.11-lab/2/linux/include/sys/wait.h b/linux-0.11-lab/2/linux/include/sys/wait.h new file mode 100755 index 0000000..53190c2 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/sys/wait.h @@ -0,0 +1,23 @@ +#ifndef _SYS_WAIT_H +#define _SYS_WAIT_H + +#include + +#define _LOW(v) ( (v) & 0377) +#define _HIGH(v) ( ((v) >> 8) & 0377) + +/* options for waitpid, WUNTRACED not supported */ +#define WNOHANG 1 +#define WUNTRACED 2 + +#define WIFEXITED(s) (!((s)&0xFF) +#define WIFSTOPPED(s) (((s)&0xFF)==0x7F) +#define WEXITSTATUS(s) (((s)>>8)&0xFF) +#define WTERMSIG(s) ((s)&0x7F) +#define WSTOPSIG(s) (((s)>>8)&0xFF) +#define WIFSIGNALED(s) (((unsigned int)(s)-1 & 0xFFFF) < 0xFF) + +pid_t wait(int *stat_loc); +pid_t waitpid(pid_t pid, int *stat_loc, int options); + +#endif diff --git a/linux-0.11-lab/2/linux/include/termios.h b/linux-0.11-lab/2/linux/include/termios.h new file mode 100755 index 0000000..2b7b913 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/termios.h @@ -0,0 +1,228 @@ +#ifndef _TERMIOS_H +#define _TERMIOS_H + +#define TTY_BUF_SIZE 1024 + +/* 0x54 is just a magic number to make these relatively uniqe ('T') */ + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define TIOCINQ 0x541B + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +#define NCCS 17 +struct termios { + unsigned long c_iflag; /* input mode flags */ + unsigned long c_oflag; /* output mode flags */ + unsigned long c_cflag; /* control mode flags */ + unsigned long c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCCS]; /* control characters */ +}; + +/* c_cc characters */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + +/* c_iflag bits */ +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 + +/* c_oflag bits */ +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0040000 +#define FF0 0000000 +#define FF1 0040000 + +/* c_cflag bit meaning */ +#define CBAUD 0000017 +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#define EXTA B19200 +#define EXTB B38400 +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define CPARENB 0000400 +#define CPARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#define CIBAUD 03600000 /* input baud rate (not used) */ +#define CRTSCTS 020000000000 /* flow control */ + +#define PARENB CPARENB +#define PARODD CPARODD + +/* c_lflag bits */ +#define ISIG 0000001 +#define ICANON 0000002 +#define XCASE 0000004 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define IEXTEN 0100000 + +/* modem lines */ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG + +/* tcflow() and TCXONC use these */ +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +typedef int speed_t; + +extern speed_t cfgetispeed(struct termios *termios_p); +extern speed_t cfgetospeed(struct termios *termios_p); +extern int cfsetispeed(struct termios *termios_p, speed_t speed); +extern int cfsetospeed(struct termios *termios_p, speed_t speed); +extern int tcdrain(int fildes); +extern int tcflow(int fildes, int action); +extern int tcflush(int fildes, int queue_selector); +extern int tcgetattr(int fildes, struct termios *termios_p); +extern int tcsendbreak(int fildes, int duration); +extern int tcsetattr(int fildes, int optional_actions, + struct termios *termios_p); + +#endif diff --git a/linux-0.11-lab/2/linux/include/time.h b/linux-0.11-lab/2/linux/include/time.h new file mode 100755 index 0000000..d0a765d --- /dev/null +++ b/linux-0.11-lab/2/linux/include/time.h @@ -0,0 +1,42 @@ +#ifndef _TIME_H +#define _TIME_H + +#ifndef _TIME_T +#define _TIME_T +typedef long time_t; +#endif + +#ifndef _SIZE_T +#define _SIZE_T +typedef unsigned int size_t; +#endif + +#define CLOCKS_PER_SEC 100 + +typedef long clock_t; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +clock_t clock(void); +time_t time(time_t * tp); +double difftime(time_t time2, time_t time1); +time_t mktime(struct tm * tp); + +char * asctime(const struct tm * tp); +char * ctime(const time_t * tp); +struct tm * gmtime(const time_t *tp); +struct tm *localtime(const time_t * tp); +size_t strftime(char * s, size_t smax, const char * fmt, const struct tm * tp); +void tzset(void); + +#endif diff --git a/linux-0.11-lab/2/linux/include/unistd.h b/linux-0.11-lab/2/linux/include/unistd.h new file mode 100755 index 0000000..dcbc754 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/unistd.h @@ -0,0 +1,269 @@ +#ifndef _UNISTD_H +#define _UNISTD_H + +/* ok, this may be a joke, but I'm working on it */ +#define _POSIX_VERSION 198808L + +#define _POSIX_CHOWN_RESTRICTED /* only root can do a chown (I think..) */ +#define _POSIX_NO_TRUNC /* no pathname truncation (but see in kernel) */ +#define _POSIX_VDISABLE '\0' /* character to disable things like ^C */ +/*#define _POSIX_SAVED_IDS */ /* we'll get to this yet */ +/*#define _POSIX_JOB_CONTROL */ /* we aren't there quite yet. Soon hopefully */ + +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 + +#ifndef NULL +#define NULL ((void *)0) +#endif + +/* access */ +#define F_OK 0 +#define X_OK 1 +#define W_OK 2 +#define R_OK 4 + +/* lseek */ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +/* _SC stands for System Configuration. We don't use them much */ +#define _SC_ARG_MAX 1 +#define _SC_CHILD_MAX 2 +#define _SC_CLOCKS_PER_SEC 3 +#define _SC_NGROUPS_MAX 4 +#define _SC_OPEN_MAX 5 +#define _SC_JOB_CONTROL 6 +#define _SC_SAVED_IDS 7 +#define _SC_VERSION 8 + +/* more (possibly) configurable things - now pathnames */ +#define _PC_LINK_MAX 1 +#define _PC_MAX_CANON 2 +#define _PC_MAX_INPUT 3 +#define _PC_NAME_MAX 4 +#define _PC_PATH_MAX 5 +#define _PC_PIPE_BUF 6 +#define _PC_NO_TRUNC 7 +#define _PC_VDISABLE 8 +#define _PC_CHOWN_RESTRICTED 9 + +#include +#include +#include +#include + +#ifdef __LIBRARY__ + +#define __NR_setup 0 /* used only by init, to get system going */ +#define __NR_exit 1 +#define __NR_fork 2 +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_waitpid 7 +#define __NR_creat 8 +#define __NR_link 9 +#define __NR_unlink 10 +#define __NR_execve 11 +#define __NR_chdir 12 +#define __NR_time 13 +#define __NR_mknod 14 +#define __NR_chmod 15 +#define __NR_chown 16 +#define __NR_break 17 +#define __NR_stat 18 +#define __NR_lseek 19 +#define __NR_getpid 20 +#define __NR_mount 21 +#define __NR_umount 22 +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_stime 25 +#define __NR_ptrace 26 +#define __NR_alarm 27 +#define __NR_fstat 28 +#define __NR_pause 29 +#define __NR_utime 30 +#define __NR_stty 31 +#define __NR_gtty 32 +#define __NR_access 33 +#define __NR_nice 34 +#define __NR_ftime 35 +#define __NR_sync 36 +#define __NR_kill 37 +#define __NR_rename 38 +#define __NR_mkdir 39 +#define __NR_rmdir 40 +#define __NR_dup 41 +#define __NR_pipe 42 +#define __NR_times 43 +#define __NR_prof 44 +#define __NR_brk 45 +#define __NR_setgid 46 +#define __NR_getgid 47 +#define __NR_signal 48 +#define __NR_geteuid 49 +#define __NR_getegid 50 +#define __NR_acct 51 +#define __NR_phys 52 +#define __NR_lock 53 +#define __NR_ioctl 54 +#define __NR_fcntl 55 +#define __NR_mpx 56 +#define __NR_setpgid 57 +#define __NR_ulimit 58 +#define __NR_uname 59 +#define __NR_umask 60 +#define __NR_chroot 61 +#define __NR_ustat 62 +#define __NR_dup2 63 +#define __NR_getppid 64 +#define __NR_getpgrp 65 +#define __NR_setsid 66 +#define __NR_sigaction 67 +#define __NR_sgetmask 68 +#define __NR_ssetmask 69 +#define __NR_setreuid 70 +#define __NR_setregid 71 +#define __NR_sigsuspend 72 +#define __NR_sigpending 73 +#define __NR_sethostname 74 +#define __NR_setrlimit 75 +#define __NR_getrlimit 76 +#define __NR_getrusage 77 +#define __NR_gettimeofday 78 +#define __NR_settimeofday 79 +#define __NR_getgroups 80 +#define __NR_setgroups 81 +#define __NR_select 82 +#define __NR_symlink 83 +#define __NR_lstat 84 +#define __NR_readlink 85 +#define __NR_uselib 86 +#define _syscall0(type,name) \ +type name(void) \ +{ \ +long __res; \ +__asm__ volatile ("int $0x80" \ + : "=a" (__res) \ + : "0" (__NR_##name)); \ +if (__res >= 0) \ + return (type) __res; \ +errno = -__res; \ +return -1; \ +} + +#define _syscall1(type,name,atype,a) \ +type name(atype a) \ +{ \ +long __res; \ +__asm__ volatile ("int $0x80" \ + : "=a" (__res) \ + : "0" (__NR_##name),"b" ((long)(a))); \ +if (__res >= 0) \ + return (type) __res; \ +errno = -__res; \ +return -1; \ +} + +#define _syscall2(type,name,atype,a,btype,b) \ +type name(atype a,btype b) \ +{ \ +long __res; \ +__asm__ volatile ("int $0x80" \ + : "=a" (__res) \ + : "0" (__NR_##name),"b" ((long)(a)),"c" ((long)(b))); \ +if (__res >= 0) \ + return (type) __res; \ +errno = -__res; \ +return -1; \ +} + +#define _syscall3(type,name,atype,a,btype,b,ctype,c) \ +type name(atype a,btype b,ctype c) \ +{ \ +long __res; \ +__asm__ volatile ("int $0x80" \ + : "=a" (__res) \ + : "0" (__NR_##name),"b" ((long)(a)),"c" ((long)(b)),"d" ((long)(c))); \ +if (__res>=0) \ + return (type) __res; \ +errno=-__res; \ +return -1; \ +} + +#endif /* __LIBRARY__ */ + +extern int errno; + +int access(const char * filename, mode_t mode); +int acct(const char * filename); +int alarm(int sec); +int brk(void * end_data_segment); +void * sbrk(ptrdiff_t increment); +int chdir(const char * filename); +int chmod(const char * filename, mode_t mode); +int chown(const char * filename, uid_t owner, gid_t group); +int chroot(const char * filename); +int close(int fildes); +int creat(const char * filename, mode_t mode); +int dup(int fildes); +int execve(const char * filename, char ** argv, char ** envp); +int execv(const char * pathname, char ** argv); +int execvp(const char * file, char ** argv); +int execl(const char * pathname, char * arg0, ...); +int execlp(const char * file, char * arg0, ...); +int execle(const char * pathname, char * arg0, ...); +volatile void exit(int status); +volatile void _exit(int status); +int fcntl(int fildes, int cmd, ...); +int fork(void); +int getpid(void); +int getuid(void); +int geteuid(void); +int getgid(void); +int getegid(void); +int ioctl(int fildes, int cmd, ...); +int kill(pid_t pid, int signal); +int link(const char * filename1, const char * filename2); +int lseek(int fildes, off_t offset, int origin); +int mknod(const char * filename, mode_t mode, dev_t dev); +int mount(const char * specialfile, const char * dir, int rwflag); +int nice(int val); +int open(const char * filename, int flag, ...); +int pause(void); +int pipe(int * fildes); +int read(int fildes, char * buf, off_t count); +int setpgrp(void); +int setpgid(pid_t pid,pid_t pgid); +int setuid(uid_t uid); +int setgid(gid_t gid); +void (*signal(int sig, void (*fn)(int)))(int); +int stat(const char * filename, struct stat * stat_buf); +int fstat(int fildes, struct stat * stat_buf); +int stime(time_t * tptr); +int sync(void); +time_t time(time_t * tloc); +time_t times(struct tms * tbuf); +int ulimit(int cmd, long limit); +mode_t umask(mode_t mask); +int umount(const char * specialfile); +int uname(struct utsname * name); +int unlink(const char * filename); +int ustat(dev_t dev, struct ustat * ubuf); +int utime(const char * filename, struct utimbuf * times); +pid_t waitpid(pid_t pid,int * wait_stat,int options); +pid_t wait(int * wait_stat); +int write(int fildes, const char * buf, off_t count); +int dup2(int oldfd, int newfd); +int getppid(void); +pid_t getpgrp(void); +pid_t setsid(void); + +#define __always_inline inline __attribute__((always_inline)) + +#endif diff --git a/linux-0.11-lab/2/linux/include/utime.h b/linux-0.11-lab/2/linux/include/utime.h new file mode 100755 index 0000000..83f07c7 --- /dev/null +++ b/linux-0.11-lab/2/linux/include/utime.h @@ -0,0 +1,13 @@ +#ifndef _UTIME_H +#define _UTIME_H + +#include /* I know - shouldn't do this, but .. */ + +struct utimbuf { + time_t actime; + time_t modtime; +}; + +extern int utime(const char *filename, struct utimbuf *times); + +#endif diff --git a/linux-0.11-lab/2/linux/init/main.c b/linux-0.11-lab/2/linux/init/main.c new file mode 100755 index 0000000..0892fdc --- /dev/null +++ b/linux-0.11-lab/2/linux/init/main.c @@ -0,0 +1,210 @@ +/* + * linux/init/main.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include +#include + +/* + * we need this inline - forking from kernel space will result + * in NO COPY ON WRITE (!!!), until an execve is executed. This + * is no problem, but for the stack. This is handled by not letting + * main() use the stack at all after fork(). Thus, no function + * calls - which means inline code for fork too, as otherwise we + * would use the stack upon exit from 'fork()'. + * + * Actually only pause and fork are needed inline, so that there + * won't be any messing with the stack from main(), but we define + * some others too. + */ + +__always_inline _syscall0(int,fork) +__always_inline _syscall0(int,pause) +__always_inline _syscall1(int,setup,void *,BIOS) +__always_inline _syscall0(int,sync) + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +static char printbuf[1024]; + +extern int vsprintf(); +extern void init(void); +extern void blk_dev_init(void); +extern void chr_dev_init(void); +extern void hd_init(void); +extern void floppy_init(void); +extern void mem_init(long start, long end); +extern long rd_init(long mem_start, int length); +extern long kernel_mktime(struct tm * tm); +extern long startup_time; + +/* + * This is set up by the setup-routine at boot-time + */ +#define EXT_MEM_K (*(unsigned short *)0x90002) +#define DRIVE_INFO (*(struct drive_info *)0x90080) +#define ORIG_ROOT_DEV (*(unsigned short *)0x901FC) + +/* + * Yeah, yeah, it's ugly, but I cannot find how to do this correctly + * and this seems to work. I anybody has more info on the real-time + * clock I'd be interested. Most of this was trial and error, and some + * bios-listing reading. Urghh. + */ + +#define CMOS_READ(addr) ({ \ +outb_p(0x80|addr,0x70); \ +inb_p(0x71); \ +}) + +#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) + +static void time_init(void) +{ + struct tm time; + + do { + time.tm_sec = CMOS_READ(0); + time.tm_min = CMOS_READ(2); + time.tm_hour = CMOS_READ(4); + time.tm_mday = CMOS_READ(7); + time.tm_mon = CMOS_READ(8); + time.tm_year = CMOS_READ(9); + } while (time.tm_sec != CMOS_READ(0)); + BCD_TO_BIN(time.tm_sec); + BCD_TO_BIN(time.tm_min); + BCD_TO_BIN(time.tm_hour); + BCD_TO_BIN(time.tm_mday); + BCD_TO_BIN(time.tm_mon); + BCD_TO_BIN(time.tm_year); + time.tm_mon--; + startup_time = kernel_mktime(&time); +} + +static long memory_end = 0; +static long buffer_memory_end = 0; +static long main_memory_start = 0; + +struct drive_info { char dummy[32]; } drive_info; + +void main(void) /* This really IS void, no error here. */ +{ /* The startup routine assumes (well, ...) this */ +/* + * Interrupts are still disabled. Do necessary setups, then + * enable them + */ + ROOT_DEV = ORIG_ROOT_DEV; + __asm__ volatile ("cld"); /* by wyj */ + drive_info = DRIVE_INFO; + memory_end = (1<<20) + (EXT_MEM_K<<10); + memory_end &= 0xfffff000; + if (memory_end > 16*1024*1024) + memory_end = 16*1024*1024; + if (memory_end > 12*1024*1024) + buffer_memory_end = 4*1024*1024; + else if (memory_end > 6*1024*1024) + buffer_memory_end = 2*1024*1024; + else + buffer_memory_end = 1*1024*1024; + main_memory_start = buffer_memory_end; +#ifdef RAMDISK + main_memory_start += rd_init(main_memory_start, RAMDISK*1024); +#endif + mem_init(main_memory_start,memory_end); + trap_init(); + blk_dev_init(); + chr_dev_init(); + tty_init(); + time_init(); + sched_init(); + buffer_init(buffer_memory_end); + hd_init(); + floppy_init(); + sti(); + move_to_user_mode(); + if (!fork()) { /* we count on this going ok */ + init(); + } +/* + * NOTE!! For any other task 'pause()' would mean we have to get a + * signal to awaken, but task0 is the sole exception (see 'schedule()') + * as task 0 gets activated at every idle moment (when no other tasks + * can run). For task0 'pause()' just means we go check if some other + * task can run, and if not we return here. + */ + for(;;) pause(); +} + +static int printf(const char *fmt, ...) +{ + va_list args; + int i; + + va_start(args, fmt); + write(1,printbuf,i=vsprintf(printbuf, fmt, args)); + va_end(args); + return i; +} + +static char * argv_rc[] = { "/bin/sh", NULL }; +static char * envp_rc[] = { "HOME=/", NULL, NULL }; + +static char * argv[] = { "-/bin/sh",NULL }; +static char * envp[] = { "HOME=/usr/root", NULL, NULL }; + +void init(void) +{ + int pid,i; + + setup((void *) &drive_info); + (void) open("/dev/tty0",O_RDWR,0); + (void) dup(0); + (void) dup(0); + printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS, + NR_BUFFERS*BLOCK_SIZE); + printf("Free mem: %d bytes\n\r",memory_end-main_memory_start); + if (!(pid=fork())) { + close(0); + if (open("/etc/rc",O_RDONLY,0)) + _exit(1); + execve("/bin/sh",argv_rc,envp_rc); + _exit(2); + } + if (pid>0) + while (pid != wait(&i)) + /* nothing */; + while (1) { + if ((pid=fork())<0) { + printf("Fork failed in init\r\n"); + continue; + } + if (!pid) { + close(0);close(1);close(2); + setsid(); + (void) open("/dev/tty0",O_RDWR,0); + (void) dup(0); + (void) dup(0); + _exit(execve("/bin/sh",argv,envp)); + } + while (1) + if (pid == wait(&i)) + break; + printf("\n\rchild %d died with code %04x\n\r",pid,i); + sync(); + } + _exit(0); /* NOTE! _exit, not exit() */ +} diff --git a/linux-0.11-lab/2/linux/init/main.o b/linux-0.11-lab/2/linux/init/main.o new file mode 100755 index 0000000000000000000000000000000000000000..20bade066c6c637fb950d7858a4e12b8dcd54564 GIT binary patch literal 9040 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 UIUey|!5+cgf` tmp_make + (for i in *.c;do echo -n `echo $$i | sed 's,\.c,\.s,'`" "; \ + $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + (cd chr_drv; make dep) + (cd blk_drv; make dep) + +### Dependencies: +exit.s exit.o : exit.c ../include/errno.h ../include/signal.h \ + ../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \ + ../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h \ + ../include/asm/segment.h +fork.s fork.o : fork.c ../include/errno.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/segment.h ../include/asm/system.h +mktime.s mktime.o : mktime.c ../include/time.h +panic.s panic.o : panic.c ../include/linux/kernel.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h +printk.s printk.o : printk.c ../include/stdarg.h ../include/stddef.h \ + ../include/linux/kernel.h +sched.s sched.o : sched.c ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/sys/types.h ../include/linux/mm.h \ + ../include/signal.h ../include/linux/kernel.h ../include/linux/sys.h \ + ../include/linux/fdreg.h ../include/asm/system.h ../include/asm/io.h \ + ../include/asm/segment.h +signal.s signal.o : signal.c ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/sys/types.h ../include/linux/mm.h \ + ../include/signal.h ../include/linux/kernel.h ../include/asm/segment.h +sys.s sys.o : sys.c ../include/errno.h ../include/linux/sched.h \ + ../include/linux/head.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/tty.h \ + ../include/termios.h ../include/linux/kernel.h ../include/asm/segment.h \ + ../include/sys/times.h ../include/sys/utsname.h +traps.s traps.o : traps.c ../include/string.h ../include/linux/head.h \ + ../include/linux/sched.h ../include/linux/fs.h ../include/sys/types.h \ + ../include/linux/mm.h ../include/signal.h ../include/linux/kernel.h \ + ../include/asm/system.h ../include/asm/segment.h ../include/asm/io.h +vsprintf.s vsprintf.o : vsprintf.c ../include/stdarg.h ../include/string.h diff --git a/linux-0.11-lab/2/linux/kernel/asm.o b/linux-0.11-lab/2/linux/kernel/asm.o new file mode 100755 index 0000000000000000000000000000000000000000..a89ec75e6e7dea54ae5b8d9b94ba28158b48a77f GIT binary patch literal 1740 zcma)+O=uHQ5XWcRv}sSZ2!7VKN<_gLTB@F^9;`i75B*Zxid{F^*K{@67k4+Yil|sH zrv|)<7wbhmD2RBl?IjkWde90*5b+=$0#XkiyeY()eY^2xiRgpv|Nnb$W-{}d&9$S) z`xHe1e<@H4e+Zz*gMDtmZfJlym?EDGMTQ55PMti_THiEx4rWIp9YYK2@F4#&zm)${ zdN=d3q3K?@?aYKaK6ZL^#Z6j!Eo4c^qL61o9t*iIN>a0?YOGAXEIm;+mxxDna!+$#}~zPg>(|qFzDh#3ziNdZhm7_Gt$HGtt5$ zJb2(2L6$5XS6!9gLaHZMBo4WC>dM&)G@;K)yrt}^F9miX@AvkI_oDBSxC{Lei4UOf zm-sOHL5cg&k4j8uHzb}wuS$Fw{k+6C(HA7XgML}!hv?r*yy$rny5~3eqzG`)Jgcaa zE(!kRc@m2M7T_NN{u$t~^pB$a<^Z<^_)viR13VsJBf!@Kd@I0Ua+O&Yx70Y-8Aw() zvWCvYA?PfYNr0I$z%ZR|;8|u(Ciz8(@r %eax + xchgl %ebx,(%esp) # &function <-> %ebx + pushl %ecx + pushl %edx + pushl %edi + pushl %esi + pushl %ebp + push %ds + push %es + push %fs + pushl %eax # error code + lea 44(%esp),%eax # offset + pushl %eax + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + mov %ax,%fs + call *%ebx + addl $8,%esp + pop %fs + pop %es + pop %ds + popl %ebp + popl %esi + popl %edi + popl %edx + popl %ecx + popl %ebx + popl %eax + iret + +invalid_TSS: + pushl $do_invalid_TSS + jmp error_code + +segment_not_present: + pushl $do_segment_not_present + jmp error_code + +stack_segment: + pushl $do_stack_segment + jmp error_code + +general_protection: + pushl $do_general_protection + jmp error_code + diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/Makefile b/linux-0.11-lab/2/linux/kernel/blk_drv/Makefile new file mode 100755 index 0000000..1fb57f9 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/blk_drv/Makefile @@ -0,0 +1,58 @@ +# +# Makefile for the FREAX-kernel block device drivers. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# + +AR =ar +AS =as +LD =ld +LDFLAGS =-s -x +CC =gcc -march=i386 +CFLAGS =-w -g -fstrength-reduce -fomit-frame-pointer -mcld \ + -finline-functions -nostdinc -fno-stack-protector -I../../include +CPP =gcc -E -nostdinc -I../../include + +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< +.s.o: + $(AS) -o $*.o $< +.c.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< + +OBJS = ll_rw_blk.o floppy.o hd.o ramdisk.o + +blk_drv.a: $(OBJS) + $(AR) rcs blk_drv.a $(OBJS) + sync + +clean: + rm -f core *.o *.a tmp_make + for i in *.c;do rm -f `basename $$i .c`.s;done + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + (for i in *.c;do echo -n `echo $$i | sed 's,\.c,\.s,'`" "; \ + $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + +### Dependencies: +floppy.s floppy.o : floppy.c ../../include/linux/sched.h ../../include/linux/head.h \ + ../../include/linux/fs.h ../../include/sys/types.h ../../include/linux/mm.h \ + ../../include/signal.h ../../include/linux/kernel.h \ + ../../include/linux/fdreg.h ../../include/asm/system.h \ + ../../include/asm/io.h ../../include/asm/segment.h blk.h +hd.s hd.o : hd.c ../../include/linux/config.h ../../include/linux/sched.h \ + ../../include/linux/head.h ../../include/linux/fs.h \ + ../../include/sys/types.h ../../include/linux/mm.h ../../include/signal.h \ + ../../include/linux/kernel.h ../../include/linux/hdreg.h \ + ../../include/asm/system.h ../../include/asm/io.h \ + ../../include/asm/segment.h blk.h +ll_rw_blk.s ll_rw_blk.o : ll_rw_blk.c ../../include/errno.h ../../include/linux/sched.h \ + ../../include/linux/head.h ../../include/linux/fs.h \ + ../../include/sys/types.h ../../include/linux/mm.h ../../include/signal.h \ + ../../include/linux/kernel.h ../../include/asm/system.h blk.h diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/blk.h b/linux-0.11-lab/2/linux/kernel/blk_drv/blk.h new file mode 100755 index 0000000..7a69b71 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/blk_drv/blk.h @@ -0,0 +1,140 @@ +#ifndef _BLK_H +#define _BLK_H + +#define NR_BLK_DEV 7 +/* + * NR_REQUEST is the number of entries in the request-queue. + * NOTE that writes may use only the low 2/3 of these: reads + * take precedence. + * + * 32 seems to be a reasonable number: enough to get some benefit + * from the elevator-mechanism, but not so much as to lock a lot of + * buffers when they are in the queue. 64 seems to be too many (easily + * long pauses in reading when heavy writing/syncing is going on) + */ +#define NR_REQUEST 32 + +/* + * Ok, this is an expanded form so that we can use the same + * request for paging requests when that is implemented. In + * paging, 'bh' is NULL, and 'waiting' is used to wait for + * read/write completion. + */ +struct request { + int dev; /* -1 if no request */ + int cmd; /* READ or WRITE */ + int errors; + unsigned long sector; + unsigned long nr_sectors; + char * buffer; + struct task_struct * waiting; + struct buffer_head * bh; + struct request * next; +}; + +/* + * This is used in the elevator algorithm: Note that + * reads always go before writes. This is natural: reads + * are much more time-critical than writes. + */ +#define IN_ORDER(s1,s2) \ +((s1)->cmd<(s2)->cmd || (s1)->cmd==(s2)->cmd && \ +((s1)->dev < (s2)->dev || ((s1)->dev == (s2)->dev && \ +(s1)->sector < (s2)->sector))) + +struct blk_dev_struct { + void (*request_fn)(void); + struct request * current_request; +}; + +extern struct blk_dev_struct blk_dev[NR_BLK_DEV]; +extern struct request request[NR_REQUEST]; +extern struct task_struct * wait_for_request; + +#ifdef MAJOR_NR + +/* + * Add entries as needed. Currently the only block devices + * supported are hard-disks and floppies. + */ + +#if (MAJOR_NR == 1) +/* ram disk */ +#define DEVICE_NAME "ramdisk" +#define DEVICE_REQUEST do_rd_request +#define DEVICE_NR(device) ((device) & 7) +#define DEVICE_ON(device) +#define DEVICE_OFF(device) + +#elif (MAJOR_NR == 2) +/* floppy */ +#define DEVICE_NAME "floppy" +#define DEVICE_INTR do_floppy +#define DEVICE_REQUEST do_fd_request +#define DEVICE_NR(device) ((device) & 3) +#define DEVICE_ON(device) floppy_on(DEVICE_NR(device)) +#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device)) + +#elif (MAJOR_NR == 3) +/* harddisk */ +#define DEVICE_NAME "harddisk" +#define DEVICE_INTR do_hd +#define DEVICE_REQUEST do_hd_request +#define DEVICE_NR(device) (MINOR(device)/5) +#define DEVICE_ON(device) +#define DEVICE_OFF(device) + +#elif (MAJOR_NR > 3) +/* unknown blk device */ +#error "unknown blk device" + +#endif + +#define CURRENT (blk_dev[MAJOR_NR].current_request) +#define CURRENT_DEV DEVICE_NR(CURRENT->dev) + +#ifdef DEVICE_INTR +void (*DEVICE_INTR)(void) = NULL; +#endif +static void (DEVICE_REQUEST)(void); + +static inline void unlock_buffer(struct buffer_head * bh) +{ + if (!bh->b_lock) + printk(DEVICE_NAME ": free buffer being unlocked\n"); + bh->b_lock=0; + wake_up(&bh->b_wait); +} + +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; +} + +#define INIT_REQUEST \ +repeat: \ + if (!CURRENT) \ + return; \ + if (MAJOR(CURRENT->dev) != MAJOR_NR) \ + panic(DEVICE_NAME ": request list destroyed"); \ + if (CURRENT->bh) { \ + if (!CURRENT->bh->b_lock) \ + panic(DEVICE_NAME ": block not locked"); \ + } + +#endif + +#endif diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/blk_drv.a b/linux-0.11-lab/2/linux/kernel/blk_drv/blk_drv.a new file mode 100755 index 0000000000000000000000000000000000000000..02751f123aa0c72fe90e820ca24599de825468be GIT binary patch literal 52212 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 +#include +#include +#include +#include +#include +#include + +#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) +/* + * Note that MAX_ERRORS=8 doesn't imply that we retry every bad read + * max 8 times - some types of errors increase the errorcount by 2, + * so we might actually retry only 5-6 times before giving up. + */ +#define MAX_ERRORS 8 + +/* + * globals used by 'result()' + */ +#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]) + +/* + * This struct defines the different floppy types. Unlike minix + * linux doesn't have a "search for right type"-type, as the code + * for that is convoluted and weird. I've got enough problems with + * this driver as it is. + * + * The 'stretch' tells if the tracks need to be boubled for some + * types (ie 360kB diskette in 1.2MB drive etc). Others should + * be self-explanatory. + */ +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 }, /* no testing */ + { 720, 9,2,40,0,0x2A,0x02,0xDF }, /* 360kB PC diskettes */ + { 2400,15,2,80,0,0x1B,0x00,0xDF }, /* 1.2 MB AT-diskettes */ + { 720, 9,2,40,1,0x2A,0x02,0xDF }, /* 360kB in 720kB drive */ + { 1440, 9,2,80,0,0x2A,0x02,0xDF }, /* 3.5" 720kB diskette */ + { 720, 9,2,40,1,0x23,0x01,0xDF }, /* 360kB in 1.2MB drive */ + { 1440, 9,2,80,0,0x23,0x01,0xDF }, /* 720kB in 1.2MB drive */ + { 2880,18,2,80,0,0x1B,0x00,0xCF }, /* 1.44MB diskette */ +}; +/* + * Rate is 0 for 500kb/s, 2 for 300kbps, 1 for 250kbps + * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc), + * H is head unload time (1=16ms, 2=32ms, etc) + * + * Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms etc) + * and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). + */ + +extern void floppy_interrupt(void); +extern char tmp_floppy_area[1024]; + +/* + * These are global variables, as that's the easiest way to give + * information to interrupts. They are the data used for the current + * request. + */ +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; + +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); +} + +/* + * floppy-change is never called from an interrupt, so we can relax a bit + * here, sleep etc. Note that floppy-on tries to set current_DOR to point + * to the desired drive, but it will probably not survive the sleep if + * several floppies are used at the same time: thus the loop. + */ +int floppy_change(unsigned int nr) +{ +repeat: + floppy_on(nr); + while ((current_DOR & 3) != nr && selected) + interruptible_sleep_on(&wait_on_floppy_select); + if ((current_DOR & 3) != nr) + goto repeat; + if (inb(FD_DIR) & 0x80) { + floppy_off(nr); + return 1; + } + floppy_off(nr); + return 0; +} + +#define copy_buffer(from,to) \ +__asm__("cld ; rep ; movsl" \ + ::"c" (BLOCK_SIZE/4),"S" ((long)(from)),"D" ((long)(to)) \ + ) + +static void setup_DMA(void) +{ + 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); + } +/* mask DMA 2 */ + immoutb_p(4|2,10); +/* output command byte. I don't know why, but everyone (minix, */ +/* sanches & canton) output this twice, first to 12 then to 11 */ + __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))); +/* 8 low bits of addr */ + immoutb_p(addr,4); + addr >>= 8; +/* bits 8-15 of addr */ + immoutb_p(addr,4); + addr >>= 8; +/* bits 16-19 of addr */ + immoutb_p(addr,0x81); +/* low 8 bits of count-1 (1024-1=0x3ff) */ + immoutb_p(0xff,5); +/* high 8 bits of count-1 */ + immoutb_p(3,5); +/* activate DMA 2 */ + immoutb_p(0|2,10); + sti(); +} + +static 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"); +} + +static int result(void) +{ + 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; +} + +static void bad_flp_intr(void) +{ + CURRENT->errors++; + if (CURRENT->errors > MAX_ERRORS) { + floppy_deselect(current_drive); + end_request(0); + } + if (CURRENT->errors > MAX_ERRORS/2) + reset = 1; + else + recalibrate = 1; +} + +/* + * Ok, this interrupt is called after a DMA read/write has succeeded, + * so we check the results, and copy any buffers. + */ +static void rw_interrupt(void) +{ + 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); + } else + bad_flp_intr(); + 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(void) +{ + 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); /* sector size = 512 */ + output_byte(floppy->sect); + output_byte(floppy->gap); + output_byte(0xFF); /* sector size (0xff when n!=0 ?) */ + if (reset) + do_fd_request(); +} + +/* + * This is the routine called after every seek (or recalibrate) interrupt + * from the floppy controller. Note that the "unexpected interrupt" routine + * also does a recalibrate, but doesn't come here. + */ +static void seek_interrupt(void) +{ +/* sense drive status */ + output_byte(FD_SENSEI); + if (result() != 2 || (ST0 & 0xF8) != 0x20 || ST1 != seek_track) { + bad_flp_intr(); + do_fd_request(); + return; + } + current_track = ST1; + setup_rw_floppy(); +} + +/* + * This routine is called when everything should be correctly set up + * for the transfer (ie floppy motor is on and the correct floppy is + * selected). + */ +static void transfer(void) +{ + if (cur_spec1 != floppy->spec1) { + cur_spec1 = floppy->spec1; + output_byte(FD_SPECIFY); + output_byte(cur_spec1); /* hut etc */ + output_byte(6); /* Head load time =6ms, DMA */ + } + 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(); +} + +/* + * Special case - used after a unexpected interrupt (or reset) + */ +static void recal_interrupt(void) +{ + output_byte(FD_SENSEI); + if (result()!=2 || (ST0 & 0xE0) == 0x60) + reset = 1; + else + recalibrate = 0; + do_fd_request(); +} + +void unexpected_floppy_interrupt(void) +{ + output_byte(FD_SENSEI); + if (result()!=2 || (ST0 & 0xE0) == 0x60) + reset = 1; + else + recalibrate = 1; +} + +static void recalibrate_floppy(void) +{ + recalibrate = 0; + current_track = 0; + current_drive = 1; /* by wyj, ?? */ + do_floppy = recal_interrupt; + output_byte(FD_RECALIBRATE); + output_byte(head<<2 | current_drive); + if (reset) + do_fd_request(); +} + +static void reset_interrupt(void) +{ + output_byte(FD_SENSEI); + (void) result(); + output_byte(FD_SPECIFY); + output_byte(cur_spec1); /* hut etc */ + output_byte(6); /* Head load time =6ms, DMA */ + do_fd_request(); +} + +/* + * reset is done by pulling bit 2 of DOR low for a while. + */ +static void reset_floppy(void) +{ + 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(); +} + +static void floppy_on_interrupt(void) +{ +/* We cannot do a floppy-select, as that might sleep. We just force it */ + 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(void) +{ + 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 + panic("do_fd_request: unknown command"); + add_timer(ticks_to_floppy_on(current_drive),&floppy_on_interrupt); +} + +void floppy_init(void) +{ + blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; + set_trap_gate(0x26,&floppy_interrupt); + outb(inb_p(0x21)&~0x40,0x21); +} diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/floppy.o b/linux-0.11-lab/2/linux/kernel/blk_drv/floppy.o new file mode 100755 index 0000000000000000000000000000000000000000..33235bcdcc660371f0cfe6077089e24f2a1c3a96 GIT binary patch literal 16612 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/hd.c b/linux-0.11-lab/2/linux/kernel/blk_drv/hd.c new file mode 100755 index 0000000..c0e908f --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/blk_drv/hd.c @@ -0,0 +1,351 @@ +/* + * linux/kernel/hd.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * This is the low-level hd interrupt support. It traverses the + * request-list, using interrupts to jump between functions. As + * all the functions are called within interrupts, we may not + * sleep. Special care is recommended. + * + * modified by Drew Eckhardt to check nr of hd's from the CMOS. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAJOR_NR 3 +#include "blk.h" + +#define CMOS_READ(addr) ({ \ +outb_p(0x80|addr,0x70); \ +inb_p(0x71); \ +}) + +/* Max read/write errors/sector */ +#define MAX_ERRORS 7 +#define MAX_HD 2 + +static void recal_intr(void); + +static int recalibrate = 0; /* 1, wen */ +static int reset = 0; + +/* + * This struct defines the HD's and their types. + */ +struct hd_i_struct { + int head,sect,cyl,wpcom,lzone,ctl; + }; +#ifdef HD_TYPE +struct hd_i_struct hd_info[] = { HD_TYPE }; +#define NR_HD ((sizeof (hd_info))/(sizeof (struct hd_i_struct))) +#else +struct hd_i_struct hd_info[] = { {0,0,0,0,0,0},{0,0,0,0,0,0} }; +static int NR_HD = 0; +#endif + +static struct hd_struct { + long start_sect; + long nr_sects; +} hd[5*MAX_HD]={{0,0},}; + +#define port_read(port,buf,nr) \ +__asm__("cld;rep;insw"::"d" (port),"D" (buf),"c" (nr)) + +#define port_write(port,buf,nr) \ +__asm__("cld;rep;outsw"::"d" (port),"S" (buf),"c" (nr)) + +extern void hd_interrupt(void); +extern void rd_load(void); + +/* This may be used only once, enforced by 'static int callable' */ +int sys_setup(void * BIOS) +{ + static int callable = 1; + int i,drive; + unsigned char cmos_disks; + struct partition *p; + struct buffer_head * bh; + + if (!callable) + return -1; + callable = 0; +#ifndef HD_TYPE + for (drive=0 ; drive<2 ; drive++) { + hd_info[drive].cyl = *(unsigned short *) BIOS; + hd_info[drive].head = *(unsigned char *) (2+BIOS); + hd_info[drive].wpcom = *(unsigned short *) (5+BIOS); + hd_info[drive].ctl = *(unsigned char *) (8+BIOS); + hd_info[drive].lzone = *(unsigned short *) (12+BIOS); + hd_info[drive].sect = *(unsigned char *) (14+BIOS); + BIOS += 16; + } + if (hd_info[1].cyl) + NR_HD=2; + else + NR_HD=1; +#endif + for (i=0 ; i are the primary drives in the system, and + the ones reflected as drive 1 or 2. + + The first drive is stored in the high nibble of CMOS + byte 0x12, the second in the low nibble. This will be + either a 4 bit drive type or 0xf indicating use byte 0x19 + for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS. + + Needless to say, a non-zero value means we have + an AT controller hard disk for that drive. + + + */ + + if ((cmos_disks = CMOS_READ(0x12)) & 0xf0) + if (cmos_disks & 0x0f) + NR_HD = 2; + else + NR_HD = 1; + else + NR_HD = 0; + for (i = NR_HD ; i < 2 ; i++) { + hd[i*5].start_sect = 0; + hd[i*5].nr_sects = 0; + } + for (drive=0 ; driveb_data[510] != 0x55 || (unsigned char) + bh->b_data[511] != 0xAA) { + printk("Bad partition table on drive %d\n\r",drive); + panic(""); + } + p = 0x1BE + (void *)bh->b_data; + for (i=1;i<5;i++,p++) { + hd[i+5*drive].start_sect = p->start_sect; + hd[i+5*drive].nr_sects = p->nr_sects; + } + brelse(bh); + } + if (NR_HD) + printk("Partition table%s ok.\n\r",(NR_HD>1)?"s":""); + rd_load(); + mount_root(); + return (0); +} + +static int controller_ready(void) +{ + /* int retries=10000; */ + int retries=100000; + + /* while (--retries && (inb_p(HD_STATUS)&0xc0)!=0x40); */ + while (--retries && (inb_p(HD_STATUS)&0x80)); + return (retries); +} + +static int win_result(void) +{ + int i=inb_p(HD_STATUS); + + if ((i & (BUSY_STAT | READY_STAT | WRERR_STAT | SEEK_STAT | ERR_STAT)) + == (READY_STAT | SEEK_STAT)) + return(0); /* ok */ + if (i&1) i=inb(HD_ERROR); + return (1); +} + +static void hd_out(unsigned int drive,unsigned int nsect,unsigned int sect, + unsigned int head,unsigned int cyl,unsigned int cmd, + void (*intr_addr)(void)) +{ + register int port asm("dx"); + + if (drive>1 || head>15) + panic("Trying to write bad sector"); + if (!controller_ready()) + panic("HD controller not ready"); + do_hd = intr_addr; + outb_p(hd_info[drive].ctl,HD_CMD); + port=HD_DATA; + outb_p(hd_info[drive].wpcom>>2,++port); + outb_p(nsect,++port); + outb_p(sect,++port); + outb_p(cyl,++port); + outb_p(cyl>>8,++port); + outb_p(0xA0|(drive<<4)|head,++port); + outb(cmd,++port); +} + +static int drive_busy(void) +{ + unsigned int i; + + for (i = 0; i < 10000; i++) + if (READY_STAT == (inb_p(HD_STATUS) & (BUSY_STAT|READY_STAT))) + break; + i = inb(HD_STATUS); + i &= BUSY_STAT | READY_STAT | SEEK_STAT; + if (i == READY_STAT | SEEK_STAT) + return(0); + printk("HD controller times out\n\r"); + return(1); +} + +static void reset_controller(void) +{ + int i; + + outb(4,HD_CMD); + for(i = 0; i < 100; i++) nop(); + outb(hd_info[0].ctl & 0x0f ,HD_CMD); + if (drive_busy()) + printk("HD-controller still busy\n\r"); + if ((i = inb(HD_ERROR)) != 1) + printk("HD-controller reset failed: %02x\n\r",i); +} + +static void reset_hd(int nr) +{ + reset_controller(); + hd_out(nr,hd_info[nr].sect,hd_info[nr].sect,hd_info[nr].head-1, + hd_info[nr].cyl,WIN_SPECIFY,&recal_intr); +} + +void unexpected_hd_interrupt(void) +{ + printk("Unexpected HD interrupt\n\r"); +} + +static void bad_rw_intr(void) +{ + if (++CURRENT->errors >= MAX_ERRORS) + end_request(0); + if (CURRENT->errors > MAX_ERRORS/2) + reset = 1; +} + +static void read_intr(void) +{ + if (win_result()) { + bad_rw_intr(); + do_hd_request(); + return; + } + port_read(HD_DATA,CURRENT->buffer,256); + CURRENT->errors = 0; + CURRENT->buffer += 512; + CURRENT->sector++; + if (--CURRENT->nr_sectors) { + do_hd = &read_intr; + return; + } + end_request(1); + do_hd_request(); +} + +static void write_intr(void) +{ + if (win_result()) { + bad_rw_intr(); + do_hd_request(); + return; + } + if (--CURRENT->nr_sectors) { + CURRENT->sector++; + CURRENT->buffer += 512; + do_hd = &write_intr; + port_write(HD_DATA,CURRENT->buffer,256); + return; + } + end_request(1); + do_hd_request(); +} + +static void recal_intr(void) +{ + if (win_result()) + bad_rw_intr(); + do_hd_request(); +} + +void do_hd_request(void) +{ + int i,r; + unsigned int block,dev; + unsigned int sec,head,cyl; + unsigned int nsect; + + INIT_REQUEST; + dev = MINOR(CURRENT->dev); + block = CURRENT->sector; + if (dev >= 5*NR_HD || block+2 > hd[dev].nr_sects) { + end_request(0); + goto repeat; + } + block += hd[dev].start_sect; + dev /= 5; + __asm__("divl %4":"=a" (block),"=d" (sec):"0" (block),"1" (0), + "r" (hd_info[dev].sect)); + __asm__("divl %4":"=a" (cyl),"=d" (head):"0" (block),"1" (0), + "r" (hd_info[dev].head)); + sec++; + nsect = CURRENT->nr_sectors; + if (reset) { + reset = 0; + recalibrate = 1; + reset_hd(CURRENT_DEV); + return; + } + if (recalibrate) { + recalibrate = 0; + hd_out(dev,hd_info[CURRENT_DEV].sect,0,0,0, + WIN_RESTORE,&recal_intr); + return; + } + if (CURRENT->cmd == WRITE) { + hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr); + for(i=0 ; i<3000 && !(r=inb_p(HD_STATUS)&DRQ_STAT) ; i++) + /* nothing */ ; + if (!r) { + bad_rw_intr(); + goto repeat; + } + port_write(HD_DATA,CURRENT->buffer,256); + } else if (CURRENT->cmd == READ) { + hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr); + } else + panic("unknown hd-command"); +} + +void hd_init(void) +{ + blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; + set_intr_gate(0x2E,&hd_interrupt); + outb_p(inb_p(0x21)&0xfb,0x21); + outb(inb_p(0xA1)&0xbf,0xA1); +} diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/hd.o b/linux-0.11-lab/2/linux/kernel/blk_drv/hd.o new file mode 100755 index 0000000000000000000000000000000000000000..bf2b0d10bc58477ea1758f63f765ba3eab8d6225 GIT binary patch literal 15520 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/ll_rw_blk.c b/linux-0.11-lab/2/linux/kernel/blk_drv/ll_rw_blk.c new file mode 100755 index 0000000..f57d998 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/blk_drv/ll_rw_blk.c @@ -0,0 +1,165 @@ +/* + * linux/kernel/blk_dev/ll_rw.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * This handles all read/write requests to block devices + */ +#include +#include +#include +#include + +#include "blk.h" + +/* + * The request-struct contains all necessary data + * to load a nr of sectors into memory + */ +struct request request[NR_REQUEST]; + +/* + * used to wait on when there are no free requests + */ +struct task_struct * wait_for_request = NULL; + +/* blk_dev_struct is: + * do_request-address + * next-request + */ +struct blk_dev_struct blk_dev[NR_BLK_DEV] = { + { NULL, NULL }, /* no_dev */ + { NULL, NULL }, /* dev mem */ + { NULL, NULL }, /* dev fd */ + { NULL, NULL }, /* dev hd */ + { NULL, NULL }, /* dev ttyx */ + { NULL, NULL }, /* dev tty */ + { NULL, NULL } /* dev lp */ +}; + +static inline void lock_buffer(struct buffer_head * bh) +{ + cli(); + while (bh->b_lock) + sleep_on(&bh->b_wait); + bh->b_lock=1; + sti(); +} + +static inline void unlock_buffer(struct buffer_head * bh) +{ + if (!bh->b_lock) + printk("ll_rw_block.c: buffer not locked\n\r"); + bh->b_lock = 0; + wake_up(&bh->b_wait); +} + +/* + * add-request adds a request to the linked list. + * It disables interrupts so that it can muck with the + * request-lists in peace. + */ +static void add_request(struct blk_dev_struct * dev, struct request * req) +{ + struct request * tmp; + + req->next = NULL; + cli(); + if (req->bh) + req->bh->b_dirt = 0; + if (!(tmp = dev->current_request)) { + dev->current_request = req; + sti(); + (dev->request_fn)(); + return; + } + for ( ; tmp->next ; tmp=tmp->next) + if ((IN_ORDER(tmp,req) || + !IN_ORDER(tmp,tmp->next)) && + IN_ORDER(req,tmp->next)) + break; + req->next=tmp->next; + tmp->next=req; + sti(); +} + +static void make_request(int major,int rw, struct buffer_head * bh) +{ + struct request * req; + int rw_ahead; + +/* WRITEA/READA is special case - it is not really needed, so if the */ +/* buffer is locked, we just forget about it, else it's a normal read */ + if (rw_ahead = (rw == READA || rw == WRITEA)) { + if (bh->b_lock) + return; + if (rw == READA) + rw = READ; + else + rw = WRITE; + } + if (rw!=READ && rw!=WRITE) + panic("Bad block dev command, must be R/W/RA/WA"); + lock_buffer(bh); + if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate)) { + unlock_buffer(bh); + return; + } +repeat: +/* we don't allow the write-requests to fill up the queue completely: + * we want some room for reads: they take precedence. The last third + * of the requests are only for reads. + */ + if (rw == READ) + req = request+NR_REQUEST; + else + req = request+((NR_REQUEST*2)/3); +/* find an empty request */ + while (--req >= request) + if (req->dev<0) + break; +/* if none found, sleep on new requests: check for rw_ahead */ + if (req < request) { + if (rw_ahead) { + unlock_buffer(bh); + return; + } + sleep_on(&wait_for_request); + goto repeat; + } +/* fill up the request-info, and add it to the queue */ + req->dev = bh->b_dev; + req->cmd = rw; + req->errors=0; + req->sector = bh->b_blocknr<<1; + req->nr_sectors = 2; + req->buffer = bh->b_data; + req->waiting = NULL; + req->bh = bh; + req->next = NULL; + add_request(major+blk_dev,req); +} + +void ll_rw_block(int rw, struct buffer_head * bh) +{ + unsigned int major; + + if ((major=MAJOR(bh->b_dev)) >= NR_BLK_DEV || + !(blk_dev[major].request_fn)) { + printk("Trying to read nonexistent block-device\n\r"); + return; + } + make_request(major,rw,bh); +} + +void blk_dev_init(void) +{ + int i; + + for (i=0 ; iYkGs}N`|^F* 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 + +#include +#include +#include +#include +#include +#include +#include + +#define MAJOR_NR 1 +#include "blk.h" + +char *rd_start; +int rd_length = 0; + +void do_rd_request(void) +{ + int len; + char *addr; + + INIT_REQUEST; + addr = rd_start + (CURRENT->sector << 9); + len = CURRENT->nr_sectors << 9; + if ((MINOR(CURRENT->dev) != 1) || (addr+len > rd_start+rd_length)) { + end_request(0); + goto repeat; + } + if (CURRENT-> cmd == WRITE) { + (void ) memcpy(addr, + CURRENT->buffer, + len); + } else if (CURRENT->cmd == READ) { + (void) memcpy(CURRENT->buffer, + addr, + len); + } else + panic("unknown ramdisk-command"); + end_request(1); + goto repeat; +} + +/* + * Returns amount of memory which needs to be reserved. + */ +long rd_init(long mem_start, int length) +{ + int i; + char *cp; + + blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; + rd_start = (char *) mem_start; + rd_length = length; + cp = rd_start; + for (i=0; i < length; i++) + *cp++ = '\0'; + return(length); +} + +/* + * If the root device is the ram disk, try to load it. + * In order to do this, the root device is originally set to the + * floppy, and we later change it to be ram disk. + */ +void rd_load(void) +{ + struct buffer_head *bh; + struct super_block s; + int block = 256; /* Start at block 256 */ + int i = 1; + int nblocks; + char *cp; /* Move pointer */ + + if (!rd_length) + return; + printk("Ram disk: %d bytes, starting at 0x%x\n", rd_length, + (int) rd_start); + if (MAJOR(ROOT_DEV) != 2) + return; + bh = breada(ROOT_DEV,block+1,block,block+2,-1); + if (!bh) { + printk("Disk error while looking for ramdisk!\n"); + return; + } + __asm__ volatile ("cld"); /* by wyj */ + *((struct d_super_block *) &s) = *((struct d_super_block *) bh->b_data); + brelse(bh); + if (s.s_magic != SUPER_MAGIC) + /* No ram disk image present, assume normal floppy boot */ + return; + nblocks = s.s_nzones << s.s_log_zone_size; + if (nblocks > (rd_length >> BLOCK_SIZE_BITS)) { + printk("Ram disk image too big! (%d blocks, %d avail)\n", + nblocks, rd_length >> BLOCK_SIZE_BITS); + return; + } + printk("Loading %d bytes into ram disk... 0000k", + nblocks << BLOCK_SIZE_BITS); + cp = rd_start; + while (nblocks) { + if (nblocks > 2) + bh = breada(ROOT_DEV, block, block+1, block+2, -1); + else + bh = bread(ROOT_DEV, block); + if (!bh) { + printk("I/O error on block %d, aborting load\n", + block); + return; + } + (void) memcpy(cp, bh->b_data, BLOCK_SIZE); + brelse(bh); + printk("\010\010\010\010\010%4dk",i); + cp += BLOCK_SIZE; + block++; + nblocks--; + i++; + } + printk("\010\010\010\010\010done \n"); + ROOT_DEV=0x0101; +} diff --git a/linux-0.11-lab/2/linux/kernel/blk_drv/ramdisk.o b/linux-0.11-lab/2/linux/kernel/blk_drv/ramdisk.o new file mode 100755 index 0000000000000000000000000000000000000000..d37a922496b20c46741e78e22466958ee16e9dcd GIT binary patch literal 10664 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 azd^gt2s%I$JikGRTt|uA(-65=A^s1$?rygL literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/Makefile b/linux-0.11-lab/2/linux/kernel/chr_drv/Makefile new file mode 100755 index 0000000..9d4d8d1 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/chr_drv/Makefile @@ -0,0 +1,68 @@ +# +# Makefile for the FREAX-kernel character device drivers. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# + +AR =ar +AS =as +LD =ld +LDFLAGS =-s -x +CC =gcc -march=i386 +CFLAGS =-w -g -fstrength-reduce -fomit-frame-pointer -mcld \ + -finline-functions -nostdinc -fno-stack-protector -I../../include +CPP =gcc -E -nostdinc -I../../include + +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< +.s.o: + $(AS) -o $*.o $< +.c.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< + +OBJS = tty_io.o console.o keyboard.2.o serial.o rs_io.o \ + tty_ioctl.o + +chr_drv.a: $(OBJS) + $(AR) rcs chr_drv.a $(OBJS) + sync + +keyboard.2.s: keyboard.S ../../include/linux/config.h + $(CPP) -traditional keyboard.S -o keyboard.2.s + +clean: + rm -f core *.o *.a tmp_make keyboard.2.s + for i in *.c;do rm -f `basename $$i .c`.s;done + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + (for i in *.c;do echo -n `echo $$i | sed 's,\.c,\.s,'`" "; \ + $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + +### Dependencies: +console.s console.o : console.c ../../include/linux/sched.h \ + ../../include/linux/head.h ../../include/linux/fs.h \ + ../../include/sys/types.h ../../include/linux/mm.h ../../include/signal.h \ + ../../include/linux/tty.h ../../include/termios.h ../../include/asm/io.h \ + ../../include/asm/system.h +serial.s serial.o : serial.c ../../include/linux/tty.h ../../include/termios.h \ + ../../include/linux/sched.h ../../include/linux/head.h \ + ../../include/linux/fs.h ../../include/sys/types.h ../../include/linux/mm.h \ + ../../include/signal.h ../../include/asm/system.h ../../include/asm/io.h +tty_io.s tty_io.o : tty_io.c ../../include/ctype.h ../../include/errno.h \ + ../../include/signal.h ../../include/sys/types.h \ + ../../include/linux/sched.h ../../include/linux/head.h \ + ../../include/linux/fs.h ../../include/linux/mm.h ../../include/linux/tty.h \ + ../../include/termios.h ../../include/asm/segment.h \ + ../../include/asm/system.h +tty_ioctl.s tty_ioctl.o : tty_ioctl.c ../../include/errno.h ../../include/termios.h \ + ../../include/linux/sched.h ../../include/linux/head.h \ + ../../include/linux/fs.h ../../include/sys/types.h ../../include/linux/mm.h \ + ../../include/signal.h ../../include/linux/kernel.h \ + ../../include/linux/tty.h ../../include/asm/io.h \ + ../../include/asm/segment.h ../../include/asm/system.h diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/chr_drv.a b/linux-0.11-lab/2/linux/kernel/chr_drv/chr_drv.a new file mode 100755 index 0000000000000000000000000000000000000000..d2f3869a9d5cd226117476be64275b50d1cf4aa7 GIT binary patch literal 68902 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ਞ(_ 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 E8yu$yWB>pF literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/console.c b/linux-0.11-lab/2/linux/kernel/chr_drv/console.c new file mode 100755 index 0000000..a12ffbf --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/chr_drv/console.c @@ -0,0 +1,710 @@ +/* + * linux/kernel/console.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * console.c + * + * This module implements the console io functions + * 'void con_init(void)' + * 'void con_write(struct tty_queue * queue)' + * Hopefully this will be a rather complete VT102 implementation. + * + * Beeping thanks to John T Kohl. + */ + +/* + * NOTE!!! We sometimes disable and enable interrupts for a short while + * (to put a word in video IO), but this will work even for keyboard + * interrupts. We know interrupts aren't enabled when getting a keyboard + * interrupt, as we use trap-gates. Hopefully all is well. + */ + +/* + * Code to check for different video-cards mostly by Galen Hunt, + * + */ + +#include +#include +#include +#include + +/* + * These are set up by the setup-routine at boot-time: + */ + +#define ORIG_X (*(unsigned char *)0x90000) +#define ORIG_Y (*(unsigned char *)0x90001) +#define ORIG_VIDEO_PAGE (*(unsigned short *)0x90004) +#define ORIG_VIDEO_MODE ((*(unsigned short *)0x90006) & 0xff) +#define ORIG_VIDEO_COLS (((*(unsigned short *)0x90006) & 0xff00) >> 8) +#define ORIG_VIDEO_LINES (25) +#define ORIG_VIDEO_EGA_AX (*(unsigned short *)0x90008) +#define ORIG_VIDEO_EGA_BX (*(unsigned short *)0x9000a) +#define ORIG_VIDEO_EGA_CX (*(unsigned short *)0x9000c) + +#define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ +#define VIDEO_TYPE_CGA 0x11 /* CGA Display */ +#define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ +#define VIDEO_TYPE_EGAC 0x21 /* EGA/VGA in Color Mode */ + +#define NPAR 16 + +extern void keyboard_interrupt(void); + +static unsigned char video_type; /* Type of display being used */ +static unsigned long video_num_columns; /* Number of text columns */ +static unsigned long video_size_row; /* Bytes per row */ +static unsigned long video_num_lines; /* Number of test lines */ +static unsigned char video_page; /* Initial video page */ +static unsigned long video_mem_start; /* Start of video RAM */ +static unsigned long video_mem_end; /* End of video RAM (sort of) */ +static unsigned short video_port_reg; /* Video register select port */ +static unsigned short video_port_val; /* Video register value port */ +static unsigned short video_erase_char; /* Char+Attrib to erase with */ + +static unsigned long origin; /* Used for EGA/VGA fast scroll */ +static unsigned long scr_end; /* Used for EGA/VGA fast scroll */ +static unsigned long pos; +static unsigned long x,y; +static unsigned long top,bottom; +static unsigned long state=0; +static unsigned long npar,par[NPAR]; +static unsigned long ques=0; +static unsigned char attr=0x07; + +static void sysbeep(void); + +/* + * this is what the terminal answers to a ESC-Z or csi0c + * query (= vt100 response). + */ +#define RESPONSE "\033[?1;2c" + +/* NOTE! gotoxy thinks x==video_num_columns is ok */ +static inline void gotoxy(unsigned int new_x,unsigned int new_y) +{ + if (new_x > video_num_columns || new_y >= video_num_lines) + return; + x=new_x; + y=new_y; + pos=origin + y*video_size_row + (x<<1); +} + +static inline void set_origin(void) +{ + cli(); + outb_p(12, video_port_reg); + outb_p(0xff&((origin-video_mem_start)>>9), video_port_val); + outb_p(13, video_port_reg); + outb_p(0xff&((origin-video_mem_start)>>1), video_port_val); + sti(); +} + +static void scrup(void) +{ + if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM) + { + if (!top && bottom == video_num_lines) { + origin += video_size_row; + pos += video_size_row; + scr_end += video_size_row; + if (scr_end > video_mem_end) { + __asm__("cld\n\t" + "rep\n\t" + "movsl\n\t" + "movl video_num_columns,%1\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" ((video_num_lines-1)*video_num_columns>>1), + "D" (video_mem_start), + "S" (origin) + ); + scr_end -= origin-video_mem_start; + pos -= origin-video_mem_start; + origin = video_mem_start; + } else { + __asm__("cld\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" (video_num_columns), + "D" (scr_end-video_size_row) + ); + } + set_origin(); + } else { + __asm__("cld\n\t" + "rep\n\t" + "movsl\n\t" + "movl video_num_columns,%%ecx\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" ((bottom-top-1)*video_num_columns>>1), + "D" (origin+video_size_row*top), + "S" (origin+video_size_row*(top+1)) + ); + } + } + else /* Not EGA/VGA */ + { + __asm__("cld\n\t" + "rep\n\t" + "movsl\n\t" + "movl video_num_columns,%%ecx\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" ((bottom-top-1)*video_num_columns>>1), + "D" (origin+video_size_row*top), + "S" (origin+video_size_row*(top+1)) + ); + } +} + +static void scrdown(void) +{ + if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_EGAM) + { + __asm__("std\n\t" + "rep\n\t" + "movsl\n\t" + "addl $2,%%edi\n\t" /* %edi has been decremented by 4 */ + "movl video_num_columns,%%ecx\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" ((bottom-top-1)*video_num_columns>>1), + "D" (origin+video_size_row*bottom-4), + "S" (origin+video_size_row*(bottom-1)-4) + ); + } + else /* Not EGA/VGA */ + { + __asm__("std\n\t" + "rep\n\t" + "movsl\n\t" + "addl $2,%%edi\n\t" /* %edi has been decremented by 4 */ + "movl video_num_columns,%%ecx\n\t" + "rep\n\t" + "stosw" + ::"a" (video_erase_char), + "c" ((bottom-top-1)*video_num_columns>>1), + "D" (origin+video_size_row*bottom-4), + "S" (origin+video_size_row*(bottom-1)-4) + ); + } +} + +static void lf(void) +{ + if (y+1top) { + y--; + pos -= video_size_row; + return; + } + scrdown(); +} + +static void cr(void) +{ + pos -= x<<1; + x=0; +} + +static void del(void) +{ + if (x) { + pos -= 2; + x--; + *(unsigned short *)pos = video_erase_char; + } +} + +static void csi_J(int par) +{ + long count __asm__("cx"); + long start __asm__("di"); + + switch (par) { + case 0: /* erase from cursor to end of display */ + count = (scr_end-pos)>>1; + start = pos; + break; + case 1: /* erase from start to cursor */ + count = (pos-origin)>>1; + start = origin; + break; + case 2: /* erase whole display */ + count = video_num_columns * video_num_lines; + start = origin; + break; + default: + return; + } + __asm__("cld\n\t" + "rep\n\t" + "stosw\n\t" + ::"c" (count), + "D" (start),"a" (video_erase_char) + ); +} + +static void csi_K(int par) +{ + long count __asm__("cx"); + long start __asm__("di"); + + switch (par) { + case 0: /* erase from cursor to end of line */ + if (x>=video_num_columns) + return; + count = video_num_columns-x; + start = pos; + break; + case 1: /* erase from start of line to cursor */ + start = pos - (x<<1); + count = (x>9), video_port_val); + outb_p(15, video_port_reg); + outb_p(0xff&((pos-video_mem_start)>>1), video_port_val); + sti(); +} + +static void respond(struct tty_struct * tty) +{ + char * p = RESPONSE; + + cli(); + while (*p) { + PUTCH(*p,tty->read_q); + p++; + } + sti(); + copy_to_cooked(tty); +} + +static void insert_char(void) +{ + int i=x; + unsigned short tmp, old = video_erase_char; + unsigned short * p = (unsigned short *) pos; + + while (i++=video_num_columns) + return; + i = x; + while (++i < video_num_columns) { + *p = *(p+1); + p++; + } + *p = video_erase_char; +} + +static void delete_line(void) +{ + int oldtop,oldbottom; + + oldtop=top; + oldbottom=bottom; + top=y; + bottom = video_num_lines; + scrup(); + top=oldtop; + bottom=oldbottom; +} + +static void csi_at(unsigned int nr) +{ + if (nr > video_num_columns) + nr = video_num_columns; + else if (!nr) + nr = 1; + while (nr--) + insert_char(); +} + +static void csi_L(unsigned int nr) +{ + if (nr > video_num_lines) + nr = video_num_lines; + else if (!nr) + nr = 1; + while (nr--) + insert_line(); +} + +static void csi_P(unsigned int nr) +{ + if (nr > video_num_columns) + nr = video_num_columns; + else if (!nr) + nr = 1; + while (nr--) + delete_char(); +} + +static void csi_M(unsigned int nr) +{ + if (nr > video_num_lines) + nr = video_num_lines; + else if (!nr) + nr=1; + while (nr--) + delete_line(); +} + +static int saved_x=0; +static int saved_y=0; + +static void save_cur(void) +{ + saved_x=x; + saved_y=y; +} + +static void restore_cur(void) +{ + gotoxy(saved_x, saved_y); +} + +void con_write(struct tty_struct * tty) +{ + int nr; + char c; + + nr = CHARS(tty->write_q); + while (nr--) { + GETCH(tty->write_q,c); + switch(state) { + case 0: + if (c>31 && c<127) { + if (x>=video_num_columns) { + x -= video_num_columns; + pos -= video_size_row; + lf(); + } + __asm__("movb attr,%%ah\n\t" + "movw %%ax,%1\n\t" + ::"a" (c),"m" (*(short *)pos) + ); + pos += 2; + x++; + } else if (c==27) + state=1; + else if (c==10 || c==11 || c==12) + lf(); + else if (c==13) + cr(); + else if (c==ERASE_CHAR(tty)) + del(); + else if (c==8) { + if (x) { + x--; + pos -= 2; + } + } else if (c==9) { + c=8-(x&7); + x += c; + pos += c<<1; + if (x>video_num_columns) { + x -= video_num_columns; + pos -= video_size_row; + lf(); + } + c=9; + } else if (c==7) + sysbeep(); + break; + case 1: + state=0; + if (c=='[') + state=2; + else if (c=='E') + gotoxy(0,y+1); + else if (c=='M') + ri(); + else if (c=='D') + lf(); + else if (c=='Z') + respond(tty); + else if (x=='7') + save_cur(); + else if (x=='8') + restore_cur(); + break; + case 2: + for(npar=0;npar='0' && c<='9') { + par[npar]=10*par[npar]+c-'0'; + break; + } else state=4; + case 4: + state=0; + switch(c) { + case 'G': case '`': + if (par[0]) par[0]--; + gotoxy(par[0],y); + break; + case 'A': + if (!par[0]) par[0]++; + gotoxy(x,y-par[0]); + break; + case 'B': case 'e': + if (!par[0]) par[0]++; + gotoxy(x,y+par[0]); + break; + case 'C': case 'a': + if (!par[0]) par[0]++; + gotoxy(x+par[0],y); + break; + case 'D': + if (!par[0]) par[0]++; + gotoxy(x-par[0],y); + break; + case 'E': + if (!par[0]) par[0]++; + gotoxy(0,y+par[0]); + break; + case 'F': + if (!par[0]) par[0]++; + gotoxy(0,y-par[0]); + break; + case 'd': + if (par[0]) par[0]--; + gotoxy(x,par[0]); + break; + case 'H': case 'f': + if (par[0]) par[0]--; + if (par[1]) par[1]--; + gotoxy(par[1],par[0]); + break; + case 'J': + csi_J(par[0]); + break; + case 'K': + csi_K(par[0]); + break; + case 'L': + csi_L(par[0]); + break; + case 'M': + csi_M(par[0]); + break; + case 'P': + csi_P(par[0]); + break; + case '@': + csi_at(par[0]); + break; + case 'm': + csi_m(); + break; + case 'r': + if (par[0]) par[0]--; + if (!par[1]) par[1] = video_num_lines; + if (par[0] < par[1] && + par[1] <= video_num_lines) { + top=par[0]; + bottom=par[1]; + } + break; + case 's': + save_cur(); + break; + case 'u': + restore_cur(); + break; + } + } + } + set_cursor(); +} + +/* + * void con_init(void); + * + * This routine initalizes console interrupts, and does nothing + * else. If you want the screen to clear, call tty_write with + * the appropriate escape-sequece. + * + * Reads the information preserved by setup.s to determine the current display + * type and sets everything accordingly. + */ +void con_init(void) +{ + register unsigned char a; + char *display_desc = "????"; + char *display_ptr; + + video_num_columns = ORIG_VIDEO_COLS; + video_size_row = video_num_columns * 2; + video_num_lines = ORIG_VIDEO_LINES; + video_page = ORIG_VIDEO_PAGE; + video_erase_char = 0x0720; + + if (ORIG_VIDEO_MODE == 7) /* Is this a monochrome display? */ + { + video_mem_start = 0xb0000; + video_port_reg = 0x3b4; + video_port_val = 0x3b5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) + { + video_type = VIDEO_TYPE_EGAM; + video_mem_end = 0xb8000; + display_desc = "EGAm"; + } + else + { + video_type = VIDEO_TYPE_MDA; + video_mem_end = 0xb2000; + display_desc = "*MDA"; + } + } + else /* If not, it is color. */ + { + video_mem_start = 0xb8000; + video_port_reg = 0x3d4; + video_port_val = 0x3d5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) + { + video_type = VIDEO_TYPE_EGAC; + video_mem_end = 0xbc000; + display_desc = "EGAc"; + } + else + { + video_type = VIDEO_TYPE_CGA; + video_mem_end = 0xba000; + display_desc = "*CGA"; + } + } + + /* Let the user known what kind of display driver we are using */ + + display_ptr = ((char *)video_mem_start) + video_size_row - 8; + while (*display_desc) + { + *display_ptr++ = *display_desc++; + display_ptr++; + } + + /* Initialize the variables used for scrolling (mostly EGA/VGA) */ + + origin = video_mem_start; + scr_end = video_mem_start + video_num_lines * video_size_row; + top = 0; + bottom = video_num_lines; + + gotoxy(ORIG_X,ORIG_Y); + set_trap_gate(0x21,&keyboard_interrupt); + outb_p(inb_p(0x21)&0xfd,0x21); + a=inb_p(0x61); + outb_p(a|0x80,0x61); + outb(a,0x61); +} +/* from bsd-net-2: */ + +void sysbeepstop(void) +{ + /* disable counter 2 */ + outb(inb_p(0x61)&0xFC, 0x61); +} + +int beepcount = 0; + +static void sysbeep(void) +{ + /* enable counter 2 */ + outb_p(inb_p(0x61)|3, 0x61); + /* set command for counter 2, 2 byte write */ + outb_p(0xB6, 0x43); + /* send 0x637 for 750 HZ */ + outb_p(0x37, 0x42); + outb(0x06, 0x42); + /* 1/8 second */ + beepcount = HZ/8; +} diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/console.o b/linux-0.11-lab/2/linux/kernel/chr_drv/console.o new file mode 100755 index 0000000000000000000000000000000000000000..cdb09cf249a683c556a1bd6a57bcc3dbe96270a4 GIT binary patch literal 20896 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" +# 1 "" +# 1 "keyboard.S" + + + + + + + + + + + + + +# 1 "../../include/linux/config.h" 1 + + + + + + + + + + + + + + + + + + + + + +# 36 "../../include/linux/config.h" + +# 47 "../../include/linux/config.h" + +# 14 "keyboard.S" 2 + +.text +.globl keyboard_interrupt + + + + +size = 1024 + +head = 4 +tail = 8 +proc_list = 12 +buf = 16 + +mode: .byte 0 +leds: .byte 2 +e0: .byte 0 + + + + + + +keyboard_interrupt: + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + push %ds + push %es + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + xor %al,%al + inb $0x60,%al + cmpb $0xe0,%al + je set_e0 + cmpb $0xe1,%al + je set_e1 + call key_table(,%eax,4) + movb $0,e0 +e0_e1: inb $0x61,%al + jmp 1f +1: jmp 1f +1: orb $0x80,%al + jmp 1f +1: jmp 1f +1: outb %al,$0x61 + jmp 1f +1: jmp 1f +1: andb $0x7F,%al + outb %al,$0x61 + movb $0x20,%al + outb %al,$0x20 + pushl $0 + call do_tty_interrupt + addl $4,%esp + pop %es + pop %ds + popl %edx + popl %ecx + popl %ebx + popl %eax + iret +set_e0: movb $1,e0 + jmp e0_e1 +set_e1: movb $2,e0 + jmp e0_e1 + + + + + + +put_queue: + pushl %ecx + pushl %edx + movl table_list,%edx # read-queue for console + movl head(%edx),%ecx +1: movb %al,buf(%edx,%ecx) + incl %ecx + andl $size-1,%ecx + cmpl tail(%edx),%ecx # buffer full - discard everything + je 3f + shrdl $8,%ebx,%eax + je 2f + shrl $8,%ebx + jmp 1b +2: movl %ecx,head(%edx) + movl proc_list(%edx),%ecx + testl %ecx,%ecx + je 3f + movl $0,(%ecx) +3: popl %edx + popl %ecx + ret + +ctrl: movb $0x04,%al + jmp 1f +alt: movb $0x10,%al +1: cmpb $0,e0 + je 2f + addb %al,%al +2: orb %al,mode + ret +unctrl: movb $0x04,%al + jmp 1f +unalt: movb $0x10,%al +1: cmpb $0,e0 + je 2f + addb %al,%al +2: notb %al + andb %al,mode + ret + +lshift: + orb $0x01,mode + ret +unlshift: + andb $0xfe,mode + ret +rshift: + orb $0x02,mode + ret +unrshift: + andb $0xfd,mode + ret + +caps: testb $0x80,mode + jne 1f + xorb $4,leds + xorb $0x40,mode + orb $0x80,mode +set_leds: + call kb_wait + movb $0xed,%al + outb %al,$0x60 + call kb_wait + movb leds,%al + outb %al,$0x60 + ret +uncaps: andb $0x7f,mode + ret +scroll: + xorb $1,leds + jmp set_leds +num: xorb $2,leds + jmp set_leds + + + + + +cursor: + subb $0x47,%al + jb 1f + cmpb $12,%al + ja 1f + jne cur2 + testb $0x0c,mode + je cur2 + testb $0x30,mode + jne reboot +cur2: cmpb $0x01,e0 + je cur + testb $0x02,leds + je cur + testb $0x03,mode + jne cur + xorl %ebx,%ebx + movb num_table(%eax),%al + jmp put_queue +1: ret + +cur: movb cur_table(%eax),%al + cmpb $'9,%al + ja ok_cur + movb $'~,%ah +ok_cur: shll $16,%eax + movw $0x5b1b,%ax + xorl %ebx,%ebx + jmp put_queue + + + + + +num_table: + .ascii "789 456 1230," + +cur_table: + .ascii "HA5 DGC YB623" + + + + +func: + pushl %eax + pushl %ecx + pushl %edx + call show_stat + popl %edx + popl %ecx + popl %eax + subb $0x3B,%al + jb end_func + cmpb $9,%al + jbe ok_func + subb $18,%al + cmpb $10,%al + jb end_func + cmpb $11,%al + ja end_func +ok_func: + cmpl $4,%ecx + jl end_func + movl func_table(,%eax,4),%eax + xorl %ebx,%ebx + jmp put_queue +end_func: + ret + + + + +func_table: + .long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b + .long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b + .long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b + +# 294 "keyboard.S" + +key_map: + .byte 0,27 + .ascii "1234567890-=" + .byte 127,9 + .ascii "qwertyuiop[]" + .byte 13,0 + .ascii "asdfghjkl;'" + .byte '`,0 + .ascii "\\zxcvbnm,./" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 + .byte '-,0,0,0,'+ + .byte 0,0,0,0,0,0,0 + .byte '< + .fill 10,1,0 + + +shift_map: + .byte 0,27 + .ascii "!@#$%^&*()_+" + .byte 127,9 + .ascii "QWERTYUIOP{}" + .byte 13,0 + .ascii "ASDFGHJKL:\"" + .byte '~,0 + .ascii "|ZXCVBNM<>?" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 + .byte '-,0,0,0,'+ + .byte 0,0,0,0,0,0,0 + .byte '> + .fill 10,1,0 + +alt_map: + .byte 0,0 + .ascii "\0@\0$\0\0{[]}\\\0" + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte '~,13,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 + .fill 16,1,0 + .byte 0,0,0,0,0 + .byte 0,0,0,0,0,0,0 + .byte '| + .fill 10,1,0 + +# 449 "keyboard.S" + + + + +do_self: + lea alt_map,%ebx + testb $0x20,mode + jne 1f + lea shift_map,%ebx + testb $0x03,mode + jne 1f + lea key_map,%ebx +1: movb (%ebx,%eax),%al + orb %al,%al + je none + testb $0x4c,mode + je 2f + cmpb $'a,%al + jb 2f + cmpb $'},%al + ja 2f + subb $32,%al +2: testb $0x0c,mode + je 3f + cmpb $64,%al + jb 3f + cmpb $64+32,%al + jae 3f + subb $64,%al +3: testb $0x10,mode + je 4f + orb $0x80,%al +4: andl $0xff,%eax + xorl %ebx,%ebx + call put_queue +none: ret + + + + + + +minus: cmpb $1,e0 + jne do_self + movl $'/,%eax + xorl %ebx,%ebx + jmp put_queue + + + + + + +key_table: + .long none,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,ctrl,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,lshift,do_self + .long do_self,do_self,do_self,do_self + .long do_self,do_self,do_self,do_self + .long do_self,minus,rshift,do_self + .long alt,do_self,caps,func + .long func,func,func,func + .long func,func,func,func + .long func,num,scroll,cursor + .long cursor,cursor,do_self,cursor + .long cursor,cursor,do_self,cursor + .long cursor,cursor,cursor,cursor + .long none,none,do_self,func + .long func,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,unctrl,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,unlshift,none + .long none,none,none,none + .long none,none,none,none + .long none,none,unrshift,none + .long unalt,none,uncaps,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + .long none,none,none,none + + + + + +kb_wait: + pushl %eax +1: inb $0x64,%al + testb $0x02,%al + jne 1b + popl %eax + ret + + + + +reboot: + call kb_wait + movw $0x1234,0x472 + movb $0xfc,%al + outb %al,$0x64 +die: jmp die diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.S b/linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.S new file mode 100755 index 0000000..25210b4 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/chr_drv/keyboard.S @@ -0,0 +1,588 @@ +/* + * linux/kernel/keyboard.S + * + * (C) 1991 Linus Torvalds + */ + +/* + * Thanks to Alfred Leung for US keyboard patches + * Wolfgang Thiel for German keyboard patches + * Marc Corsini for the French keyboard + */ + +#include + +.text +.globl keyboard_interrupt + +/* + * these are for the keyboard read functions + */ +size = 1024 /* must be a power of two ! And MUST be the same + as in tty_io.c !!!! */ +head = 4 +tail = 8 +proc_list = 12 +buf = 16 + +mode: .byte 0 /* caps, alt, ctrl and shift mode */ +leds: .byte 2 /* num-lock, caps, scroll-lock mode (nom-lock on) */ +e0: .byte 0 + +/* + * con_int is the real interrupt routine that reads the + * keyboard scan-code and converts it into the appropriate + * ascii character(s). + */ +keyboard_interrupt: + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + push %ds + push %es + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + xor %al,%al /* %eax is scan code */ + inb $0x60,%al + cmpb $0xe0,%al + je set_e0 + cmpb $0xe1,%al + je set_e1 + call key_table(,%eax,4) + movb $0,e0 +e0_e1: inb $0x61,%al + jmp 1f +1: jmp 1f +1: orb $0x80,%al + jmp 1f +1: jmp 1f +1: outb %al,$0x61 + jmp 1f +1: jmp 1f +1: andb $0x7F,%al + outb %al,$0x61 + movb $0x20,%al + outb %al,$0x20 + pushl $0 + call do_tty_interrupt + addl $4,%esp + pop %es + pop %ds + popl %edx + popl %ecx + popl %ebx + popl %eax + iret +set_e0: movb $1,e0 + jmp e0_e1 +set_e1: movb $2,e0 + jmp e0_e1 + +/* + * This routine fills the buffer with max 8 bytes, taken from + * %ebx:%eax. (%edx is high). The bytes are written in the + * order %al,%ah,%eal,%eah,%bl,%bh ... until %eax is zero. + */ +put_queue: + pushl %ecx + pushl %edx + movl table_list,%edx # read-queue for console + movl head(%edx),%ecx +1: movb %al,buf(%edx,%ecx) + incl %ecx + andl $size-1,%ecx + cmpl tail(%edx),%ecx # buffer full - discard everything + je 3f + shrdl $8,%ebx,%eax + je 2f + shrl $8,%ebx + jmp 1b +2: movl %ecx,head(%edx) + movl proc_list(%edx),%ecx + testl %ecx,%ecx + je 3f + movl $0,(%ecx) +3: popl %edx + popl %ecx + ret + +ctrl: movb $0x04,%al + jmp 1f +alt: movb $0x10,%al +1: cmpb $0,e0 + je 2f + addb %al,%al +2: orb %al,mode + ret +unctrl: movb $0x04,%al + jmp 1f +unalt: movb $0x10,%al +1: cmpb $0,e0 + je 2f + addb %al,%al +2: notb %al + andb %al,mode + ret + +lshift: + orb $0x01,mode + ret +unlshift: + andb $0xfe,mode + ret +rshift: + orb $0x02,mode + ret +unrshift: + andb $0xfd,mode + ret + +caps: testb $0x80,mode + jne 1f + xorb $4,leds + xorb $0x40,mode + orb $0x80,mode +set_leds: + call kb_wait + movb $0xed,%al /* set leds command */ + outb %al,$0x60 + call kb_wait + movb leds,%al + outb %al,$0x60 + ret +uncaps: andb $0x7f,mode + ret +scroll: + xorb $1,leds + jmp set_leds +num: xorb $2,leds + jmp set_leds + +/* + * curosr-key/numeric keypad cursor keys are handled here. + * checking for numeric keypad etc. + */ +cursor: + subb $0x47,%al + jb 1f + cmpb $12,%al + ja 1f + jne cur2 /* check for ctrl-alt-del */ + testb $0x0c,mode + je cur2 + testb $0x30,mode + jne reboot +cur2: cmpb $0x01,e0 /* e0 forces cursor movement */ + je cur + testb $0x02,leds /* not num-lock forces cursor */ + je cur + testb $0x03,mode /* shift forces cursor */ + jne cur + xorl %ebx,%ebx + movb num_table(%eax),%al + jmp put_queue +1: ret + +cur: movb cur_table(%eax),%al + cmpb $'9,%al + ja ok_cur + movb $'~,%ah +ok_cur: shll $16,%eax + movw $0x5b1b,%ax + xorl %ebx,%ebx + jmp put_queue + +#if defined(KBD_FR) +num_table: + .ascii "789 456 1230." +#else +num_table: + .ascii "789 456 1230," +#endif +cur_table: + .ascii "HA5 DGC YB623" + +/* + * this routine handles function keys + */ +func: + pushl %eax + pushl %ecx + pushl %edx + call show_stat + popl %edx + popl %ecx + popl %eax + subb $0x3B,%al + jb end_func + cmpb $9,%al + jbe ok_func + subb $18,%al + cmpb $10,%al + jb end_func + cmpb $11,%al + ja end_func +ok_func: + cmpl $4,%ecx /* check that there is enough room */ + jl end_func + movl func_table(,%eax,4),%eax + xorl %ebx,%ebx + jmp put_queue +end_func: + ret + +/* + * function keys send F1:'esc [ [ A' F2:'esc [ [ B' etc. + */ +func_table: + .long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b + .long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b + .long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b + +#if defined(KBD_FINNISH) +key_map: + .byte 0,27 + .ascii "1234567890+'" + .byte 127,9 + .ascii "qwertyuiop}" + .byte 0,13,0 + .ascii "asdfghjkl|{" + .byte 0,0 + .ascii "'zxcvbnm,.-" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '< + .fill 10,1,0 + +shift_map: + .byte 0,27 + .ascii "!\"#$%&/()=?`" + .byte 127,9 + .ascii "QWERTYUIOP]^" + .byte 13,0 + .ascii "ASDFGHJKL\\[" + .byte 0,0 + .ascii "*ZXCVBNM;:_" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '> + .fill 10,1,0 + +alt_map: + .byte 0,0 + .ascii "\0@\0$\0\0{[]}\\\0" + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte '~,13,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte 0,0,0,0,0 /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '| + .fill 10,1,0 + +#elif defined(KBD_US) + +key_map: + .byte 0,27 + .ascii "1234567890-=" + .byte 127,9 + .ascii "qwertyuiop[]" + .byte 13,0 + .ascii "asdfghjkl;'" + .byte '`,0 + .ascii "\\zxcvbnm,./" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '< + .fill 10,1,0 + + +shift_map: + .byte 0,27 + .ascii "!@#$%^&*()_+" + .byte 127,9 + .ascii "QWERTYUIOP{}" + .byte 13,0 + .ascii "ASDFGHJKL:\"" + .byte '~,0 + .ascii "|ZXCVBNM<>?" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '> + .fill 10,1,0 + +alt_map: + .byte 0,0 + .ascii "\0@\0$\0\0{[]}\\\0" + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte '~,13,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte 0,0,0,0,0 /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '| + .fill 10,1,0 + +#elif defined(KBD_GR) + +key_map: + .byte 0,27 + .ascii "1234567890\\'" + .byte 127,9 + .ascii "qwertzuiop@+" + .byte 13,0 + .ascii "asdfghjkl[]^" + .byte 0,'# + .ascii "yxcvbnm,.-" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '< + .fill 10,1,0 + + +shift_map: + .byte 0,27 + .ascii "!\"#$%&/()=?`" + .byte 127,9 + .ascii "QWERTZUIOP\\*" + .byte 13,0 + .ascii "ASDFGHJKL{}~" + .byte 0,'' + .ascii "YXCVBNM;:_" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '> + .fill 10,1,0 + +alt_map: + .byte 0,0 + .ascii "\0@\0$\0\0{[]}\\\0" + .byte 0,0 + .byte '@,0,0,0,0,0,0,0,0,0,0 + .byte '~,13,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte 0,0,0,0,0 /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '| + .fill 10,1,0 + + +#elif defined(KBD_FR) + +key_map: + .byte 0,27 + .ascii "&{\"'(-}_/@)=" + .byte 127,9 + .ascii "azertyuiop^$" + .byte 13,0 + .ascii "qsdfghjklm|" + .byte '`,0,42 /* coin sup gauche, don't know, [*|mu] */ + .ascii "wxcvbn,;:!" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '< + .fill 10,1,0 + +shift_map: + .byte 0,27 + .ascii "1234567890]+" + .byte 127,9 + .ascii "AZERTYUIOP<>" + .byte 13,0 + .ascii "QSDFGHJKLM%" + .byte '~,0,'# + .ascii "WXCVBN?./\\" + .byte 0,'*,0,32 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte '-,0,0,0,'+ /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '> + .fill 10,1,0 + +alt_map: + .byte 0,0 + .ascii "\0~#{[|`\\^@]}" + .byte 0,0 + .byte '@,0,0,0,0,0,0,0,0,0,0 + .byte '~,13,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 /* 36-39 */ + .fill 16,1,0 /* 3A-49 */ + .byte 0,0,0,0,0 /* 4A-4E */ + .byte 0,0,0,0,0,0,0 /* 4F-55 */ + .byte '| + .fill 10,1,0 + +#else +#error "KBD-type not defined" +#endif +/* + * do_self handles "normal" keys, ie keys that don't change meaning + * and which have just one character returns. + */ +do_self: + lea alt_map,%ebx + testb $0x20,mode /* alt-gr */ + jne 1f + lea shift_map,%ebx + testb $0x03,mode + jne 1f + lea key_map,%ebx +1: movb (%ebx,%eax),%al + orb %al,%al + je none + testb $0x4c,mode /* ctrl or caps */ + je 2f + cmpb $'a,%al + jb 2f + cmpb $'},%al + ja 2f + subb $32,%al +2: testb $0x0c,mode /* ctrl */ + je 3f + cmpb $64,%al + jb 3f + cmpb $64+32,%al + jae 3f + subb $64,%al +3: testb $0x10,mode /* left alt */ + je 4f + orb $0x80,%al +4: andl $0xff,%eax + xorl %ebx,%ebx + call put_queue +none: ret + +/* + * minus has a routine of it's own, as a 'E0h' before + * the scan code for minus means that the numeric keypad + * slash was pushed. + */ +minus: cmpb $1,e0 + jne do_self + movl $'/,%eax + xorl %ebx,%ebx + jmp put_queue + +/* + * This table decides which routine to call when a scan-code has been + * gotten. Most routines just call do_self, or none, depending if + * they are make or break. + */ +key_table: + .long none,do_self,do_self,do_self /* 00-03 s0 esc 1 2 */ + .long do_self,do_self,do_self,do_self /* 04-07 3 4 5 6 */ + .long do_self,do_self,do_self,do_self /* 08-0B 7 8 9 0 */ + .long do_self,do_self,do_self,do_self /* 0C-0F + ' bs tab */ + .long do_self,do_self,do_self,do_self /* 10-13 q w e r */ + .long do_self,do_self,do_self,do_self /* 14-17 t y u i */ + .long do_self,do_self,do_self,do_self /* 18-1B o p } ^ */ + .long do_self,ctrl,do_self,do_self /* 1C-1F enter ctrl a s */ + .long do_self,do_self,do_self,do_self /* 20-23 d f g h */ + .long do_self,do_self,do_self,do_self /* 24-27 j k l | */ + .long do_self,do_self,lshift,do_self /* 28-2B { para lshift , */ + .long do_self,do_self,do_self,do_self /* 2C-2F z x c v */ + .long do_self,do_self,do_self,do_self /* 30-33 b n m , */ + .long do_self,minus,rshift,do_self /* 34-37 . - rshift * */ + .long alt,do_self,caps,func /* 38-3B alt sp caps f1 */ + .long func,func,func,func /* 3C-3F f2 f3 f4 f5 */ + .long func,func,func,func /* 40-43 f6 f7 f8 f9 */ + .long func,num,scroll,cursor /* 44-47 f10 num scr home */ + .long cursor,cursor,do_self,cursor /* 48-4B up pgup - left */ + .long cursor,cursor,do_self,cursor /* 4C-4F n5 right + end */ + .long cursor,cursor,cursor,cursor /* 50-53 dn pgdn ins del */ + .long none,none,do_self,func /* 54-57 sysreq ? < f11 */ + .long func,none,none,none /* 58-5B f12 ? ? ? */ + .long none,none,none,none /* 5C-5F ? ? ? ? */ + .long none,none,none,none /* 60-63 ? ? ? ? */ + .long none,none,none,none /* 64-67 ? ? ? ? */ + .long none,none,none,none /* 68-6B ? ? ? ? */ + .long none,none,none,none /* 6C-6F ? ? ? ? */ + .long none,none,none,none /* 70-73 ? ? ? ? */ + .long none,none,none,none /* 74-77 ? ? ? ? */ + .long none,none,none,none /* 78-7B ? ? ? ? */ + .long none,none,none,none /* 7C-7F ? ? ? ? */ + .long none,none,none,none /* 80-83 ? br br br */ + .long none,none,none,none /* 84-87 br br br br */ + .long none,none,none,none /* 88-8B br br br br */ + .long none,none,none,none /* 8C-8F br br br br */ + .long none,none,none,none /* 90-93 br br br br */ + .long none,none,none,none /* 94-97 br br br br */ + .long none,none,none,none /* 98-9B br br br br */ + .long none,unctrl,none,none /* 9C-9F br unctrl br br */ + .long none,none,none,none /* A0-A3 br br br br */ + .long none,none,none,none /* A4-A7 br br br br */ + .long none,none,unlshift,none /* A8-AB br br unlshift br */ + .long none,none,none,none /* AC-AF br br br br */ + .long none,none,none,none /* B0-B3 br br br br */ + .long none,none,unrshift,none /* B4-B7 br br unrshift br */ + .long unalt,none,uncaps,none /* B8-BB unalt br uncaps br */ + .long none,none,none,none /* BC-BF br br br br */ + .long none,none,none,none /* C0-C3 br br br br */ + .long none,none,none,none /* C4-C7 br br br br */ + .long none,none,none,none /* C8-CB br br br br */ + .long none,none,none,none /* CC-CF br br br br */ + .long none,none,none,none /* D0-D3 br br br br */ + .long none,none,none,none /* D4-D7 br br br br */ + .long none,none,none,none /* D8-DB br ? ? ? */ + .long none,none,none,none /* DC-DF ? ? ? ? */ + .long none,none,none,none /* E0-E3 e0 e1 ? ? */ + .long none,none,none,none /* E4-E7 ? ? ? ? */ + .long none,none,none,none /* E8-EB ? ? ? ? */ + .long none,none,none,none /* EC-EF ? ? ? ? */ + .long none,none,none,none /* F0-F3 ? ? ? ? */ + .long none,none,none,none /* F4-F7 ? ? ? ? */ + .long none,none,none,none /* F8-FB ? ? ? ? */ + .long none,none,none,none /* FC-FF ? ? ? ? */ + +/* + * kb_wait waits for the keyboard controller buffer to empty. + * there is no timeout - if the buffer doesn't empty, we hang. + */ +kb_wait: + pushl %eax +1: inb $0x64,%al + testb $0x02,%al + jne 1b + popl %eax + ret +/* + * This routine reboots the machine by asking the keyboard + * controller to pulse the reset-line low. + */ +reboot: + call kb_wait + movw $0x1234,0x472 /* don't do memory check */ + movb $0xfc,%al /* pulse reset and A20 low */ + outb %al,$0x64 +die: jmp die diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.o b/linux-0.11-lab/2/linux/kernel/chr_drv/rs_io.o new file mode 100755 index 0000000000000000000000000000000000000000..9d7d5b3a22aa1a7d33dea95b723af176ee68e951 GIT binary patch literal 1320 zcma)5O=}ZT6upy7lN1_>vDAuUi$oC$(TZ-YF8rt{7SvR*(+bl`=7mYg$1w9^jTe}J1pL8J+VS-DUc@11#5ry}TuH|L!9&O7g8W*$#YU6UjU z!jd2kzZJlJAu zYUu}^X)*0615dy3#7CS5;3%o*n6o2-mX*|mBJ()SkJ>Kxy3mDOdS@N-cB{sLjja`nuw?{k1!T?BECWK1Ur++2eHxq=#!x{gli&& zBRH@@L{yj;>c8RMuaxqliKJ!!PW(mv0M`reH^_6neMo3eLAl-mBy=A^x!y36flz|$ z9Yaq056bmU5ZT?V>*Z0VgF%1b96oaqeG&Pkh$c>dL{JjkL^3ZF1^Vqn>-rt20MOw)mDl`5E4qoh_V zHiu%f3^vy+-ZaTqsdKQH=_9M_uuwBq{86e5Y7L#$RJ8J@4U1NVGqq%B7P>V(VAV>U z?KNO{nOQ2UnY@MR;}pv*t7+mQ_L+$Cmk2hbH&o7BkuiEb(opct5uPWFopkSn(*o}a PoD +#include +#include +#include + +#define WAKEUP_CHARS (TTY_BUF_SIZE/4) + +extern void rs1_interrupt(void); +extern void rs2_interrupt(void); + +static void init(int port) +{ + outb_p(0x80,port+3); /* set DLAB of line control reg */ + outb_p(0x30,port); /* LS of divisor (48 -> 2400 bps */ + outb_p(0x00,port+1); /* MS of divisor */ + outb_p(0x03,port+3); /* reset DLAB */ + outb_p(0x0b,port+4); /* set DTR,RTS, OUT_2 */ + outb_p(0x0d,port+1); /* enable all intrs but writes */ + (void)inb(port); /* read data port to reset things (?) */ +} + +void rs_init(void) +{ + set_intr_gate(0x24,rs1_interrupt); + set_intr_gate(0x23,rs2_interrupt); + init(tty_table[1].read_q.data); + init(tty_table[2].read_q.data); + outb(inb_p(0x21)&0xE7,0x21); +} + +/* + * This routine gets called when tty_write has put something into + * the write_queue. It must check wheter the queue is empty, and + * set the interrupt register accordingly + * + * void _rs_write(struct tty_struct * tty); + */ +void rs_write(struct tty_struct * tty) +{ + cli(); + if (!EMPTY(tty->write_q)) + outb(inb_p(tty->write_q.data+1)|0x02,tty->write_q.data+1); + sti(); +} diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/serial.o b/linux-0.11-lab/2/linux/kernel/chr_drv/serial.o new file mode 100755 index 0000000000000000000000000000000000000000..bf80e08be94a19c3982f10989e20a6e929a1d240 GIT binary patch literal 6752 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 +#include +#include + +#define ALRMMASK (1<<(SIGALRM-1)) +#define KILLMASK (1<<(SIGKILL-1)) +#define INTMASK (1<<(SIGINT-1)) +#define QUITMASK (1<<(SIGQUIT-1)) +#define TSTPMASK (1<<(SIGTSTP-1)) + +#include +#include +#include +#include + +#define _L_FLAG(tty,f) ((tty)->termios.c_lflag & f) +#define _I_FLAG(tty,f) ((tty)->termios.c_iflag & f) +#define _O_FLAG(tty,f) ((tty)->termios.c_oflag & f) + +#define L_CANON(tty) _L_FLAG((tty),ICANON) +#define L_ISIG(tty) _L_FLAG((tty),ISIG) +#define L_ECHO(tty) _L_FLAG((tty),ECHO) +#define L_ECHOE(tty) _L_FLAG((tty),ECHOE) +#define L_ECHOK(tty) _L_FLAG((tty),ECHOK) +#define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL) +#define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE) + +#define I_UCLC(tty) _I_FLAG((tty),IUCLC) +#define I_NLCR(tty) _I_FLAG((tty),INLCR) +#define I_CRNL(tty) _I_FLAG((tty),ICRNL) +#define I_NOCR(tty) _I_FLAG((tty),IGNCR) + +#define O_POST(tty) _O_FLAG((tty),OPOST) +#define O_NLCR(tty) _O_FLAG((tty),ONLCR) +#define O_CRNL(tty) _O_FLAG((tty),OCRNL) +#define O_NLRET(tty) _O_FLAG((tty),ONLRET) +#define O_LCUC(tty) _O_FLAG((tty),OLCUC) + +struct tty_struct tty_table[] = { + { + {ICRNL, /* change incoming CR to NL */ + OPOST|ONLCR, /* change outgoing NL to CRNL */ + 0, + ISIG | ICANON | ECHO | ECHOCTL | ECHOKE, + 0, /* console termio */ + INIT_C_CC}, + 0, /* initial pgrp */ + 0, /* initial stopped */ + con_write, + {0,0,0,0,""}, /* console read-queue */ + {0,0,0,0,""}, /* console write-queue */ + {0,0,0,0,""} /* console secondary queue */ + },{ + {0, /* no translation */ + 0, /* no translation */ + B2400 | CS8, + 0, + 0, + INIT_C_CC}, + 0, + 0, + rs_write, + {0x3f8,0,0,0,""}, /* rs 1 */ + {0x3f8,0,0,0,""}, + {0,0,0,0,""} + },{ + {0, /* no translation */ + 0, /* no translation */ + B2400 | CS8, + 0, + 0, + INIT_C_CC}, + 0, + 0, + rs_write, + {0x2f8,0,0,0,""}, /* rs 2 */ + {0x2f8,0,0,0,""}, + {0,0,0,0,""} + } +}; + +/* + * these are the tables used by the machine code handlers. + * you can implement pseudo-tty's or something by changing + * them. Currently not done. + */ +struct tty_queue * table_list[]={ + &tty_table[0].read_q, &tty_table[0].write_q, + &tty_table[1].read_q, &tty_table[1].write_q, + &tty_table[2].read_q, &tty_table[2].write_q + }; + +void tty_init(void) +{ + rs_init(); + con_init(); +} + +void tty_intr(struct tty_struct * tty, int mask) +{ + int i; + + if (tty->pgrp <= 0) + return; + for (i=0;ipgrp==tty->pgrp) + task[i]->signal |= mask; +} + +static void sleep_if_empty(struct tty_queue * queue) +{ + cli(); + while (!current->signal && EMPTY(*queue)) + interruptible_sleep_on(&queue->proc_list); + sti(); +} + +static void sleep_if_full(struct tty_queue * queue) +{ + if (!FULL(*queue)) + return; + cli(); + while (!current->signal && LEFT(*queue)<128) + interruptible_sleep_on(&queue->proc_list); + sti(); +} + +void wait_for_keypress(void) +{ + sleep_if_empty(&tty_table[0].secondary); +} + +void copy_to_cooked(struct tty_struct * tty) +{ + signed char c; + + while (!EMPTY(tty->read_q) && !FULL(tty->secondary)) { + GETCH(tty->read_q,c); + if (c==13) + if (I_CRNL(tty)) + c=10; + else if (I_NOCR(tty)) + continue; + else ; + else if (c==10 && I_NLCR(tty)) + c=13; + if (I_UCLC(tty)) + c=tolower(c); + if (L_CANON(tty)) { + if (c==KILL_CHAR(tty)) { + /* deal with killing the input line */ + while(!(EMPTY(tty->secondary) || + (c=LAST(tty->secondary))==10 || + c==EOF_CHAR(tty))) { + if (L_ECHO(tty)) { + if (c<32) + PUTCH(127,tty->write_q); + PUTCH(127,tty->write_q); + tty->write(tty); + } + DEC(tty->secondary.head); + } + continue; + } + if (c==ERASE_CHAR(tty)) { + if (EMPTY(tty->secondary) || + (c=LAST(tty->secondary))==10 || + c==EOF_CHAR(tty)) + continue; + if (L_ECHO(tty)) { + if (c<32) + PUTCH(127,tty->write_q); + PUTCH(127,tty->write_q); + tty->write(tty); + } + DEC(tty->secondary.head); + continue; + } + if (c==STOP_CHAR(tty)) { + tty->stopped=1; + continue; + } + if (c==START_CHAR(tty)) { + tty->stopped=0; + continue; + } + } + if (L_ISIG(tty)) { + if (c==INTR_CHAR(tty)) { + tty_intr(tty,INTMASK); + continue; + } + if (c==QUIT_CHAR(tty)) { + tty_intr(tty,QUITMASK); + continue; + } + } + if (c==10 || c==EOF_CHAR(tty)) + tty->secondary.data++; + if (L_ECHO(tty)) { + if (c==10) { + PUTCH(10,tty->write_q); + PUTCH(13,tty->write_q); + } else if (c<32) { + if (L_ECHOCTL(tty)) { + PUTCH('^',tty->write_q); + PUTCH(c+64,tty->write_q); + } + } else + PUTCH(c,tty->write_q); + tty->write(tty); + } + PUTCH(c,tty->secondary); + } + wake_up(&tty->secondary.proc_list); +} + +int tty_read(unsigned channel, char * buf, int nr) +{ + struct tty_struct * tty; + char c, * b=buf; + int minimum,time,flag=0; + long oldalarm; + + if (channel>2 || nr<0) return -1; + tty = &tty_table[channel]; + oldalarm = current->alarm; + time = 10L*tty->termios.c_cc[VTIME]; + minimum = tty->termios.c_cc[VMIN]; + if (time && !minimum) { + minimum=1; + if (flag=(!oldalarm || time+jiffiesalarm = time+jiffies; + } + if (minimum>nr) + minimum=nr; + while (nr>0) { + if (flag && (current->signal & ALRMMASK)) { + current->signal &= ~ALRMMASK; + break; + } + if (current->signal) + break; + if (EMPTY(tty->secondary) || (L_CANON(tty) && + !tty->secondary.data && LEFT(tty->secondary)>20)) { + sleep_if_empty(&tty->secondary); + continue; + } + do { + GETCH(tty->secondary,c); + if (c==EOF_CHAR(tty) || c==10) + tty->secondary.data--; + if (c==EOF_CHAR(tty) && L_CANON(tty)) + return (b-buf); + else { + put_fs_byte(c,b++); + if (!--nr) + break; + } + } while (nr>0 && !EMPTY(tty->secondary)); + if (time && !L_CANON(tty)) + if (flag=(!oldalarm || time+jiffiesalarm = time+jiffies; + else + current->alarm = oldalarm; + if (L_CANON(tty)) { + if (b-buf) + break; + } else if (b-buf >= minimum) + break; + } + current->alarm = oldalarm; + if (current->signal && !(b-buf)) + return -EINTR; + return (b-buf); +} + +int tty_write(unsigned channel, char * buf, int nr) +{ + static cr_flag=0; + struct tty_struct * tty; + char c, *b=buf; + + if (channel>2 || nr<0) return -1; + tty = channel + tty_table; + while (nr>0) { + sleep_if_full(&tty->write_q); + if (current->signal) + break; + while (nr>0 && !FULL(tty->write_q)) { + c=get_fs_byte(b); + if (O_POST(tty)) { + if (c=='\r' && O_CRNL(tty)) + c='\n'; + else if (c=='\n' && O_NLRET(tty)) + c='\r'; + if (c=='\n' && !cr_flag && O_NLCR(tty)) { + cr_flag = 1; + PUTCH(13,tty->write_q); + continue; + } + if (O_LCUC(tty)) + c=toupper(c); + } + b++; nr--; + cr_flag = 0; + PUTCH(c,tty->write_q); + } + tty->write(tty); + if (nr>0) + schedule(); + } + return (b-buf); +} + +/* + * Jeh, sometimes I really like the 386. + * This routine is called from an interrupt, + * and there should be absolutely no problem + * with sleeping even in an interrupt (I hope). + * Of course, if somebody proves me wrong, I'll + * hate intel for all time :-). We'll have to + * be careful and see to reinstating the interrupt + * chips before calling this, though. + * + * I don't think we sleep here under normal circumstances + * anyway, which is good, as the task sleeping might be + * totally innocent. + */ +void do_tty_interrupt(int tty) +{ + copy_to_cooked(tty_table+tty); +} + +void chr_dev_init(void) +{ +} diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/tty_io.o b/linux-0.11-lab/2/linux/kernel/chr_drv/tty_io.o new file mode 100755 index 0000000000000000000000000000000000000000..37e2b15961ebc5713d826d6c25e53571ac6fbb83 GIT binary patch literal 22504 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 O^kQA0pRj`M3jQCx0hyNo literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.c b/linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.c new file mode 100755 index 0000000..e4e3745 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.c @@ -0,0 +1,204 @@ +/* + * linux/kernel/chr_drv/tty_ioctl.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include + +#include +#include +#include + +#include +#include +#include + +static unsigned short quotient[] = { + 0, 2304, 1536, 1047, 857, + 768, 576, 384, 192, 96, + 64, 48, 24, 12, 6, 3 +}; + +static void change_speed(struct tty_struct * tty) +{ + unsigned short port,quot; + + if (!(port = tty->read_q.data)) + return; + quot = quotient[tty->termios.c_cflag & CBAUD]; + cli(); + outb_p(0x80,port+3); /* set DLAB */ + outb_p(quot & 0xff,port); /* LS of divisor */ + outb_p(quot >> 8,port+1); /* MS of divisor */ + outb(0x03,port+3); /* reset DLAB */ + sti(); +} + +static void flush(struct tty_queue * queue) +{ + cli(); + queue->head = queue->tail; + sti(); +} + +static void wait_until_sent(struct tty_struct * tty) +{ + /* do nothing - not implemented */ +} + +static void send_break(struct tty_struct * tty) +{ + /* do nothing - not implemented */ +} + +static int get_termios(struct tty_struct * tty, struct termios * termios) +{ + int i; + + verify_area(termios, sizeof (*termios)); + for (i=0 ; i< (sizeof (*termios)) ; i++) + put_fs_byte( ((char *)&tty->termios)[i] , i+(char *)termios ); + return 0; +} + +static int set_termios(struct tty_struct * tty, struct termios * termios) +{ + int i; + + for (i=0 ; i< (sizeof (*termios)) ; i++) + ((char *)&tty->termios)[i]=get_fs_byte(i+(char *)termios); + change_speed(tty); + return 0; +} + +static int get_termio(struct tty_struct * tty, struct termio * termio) +{ + int i; + struct termio tmp_termio; + + verify_area(termio, sizeof (*termio)); + tmp_termio.c_iflag = tty->termios.c_iflag; + tmp_termio.c_oflag = tty->termios.c_oflag; + tmp_termio.c_cflag = tty->termios.c_cflag; + tmp_termio.c_lflag = tty->termios.c_lflag; + tmp_termio.c_line = tty->termios.c_line; + for(i=0 ; i < NCC ; i++) + tmp_termio.c_cc[i] = tty->termios.c_cc[i]; + for (i=0 ; i< (sizeof (*termio)) ; i++) + put_fs_byte( ((char *)&tmp_termio)[i] , i+(char *)termio ); + return 0; +} + +/* + * This only works as the 386 is low-byt-first + */ +static int set_termio(struct tty_struct * tty, struct termio * termio) +{ + int i; + struct termio tmp_termio; + + for (i=0 ; i< (sizeof (*termio)) ; i++) + ((char *)&tmp_termio)[i]=get_fs_byte(i+(char *)termio); + *(unsigned short *)&tty->termios.c_iflag = tmp_termio.c_iflag; + *(unsigned short *)&tty->termios.c_oflag = tmp_termio.c_oflag; + *(unsigned short *)&tty->termios.c_cflag = tmp_termio.c_cflag; + *(unsigned short *)&tty->termios.c_lflag = tmp_termio.c_lflag; + tty->termios.c_line = tmp_termio.c_line; + for(i=0 ; i < NCC ; i++) + tty->termios.c_cc[i] = tmp_termio.c_cc[i]; + change_speed(tty); + return 0; +} + +int tty_ioctl(int dev, int cmd, int arg) +{ + struct tty_struct * tty; + if (MAJOR(dev) == 5) { + dev=current->tty; + if (dev<0) + panic("tty_ioctl: dev<0"); + } else + dev=MINOR(dev); + tty = dev + tty_table; + switch (cmd) { + case TCGETS: + return get_termios(tty,(struct termios *) arg); + case TCSETSF: + flush(&tty->read_q); /* fallthrough */ + case TCSETSW: + wait_until_sent(tty); /* fallthrough */ + case TCSETS: + return set_termios(tty,(struct termios *) arg); + case TCGETA: + return get_termio(tty,(struct termio *) arg); + case TCSETAF: + flush(&tty->read_q); /* fallthrough */ + case TCSETAW: + wait_until_sent(tty); /* fallthrough */ + case TCSETA: + return set_termio(tty,(struct termio *) arg); + case TCSBRK: + if (!arg) { + wait_until_sent(tty); + send_break(tty); + } + return 0; + case TCXONC: + return -EINVAL; /* not implemented */ + case TCFLSH: + if (arg==0) + flush(&tty->read_q); + else if (arg==1) + flush(&tty->write_q); + else if (arg==2) { + flush(&tty->read_q); + flush(&tty->write_q); + } else + return -EINVAL; + return 0; + case TIOCEXCL: + return -EINVAL; /* not implemented */ + case TIOCNXCL: + return -EINVAL; /* not implemented */ + case TIOCSCTTY: + return -EINVAL; /* set controlling term NI */ + case TIOCGPGRP: + verify_area((void *) arg,4); + put_fs_long(tty->pgrp,(unsigned long *) arg); + return 0; + case TIOCSPGRP: + tty->pgrp=get_fs_long((unsigned long *) arg); + return 0; + case TIOCOUTQ: + verify_area((void *) arg,4); + put_fs_long(CHARS(tty->write_q),(unsigned long *) arg); + return 0; + case TIOCINQ: + verify_area((void *) arg,4); + put_fs_long(CHARS(tty->secondary), + (unsigned long *) arg); + return 0; + case TIOCSTI: + return -EINVAL; /* not implemented */ + case TIOCGWINSZ: + return -EINVAL; /* not implemented */ + case TIOCSWINSZ: + return -EINVAL; /* not implemented */ + case TIOCMGET: + return -EINVAL; /* not implemented */ + case TIOCMBIS: + return -EINVAL; /* not implemented */ + case TIOCMBIC: + return -EINVAL; /* not implemented */ + case TIOCMSET: + return -EINVAL; /* not implemented */ + case TIOCGSOFTCAR: + return -EINVAL; /* not implemented */ + case TIOCSSOFTCAR: + return -EINVAL; /* not implemented */ + default: + return -EINVAL; + } +} diff --git a/linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.o b/linux-0.11-lab/2/linux/kernel/chr_drv/tty_ioctl.o new file mode 100755 index 0000000000000000000000000000000000000000..6fcf766d95e129c53038533553e2124de8516b4b GIT binary patch literal 10648 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 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/exit.c b/linux-0.11-lab/2/linux/kernel/exit.c new file mode 100755 index 0000000..2406ebe --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/exit.c @@ -0,0 +1,197 @@ +/* + * linux/kernel/exit.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include +#include + +#include +#include +#include +#include + +int sys_pause(void); +int sys_close(int fd); + +void release(struct task_struct * p) +{ + int i; + + if (!p) + return; + for (i=1 ; i32) + return -EINVAL; + if (priv || (current->euid==p->euid) || suser()) + p->signal |= (1<<(sig-1)); + else + return -EPERM; + return 0; +} + +static void kill_session(void) +{ + struct task_struct **p = NR_TASKS + task; + + while (--p > &FIRST_TASK) { + if (*p && (*p)->session == current->session) + (*p)->signal |= 1<<(SIGHUP-1); + } +} + +/* + * XXX need to check permissions needed to send signals to process + * groups, etc. etc. kill() permissions semantics are tricky! + */ +int sys_kill(int pid,int sig) +{ + struct task_struct **p = NR_TASKS + task; + int err, retval = 0; + + if (!pid) while (--p > &FIRST_TASK) { + if (*p && (*p)->pgrp == current->pid) + if (err=send_sig(sig,*p,1)) + retval = err; + } else if (pid>0) while (--p > &FIRST_TASK) { + if (*p && (*p)->pid == pid) + if (err=send_sig(sig,*p,0)) + retval = err; + } else if (pid == -1) while (--p > &FIRST_TASK) + if (err = send_sig(sig,*p,0)) + retval = err; + else while (--p > &FIRST_TASK) + if (*p && (*p)->pgrp == -pid) + if (err = send_sig(sig,*p,0)) + retval = err; + return retval; +} + +static void tell_father(int pid) +{ + int i; + + if (pid) + for (i=0;ipid != pid) + continue; + task[i]->signal |= (1<<(SIGCHLD-1)); + return; + } +/* if we don't find any fathers, we just release ourselves */ +/* This is not really OK. Must change it to make father 1 */ + printk("BAD BAD - no father found\n\r"); + release(current); +} + +int do_exit(long code) +{ + int i; + + free_page_tables(get_base(current->ldt[1]),get_limit(0x0f)); + free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); + for (i=0 ; ifather == current->pid) { + task[i]->father = 1; + if (task[i]->state == TASK_ZOMBIE) + /* assumption task[1] is always init */ + (void) send_sig(SIGCHLD, task[1], 1); + } + for (i=0 ; ifilp[i]) + sys_close(i); + iput(current->pwd); + current->pwd=NULL; + iput(current->root); + current->root=NULL; + iput(current->executable); + current->executable=NULL; + if (current->leader && current->tty >= 0) + tty_table[current->tty].pgrp = 0; + if (last_task_used_math == current) + last_task_used_math = NULL; + if (current->leader) + kill_session(); + current->state = TASK_ZOMBIE; + current->exit_code = code; + tell_father(current->father); + schedule(); + return (-1); /* just to suppress warnings */ +} + +int sys_exit(int error_code) +{ + return do_exit((error_code&0xff)<<8); +} + +int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options) +{ + int flag, code; + struct task_struct ** p; + + verify_area(stat_addr,4); +repeat: + flag=0; + for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) { + if (!*p || *p == current) + continue; + if ((*p)->father != current->pid) + continue; + if (pid>0) { + if ((*p)->pid != pid) + continue; + } else if (!pid) { + if ((*p)->pgrp != current->pgrp) + continue; + } else if (pid != -1) { + if ((*p)->pgrp != -pid) + continue; + } + switch ((*p)->state) { + case TASK_STOPPED: + if (!(options & WUNTRACED)) + continue; + put_fs_long(0x7f,stat_addr); + return (*p)->pid; + case TASK_ZOMBIE: + current->cutime += (*p)->utime; + current->cstime += (*p)->stime; + flag = (*p)->pid; + code = (*p)->exit_code; + release(*p); + put_fs_long(code,stat_addr); + return flag; + default: + flag=1; + continue; + } + } + if (flag) { + if (options & WNOHANG) + return 0; + current->state=TASK_INTERRUPTIBLE; + schedule(); + if (!(current->signal &= ~(1<<(SIGCHLD-1)))) + goto repeat; + else + return -EINTR; + } + return -ECHILD; +} + + diff --git a/linux-0.11-lab/2/linux/kernel/exit.o b/linux-0.11-lab/2/linux/kernel/exit.o new file mode 100755 index 0000000000000000000000000000000000000000..97c5057fd4da000378b2c23ca0dba2b274e9b855 GIT binary patch literal 11164 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 + +#include +#include +#include +#include + +extern void write_verify(unsigned long address); + +long last_pid=0; + +void verify_area(void * addr,int size) +{ + unsigned long start; + + start = (unsigned long) addr; + size += start & 0xfff; + start &= 0xfffff000; + start += get_base(current->ldt[2]); + while (size>0) { + size -= 4096; + write_verify(start); + start += 4096; + } +} + +int copy_mem(int nr,struct task_struct * p) +{ + unsigned long old_data_base,new_data_base,data_limit; + unsigned long old_code_base,new_code_base,code_limit; + + code_limit=get_limit(0x0f); + 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) + panic("We don't support separate I&D"); + if (data_limit < code_limit) + panic("Bad data_limit"); + new_data_base = new_code_base = nr * 0x4000000; + p->start_code = new_code_base; + set_base(p->ldt[1],new_code_base); + set_base(p->ldt[2],new_data_base); + if (copy_page_tables(old_data_base,new_data_base,data_limit)) { + free_page_tables(new_data_base,data_limit); + return -ENOMEM; + } + return 0; +} + +/* + * Ok, this is the main fork-routine. It copies the system process + * information (task[nr]) and sets up the necessary registers. It + * also copies the data segment in it's entirety. + */ +int copy_process(int nr,long ebp,long edi,long esi,long gs,long none, + long ebx,long ecx,long edx, + long fs,long es,long ds, + long eip,long cs,long eflags,long esp,long ss) +{ + struct task_struct *p; + int i; + struct file *f; + + p = (struct task_struct *) get_free_page(); + if (!p) + return -EAGAIN; + task[nr] = p; + __asm__ volatile ("cld"); /* by wyj */ + *p = *current; /* NOTE! this doesn't copy the supervisor stack */ + p->state = TASK_UNINTERRUPTIBLE; + p->pid = last_pid; + p->father = current->pid; + p->counter = p->priority; + p->signal = 0; + p->alarm = 0; + p->leader = 0; /* process leadership doesn't inherit */ + p->utime = p->stime = 0; + p->cutime = p->cstime = 0; + p->start_time = jiffies; + p->tss.back_link = 0; + p->tss.esp0 = PAGE_SIZE + (long) p; + p->tss.ss0 = 0x10; + p->tss.eip = eip; + p->tss.eflags = eflags; + p->tss.eax = 0; + p->tss.ecx = ecx; + p->tss.edx = edx; + p->tss.ebx = ebx; + p->tss.esp = esp; + p->tss.ebp = ebp; + p->tss.esi = esi; + p->tss.edi = edi; + p->tss.es = es & 0xffff; + p->tss.cs = cs & 0xffff; + p->tss.ss = ss & 0xffff; + p->tss.ds = ds & 0xffff; + p->tss.fs = fs & 0xffff; + p->tss.gs = gs & 0xffff; + p->tss.ldt = _LDT(nr); + p->tss.trace_bitmap = 0x80000000; + if (last_task_used_math == current) + __asm__("clts ; fnsave %0"::"m" (p->tss.i387)); + if (copy_mem(nr,p)) { + task[nr] = NULL; + free_page((long) p); + return -EAGAIN; + } + for (i=0; ifilp[i]) + f->f_count++; + if (current->pwd) + current->pwd->i_count++; + if (current->root) + current->root->i_count++; + if (current->executable) + current->executable->i_count++; + set_tss_desc(gdt+(nr<<1)+FIRST_TSS_ENTRY,&(p->tss)); + set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY,&(p->ldt)); + p->state = TASK_RUNNING; /* do this last, just in case */ + return last_pid; +} + +int find_empty_process(void) +{ + int i; + + repeat: + if ((++last_pid)<0) last_pid=1; + for(i=0 ; ipid == last_pid) goto repeat; + for(i=1 ; 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 Mi^Z-!?KYSAen*aa+ literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/math/Makefile b/linux-0.11-lab/2/linux/kernel/math/Makefile new file mode 100755 index 0000000..b35d488 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/math/Makefile @@ -0,0 +1,43 @@ +# +# Makefile for the FREAX-kernel character device drivers. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# + +AR =ar +AS =as +LD =ld +LDFLAGS =-s -x +CC =gcc -march=i386 +CFLAGS =-w -g -fstrength-reduce -fomit-frame-pointer -mcld \ + -nostdinc -fno-stack-protector -I../../include +CPP =gcc -E -nostdinc -I../../include + +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< +.s.o: + $(AS) -o $*.o $< +.c.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< + +OBJS = math_emulate.o + +math.a: $(OBJS) + $(AR) rcs math.a $(OBJS) + sync + +clean: + rm -f core *.o *.a tmp_make + for i in *.c;do rm -f `basename $$i .c`.s;done + +dep: + sed '/\#\#\# Dependencies/q' < Makefile > tmp_make + (for i in *.c;do echo -n `echo $$i | sed 's,\.c,\.s,'`" "; \ + $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + +### Dependencies: diff --git a/linux-0.11-lab/2/linux/kernel/math/math.a b/linux-0.11-lab/2/linux/kernel/math/math.a new file mode 100755 index 0000000000000000000000000000000000000000..f92fb43a9c019f8e75bf744c65f88b59c8d4ba88 GIT binary patch literal 6628 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 + +#include +#include +#include + +void math_emulate(long edi, long esi, long ebp, long sys_call_ret, + long eax,long ebx,long ecx,long edx, + unsigned short fs,unsigned short es,unsigned short ds, + unsigned long eip,unsigned short cs,unsigned long eflags, + unsigned short ss, unsigned long esp) +{ + unsigned char first, second; + +/* 0x0007 means user code space */ + if (cs != 0x000F) { + printk("math_emulate: %04x:%08x\n\r",cs,eip); + panic("Math emulation needed in kernel"); + } + first = get_fs_byte((char *)((*&eip)++)); + second = get_fs_byte((char *)((*&eip)++)); + printk("%04x:%08x %02x %02x\n\r",cs,eip-2,first,second); + current->signal |= 1<<(SIGFPE-1); +} + +void math_error(void) +{ + __asm__("fnclex"); + if (last_task_used_math) + last_task_used_math->signal |= 1<<(SIGFPE-1); +} diff --git a/linux-0.11-lab/2/linux/kernel/math/math_emulate.o b/linux-0.11-lab/2/linux/kernel/math/math_emulate.o new file mode 100755 index 0000000000000000000000000000000000000000..8a98b22720edd26bc9b196e2d1b86549665ddef0 GIT binary patch literal 6464 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 + +/* + * This isn't the library routine, it is only used in the kernel. + * as such, we don't care about years<1970 etc, but assume everything + * is ok. Similarly, TZ etc is happily ignored. We just do everything + * as easily as possible. Let's find something public for the library + * routines (although I think minix times is public). + */ +/* + * PS. I hate whoever though up the year 1970 - couldn't they have gotten + * a leap-year instead? I also hate Gregorius, pope or no. I'm grumpy. + */ +#define MINUTE 60 +#define HOUR (60*MINUTE) +#define DAY (24*HOUR) +#define YEAR (365*DAY) + +/* interestingly, we assume leap-years */ +static int month[12] = { + 0, + DAY*(31), + DAY*(31+29), + DAY*(31+29+31), + DAY*(31+29+31+30), + DAY*(31+29+31+30+31), + DAY*(31+29+31+30+31+30), + DAY*(31+29+31+30+31+30+31), + DAY*(31+29+31+30+31+30+31+31), + DAY*(31+29+31+30+31+30+31+31+30), + DAY*(31+29+31+30+31+30+31+31+30+31), + DAY*(31+29+31+30+31+30+31+31+30+31+30) +}; + +long kernel_mktime(struct tm * tm) +{ + long res; + int year; + if (tm->tm_year < 70 ) tm->tm_year += 100; /* gohigh */ + year = tm->tm_year - 70; +/* magic offsets (y+1) needed to get leapyears right.*/ + res = YEAR*year + DAY*((year+1)/4); + res += month[tm->tm_mon]; +/* and (y+2) here. If it wasn't a leap-year, we have to adjust */ + if (tm->tm_mon>1 && ((year+2)%4)) + res -= DAY; + res += DAY*(tm->tm_mday-1); + res += HOUR*tm->tm_hour; + res += MINUTE*tm->tm_min; + res += tm->tm_sec; + return res; +} diff --git a/linux-0.11-lab/2/linux/kernel/mktime.o b/linux-0.11-lab/2/linux/kernel/mktime.o new file mode 100755 index 0000000000000000000000000000000000000000..6694bf8258168567f68b2aba8bfc5ed630e30698 GIT binary patch literal 2872 zcma)8U1%It6h3!mHraGH+f8=c=BL9R=z+QC zJLlZh2X+aMEv_t>trhe7 zs=+FMvsh7H_c`1WH#v6H&lF#_7Ezv9*R)o}g{=tMS}|I;&BYZj{7N|;Z9Xl?_laJb zy7!+sbi64(04lkZ^z#JEw@~X^<|*sGoj9@%qYI3-zKwt5w^gpqUj~T!PEd383^f<8 z5*2O|-T9N6-}eamWL(gJl4$n6A(|h2E>b)kOL|%2Nt}5PFW*T8(P1??!wQYF%COpD zFue+;jqZ;aTKk|*0Ft#II4RZEhrnBa!&WCpF}4Cntxo8-0mrQn^gX~ys}K5K;2vui za3An?3&%40fm0N+LM7Luwrebj!QH%qP@{PFZ$|B0mly;xE>pPX)Jg2cF5~jqj<1=E zhY-iO?9nD!cLZXD-J@6{INm?3=}2O4-(6lqCNC^>iQTb8#EkXFxcneQzY^j ztGFErVTL1-{gDF^k>ECTk{N?AnHY_52(>Xx)Mkr=y}s?i-pK?)jrF|qcrU!#Lu7`1 zFQbQ>HnKtNU{S?{b<<`}KFMAYAtn=WkM5+&M3&Rhc76;Lt)>d3#|T{J#~|E3A@0UH zd6kzHO|T+#TCCnYx$DpU%wJs-Bbgsx@RQRvR@s?bKYSJna`l3rj$BF>73&&%scXkDpCbUrK1xQ`%?p_ zW*V;7@Q;*vxFMzC3&SJ!(8!>#<*R`SFo|;~Nt_Rh{-|ZW&eP)8K+YOAIp2v`(i|5t zd6(__LdDC?kX`p`J}+uibIP{oob|{qJbHHN9lg{A-$Y1?s@gL!-S zBN1mE^5T3tFW>nM@!sQj^Q_aP`$J4UrLA^zH?rA;v#(!9l zgBc)OgxP>F5Bw(!k}2Q7b&W~#cYaM_$_cND?5(5uI+LR7MnXh#w zG`P#%nAqCq-~V;k_#GyCi}wmH8{YxJ+xEdL7= CPoF&i literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/panic.c b/linux-0.11-lab/2/linux/kernel/panic.c new file mode 100755 index 0000000..7d8a06b --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/panic.c @@ -0,0 +1,24 @@ +/* + * linux/kernel/panic.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * This function is used through-out the kernel (includeinh mm and fs) + * to indicate a major problem. + */ +#include +#include + +void sys_sync(void); /* it's really int */ + +volatile void panic(const char * s) +{ + printk("Kernel panic: %s\n\r",s); + if (current == task[0]) + printk("In swapper task - not syncing\n\r"); + else + sys_sync(); + for(;;); +} diff --git a/linux-0.11-lab/2/linux/kernel/panic.o b/linux-0.11-lab/2/linux/kernel/panic.o new file mode 100755 index 0000000000000000000000000000000000000000..da42b57864ffc04172b2020b3f3f9096af53eb86 GIT binary patch literal 5424 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 D&gTd! literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/printk.c b/linux-0.11-lab/2/linux/kernel/printk.c new file mode 100755 index 0000000..0daa097 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/printk.c @@ -0,0 +1,41 @@ +/* + * linux/kernel/printk.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * When in kernel-mode, we cannot use printf, as fs is liable to + * point to 'interesting' things. Make a printf with fs-saving, and + * all is well. + */ +#include +#include + +#include + +static char buf[1024]; + +extern int vsprintf(char * buf, const char * fmt, va_list args); + +int printk(const char *fmt, ...) +{ + va_list args; + int i; + + va_start(args, fmt); + i=vsprintf(buf,fmt,args); + va_end(args); + __asm__("push %%fs\n\t" + "push %%ds\n\t" + "pop %%fs\n\t" + "pushl %0\n\t" + "pushl $buf\n\t" + "pushl $0\n\t" + "call tty_write\n\t" + "addl $8,%%esp\n\t" + "popl %0\n\t" + "pop %%fs" + ::"r" (i):"ax","cx","dx"); + return i; +} diff --git a/linux-0.11-lab/2/linux/kernel/printk.o b/linux-0.11-lab/2/linux/kernel/printk.o new file mode 100755 index 0000000000000000000000000000000000000000..93ce6e40ca451b8b2b024367e2fd7f575b694368 GIT binary patch literal 2424 zcma)7&2Jk;6o2DgCr+F=bwa44L}e?vC4jtkz$&FcNl74zT1BEwQKbUW+Fsk+*lV-9 zPLry@Ap#ObAoTzO!66j~E?kfhSCAS$gv5Ou_hxtEEfNw>nt8wXJ@aOE z_N^B#y(okrMS?WyOGHgQw3H>Ar3WZWSGNC{eQz;e-d)Vk>@DU?d#m}G-PL>wvi^gf zXV2gNK0G{xoZEXPpBvjhF?RP#ll3=3%l1L)`q*8>=C%)Juisi90ly z>aykdDJiyw91=P9O5ADEu%2|>07X85BF&XXc={4!l&3=tH3#1S8mjc_B(nQ}NevS+ zX2q$@L|V&CXR=~^;Mj4be2}!vx%AWNhz0-DrLfy04cA?ur zdfS82aa)dS7wSE?8aN%-hsx~~{J^TN7rI_2u&Y7GqgKal7(Lf_8m?V4_zbZkpEj(u zmg5KHJGbm$t7}uS*=gHFw^s{_9lzk(H;c&L+bopKxw%5isuWA1qPT8*uH6dra=N4a zR-2X=NkmHv3+Ig4tCgM`^uoOr9`8wM?#;QfSt>sgY6;&}NaEII61P)gdPLWE&{P9z zJ`yH*3>Pw~?ZiT+l(?8lUAUK#--hXLwF9d{rXP4AZz|;3Eiec z$O^M5i?7IF5RtO2K#teF2H_ZVT$lH!>e|3629V~E?;3-Ml+A)1&)0;&c{txNhRXLk zFvsw|nRb!ymk`RCZ9HyAT=~6`G|KE@(H-d7eQUg`kCXV589b>lVJwlj!6Ly5PP@Nmnz+;^@S&-W3E%tEI~ z@kn{1j;@ME+C(083(}ch`{!E#R3zOA&vW cIpTsy{wm_%F-Lt_7ZcwB_FIU!0iJ;T4?BzyrvLx| literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/sched.c b/linux-0.11-lab/2/linux/kernel/sched.c new file mode 100755 index 0000000..15d839b --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/sched.c @@ -0,0 +1,412 @@ +/* + * linux/kernel/sched.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * 'sched.c' is the main kernel file. It contains scheduling primitives + * (sleep_on, wakeup, schedule etc) as well as a number of simple system + * call functions (type getpid(), which just extracts a field from + * current-task + */ +#include +#include +#include +#include +#include +#include +#include + +#include + +#define _S(nr) (1<<((nr)-1)) +#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP))) + +void show_task(int nr,struct task_struct * p) +{ + int i,j = 4096-sizeof(struct task_struct); + + printk("%d: pid=%d, state=%d, ",nr,p->pid,p->state); + i=0; + while (i>2 ] ; + +struct { + long * a; + short b; + } stack_start = { & user_stack [PAGE_SIZE>>2] , 0x10 }; +/* + * 'math_state_restore()' saves the current math information in the + * old math state array, and gets the new ones from the current task + */ +void math_state_restore() +{ + if (last_task_used_math == current) + return; + __asm__("fwait"); + if (last_task_used_math) { + __asm__("fnsave %0"::"m" (last_task_used_math->tss.i387)); + } + last_task_used_math=current; + if (current->used_math) { + __asm__("frstor %0"::"m" (current->tss.i387)); + } else { + __asm__("fninit"::); + current->used_math=1; + } +} + +/* + * 'schedule()' is the scheduler function. This is GOOD CODE! There + * probably won't be any reason to change this, as it should work well + * in all circumstances (ie gives IO-bound processes good response etc). + * The one thing you might take a look at is the signal-handler code here. + * + * NOTE!! Task 0 is the 'idle' task, which gets called when no other + * tasks can run. It can not be killed, and it cannot sleep. The 'state' + * information in task[0] is never used. + */ +void schedule(void) +{ + int i,next,c; + struct task_struct ** p; + +/* check alarm, wake up any interruptible tasks that have got a signal */ + + for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) + if (*p) { + if ((*p)->alarm && (*p)->alarm < jiffies) { + (*p)->signal |= (1<<(SIGALRM-1)); + (*p)->alarm = 0; + } + if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) && + (*p)->state==TASK_INTERRUPTIBLE) + (*p)->state=TASK_RUNNING; + } + +/* this is the scheduler proper: */ + + while (1) { + c = -1; + next = 0; + i = NR_TASKS; + p = &task[NR_TASKS]; + while (--i) { + if (!*--p) + continue; + if ((*p)->state == TASK_RUNNING && (*p)->counter > c) + c = (*p)->counter, next = i; + } + if (c) break; + for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) + if (*p) + (*p)->counter = ((*p)->counter >> 1) + + (*p)->priority; + } + switch_to(next); +} + +int sys_pause(void) +{ + current->state = TASK_INTERRUPTIBLE; + schedule(); + return 0; +} + +void sleep_on(struct task_struct **p) +{ + struct task_struct *tmp; + + if (!p) + return; + if (current == &(init_task.task)) + panic("task[0] trying to sleep"); + tmp = *p; + *p = current; + current->state = TASK_UNINTERRUPTIBLE; + schedule(); + if (tmp) + tmp->state=0; +} + +void interruptible_sleep_on(struct task_struct **p) +{ + struct task_struct *tmp; + + if (!p) + return; + if (current == &(init_task.task)) + panic("task[0] trying to sleep"); + tmp=*p; + *p=current; +repeat: current->state = TASK_INTERRUPTIBLE; + schedule(); + if (*p && *p != current) { + (**p).state=0; + goto repeat; + } + *p=NULL; + if (tmp) + tmp->state=0; +} + +void wake_up(struct task_struct **p) +{ + if (p && *p) { + (**p).state=0; + *p=NULL; + } +} + +/* + * OK, here are some floppy things that shouldn't be in the kernel + * proper. They are here because the floppy needs a timer, and this + * was the easiest way of doing it. + */ +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) + panic("floppy_on: nr>3"); + moff_timer[nr]=10000; /* 100 s = very big :-) */ + cli(); /* use floppy_off to turn it off */ + 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_on(unsigned int nr) +{ + cli(); + while (ticks_to_floppy_on(nr)) + sleep_on(nr+wait_motor); + sti(); +} + +void floppy_off(unsigned int nr) +{ + moff_timer[nr]=3*HZ; +} + +void do_floppy_timer(void) +{ + int i; + unsigned char mask = 0x10; + + for (i=0 ; i<4 ; i++,mask <<= 1) { + if (!(mask & current_DOR)) + continue; + if (mon_timer[i]) { + if (!--mon_timer[i]) + wake_up(i+wait_motor); + } else if (!moff_timer[i]) { + current_DOR &= ~mask; + outb(current_DOR,FD_DOR); + } else + moff_timer[i]--; + } +} + +#define TIME_REQUESTS 64 + +static struct timer_list { + long jiffies; + void (*fn)(); + struct timer_list * next; +} timer_list[TIME_REQUESTS], * next_timer = NULL; + +void add_timer(long jiffies, void (*fn)(void)) +{ + struct timer_list * p; + + if (!fn) + return; + cli(); + if (jiffies <= 0) + (fn)(); + else { + for (p = timer_list ; p < timer_list + TIME_REQUESTS ; p++) + if (!p->fn) + break; + if (p >= timer_list + TIME_REQUESTS) + panic("No more time requests free"); + p->fn = fn; + p->jiffies = jiffies; + p->next = next_timer; + next_timer = p; + while (p->next && p->next->jiffies < p->jiffies) { + p->jiffies -= p->next->jiffies; + fn = p->fn; + p->fn = p->next->fn; + p->next->fn = fn; + jiffies = p->jiffies; + p->jiffies = p->next->jiffies; + p->next->jiffies = jiffies; + p = p->next; + } + } + sti(); +} + +void do_timer(long cpl) +{ + extern int beepcount; + extern void sysbeepstop(void); + + if (beepcount) + if (!--beepcount) + sysbeepstop(); + + if (cpl) + current->utime++; + else + current->stime++; + + if (next_timer) { + next_timer->jiffies--; + while (next_timer && next_timer->jiffies <= 0) { + void (*fn)(void); + + fn = next_timer->fn; + next_timer->fn = NULL; + next_timer = next_timer->next; + (fn)(); + } + } + if (current_DOR & 0xf0) + do_floppy_timer(); + if ((--current->counter)>0) return; + current->counter=0; + if (!cpl) return; + schedule(); +} + +int sys_alarm(long seconds) +{ + int old = current->alarm; + + if (old) + old = (old - jiffies) / HZ; + current->alarm = (seconds>0)?(jiffies+HZ*seconds):0; + return (old); +} + +int sys_getpid(void) +{ + return current->pid; +} + +int sys_getppid(void) +{ + return current->father; +} + +int sys_getuid(void) +{ + return current->uid; +} + +int sys_geteuid(void) +{ + return current->euid; +} + +int sys_getgid(void) +{ + return current->gid; +} + +int sys_getegid(void) +{ + return current->egid; +} + +int sys_nice(long increment) +{ + if (current->priority-increment>0) + current->priority -= increment; + return 0; +} + +void sched_init(void) +{ + int i; + struct desc_struct * p; + + if (sizeof(struct sigaction) != 16) + panic("Struct sigaction MUST be 16 bytes"); + set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); + set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt)); + p = gdt+2+FIRST_TSS_ENTRY; + for(i=1;ia=p->b=0; + p++; + p->a=p->b=0; + p++; + } +/* Clear NT, so that we won't have troubles with that later on */ + __asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl"); + ltr(0); + lldt(0); + outb_p(0x36,0x43); /* binary, mode 3, LSB/MSB, ch 0 */ + outb_p(LATCH & 0xff , 0x40); /* LSB */ + outb(LATCH >> 8 , 0x40); /* MSB */ + set_intr_gate(0x20,&timer_interrupt); + outb(inb_p(0x21)&~0x01,0x21); + set_system_gate(0x80,&system_call); +} diff --git a/linux-0.11-lab/2/linux/kernel/sched.o b/linux-0.11-lab/2/linux/kernel/sched.o new file mode 100755 index 0000000000000000000000000000000000000000..8907e54fae556c36d88e61cb2d6e7dbb043a4216 GIT binary patch literal 22732 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 U-~)n>3HAxTA^3?P_htI|KkS5JegFUf literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/signal.c b/linux-0.11-lab/2/linux/kernel/signal.c new file mode 100755 index 0000000..8d5a65f --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/signal.c @@ -0,0 +1,129 @@ +/* + * linux/kernel/signal.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#include +#include +#include +#include + +volatile void do_exit(int error_code); + +int sys_sgetmask() +{ + return current->blocked; +} + +int sys_ssetmask(int newmask) +{ + int old=current->blocked; + + current->blocked = newmask & ~(1<<(SIGKILL-1)); + return old; +} + +int sys_sigpending() +{ + return -ENOSYS; +} + +int sys_sigsuspend() +{ + return -ENOSYS; +} + +static inline void save_old(char * from,char * to) +{ + int i; + + verify_area(to, sizeof(struct sigaction)); + for (i=0 ; i< sizeof(struct sigaction) ; i++) { + put_fs_byte(*from,to); + from++; + to++; + } +} + +static inline void get_new(char * from,char * to) +{ + int i; + + for (i=0 ; i< sizeof(struct sigaction) ; i++) + *(to++) = get_fs_byte(from++); +} + +int sys_signal(int signum, long handler, long restorer) +{ + struct sigaction tmp; + + if (signum<1 || signum>32 || signum==SIGKILL) + return -1; + tmp.sa_handler = (void (*)(int)) handler; + tmp.sa_mask = 0; + tmp.sa_flags = SA_ONESHOT | SA_NOMASK; + tmp.sa_restorer = (void (*)(void)) restorer; + handler = (long) current->sigaction[signum-1].sa_handler; + current->sigaction[signum-1] = tmp; + return handler; +} + +int sys_sigaction(int signum, const struct sigaction * action, + struct sigaction * oldaction) +{ + struct sigaction tmp; + + if (signum<1 || signum>32 || signum==SIGKILL) + return -1; + tmp = current->sigaction[signum-1]; + get_new((char *) action, + (char *) (signum-1+current->sigaction)); + if (oldaction) + save_old((char *) &tmp,(char *) oldaction); + if (current->sigaction[signum-1].sa_flags & SA_NOMASK) + current->sigaction[signum-1].sa_mask = 0; + else + current->sigaction[signum-1].sa_mask |= (1<<(signum-1)); + return 0; +} + +void do_signal(long signr,long eax, long ebx, long ecx, long edx, + long fs, long es, long ds, + long eip, long cs, long eflags, + unsigned long * esp, long ss) +{ + unsigned long sa_handler; + long old_eip=eip; + struct sigaction * sa = current->sigaction + signr - 1; + int longs; + unsigned long * tmp_esp; + + sa_handler = (unsigned long) sa->sa_handler; + if (sa_handler==1) + return; + if (!sa_handler) { + if (signr==SIGCHLD) + return; + else + do_exit(1<<(signr-1)); + } + if (sa->sa_flags & SA_ONESHOT) + sa->sa_handler = NULL; + *(&eip) = sa_handler; + longs = (sa->sa_flags & SA_NOMASK)?7:8; + *(&esp) -= longs; + verify_area(esp,longs*4); + tmp_esp=esp; + put_fs_long((long) sa->sa_restorer,tmp_esp++); + put_fs_long(signr,tmp_esp++); + if (!(sa->sa_flags & SA_NOMASK)) + put_fs_long(current->blocked,tmp_esp++); + put_fs_long(eax,tmp_esp++); + put_fs_long(ecx,tmp_esp++); + put_fs_long(edx,tmp_esp++); + put_fs_long(eflags,tmp_esp++); + put_fs_long(old_eip,tmp_esp++); + current->blocked |= sa->sa_mask; +} diff --git a/linux-0.11-lab/2/linux/kernel/signal.o b/linux-0.11-lab/2/linux/kernel/signal.o new file mode 100755 index 0000000000000000000000000000000000000000..1970f39f72c6b0c63a277c6955a88089975ca4d3 GIT binary patch literal 8960 zcma)BdyrJsoj&(5GktrSre}H>85y;a7A88=(+s1qI>-zlI)I3P5rok6}?%E$_PW(gdc<=Pa+L;dcGo*MwJhd$xISH-oey#y$h?0Vo1=KUF*4v32^+FCs$VkG1>4A@OBDA#{HW!K$_#VZ-m=1&1&~ zFmtv7^Z<@R+|$_g(CX#K-ZHh5Qv%YkTM$<|`O4(mN9aHK`sBY(9y|LiqoO`rx5u0u zLd+rRD+_(cHM}Q?n?WS{sgzjvV`)sr{n% ziaB*D#xlD4=NdHoes${fcA<9IRn;6-cxu?A(y7jCG@J* zruGC1sC~r{;$4mzu9~9}dJh& z%~yn}xBNAQnx_pdG~W)oIkXjFOs)BDNLtJX!FYZL@+HGu_h*P>&7i}28VTzPD9qcX zgEhcLHjwsMTPWX1+Go8)`KGpJAp+i~NZ&zuK=+o&+?fE=p?epQ*~~7?*1bQhGu^tE zd$Xen>8**qEsIW~JUbMzgInTcvw#29V4xy7y6rmdtA1do=@WV>)Yf zZ;I)BiOhQ4dx$=g*`#|<)S1n?_rDoHYPRX#gLTag-MgOwwzJWc-dd^b5$28rn2hfI zQ)=SW2cfX1-@93BbkHX%^hMt4_j9Wo?gnkU(OPap)Er9j6kT=OBh4m8%nqsup zt!A{{w1dr=mPvV>w8wgx@siK0eG^Z=bvasZN^{k~Yi3Z$>K zJ|tZveVuhVt z{QF1;jC7$O%n0cY(2)0&o^3sX_-2&hyM>P;P8T^jfYZg}H=u!0JLA^G`^3Kt3SM>q*ZxlBGq$yn%GLVKea| z(jn`ov|ma(Y}oPL!n~1mk6|ZWy4SE%E*&-Ogi8+^b{TP&(S8Z!pod8hL7o-n2J5ODX= z4t< zp;|qnR50S5Q0SvnFyeiTxcY07QxVs?5nIej$UDfkn0(H8o^5UW27J!Q@K0Mv_*I6G zuQ`P8D3_VtiPhsW-JM+H`gW%t zp-wC}mkGCX$-7(+LclQQ%(321EJi)%ctyLpv+D8%gt~S2l1n(cOt2gmdeSLJN`7_e zse~;4w(e_LINOPs6PNunnltzFwIsAQ?J9q;)$q^pw`uLoflFW*)C_-X>-DWSv}!?Y zwljp`Au}3W(h9$@Xl=a_4tN6_`!nW>(O^I9{j;g&bJI^lb8bTfL3d7jp#u&*bAMRoBClsJT*So@NqL9TJ!4WCvUx#tfPKg2_N6OOH!5Q*Q?c9t>)R{IlE?e zU3OTX*YUweRnJn-3D48|NN~&E8*857!__U->Rq0R7Y?%(t@%U7t>9s7=A)U-8lHan zWOD}149^Kia8{oe^c;5o=~o7I6IIU@@_2uujxlt-Xy;Se{Fo?L;-yLq&*V;7k?Oce z+2tf8rE0PwU=>TnD{)bd$I`ht{41q+(vBsvmGO8{WMg>@)Xp-9cqKb-i>iELBU$J+ z6i-&Ng}kVa$IClKI$p`xB~dNgsn|GZar3%6LMuXpktLDAP~UjGl*}y6E?ROO=wvPx z>KhC7r3>TPN?*DZAGiC81$=$kB?z-@*X~PK^D=xHqI{uGcB8LYDpc%brBFgvW!v5f z7%x=u*@noADa-D)+3$)iSdtLG=+ZDr*-#d+~O3{ z=~zXm4%)lzWVI4c_LZ+YE<-R3gdQvzM87^7s`FereCh6zG!6O!oFNQ z(I0gL{X6Ya-ps*3STmkQ&~_?B(V z0}N~?o=@eVN#+V=J66cYSPo(D&Za`95v6&)iS5LNS0+;;U_VkN?{th z1CY$bkvi+o&Sf!#$T!CKW;#~Hu^pnK7(<>ILs@3bdn^=6P+hf?h~ikOC~Wph##0Gk zUlKWNNrvKGo&2v~V&p1W0s1T=h zIX;1s<2YBrNYuL@kGW%lsOLvcg(x$u%n+TBZDwP;;@OHQ6$%xchF7e(KGbtZ0^zI9 z>g*e+N^aqo7Y;_EgI{o@*ls(x=i<`#ZV=ji9&L`#H1}ak#;ZcU8K~n~Sd92RHGS>0 zA1?{|EKzdWi4}g&CMW_R*W;d#n=Z`AxpbPU3dYr%ui*{M~!~o)Kgoh3-FbyT?!JAJIqrzONc1 z{y@!K;ScG1{Q;QzMqY)>YsiT{VbsGtU|#GK#UIx%bYe|5!^b@}BEMnd9gU^K7kYWm zIQAJ}rQ~47rAl@#Qn7beL`3e{kp#|g5eidwqB@45PZyw)bUcwLVM#Y=fV`pM=n`V;#zv~K^p_}z_83f&Ua-fda9NaiI z*RMA&6XG#&?YL>fy5KM<|GG>bZ+Ch9r7W0Y0B*c%K-2#JvSU834@kjyKWs?E)p3j) z#3FOK5FywyKO8CR`3-}1eL#vN7RE0d1TMMZb9Rvc;?Y4}uH8EDjqUEc(wXmUm;H0= zVuN;lK#FyU$2IC+E*XcQG2Wje9^){c7q=Vl9?1;E6P>VA zHU!u1VMV*Dt6|r8(T>+Qag&y3HDE97imnp8o5GWz8~gDz`mqBt_G2b)w;xEmJ_kUG zL--1LhJ?D@(2Z?UwF49KD1`VJkTDq#C6#Tua|)~oVV=H7LS1e=mv^yIZi)}ixpLx# zzr2xeY=OKf$A-4tXLVGF9+cz5q5|0D43MgQ|}^2S3!<2met1E2eT zuAdip1b5%N?$JfQjNRjuIy=-4>CTzmJX`d$F%hXxDEx`S*A=$wjy|ezjl#_epHX-gsAG+6$5dt9qd>;p zj)g)@DU^Rv!WTBjS;K_odL;4}3L?KQHN=`roZ-x2%14!cy}~;cZdaI7SXRih0{!GZ z1AI*JPbqv(;ZGGFQ}}lZ|4HF#g=ZCFYRI_!ZHMs}C>&9^PT^LC8HEojd{p6c3SU$> zt?;D6-za=f;l~P1)*J1%DZEDEO$s+Cj48}1d|u&;3SUw9_X^)scv|6y3O`fm<#?jq zPK8%0j40%fBh;@_xIrQ31LgdUj5wk2L4{va_-%#XSNLOvFDv||!q*kPr|`cNYMft) zKSN=cLjJZx`D%sFD|}7iDTTjP__0F#;Ya!{Q}~I(CQM+)yG7v!B5D*@{38kvDEae> z|0{(rEBU`D{sV=dDtR-uTE-6$5%&tk4=G%wjHA|jtPir=DeOyQFXzfFYQ^NJs^oOoLmW)(i9@NtFTQHU}K v4X+dKxs3CDg(090en=tT2jnvfdF~+pgu)*vd`aQ26@H|!2kVLU+Z6r}gG3co literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/sys.c b/linux-0.11-lab/2/linux/kernel/sys.c new file mode 100755 index 0000000..695f287 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/sys.c @@ -0,0 +1,292 @@ +/* + * linux/kernel/sys.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#include +#include +#include +#include +#include +#include + +int sys_ftime() +{ + return -ENOSYS; +} + +int sys_break() +{ + return -ENOSYS; +} + +int sys_ptrace() +{ + return -ENOSYS; +} + +int sys_stty() +{ + return -ENOSYS; +} + +int sys_gtty() +{ + return -ENOSYS; +} + +int sys_rename() +{ + return -ENOSYS; +} + +int sys_prof() +{ + return -ENOSYS; +} + +int sys_setregid(int rgid, int egid) +{ + if (rgid>0) { + if ((current->gid == rgid) || + suser()) + current->gid = rgid; + else + return(-EPERM); + } + if (egid>0) { + if ((current->gid == egid) || + (current->egid == egid) || + suser()) { + current->egid = egid; + current->sgid = egid; + } else + return(-EPERM); + } + return 0; +} + +int sys_setgid(int gid) +{ +/* return(sys_setregid(gid, gid)); */ + if (suser()) + current->gid = current->egid = current->sgid = gid; + else if ((gid == current->gid) || (gid == current->sgid)) + current->egid = gid; + else + return -EPERM; + return 0; +} + +int sys_acct() +{ + return -ENOSYS; +} + +int sys_phys() +{ + return -ENOSYS; +} + +int sys_lock() +{ + return -ENOSYS; +} + +int sys_mpx() +{ + return -ENOSYS; +} + +int sys_ulimit() +{ + return -ENOSYS; +} + +int sys_time(long * tloc) +{ + int i; + + i = CURRENT_TIME; + if (tloc) { + verify_area(tloc,4); + put_fs_long(i,(unsigned long *)tloc); + } + return i; +} + +/* + * Unprivileged users may change the real user id to the effective uid + * or vice versa. + */ +int sys_setreuid(int ruid, int euid) +{ + int old_ruid = current->uid; + + if (ruid>0) { + if ((current->euid==ruid) || + (old_ruid == ruid) || + suser()) + current->uid = ruid; + else + return(-EPERM); + } + if (euid>0) { + if ((old_ruid == euid) || + (current->euid == euid) || + suser()) { + current->euid = euid; + current->suid = euid; + } else { + current->uid = old_ruid; + return(-EPERM); + } + } + return 0; +} + +int sys_setuid(int uid) +{ +/* return(sys_setreuid(uid, uid)); */ + if (suser()) + current->uid = current->euid = current->suid = uid; + else if ((uid == current->uid) || (uid == current->suid)) + current->euid = uid; + else + return -EPERM; + return(0); +} + +int sys_stime(long * tptr) +{ + if (!suser()) + return -EPERM; + startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ; + return 0; +} + +int sys_times(struct tms * tbuf) +{ + if (tbuf) { + verify_area(tbuf,sizeof *tbuf); + put_fs_long(current->utime,(unsigned long *)&tbuf->tms_utime); + put_fs_long(current->stime,(unsigned long *)&tbuf->tms_stime); + put_fs_long(current->cutime,(unsigned long *)&tbuf->tms_cutime); + put_fs_long(current->cstime,(unsigned long *)&tbuf->tms_cstime); + } + return jiffies; +} + +int sys_brk(unsigned long end_data_seg) +{ + if (end_data_seg >= current->end_code && + end_data_seg < current->start_stack - 16384) + current->brk = end_data_seg; + return current->brk; +} + +/* + * This needs some heave checking ... + * I just haven't get the stomach for it. I also don't fully + * understand sessions/pgrp etc. Let somebody who does explain it. + */ +int sys_setpgid(int pid, int pgid) +{ + int i; + + if (!pid) + pid = current->pid; + if (!pgid) + pgid = current->pid; + for (i=0 ; ipid==pid) { + if (task[i]->leader) + return -EPERM; + if (task[i]->session != current->session) + return -EPERM; + task[i]->pgrp = pgid; + return 0; + } + return -ESRCH; +} + +int sys_getpgrp(void) +{ + return current->pgrp; +} + +int sys_setsid(void) +{ + if (current->leader && !suser()) + return -EPERM; + current->leader = 1; + current->session = current->pgrp = current->pid; + current->tty = -1; + return current->pgrp; +} + +int sys_getgroups() +{ + return -ENOSYS; +} + +int sys_setgroups() +{ + return -ENOSYS; +} + +int sys_uname(struct utsname * name) +{ + static struct utsname thisname = { + "linux .0","nodename","release ","version ","machine " + }; + int i; + + if (!name) return -ERROR; + verify_area(name,sizeof *name); + for(i=0;iumask; + + current->umask = mask & 0777; + return (old); +} diff --git a/linux-0.11-lab/2/linux/kernel/sys.o b/linux-0.11-lab/2/linux/kernel/sys.o new file mode 100755 index 0000000000000000000000000000000000000000..a691166c6ad2230733c9baaa0609d3b8fe779594 GIT binary patch literal 13088 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 M35GC+)VB!!4-!@J2mk;8 literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/system_call.o b/linux-0.11-lab/2/linux/kernel/system_call.o new file mode 100755 index 0000000000000000000000000000000000000000..ddce0649262248d052f5c003cc697385b7d0d869 GIT binary patch literal 2520 zcma);U1%It6vxlzt5st*N@_%FyJCv5#+YcU6+wvEqzNo^(C8hE#)L@xkZzL2X~8v@an@S&Rx&BsEWdJp{#SsXi)OAGkh-}qT;9JQX7e?%TKm*uNczHFZD&j#eUX- z-eP1q*|~hG8>|2R#l2sJKm1H|g)d%yBiT7J^%Jj{Og?k`MEJ~(y{N-mHooev`{hb? z)m?Y1S>L}#gge5K>bW*l5q_OhPtP24mr$O6ZhhO_j$8Km$koVlv@cTLYK^;d${)8~ z+lL&Lx1xQ!8(r&q#T{L&mb$`cXO2z#BR%W!siRz6uyiCoeVwk;@aEDkKA*+SV*47K zs}X0Dw|(Mxa%20sk>To+Ti{}~*uKj1oGXo4Ty%1S2JMBMP-mgSs%yq~mSzkJtt4nL ztqPR}XKkBv{NJ`0f&2`0coX>9`9ylC_^7$vjq4`Y)o(+9v#>mm!#Qpzu6-W2Lb?4Z zGTofcfoW0^;UE4 zf$8xP;}Q5fCB6@Sx5W3uMnH zzs}q^_nMOjH(SkF0Lb}Y1Izi}1k3r~0ngy7x0>^wZ(R-1MQC$=h%SLA8ZjZd0`H$^ zH~xCxf)98P1M?5ypS^hI-{AYCadc5k;#=WQNxTRClElOC7o>dS;EKdaFP6Lb+|&RU z0$d94%K=^r@Y?}?H^3JHycXc~0Dm6ftpNWL;9moLOXFFn?{`;#DKU9i8J&nlX>24( zV^8B6#T8A`c!I_f6vcfqPNR_V*vR1o9f?K95^*eA+-TY)-Z3Sam}^X|u63TbLFG^Oj;S*h0%GDb+A+ znpM->;SwP#mC@2gLxUBHZkf5}pfrtmhHhGOB(gcpQnFm6RV)a1Kr3mfd5tn@sb4qD zLSaGbD5w_J*9@sEt<7gsnvyq#qRy*XL!Ct(DYIaiDb2P`OTii@w&$1Vm#yIY!jVPG z((-}??>%iQ-cjXLk@04_);(DNJg7dJD;j*-FJyH+tJyr+-4`2gGkP|kRK}y literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/kernel/system_call.s b/linux-0.11-lab/2/linux/kernel/system_call.s new file mode 100755 index 0000000..b7987f0 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/system_call.s @@ -0,0 +1,285 @@ +/* + * linux/kernel/system_call.s + * + * (C) 1991 Linus Torvalds + */ + +/* + * system_call.s contains the system-call low-level handling routines. + * This also contains the timer-interrupt handler, as some of the code is + * the same. The hd- and flopppy-interrupts are also here. + * + * NOTE: This code handles signal-recognition, which happens every time + * after a timer-interrupt and after each system call. Ordinary interrupts + * don't handle signal-recognition, as that would clutter them up totally + * unnecessarily. + * + * Stack layout in 'ret_from_system_call': + * + * 0(%esp) - %eax + * 4(%esp) - %ebx + * 8(%esp) - %ecx + * C(%esp) - %edx + * 10(%esp) - %fs + * 14(%esp) - %es + * 18(%esp) - %ds + * 1C(%esp) - %eip + * 20(%esp) - %cs + * 24(%esp) - %eflags + * 28(%esp) - %oldesp + * 2C(%esp) - %oldss + */ + +SIG_CHLD = 17 + +EAX = 0x00 +EBX = 0x04 +ECX = 0x08 +EDX = 0x0C +FS = 0x10 +ES = 0x14 +DS = 0x18 +EIP = 0x1C +CS = 0x20 +EFLAGS = 0x24 +OLDESP = 0x28 +OLDSS = 0x2C + +state = 0 # these are offsets into the task-struct. +counter = 4 +priority = 8 +signal = 12 +sigaction = 16 # MUST be 16 (=len of sigaction) +blocked = (33*16) + +# offsets within sigaction +sa_handler = 0 +sa_mask = 4 +sa_flags = 8 +sa_restorer = 12 + +nr_system_calls = 86 /* 72 */ + +/* + * Ok, I get parallel printer interrupts while using the floppy for some + * strange reason. Urgel. Now I just ignore them. + */ +.globl system_call,sys_fork,timer_interrupt,sys_execve +.globl hd_interrupt,floppy_interrupt,parallel_interrupt +.globl device_not_available, coprocessor_error + +.align 4 +bad_sys_call: + movl $-1,%eax + iret +.align 4 +reschedule: + pushl $ret_from_sys_call + jmp schedule +.align 4 +system_call: + cmpl $nr_system_calls-1,%eax + ja bad_sys_call + push %ds + push %es + push %fs + pushl %edx + pushl %ecx # push %ebx,%ecx,%edx as parameters + pushl %ebx # to the system call + movl $0x10,%edx # set up ds,es to kernel space + mov %dx,%ds + mov %dx,%es + movl $0x17,%edx # fs points to local data space + mov %dx,%fs + call sys_call_table(,%eax,4) + pushl %eax + movl current,%eax + cmpl $0,state(%eax) # state + jne reschedule + cmpl $0,counter(%eax) # counter + je reschedule +ret_from_sys_call: + movl current,%eax # task[0] cannot have signals + cmpl task,%eax + je 3f + cmpw $0x0f,CS(%esp) # was old code segment supervisor ? + jne 3f + cmpw $0x17,OLDSS(%esp) # was stack segment = 0x17 ? + jne 3f + movl signal(%eax),%ebx + movl blocked(%eax),%ecx + notl %ecx + andl %ebx,%ecx + bsfl %ecx,%ecx + je 3f + btrl %ecx,%ebx + movl %ebx,signal(%eax) + incl %ecx + pushl %ecx + call do_signal + popl %eax +3: popl %eax + popl %ebx + popl %ecx + popl %edx + pop %fs + pop %es + pop %ds + iret + +.align 4 +coprocessor_error: + push %ds + push %es + push %fs + pushl %edx + pushl %ecx + pushl %ebx + pushl %eax + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + movl $0x17,%eax + mov %ax,%fs + pushl $ret_from_sys_call + jmp math_error + +.align 2 +device_not_available: + push %ds + push %es + push %fs + pushl %edx + pushl %ecx + pushl %ebx + pushl %eax + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + movl $0x17,%eax + mov %ax,%fs + pushl $ret_from_sys_call + clts # clear TS so that we can use math + movl %cr0,%eax + testl $0x4,%eax # EM (math emulation bit) + je math_state_restore + pushl %ebp + pushl %esi + pushl %edi + call math_emulate + popl %edi + popl %esi + popl %ebp + ret + +.align 4 +timer_interrupt: + push %ds # save ds,es and put kernel data space + push %es # into them. %fs is used by _system_call + push %fs + pushl %edx # we save %eax,%ecx,%edx as gcc doesn't + pushl %ecx # save those across function calls. %ebx + pushl %ebx # is saved as we use that in ret_sys_call + pushl %eax + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + movl $0x17,%eax + mov %ax,%fs + incl jiffies + movb $0x20,%al # EOI to interrupt controller #1 + outb %al,$0x20 + movl CS(%esp),%eax + andl $3,%eax # %eax is CPL (0 or 3, 0=supervisor) + pushl %eax + call do_timer # 'do_timer(long CPL)' does everything from + addl $4,%esp # task switching to accounting ... + jmp ret_from_sys_call + +.align 4 +sys_execve: + lea EIP(%esp),%eax + pushl %eax + call do_execve + addl $4,%esp + ret + +.align 4 +sys_fork: + call find_empty_process + testl %eax,%eax + js 1f + push %gs + pushl %esi + pushl %edi + pushl %ebp + pushl %eax + call copy_process + addl $20,%esp +1: ret + +hd_interrupt: + pushl %eax + pushl %ecx + pushl %edx + push %ds + push %es + push %fs + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + movl $0x17,%eax + mov %ax,%fs + movb $0x20,%al + outb %al,$0xA0 # EOI to interrupt controller #1 + jmp 1f # give port chance to breathe +1: jmp 1f +1: xorl %edx,%edx + xchgl do_hd,%edx + testl %edx,%edx + jne 1f + movl $unexpected_hd_interrupt,%edx +1: outb %al,$0x20 + call *%edx # "interesting" way of handling intr. + pop %fs + pop %es + pop %ds + popl %edx + popl %ecx + popl %eax + iret + +floppy_interrupt: + pushl %eax + pushl %ecx + pushl %edx + push %ds + push %es + push %fs + movl $0x10,%eax + mov %ax,%ds + mov %ax,%es + movl $0x17,%eax + mov %ax,%fs + movb $0x20,%al + outb %al,$0x20 # EOI to interrupt controller #1 + xorl %eax,%eax + xchgl do_floppy,%eax + testl %eax,%eax + jne 1f + movl $unexpected_floppy_interrupt,%eax +1: call *%eax # "interesting" way of handling intr. + pop %fs + pop %es + pop %ds + popl %edx + popl %ecx + popl %eax + iret + +parallel_interrupt: + pushl %eax + movb $0x20,%al + outb %al,$0x20 + popl %eax + iret diff --git a/linux-0.11-lab/2/linux/kernel/traps.c b/linux-0.11-lab/2/linux/kernel/traps.c new file mode 100755 index 0000000..f9bd8f1 --- /dev/null +++ b/linux-0.11-lab/2/linux/kernel/traps.c @@ -0,0 +1,208 @@ +/* + * linux/kernel/traps.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * 'Traps.c' handles hardware traps and faults after we have saved some + * state in 'asm.s'. Currently mostly a debugging-aid, will be extended + * to mainly kill the offending process (probably by giving it a signal, + * but possibly by killing it outright if necessary). + */ +#include + +#include +#include +#include +#include +#include +#include + +#define get_seg_byte(seg,addr) ({ \ +register char __res; \ +__asm__("push %%fs;mov %%ax,%%fs;movb %%fs:%2,%%al;pop %%fs" \ + :"=a" (__res):"0" (seg),"m" (*(addr))); \ +__res;}) + +#define get_seg_long(seg,addr) ({ \ +register unsigned long __res; \ +__asm__("push %%fs;mov %%ax,%%fs;movl %%fs:%2,%%eax;pop %%fs" \ + :"=a" (__res):"0" (seg),"m" (*(addr))); \ +__res;}) + +#define _fs() ({ \ +register unsigned short __res; \ +__asm__("mov %%fs,%%ax":"=a" (__res):); \ +__res;}) + +int do_exit(long code); + +void page_exception(void); + +void divide_error(void); +void debug(void); +void nmi(void); +void int3(void); +void overflow(void); +void bounds(void); +void invalid_op(void); +void device_not_available(void); +void double_fault(void); +void coprocessor_segment_overrun(void); +void invalid_TSS(void); +void segment_not_present(void); +void stack_segment(void); +void general_protection(void); +void page_fault(void); +void coprocessor_error(void); +void reserved(void); +void parallel_interrupt(void); +void irq13(void); + +static void die(char * str,long esp_ptr,long nr) +{ + long * esp = (long *) esp_ptr; + int i; + + printk("%s: %04x\n\r",str,nr&0xffff); + printk("EIP:\t%04x:%p\nEFLAGS:\t%p\nESP:\t%04x:%p\n", + esp[1],esp[0],esp[2],esp[4],esp[3]); + printk("fs: %04x\n",_fs()); + printk("base: %p, limit: %p\n",get_base(current->ldt[1]),get_limit(0x17)); + if (esp[4] == 0x17) { + printk("Stack: "); + for (i=0;i<4;i++) + printk("%p ",get_seg_long(0x17,i+(long *)esp[3])); + printk("\n"); + } + str(i); + printk("Pid: %d, process nr: %d\n\r",current->pid,0xffff & i); + for(i=0;i<10;i++) + printk("%02x ",0xff & get_seg_byte(esp[1],(i+(char *)esp[0]))); + printk("\n\r"); + do_exit(11); /* play segment exception */ +} + +void do_double_fault(long esp, long error_code) +{ + die("double fault",esp,error_code); +} + +void do_general_protection(long esp, long error_code) +{ + die("general protection",esp,error_code); +} + +void do_divide_error(long esp, long error_code) +{ + die("divide error",esp,error_code); +} + +void do_int3(long * esp, long error_code, + long fs,long es,long ds, + long ebp,long esi,long edi, + long edx,long ecx,long ebx,long eax) +{ + int tr; + + __asm__("str %%ax":"=a" (tr):"0" (0)); + printk("eax\t\tebx\t\tecx\t\tedx\n\r%8x\t%8x\t%8x\t%8x\n\r", + eax,ebx,ecx,edx); + printk("esi\t\tedi\t\tebp\t\tesp\n\r%8x\t%8x\t%8x\t%8x\n\r", + esi,edi,ebp,(long) esp); + printk("\n\rds\tes\tfs\ttr\n\r%4x\t%4x\t%4x\t%4x\n\r", + ds,es,fs,tr); + printk("EIP: %8x CS: %4x EFLAGS: %8x\n\r",esp[0],esp[1],esp[2]); +} + +void do_nmi(long esp, long error_code) +{ + die("nmi",esp,error_code); +} + +void do_debug(long esp, long error_code) +{ + die("debug",esp,error_code); +} + +void do_overflow(long esp, long error_code) +{ + die("overflow",esp,error_code); +} + +void do_bounds(long esp, long error_code) +{ + die("bounds",esp,error_code); +} + +void do_invalid_op(long esp, long error_code) +{ + die("invalid operand",esp,error_code); +} + +void do_device_not_available(long esp, long error_code) +{ + die("device not available",esp,error_code); +} + +void do_coprocessor_segment_overrun(long esp, long error_code) +{ + die("coprocessor segment overrun",esp,error_code); +} + +void do_invalid_TSS(long esp,long error_code) +{ + die("invalid TSS",esp,error_code); +} + +void do_segment_not_present(long esp,long error_code) +{ + die("segment not present",esp,error_code); +} + +void do_stack_segment(long esp,long error_code) +{ + die("stack segment",esp,error_code); +} + +void do_coprocessor_error(long esp, long error_code) +{ + if (last_task_used_math != current) + return; + die("coprocessor error",esp,error_code); +} + +void do_reserved(long esp, long error_code) +{ + die("reserved (15,17-47) error",esp,error_code); +} + +void trap_init(void) +{ + int i; + + set_trap_gate(0,÷_error); + set_trap_gate(1,&debug); + set_trap_gate(2,&nmi); + set_system_gate(3,&int3); /* int3-5 can be called from all */ + set_system_gate(4,&overflow); + set_system_gate(5,&bounds); + set_trap_gate(6,&invalid_op); + set_trap_gate(7,&device_not_available); + set_trap_gate(8,&double_fault); + set_trap_gate(9,&coprocessor_segment_overrun); + set_trap_gate(10,&invalid_TSS); + set_trap_gate(11,&segment_not_present); + set_trap_gate(12,&stack_segment); + set_trap_gate(13,&general_protection); + set_trap_gate(14,&page_fault); + set_trap_gate(15,&reserved); + set_trap_gate(16,&coprocessor_error); + for (i=17;i<48;i++) + set_trap_gate(i,&reserved); + set_trap_gate(45,&irq13); + outb_p(inb_p(0x21)&0xfb,0x21); + outb(inb_p(0xA1)&0xdf,0xA1); + set_trap_gate(39,¶llel_interrupt); +} diff --git a/linux-0.11-lab/2/linux/kernel/traps.o b/linux-0.11-lab/2/linux/kernel/traps.o new file mode 100755 index 0000000000000000000000000000000000000000..51de46fe88ac98ea479385c2c283bf030d1f46cd GIT binary patch literal 12972 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 +#include + +/* we use this so that we can do without the ctype library */ +#define is_digit(c) ((c) >= '0' && (c) <= '9') + +static int skip_atoi(const char **s) +{ + int i=0; + + while (is_digit(**s)) + i = i*10 + *((*s)++) - '0'; + return i; +} + +#define ZEROPAD 1 /* pad with zero */ +#define SIGN 2 /* unsigned/signed long */ +#define PLUS 4 /* show plus */ +#define SPACE 8 /* space if plus */ +#define LEFT 16 /* left justified */ +#define SPECIAL 32 /* 0x */ +#define SMALL 64 /* use 'abcdef' instead of 'ABCDEF' */ + +#define do_div(n,base) ({ \ +int __res; \ +__asm__("divl %4":"=a" (n),"=d" (__res):"0" (n),"1" (0),"r" (base)); \ +__res; }) + +static char * number(char * str, int num, int base, int size, int precision + ,int type) +{ + char c,sign,tmp[36]; + const char *digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int i; + + if (type&SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz"; + if (type&LEFT) type &= ~ZEROPAD; + if (base<2 || base>36) + return 0; + c = (type & ZEROPAD) ? '0' : ' ' ; + if (type&SIGN && num<0) { + sign='-'; + num = -num; + } else + sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0); + if (sign) size--; + if (type&SPECIAL) + if (base==16) size -= 2; + else if (base==8) size--; + i=0; + if (num==0) + tmp[i++]='0'; + else while (num!=0) + tmp[i++]=digits[do_div(num,base)]; + if (i>precision) precision=i; + size -= precision; + if (!(type&(ZEROPAD+LEFT))) + while(size-->0) + *str++ = ' '; + if (sign) + *str++ = sign; + if (type&SPECIAL) + if (base==8) + *str++ = '0'; + else if (base==16) { + *str++ = '0'; + *str++ = digits[33]; + } + if (!(type&LEFT)) + while(size-->0) + *str++ = c; + while(i0) + *str++ = tmp[i]; + while(size-->0) + *str++ = ' '; + return str; +} + +int vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + int i; + char * str; + char *s; + int *ip; + + int flags; /* flags to number() */ + + int field_width; /* width of output field */ + int precision; /* min. # of digits for integers; max + number of chars for from string */ + int qualifier; /* 'h', 'l', or 'L' for integer fields */ + + for (str=buf ; *fmt ; ++fmt) { + if (*fmt != '%') { + *str++ = *fmt; + continue; + } + + /* process flags */ + flags = 0; + repeat: + ++fmt; /* this also skips first '%' */ + switch (*fmt) { + case '-': flags |= LEFT; goto repeat; + case '+': flags |= PLUS; goto repeat; + case ' ': flags |= SPACE; goto repeat; + case '#': flags |= SPECIAL; goto repeat; + case '0': flags |= ZEROPAD; goto repeat; + } + + /* get field width */ + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') { + /* it's the next argument */ + field_width = va_arg(args, int); + if (field_width < 0) { + field_width = -field_width; + flags |= LEFT; + } + } + + /* get the precision */ + precision = -1; + if (*fmt == '.') { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') { + /* it's the next argument */ + precision = va_arg(args, int); + } + if (precision < 0) + precision = 0; + } + + /* get the conversion qualifier */ + qualifier = -1; + if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') { + qualifier = *fmt; + ++fmt; + } + + switch (*fmt) { + case 'c': + if (!(flags & LEFT)) + while (--field_width > 0) + *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) + *str++ = ' '; + break; + + case 's': + s = va_arg(args, char *); + len = strlen(s); + if (precision < 0) + precision = len; + else if (len > precision) + len = precision; + + if (!(flags & LEFT)) + while (len < field_width--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = *s++; + while (len < field_width--) + *str++ = ' '; + break; + + case 'o': + str = number(str, va_arg(args, unsigned long), 8, + field_width, precision, flags); + break; + + case 'p': + if (field_width == -1) { + field_width = 8; + flags |= ZEROPAD; + } + str = number(str, + (unsigned long) va_arg(args, void *), 16, + field_width, precision, flags); + break; + + case 'x': + flags |= SMALL; + case 'X': + str = number(str, va_arg(args, unsigned long), 16, + field_width, precision, flags); + break; + + case 'd': + case 'i': + flags |= SIGN; + case 'u': + str = number(str, va_arg(args, unsigned long), 10, + field_width, precision, flags); + break; + + case 'n': + ip = va_arg(args, int *); + *ip = (str - buf); + break; + + default: + if (*fmt != '%') + *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + break; + } + } + *str = '\0'; + return str-buf; +} diff --git a/linux-0.11-lab/2/linux/kernel/vsprintf.o b/linux-0.11-lab/2/linux/kernel/vsprintf.o new file mode 100755 index 0000000000000000000000000000000000000000..5acfe6576413e77d5a31e400e048fdd1e4ad4bf8 GIT binary patch literal 6156 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 tmp_make + (for i in *.c;do $(CPP) -M $$i;done) >> tmp_make + cp tmp_make Makefile + +### Dependencies: +memory.o : memory.c ../include/signal.h ../include/sys/types.h \ + ../include/asm/system.h ../include/linux/sched.h ../include/linux/head.h \ + ../include/linux/fs.h ../include/linux/mm.h ../include/linux/kernel.h diff --git a/linux-0.11-lab/2/linux/mm/memory.c b/linux-0.11-lab/2/linux/mm/memory.c new file mode 100755 index 0000000..0ffa375 --- /dev/null +++ b/linux-0.11-lab/2/linux/mm/memory.c @@ -0,0 +1,431 @@ +/* + * linux/mm/memory.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * demand-loading started 01.12.91 - seems it is high on the list of + * things wanted, and it should be easy to implement. - Linus + */ + +/* + * Ok, demand-loading was easy, shared pages a little bit tricker. Shared + * pages started 02.12.91, seems to work. - Linus. + * + * Tested sharing by executing about 30 /bin/sh: under the old kernel it + * would have taken more than the 6M I have free, but it worked well as + * far as I could see. + * + * Also corrected some "invalidate()"s - I wasn't doing enough of them. + */ + +#include + +#include + +#include +#include +#include + +volatile void do_exit(long code); + +static inline volatile void oom(void) +{ + printk("out of memory\n\r"); + do_exit(SIGSEGV); +} + +#define invalidate() \ +__asm__("movl %%eax,%%cr3"::"a" (0)) + +/* these are not to be changed without changing head.s etc */ +#define LOW_MEM 0x100000 +#define PAGING_MEMORY (15*1024*1024) +#define PAGING_PAGES (PAGING_MEMORY>>12) +#define MAP_NR(addr) (((addr)-LOW_MEM)>>12) +#define USED 100 + +#define CODE_SPACE(addr) ((((addr)+4095)&~4095) < \ +current->start_code + current->end_code) + +static long HIGH_MEMORY = 0; + +#define copy_page(from,to) \ +__asm__("cld ; rep ; movsl"::"S" (from),"D" (to),"c" (1024)) + +static unsigned char mem_map [ PAGING_PAGES ] = {0,}; + +/* + * Get physical address of first (actually last :-) free page, and mark it + * used. If no free pages left, return 0. + */ +unsigned long get_free_page(void) +{ +register unsigned long __res asm("ax"); + +__asm__("std ; repne ; scasb\n\t" + "jne 1f\n\t" + "movb $1,1(%%edi)\n\t" + "sall $12,%%ecx\n\t" + "addl %2,%%ecx\n\t" + "movl %%ecx,%%edx\n\t" + "movl $1024,%%ecx\n\t" + "leal 4092(%%edx),%%edi\n\t" + "rep ; stosl\n\t" + "movl %%edx,%%eax\n\t" + "1:" + "cld\n\t" /* by wyj */ + :"=a" (__res) + :"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES), + "D" (mem_map+PAGING_PAGES-1) + ); +return __res; +} + +/* + * Free a page of memory at physical address 'addr'. Used by + * 'free_page_tables()' + */ +void free_page(unsigned long addr) +{ + if (addr < LOW_MEM) return; + if (addr >= HIGH_MEMORY) + panic("trying to free nonexistent page"); + addr -= LOW_MEM; + addr >>= 12; + if (mem_map[addr]--) return; + mem_map[addr]=0; + panic("trying to free free page"); +} + +/* + * This function frees a continuos block of page tables, as needed + * by 'exit()'. As does copy_page_tables(), this handles only 4Mb blocks. + */ +int free_page_tables(unsigned long from,unsigned long size) +{ + unsigned long *pg_table; + unsigned long * dir, nr; + + if (from & 0x3fffff) + panic("free_page_tables called with wrong alignment"); + if (!from) + panic("Trying to free up swapper memory space"); + size = (size + 0x3fffff) >> 22; + dir = (unsigned long *) ((from>>20) & 0xffc); /* _pg_dir = 0 */ + for ( ; size-->0 ; dir++) { + if (!(1 & *dir)) + continue; + pg_table = (unsigned long *) (0xfffff000 & *dir); + for (nr=0 ; nr<1024 ; nr++) { + if (1 & *pg_table) + free_page(0xfffff000 & *pg_table); + *pg_table = 0; + pg_table++; + } + free_page(0xfffff000 & *dir); + *dir = 0; + } + invalidate(); + return 0; +} + +/* + * Well, here is one of the most complicated functions in mm. It + * copies a range of linerar addresses by copying only the pages. + * Let's hope this is bug-free, 'cause this one I don't want to debug :-) + * + * Note! We don't copy just any chunks of memory - addresses have to + * be divisible by 4Mb (one page-directory entry), as this makes the + * function easier. It's used only by fork anyway. + * + * NOTE 2!! When from==0 we are copying kernel space for the first + * fork(). Then we DONT want to copy a full page-directory entry, as + * that would lead to some serious memory waste - we just copy the + * first 160 pages - 640kB. Even that is more than we need, but it + * doesn't take any more memory - we don't copy-on-write in the low + * 1 Mb-range, so the pages can be shared with the kernel. Thus the + * special case for nr=xxxx. + */ +int copy_page_tables(unsigned long from,unsigned long to,long size) +{ + unsigned long * from_page_table; + unsigned long * to_page_table; + unsigned long this_page; + unsigned long * from_dir, * to_dir; + unsigned long nr; + + if ((from&0x3fffff) || (to&0x3fffff)) + panic("copy_page_tables called with wrong alignment"); + from_dir = (unsigned long *) ((from>>20) & 0xffc); /* _pg_dir = 0 */ + to_dir = (unsigned long *) ((to>>20) & 0xffc); + size = ((unsigned) (size+0x3fffff)) >> 22; + for( ; size-->0 ; from_dir++,to_dir++) { + if (1 & *to_dir) + panic("copy_page_tables: already exist"); + if (!(1 & *from_dir)) + continue; + from_page_table = (unsigned long *) (0xfffff000 & *from_dir); + if (!(to_page_table = (unsigned long *) get_free_page())) + return -1; /* Out of memory, see freeing */ + *to_dir = ((unsigned long) to_page_table) | 7; + nr = (from==0)?0xA0:1024; + for ( ; nr-- > 0 ; from_page_table++,to_page_table++) { + this_page = *from_page_table; + if (!(1 & this_page)) + continue; + this_page &= ~2; + *to_page_table = this_page; + if (this_page > LOW_MEM) { + *from_page_table = this_page; + this_page -= LOW_MEM; + this_page >>= 12; + mem_map[this_page]++; + } + } + } + invalidate(); + return 0; +} + +/* + * This function puts a page in memory at the wanted address. + * It returns the physical address of the page gotten, 0 if + * out of memory (either when trying to access page-table or + * page.) + */ +unsigned long put_page(unsigned long page,unsigned long address) +{ + unsigned long tmp, *page_table; + +/* NOTE !!! This uses the fact that _pg_dir=0 */ + + if (page < LOW_MEM || page >= HIGH_MEMORY) + printk("Trying to put page %p at %p\n",page,address); + if (mem_map[(page-LOW_MEM)>>12] != 1) + printk("mem_map disagrees with %p at %p\n",page,address); + page_table = (unsigned long *) ((address>>20) & 0xffc); + if ((*page_table)&1) + page_table = (unsigned long *) (0xfffff000 & *page_table); + else { + if (!(tmp=get_free_page())) + return 0; + *page_table = tmp|7; + page_table = (unsigned long *) tmp; + } + page_table[(address>>12) & 0x3ff] = page | 7; +/* no need for invalidate */ + return page; +} + +void un_wp_page(unsigned long * table_entry) +{ + unsigned long old_page,new_page; + + old_page = 0xfffff000 & *table_entry; + if (old_page >= LOW_MEM && mem_map[MAP_NR(old_page)]==1) { + *table_entry |= 2; + invalidate(); + return; + } + if (!(new_page=get_free_page())) + oom(); + if (old_page >= LOW_MEM) + mem_map[MAP_NR(old_page)]--; + *table_entry = new_page | 7; + invalidate(); + copy_page(old_page,new_page); +} + +/* + * This routine handles present pages, when users try to write + * to a shared page. It is done by copying the page to a new address + * and decrementing the shared-page counter for the old page. + * + * If it's in code space we exit with a segment error. + */ +void do_wp_page(unsigned long error_code,unsigned long address) +{ +#if 0 +/* we cannot do this yet: the estdio library writes to code space */ +/* stupid, stupid. I really want the libc.a from GNU */ + if (CODE_SPACE(address)) + do_exit(SIGSEGV); +#endif + un_wp_page((unsigned long *) + (((address>>10) & 0xffc) + (0xfffff000 & + *((unsigned long *) ((address>>20) &0xffc))))); + +} + +void write_verify(unsigned long address) +{ + unsigned long page; + + if (!( (page = *((unsigned long *) ((address>>20) & 0xffc)) )&1)) + return; + page &= 0xfffff000; + page += ((address>>10) & 0xffc); + if ((3 & *(unsigned long *) page) == 1) /* non-writeable, present */ + un_wp_page((unsigned long *) page); + return; +} + +void get_empty_page(unsigned long address) +{ + unsigned long tmp; + + if (!(tmp=get_free_page()) || !put_page(tmp,address)) { + free_page(tmp); /* 0 is ok - ignored */ + oom(); + } +} + +/* + * try_to_share() checks the page at address "address" in the task "p", + * to see if it exists, and if it is clean. If so, share it with the current + * task. + * + * NOTE! This assumes we have checked that p != current, and that they + * share the same executable. + */ +static int try_to_share(unsigned long address, struct task_struct * p) +{ + unsigned long from; + unsigned long to; + unsigned long from_page; + unsigned long to_page; + unsigned long phys_addr; + + from_page = to_page = ((address>>20) & 0xffc); + from_page += ((p->start_code>>20) & 0xffc); + to_page += ((current->start_code>>20) & 0xffc); +/* is there a page-directory at from? */ + from = *(unsigned long *) from_page; + if (!(from & 1)) + return 0; + from &= 0xfffff000; + from_page = from + ((address>>10) & 0xffc); + phys_addr = *(unsigned long *) from_page; +/* is the page clean and present? */ + if ((phys_addr & 0x41) != 0x01) + return 0; + phys_addr &= 0xfffff000; + if (phys_addr >= HIGH_MEMORY || phys_addr < LOW_MEM) + return 0; + to = *(unsigned long *) to_page; + if (!(to & 1)) + if (to = get_free_page()) + *(unsigned long *) to_page = to | 7; + else + oom(); + to &= 0xfffff000; + to_page = to + ((address>>10) & 0xffc); + if (1 & *(unsigned long *) to_page) + panic("try_to_share: to_page already exists"); +/* share them: write-protect */ + *(unsigned long *) from_page &= ~2; + *(unsigned long *) to_page = *(unsigned long *) from_page; + invalidate(); + phys_addr -= LOW_MEM; + phys_addr >>= 12; + mem_map[phys_addr]++; + return 1; +} + +/* + * share_page() tries to find a process that could share a page with + * the current one. Address is the address of the wanted page relative + * to the current data space. + * + * We first check if it is at all feasible by checking executable->i_count. + * It should be >1 if there are other tasks sharing this inode. + */ +static int share_page(unsigned long address) +{ + struct task_struct ** p; + + if (!current->executable) + return 0; + if (current->executable->i_count < 2) + return 0; + for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) { + if (!*p) + continue; + if (current == *p) + continue; + if ((*p)->executable != current->executable) + continue; + if (try_to_share(address,*p)) + return 1; + } + return 0; +} + +void do_no_page(unsigned long error_code,unsigned long address) +{ + int nr[4]; + unsigned long tmp; + unsigned long page; + int block,i; + + address &= 0xfffff000; + tmp = address - current->start_code; + if (!current->executable || tmp >= current->end_data) { + get_empty_page(address); + return; + } + if (share_page(tmp)) + return; + if (!(page = get_free_page())) + oom(); +/* remember that 1 block is used for header */ + block = 1 + tmp/BLOCK_SIZE; + for (i=0 ; i<4 ; block++,i++) + nr[i] = bmap(current->executable,block); + bread_page(page,current->executable->i_dev,nr); + i = tmp + 4096 - current->end_data; + tmp = page + 4096; + while (i-- > 0) { + tmp--; + *(char *)tmp = 0; + } + if (put_page(page,address)) + return; + free_page(page); + oom(); +} + +void mem_init(long start_mem, long end_mem) +{ + int i; + + HIGH_MEMORY = end_mem; + for (i=0 ; i>= 12; + while (end_mem-->0) + mem_map[i++]=0; +} + +void calc_mem(void) +{ + int i,j,k,free=0; + long * pg_tbl; + + for(i=0 ; i5I8yebbsjY3b+28NJ=ba4L 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 WJ>8K)@)PG@pEzRdVi(KKAO0KJhD)6Q literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/mm/page.o b/linux-0.11-lab/2/linux/mm/page.o new file mode 100755 index 0000000000000000000000000000000000000000..da4852668a6d8b88d91c428ae8572bb3d4d2090d GIT binary patch literal 640 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 N^|Cbi(V*L${{d;jp)>#h literal 0 HcmV?d00001 diff --git a/linux-0.11-lab/2/linux/tools/build.c b/linux-0.11-lab/2/linux/tools/build.c new file mode 100755 index 0000000..8b8c7ab --- /dev/null +++ b/linux-0.11-lab/2/linux/tools/build.c @@ -0,0 +1,171 @@ +/* + * linux/tools/build.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * This file builds a disk-image from three different files: + * + * - bootsect: max 510 bytes of 8086 machine code, loads the rest + * - setup: max 4 sectors of 8086 machine code, sets up system parm + * - system: 80386 code for actual system + * + * It does some checking that all files are of the correct type, and + * just writes the result to stdout, removing headers and padding to + * the right amount. It also writes some system data to stderr. + */ + +/* + * Changes by tytso to allow root device specification + */ + +#include /* fprintf */ +#include +#include /* contains exit */ +#include /* unistd.h needs this */ +#include +#include +#include /* contains read/write */ +#include + +#define MAJOR(a) (((unsigned)(a))>>8) +#define MINOR(a) ((a)&0xff) + +#define MINIX_HEADER 32 +#define GCC_HEADER 0x80 /* 0x1000 */ /* by wyj */ + +#define SYS_SIZE 0x3000 + +#define DEFAULT_MAJOR_ROOT 0x03 //0x02 /* by wyj */ +#define DEFAULT_MINOR_ROOT 0x00 //0x1d + +/* max nr of sectors of setup: don't change unless you also change + * bootsect etc */ +#define SETUP_SECTS 4 + +#define STRINGIFY(x) #x + +void die(char * str) +{ + fprintf(stderr,"%s\n",str); + exit(1); +} + +void usage(void) +{ + die("Usage: build bootsect setup system [rootdev] [> image]"); +} + +int main(int argc, char ** argv) +{ + int i,c,id; + char buf[1024*4]; /* by wyj */ + char major_root, minor_root; + struct stat sb; + + if ((argc != 4) && (argc != 5)) + usage(); + if (argc == 5) { + if (strcmp(argv[4], "FLOPPY")) { + if (stat(argv[4], &sb)) { + perror(argv[4]); + die("Couldn't stat root device."); + } + major_root = MAJOR(sb.st_rdev); + minor_root = MINOR(sb.st_rdev); + } else { + major_root = 0; + minor_root = 0; + } + } else { + major_root = DEFAULT_MAJOR_ROOT; + minor_root = DEFAULT_MINOR_ROOT; + } + fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root); + if ((major_root != 2) && (major_root != 3) && + (major_root != 0)) { + fprintf(stderr, "Illegal root device (major = %d)\n", + major_root); + die("Bad root device --- major #"); + } + for (i=0;i0 ; i+=c ) + if (write(1,buf,c)!=c) + die("Write call failed"); + close (id); + if (i > SETUP_SECTS*512) + die("Setup exceeds " STRINGIFY(SETUP_SECTS) + " sectors - rewrite build/boot/setup"); + fprintf(stderr,"Setup is %d bytes.\n",i); + for (c=0 ; c sizeof(buf)) + c = sizeof(buf); + if (write(1,buf,c) != c) + die("Write call failed"); + i += c; + } + + if ((id=open(argv[3],O_RDONLY,0))<0) + die("Unable to open 'system'"); + if (read(id,buf,GCC_HEADER) != GCC_HEADER) + die("Unable to read header of 'system'"); +// if (((long *) buf)[5] != 0) +// die("Non-GCC header of 'system'"); + for (i=0 ; (c=read(id,buf,sizeof buf))>0 ; i+=c ) + if (write(1,buf,c)!=c) + die("Write call failed"); + close(id); + fprintf(stderr,"System is %d bytes.\n",i); + if (i > SYS_SIZE*16) + die("System is too big"); + return(0); +} diff --git a/linux-0.11-lab/2/linux/tools/system b/linux-0.11-lab/2/linux/tools/system new file mode 100755 index 0000000000000000000000000000000000000000..cdec13498fa56de2a8a9c9f8d06d839b764ef75e GIT binary patch literal 286057 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