From 702f14201f16bae81c9d9b65331d33557b5e8836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=97=E7=AB=AF=E5=AE=87?= <1907694477@qq.com> Date: Thu, 8 Jul 2021 21:31:55 +0800 Subject: [PATCH] upload the code --- 2/linux-0.11-lab/0.gdb | 5 + 2/linux-0.11-lab/0/README | 6 + .../0/Source-Insight/Linux-0.11.IAB | Bin 0 -> 102400 bytes .../0/Source-Insight/Linux-0.11.IAD | Bin 0 -> 1328 bytes .../0/Source-Insight/Linux-0.11.IMB | Bin 0 -> 81920 bytes .../0/Source-Insight/Linux-0.11.IMD | Bin 0 -> 1128 bytes .../0/Source-Insight/Linux-0.11.PFI | Bin 0 -> 412 bytes .../0/Source-Insight/Linux-0.11.PO | Bin 0 -> 776 bytes .../0/Source-Insight/Linux-0.11.PR | Bin 0 -> 32648 bytes .../0/Source-Insight/Linux-0.11.PRI | Bin 0 -> 208984 bytes .../0/Source-Insight/Linux-0.11.PS | Bin 0 -> 623496 bytes .../0/Source-Insight/Linux-0.11.SearchResults | 2 + .../0/Source-Insight/Linux-0.11.WK3 | Bin 0 -> 8851 bytes 2/linux-0.11-lab/0/linux/Image | Bin 0 -> 136196 bytes 2/linux-0.11-lab/0/linux/Image.bkp | Bin 0 -> 131556 bytes 2/linux-0.11-lab/0/linux/Makefile | 125 ++ 2/linux-0.11-lab/0/linux/System.map | 587 +++++++++ 2/linux-0.11-lab/0/linux/System.map.2 | 1084 +++++++++++++++++ 2/linux-0.11-lab/0/linux/boot/bootsect | Bin 0 -> 544 bytes 2/linux-0.11-lab/0/linux/boot/bootsect.o | Bin 0 -> 923 bytes 2/linux-0.11-lab/0/linux/boot/bootsect.s | 260 ++++ 2/linux-0.11-lab/0/linux/boot/head.o | Bin 0 -> 27012 bytes 2/linux-0.11-lab/0/linux/boot/head.s | 240 ++++ 2/linux-0.11-lab/0/linux/boot/setup | Bin 0 -> 344 bytes 2/linux-0.11-lab/0/linux/boot/setup.o | Bin 0 -> 596 bytes 2/linux-0.11-lab/0/linux/boot/setup.s | 231 ++++ 2/linux-0.11-lab/0/linux/execve2.patch | 41 + 2/linux-0.11-lab/0/linux/fs/Makefile | 101 ++ 2/linux-0.11-lab/0/linux/fs/bitmap.c | 168 +++ 2/linux-0.11-lab/0/linux/fs/bitmap.o | Bin 0 -> 10276 bytes 2/linux-0.11-lab/0/linux/fs/block_dev.c | 73 ++ 2/linux-0.11-lab/0/linux/fs/block_dev.o | Bin 0 -> 7292 bytes 2/linux-0.11-lab/0/linux/fs/buffer.c | 384 ++++++ 2/linux-0.11-lab/0/linux/fs/buffer.o | Bin 0 -> 13344 bytes 2/linux-0.11-lab/0/linux/fs/char_dev.c | 104 ++ 2/linux-0.11-lab/0/linux/fs/char_dev.o | Bin 0 -> 8284 bytes 2/linux-0.11-lab/0/linux/fs/exec.c | 539 ++++++++ 2/linux-0.11-lab/0/linux/fs/exec.o | Bin 0 -> 19476 bytes 2/linux-0.11-lab/0/linux/fs/fcntl.c | 75 ++ 2/linux-0.11-lab/0/linux/fs/fcntl.o | Bin 0 -> 6744 bytes 2/linux-0.11-lab/0/linux/fs/file_dev.c | 90 ++ 2/linux-0.11-lab/0/linux/fs/file_dev.o | Bin 0 -> 7824 bytes 2/linux-0.11-lab/0/linux/fs/file_table.c | 9 + 2/linux-0.11-lab/0/linux/fs/file_table.o | Bin 0 -> 2640 bytes 2/linux-0.11-lab/0/linux/fs/fs.o | Bin 0 -> 147394 bytes 2/linux-0.11-lab/0/linux/fs/inode.c | 340 ++++++ 2/linux-0.11-lab/0/linux/fs/inode.o | Bin 0 -> 14068 bytes 2/linux-0.11-lab/0/linux/fs/ioctl.c | 46 + 2/linux-0.11-lab/0/linux/fs/ioctl.o | Bin 0 -> 5824 bytes 2/linux-0.11-lab/0/linux/fs/namei.c | 783 ++++++++++++ 2/linux-0.11-lab/0/linux/fs/namei.o | Bin 0 -> 20752 bytes 2/linux-0.11-lab/0/linux/fs/open.c | 208 ++++ 2/linux-0.11-lab/0/linux/fs/open.o | Bin 0 -> 11180 bytes 2/linux-0.11-lab/0/linux/fs/pipe.c | 111 ++ 2/linux-0.11-lab/0/linux/fs/pipe.o | Bin 0 -> 8100 bytes 2/linux-0.11-lab/0/linux/fs/read_write.c | 103 ++ 2/linux-0.11-lab/0/linux/fs/read_write.o | Bin 0 -> 7516 bytes 2/linux-0.11-lab/0/linux/fs/select.c | 10 + 2/linux-0.11-lab/0/linux/fs/select.o | Bin 0 -> 1772 bytes 2/linux-0.11-lab/0/linux/fs/stat.c | 66 + 2/linux-0.11-lab/0/linux/fs/stat.o | Bin 0 -> 7208 bytes 2/linux-0.11-lab/0/linux/fs/super.c | 282 +++++ 2/linux-0.11-lab/0/linux/fs/super.o | Bin 0 -> 12280 bytes 2/linux-0.11-lab/0/linux/fs/truncate.c | 65 + 2/linux-0.11-lab/0/linux/fs/truncate.o | Bin 0 -> 6844 bytes 2/linux-0.11-lab/0/linux/include/a.out.h | 220 ++++ 2/linux-0.11-lab/0/linux/include/asm/io.h | 24 + 2/linux-0.11-lab/0/linux/include/asm/memory.h | 15 + .../0/linux/include/asm/segment.h | 65 + 2/linux-0.11-lab/0/linux/include/asm/system.h | 66 + 2/linux-0.11-lab/0/linux/include/const.h | 15 + 2/linux-0.11-lab/0/linux/include/ctype.h | 34 + 2/linux-0.11-lab/0/linux/include/errno.h | 60 + 2/linux-0.11-lab/0/linux/include/fcntl.h | 55 + .../0/linux/include/linux/config.h | 48 + .../0/linux/include/linux/fdreg.h | 71 ++ 2/linux-0.11-lab/0/linux/include/linux/fs.h | 202 +++ .../0/linux/include/linux/hdreg.h | 65 + 2/linux-0.11-lab/0/linux/include/linux/head.h | 20 + .../0/linux/include/linux/kernel.h | 22 + 2/linux-0.11-lab/0/linux/include/linux/mm.h | 10 + .../0/linux/include/linux/sched.h | 239 ++++ 2/linux-0.11-lab/0/linux/include/linux/sys.h | 119 ++ 2/linux-0.11-lab/0/linux/include/linux/tty.h | 77 ++ 2/linux-0.11-lab/0/linux/include/new.h | 30 + 2/linux-0.11-lab/0/linux/include/signal.h | 68 ++ 2/linux-0.11-lab/0/linux/include/stdarg.h | 28 + 2/linux-0.11-lab/0/linux/include/stddef.h | 19 + 2/linux-0.11-lab/0/linux/include/string.h | 405 ++++++ 2/linux-0.11-lab/0/linux/include/sys/stat.h | 60 + 2/linux-0.11-lab/0/linux/include/sys/times.h | 15 + 2/linux-0.11-lab/0/linux/include/sys/types.h | 46 + .../0/linux/include/sys/utsname.h | 16 + 2/linux-0.11-lab/0/linux/include/sys/wait.h | 23 + 2/linux-0.11-lab/0/linux/include/termios.h | 228 ++++ 2/linux-0.11-lab/0/linux/include/time.h | 42 + .../linux-0.11-lab/0/linux/include/unistd.h | 27 +- 2/linux-0.11-lab/0/linux/include/utime.h | 13 + 2/linux-0.11-lab/0/linux/init/main.c | 216 ++++ 2/linux-0.11-lab/0/linux/init/main.c.rej | 12 + 2/linux-0.11-lab/0/linux/init/main.o | Bin 0 -> 12208 bytes 2/linux-0.11-lab/0/linux/kernel/Makefile | 83 ++ 2/linux-0.11-lab/0/linux/kernel/asm.o | Bin 0 -> 1740 bytes 2/linux-0.11-lab/0/linux/kernel/asm.s | 146 +++ .../0/linux/kernel/blk_drv/Makefile | 58 + 2/linux-0.11-lab/0/linux/kernel/blk_drv/blk.h | 140 +++ .../0/linux/kernel/blk_drv/blk_drv.a | Bin 0 -> 52196 bytes .../0/linux/kernel/blk_drv/floppy.c | 463 +++++++ .../0/linux/kernel/blk_drv/floppy.o | Bin 0 -> 16608 bytes 2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.c | 351 ++++++ 2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.o | Bin 0 -> 15516 bytes .../0/linux/kernel/blk_drv/ll_rw_blk.c | 165 +++ .../0/linux/kernel/blk_drv/ll_rw_blk.o | Bin 0 -> 8736 bytes .../0/linux/kernel/blk_drv/ramdisk.c | 126 ++ .../0/linux/kernel/blk_drv/ramdisk.o | Bin 0 -> 10660 bytes .../0/linux/kernel/chr_drv/Makefile | 68 ++ .../0/linux/kernel/chr_drv/chr_drv.a | Bin 0 -> 68886 bytes .../0/linux/kernel/chr_drv/console.c | 710 +++++++++++ .../0/linux/kernel/chr_drv/console.o | Bin 0 -> 20892 bytes .../0/linux/kernel/chr_drv/keyboard.2.o | Bin 0 -> 6024 bytes .../0/linux/kernel/chr_drv/keyboard.2.s | 466 +++++++ .../0/linux/kernel/chr_drv/keyboard.S | 588 +++++++++ .../0/linux/kernel/chr_drv/rs_io.o | Bin 0 -> 1320 bytes .../0/linux/kernel/chr_drv/rs_io.s | 147 +++ .../0/linux/kernel/chr_drv/serial.c | 59 + .../0/linux/kernel/chr_drv/serial.o | Bin 0 -> 6748 bytes .../0/linux/kernel/chr_drv/tty_io.c | 349 ++++++ .../0/linux/kernel/chr_drv/tty_io.o | Bin 0 -> 22500 bytes .../0/linux/kernel/chr_drv/tty_ioctl.c | 204 ++++ .../0/linux/kernel/chr_drv/tty_ioctl.o | Bin 0 -> 10644 bytes 2/linux-0.11-lab/0/linux/kernel/exit.c | 197 +++ 2/linux-0.11-lab/0/linux/kernel/exit.o | Bin 0 -> 11160 bytes 2/linux-0.11-lab/0/linux/kernel/fork.c | 148 +++ 2/linux-0.11-lab/0/linux/kernel/fork.o | Bin 0 -> 9636 bytes 2/linux-0.11-lab/0/linux/kernel/kernel.o | Bin 0 -> 88288 bytes 2/linux-0.11-lab/0/linux/kernel/math/Makefile | 43 + 2/linux-0.11-lab/0/linux/kernel/math/math.a | Bin 0 -> 6624 bytes .../0/linux/kernel/math/math_emulate.c | 42 + .../0/linux/kernel/math/math_emulate.o | Bin 0 -> 6460 bytes 2/linux-0.11-lab/0/linux/kernel/mktime.c | 58 + 2/linux-0.11-lab/0/linux/kernel/mktime.o | Bin 0 -> 2868 bytes 2/linux-0.11-lab/0/linux/kernel/panic.c | 24 + 2/linux-0.11-lab/0/linux/kernel/panic.o | Bin 0 -> 5420 bytes 2/linux-0.11-lab/0/linux/kernel/printk.c | 41 + 2/linux-0.11-lab/0/linux/kernel/printk.o | Bin 0 -> 2420 bytes 2/linux-0.11-lab/0/linux/kernel/sched.c | 412 +++++++ 2/linux-0.11-lab/0/linux/kernel/sched.o | Bin 0 -> 23040 bytes 2/linux-0.11-lab/0/linux/kernel/signal.c | 129 ++ 2/linux-0.11-lab/0/linux/kernel/signal.o | Bin 0 -> 8956 bytes 2/linux-0.11-lab/0/linux/kernel/sys.c | 443 +++++++ 2/linux-0.11-lab/0/linux/kernel/sys.o | Bin 0 -> 17196 bytes 2/linux-0.11-lab/0/linux/kernel/system_call.o | Bin 0 -> 2640 bytes 2/linux-0.11-lab/0/linux/kernel/system_call.s | 298 +++++ .../0/linux/kernel/system_call.s.rej | 14 + 2/linux-0.11-lab/0/linux/kernel/traps.c | 208 ++++ 2/linux-0.11-lab/0/linux/kernel/traps.o | Bin 0 -> 12968 bytes 2/linux-0.11-lab/0/linux/kernel/vsprintf.c | 233 ++++ 2/linux-0.11-lab/0/linux/kernel/vsprintf.o | Bin 0 -> 6152 bytes 2/linux-0.11-lab/0/linux/lib/Makefile | 73 ++ 2/linux-0.11-lab/0/linux/lib/_exit.c | 13 + 2/linux-0.11-lab/0/linux/lib/_exit.o | Bin 0 -> 1988 bytes 2/linux-0.11-lab/0/linux/lib/close.c | 10 + 2/linux-0.11-lab/0/linux/lib/close.o | Bin 0 -> 2220 bytes 2/linux-0.11-lab/0/linux/lib/ctype.c | 35 + 2/linux-0.11-lab/0/linux/lib/ctype.o | Bin 0 -> 1904 bytes 2/linux-0.11-lab/0/linux/lib/dup.c | 10 + 2/linux-0.11-lab/0/linux/lib/dup.o | Bin 0 -> 2196 bytes 2/linux-0.11-lab/0/linux/lib/errno.c | 7 + 2/linux-0.11-lab/0/linux/lib/errno.o | Bin 0 -> 1468 bytes 2/linux-0.11-lab/0/linux/lib/execve.c | 10 + 2/linux-0.11-lab/0/linux/lib/execve.o | Bin 0 -> 2336 bytes 2/linux-0.11-lab/0/linux/lib/lib.a | Bin 0 -> 34122 bytes 2/linux-0.11-lab/0/linux/lib/malloc.c | 232 ++++ 2/linux-0.11-lab/0/linux/lib/malloc.o | Bin 0 -> 4876 bytes 2/linux-0.11-lab/0/linux/lib/open.c | 25 + 2/linux-0.11-lab/0/linux/lib/open.o | Bin 0 -> 2364 bytes 2/linux-0.11-lab/0/linux/lib/setsid.c | 10 + 2/linux-0.11-lab/0/linux/lib/setsid.o | Bin 0 -> 2240 bytes 2/linux-0.11-lab/0/linux/lib/string.c | 14 + 2/linux-0.11-lab/0/linux/lib/string.o | Bin 0 -> 6376 bytes 2/linux-0.11-lab/0/linux/lib/wait.c | 16 + 2/linux-0.11-lab/0/linux/lib/wait.o | Bin 0 -> 2580 bytes 2/linux-0.11-lab/0/linux/lib/write.c | 10 + 2/linux-0.11-lab/0/linux/lib/write.o | Bin 0 -> 2372 bytes 2/linux-0.11-lab/0/linux/mm/Makefile | 38 + 2/linux-0.11-lab/0/linux/mm/memory.c | 468 +++++++ 2/linux-0.11-lab/0/linux/mm/memory.c.rej | 12 + 2/linux-0.11-lab/0/linux/mm/memory.o | Bin 0 -> 13824 bytes 2/linux-0.11-lab/0/linux/mm/mm.o | Bin 0 -> 13950 bytes 2/linux-0.11-lab/0/linux/mm/page.o | Bin 0 -> 640 bytes 2/linux-0.11-lab/0/linux/mm/page.s | 40 + 2/linux-0.11-lab/0/linux/new.patch | 11 + 2/linux-0.11-lab/0/linux/oscomp_syscalls.md | 109 ++ 2/linux-0.11-lab/0/linux/tools/build | Bin 0 -> 15140 bytes 2/linux-0.11-lab/0/linux/tools/build.c | 171 +++ 2/linux-0.11-lab/0/linux/tools/system | Bin 0 -> 295629 bytes 2/linux-0.11-lab/b/clone.c | 66 + 2/linux-0.11-lab/b/echo.c | 12 + 2/linux-0.11-lab/b/execve.c | 21 + 2/linux-0.11-lab/b/execve2.c | 24 + 2/linux-0.11-lab/b/getcwd.c | 39 + 2/linux-0.11-lab/b/getdents.c | 42 + 2/linux-0.11-lab/b/mmap.c | 62 + 2/linux-0.11-lab/b/munmap.c | 70 ++ 2/linux-0.11-lab/b/pipe.c | 44 + 2/linux-0.11-lab/b/sleep.c | 36 + 2/linux-0.11-lab/bochsout.txt | 315 +++++ 2/linux-0.11-lab/conf/0.11-gdbstub.bxrc | 33 + 2/linux-0.11-lab/conf/0.11.bxrc | 31 + 2/linux-0.11-lab/cur/README | 6 + .../cur/Source-Insight/Linux-0.11.IAB | Bin 0 -> 102400 bytes .../cur/Source-Insight/Linux-0.11.IAD | Bin 0 -> 1328 bytes .../cur/Source-Insight/Linux-0.11.IMB | Bin 0 -> 81920 bytes .../cur/Source-Insight/Linux-0.11.IMD | Bin 0 -> 1128 bytes .../cur/Source-Insight/Linux-0.11.PFI | Bin 0 -> 412 bytes .../cur/Source-Insight/Linux-0.11.PO | Bin 0 -> 776 bytes .../cur/Source-Insight/Linux-0.11.PR | Bin 0 -> 32648 bytes .../cur/Source-Insight/Linux-0.11.PRI | Bin 0 -> 208984 bytes .../cur/Source-Insight/Linux-0.11.PS | Bin 0 -> 623496 bytes .../Source-Insight/Linux-0.11.SearchResults | 2 + .../cur/Source-Insight/Linux-0.11.WK3 | Bin 0 -> 8851 bytes 2/linux-0.11-lab/cur/linux/Image | Bin 0 -> 136196 bytes 2/linux-0.11-lab/cur/linux/Image.bkp | Bin 0 -> 131556 bytes 2/linux-0.11-lab/cur/linux/Makefile | 125 ++ 2/linux-0.11-lab/cur/linux/System.map | 587 +++++++++ 2/linux-0.11-lab/cur/linux/System.map.2 | 1084 +++++++++++++++++ 2/linux-0.11-lab/cur/linux/boot/bootsect | Bin 0 -> 544 bytes 2/linux-0.11-lab/cur/linux/boot/bootsect.o | Bin 0 -> 923 bytes 2/linux-0.11-lab/cur/linux/boot/bootsect.s | 260 ++++ 2/linux-0.11-lab/cur/linux/boot/head.o | Bin 0 -> 27012 bytes 2/linux-0.11-lab/cur/linux/boot/head.s | 240 ++++ 2/linux-0.11-lab/cur/linux/boot/setup | Bin 0 -> 344 bytes 2/linux-0.11-lab/cur/linux/boot/setup.o | Bin 0 -> 596 bytes 2/linux-0.11-lab/cur/linux/boot/setup.s | 231 ++++ 2/linux-0.11-lab/cur/linux/execve2.patch | 41 + 2/linux-0.11-lab/cur/linux/fs/Makefile | 101 ++ 2/linux-0.11-lab/cur/linux/fs/bitmap.c | 168 +++ 2/linux-0.11-lab/cur/linux/fs/bitmap.o | Bin 0 -> 10276 bytes 2/linux-0.11-lab/cur/linux/fs/block_dev.c | 73 ++ 2/linux-0.11-lab/cur/linux/fs/block_dev.o | Bin 0 -> 7292 bytes 2/linux-0.11-lab/cur/linux/fs/buffer.c | 384 ++++++ 2/linux-0.11-lab/cur/linux/fs/buffer.o | Bin 0 -> 13344 bytes 2/linux-0.11-lab/cur/linux/fs/char_dev.c | 104 ++ 2/linux-0.11-lab/cur/linux/fs/char_dev.o | Bin 0 -> 8284 bytes 2/linux-0.11-lab/cur/linux/fs/exec.c | 539 ++++++++ 2/linux-0.11-lab/cur/linux/fs/exec.o | Bin 0 -> 19476 bytes 2/linux-0.11-lab/cur/linux/fs/fcntl.c | 75 ++ 2/linux-0.11-lab/cur/linux/fs/fcntl.o | Bin 0 -> 6744 bytes 2/linux-0.11-lab/cur/linux/fs/file_dev.c | 90 ++ 2/linux-0.11-lab/cur/linux/fs/file_dev.o | Bin 0 -> 7824 bytes 2/linux-0.11-lab/cur/linux/fs/file_table.c | 9 + 2/linux-0.11-lab/cur/linux/fs/file_table.o | Bin 0 -> 2640 bytes 2/linux-0.11-lab/cur/linux/fs/fs.o | Bin 0 -> 147394 bytes 2/linux-0.11-lab/cur/linux/fs/inode.c | 340 ++++++ 2/linux-0.11-lab/cur/linux/fs/inode.o | Bin 0 -> 14068 bytes 2/linux-0.11-lab/cur/linux/fs/ioctl.c | 46 + 2/linux-0.11-lab/cur/linux/fs/ioctl.o | Bin 0 -> 5824 bytes 2/linux-0.11-lab/cur/linux/fs/namei.c | 783 ++++++++++++ 2/linux-0.11-lab/cur/linux/fs/namei.o | Bin 0 -> 20752 bytes 2/linux-0.11-lab/cur/linux/fs/open.c | 208 ++++ 2/linux-0.11-lab/cur/linux/fs/open.o | Bin 0 -> 11180 bytes 2/linux-0.11-lab/cur/linux/fs/pipe.c | 111 ++ 2/linux-0.11-lab/cur/linux/fs/pipe.o | Bin 0 -> 8100 bytes 2/linux-0.11-lab/cur/linux/fs/read_write.c | 103 ++ 2/linux-0.11-lab/cur/linux/fs/read_write.o | Bin 0 -> 7516 bytes 2/linux-0.11-lab/cur/linux/fs/select.c | 10 + 2/linux-0.11-lab/cur/linux/fs/select.o | Bin 0 -> 1772 bytes 2/linux-0.11-lab/cur/linux/fs/stat.c | 66 + 2/linux-0.11-lab/cur/linux/fs/stat.o | Bin 0 -> 7208 bytes 2/linux-0.11-lab/cur/linux/fs/super.c | 282 +++++ 2/linux-0.11-lab/cur/linux/fs/super.o | Bin 0 -> 12280 bytes 2/linux-0.11-lab/cur/linux/fs/truncate.c | 65 + 2/linux-0.11-lab/cur/linux/fs/truncate.o | Bin 0 -> 6844 bytes 2/linux-0.11-lab/cur/linux/include/a.out.h | 220 ++++ 2/linux-0.11-lab/cur/linux/include/asm/io.h | 24 + .../cur/linux/include/asm/memory.h | 15 + .../cur/linux/include/asm/segment.h | 65 + .../cur/linux/include/asm/system.h | 66 + 2/linux-0.11-lab/cur/linux/include/const.h | 15 + 2/linux-0.11-lab/cur/linux/include/ctype.h | 34 + 2/linux-0.11-lab/cur/linux/include/errno.h | 60 + 2/linux-0.11-lab/cur/linux/include/fcntl.h | 55 + .../cur/linux/include/linux/config.h | 48 + .../cur/linux/include/linux/fdreg.h | 71 ++ 2/linux-0.11-lab/cur/linux/include/linux/fs.h | 202 +++ .../cur/linux/include/linux/hdreg.h | 65 + .../cur/linux/include/linux/head.h | 20 + .../cur/linux/include/linux/kernel.h | 22 + 2/linux-0.11-lab/cur/linux/include/linux/mm.h | 10 + .../cur/linux/include/linux/sched.h | 239 ++++ .../cur/linux/include/linux/sys.h | 119 ++ .../cur/linux/include/linux/tty.h | 77 ++ 2/linux-0.11-lab/cur/linux/include/new.h | 30 + 2/linux-0.11-lab/cur/linux/include/signal.h | 68 ++ 2/linux-0.11-lab/cur/linux/include/stdarg.h | 28 + 2/linux-0.11-lab/cur/linux/include/stddef.h | 19 + 2/linux-0.11-lab/cur/linux/include/string.h | 405 ++++++ 2/linux-0.11-lab/cur/linux/include/sys/stat.h | 60 + .../cur/linux/include/sys/times.h | 15 + .../cur/linux/include/sys/types.h | 46 + .../cur/linux/include/sys/utsname.h | 16 + 2/linux-0.11-lab/cur/linux/include/sys/wait.h | 23 + 2/linux-0.11-lab/cur/linux/include/termios.h | 228 ++++ 2/linux-0.11-lab/cur/linux/include/time.h | 42 + 2/linux-0.11-lab/cur/linux/include/unistd.h | 277 +++++ 2/linux-0.11-lab/cur/linux/include/utime.h | 13 + 2/linux-0.11-lab/cur/linux/init/main.c | 216 ++++ 2/linux-0.11-lab/cur/linux/init/main.c.rej | 12 + 2/linux-0.11-lab/cur/linux/init/main.o | Bin 0 -> 12208 bytes 2/linux-0.11-lab/cur/linux/kernel/Makefile | 83 ++ 2/linux-0.11-lab/cur/linux/kernel/asm.o | Bin 0 -> 1740 bytes 2/linux-0.11-lab/cur/linux/kernel/asm.s | 146 +++ .../cur/linux/kernel/blk_drv/Makefile | 58 + .../cur/linux/kernel/blk_drv/blk.h | 140 +++ .../cur/linux/kernel/blk_drv/blk_drv.a | Bin 0 -> 52196 bytes .../cur/linux/kernel/blk_drv/floppy.c | 463 +++++++ .../cur/linux/kernel/blk_drv/floppy.o | Bin 0 -> 16608 bytes .../cur/linux/kernel/blk_drv/hd.c | 351 ++++++ .../cur/linux/kernel/blk_drv/hd.o | Bin 0 -> 15516 bytes .../cur/linux/kernel/blk_drv/ll_rw_blk.c | 165 +++ .../cur/linux/kernel/blk_drv/ll_rw_blk.o | Bin 0 -> 8736 bytes .../cur/linux/kernel/blk_drv/ramdisk.c | 126 ++ .../cur/linux/kernel/blk_drv/ramdisk.o | Bin 0 -> 10660 bytes .../cur/linux/kernel/chr_drv/Makefile | 68 ++ .../cur/linux/kernel/chr_drv/chr_drv.a | Bin 0 -> 68886 bytes .../cur/linux/kernel/chr_drv/console.c | 710 +++++++++++ .../cur/linux/kernel/chr_drv/console.o | Bin 0 -> 20892 bytes .../cur/linux/kernel/chr_drv/keyboard.2.o | Bin 0 -> 6024 bytes .../cur/linux/kernel/chr_drv/keyboard.2.s | 466 +++++++ .../cur/linux/kernel/chr_drv/keyboard.S | 588 +++++++++ .../cur/linux/kernel/chr_drv/rs_io.o | Bin 0 -> 1320 bytes .../cur/linux/kernel/chr_drv/rs_io.s | 147 +++ .../cur/linux/kernel/chr_drv/serial.c | 59 + .../cur/linux/kernel/chr_drv/serial.o | Bin 0 -> 6748 bytes .../cur/linux/kernel/chr_drv/tty_io.c | 349 ++++++ .../cur/linux/kernel/chr_drv/tty_io.o | Bin 0 -> 22500 bytes .../cur/linux/kernel/chr_drv/tty_ioctl.c | 204 ++++ .../cur/linux/kernel/chr_drv/tty_ioctl.o | Bin 0 -> 10644 bytes 2/linux-0.11-lab/cur/linux/kernel/exit.c | 197 +++ 2/linux-0.11-lab/cur/linux/kernel/exit.o | Bin 0 -> 11160 bytes 2/linux-0.11-lab/cur/linux/kernel/fork.c | 148 +++ 2/linux-0.11-lab/cur/linux/kernel/fork.o | Bin 0 -> 9636 bytes 2/linux-0.11-lab/cur/linux/kernel/kernel.o | Bin 0 -> 88288 bytes .../cur/linux/kernel/math/Makefile | 43 + 2/linux-0.11-lab/cur/linux/kernel/math/math.a | Bin 0 -> 6624 bytes .../cur/linux/kernel/math/math_emulate.c | 42 + .../cur/linux/kernel/math/math_emulate.o | Bin 0 -> 6460 bytes 2/linux-0.11-lab/cur/linux/kernel/mktime.c | 58 + 2/linux-0.11-lab/cur/linux/kernel/mktime.o | Bin 0 -> 2868 bytes 2/linux-0.11-lab/cur/linux/kernel/panic.c | 24 + 2/linux-0.11-lab/cur/linux/kernel/panic.o | Bin 0 -> 5420 bytes 2/linux-0.11-lab/cur/linux/kernel/printk.c | 41 + 2/linux-0.11-lab/cur/linux/kernel/printk.o | Bin 0 -> 2420 bytes 2/linux-0.11-lab/cur/linux/kernel/sched.c | 412 +++++++ 2/linux-0.11-lab/cur/linux/kernel/sched.o | Bin 0 -> 23040 bytes 2/linux-0.11-lab/cur/linux/kernel/signal.c | 129 ++ 2/linux-0.11-lab/cur/linux/kernel/signal.o | Bin 0 -> 8956 bytes 2/linux-0.11-lab/cur/linux/kernel/sys.c | 443 +++++++ 2/linux-0.11-lab/cur/linux/kernel/sys.o | Bin 0 -> 17196 bytes .../cur/linux/kernel/system_call.o | Bin 0 -> 2640 bytes .../cur/linux/kernel/system_call.s | 298 +++++ .../cur/linux/kernel/system_call.s.rej | 14 + 2/linux-0.11-lab/cur/linux/kernel/traps.c | 208 ++++ 2/linux-0.11-lab/cur/linux/kernel/traps.o | Bin 0 -> 12968 bytes 2/linux-0.11-lab/cur/linux/kernel/vsprintf.c | 233 ++++ 2/linux-0.11-lab/cur/linux/kernel/vsprintf.o | Bin 0 -> 6152 bytes 2/linux-0.11-lab/cur/linux/lib/Makefile | 73 ++ 2/linux-0.11-lab/cur/linux/lib/_exit.c | 13 + 2/linux-0.11-lab/cur/linux/lib/_exit.o | Bin 0 -> 1988 bytes 2/linux-0.11-lab/cur/linux/lib/close.c | 10 + 2/linux-0.11-lab/cur/linux/lib/close.o | Bin 0 -> 2220 bytes 2/linux-0.11-lab/cur/linux/lib/ctype.c | 35 + 2/linux-0.11-lab/cur/linux/lib/ctype.o | Bin 0 -> 1904 bytes 2/linux-0.11-lab/cur/linux/lib/dup.c | 10 + 2/linux-0.11-lab/cur/linux/lib/dup.o | Bin 0 -> 2196 bytes 2/linux-0.11-lab/cur/linux/lib/errno.c | 7 + 2/linux-0.11-lab/cur/linux/lib/errno.o | Bin 0 -> 1468 bytes 2/linux-0.11-lab/cur/linux/lib/execve.c | 10 + 2/linux-0.11-lab/cur/linux/lib/execve.o | Bin 0 -> 2336 bytes 2/linux-0.11-lab/cur/linux/lib/lib.a | Bin 0 -> 34122 bytes 2/linux-0.11-lab/cur/linux/lib/malloc.c | 232 ++++ 2/linux-0.11-lab/cur/linux/lib/malloc.o | Bin 0 -> 4876 bytes 2/linux-0.11-lab/cur/linux/lib/open.c | 25 + 2/linux-0.11-lab/cur/linux/lib/open.o | Bin 0 -> 2364 bytes 2/linux-0.11-lab/cur/linux/lib/setsid.c | 10 + 2/linux-0.11-lab/cur/linux/lib/setsid.o | Bin 0 -> 2240 bytes 2/linux-0.11-lab/cur/linux/lib/string.c | 14 + 2/linux-0.11-lab/cur/linux/lib/string.o | Bin 0 -> 6376 bytes 2/linux-0.11-lab/cur/linux/lib/wait.c | 16 + 2/linux-0.11-lab/cur/linux/lib/wait.o | Bin 0 -> 2580 bytes 2/linux-0.11-lab/cur/linux/lib/write.c | 10 + 2/linux-0.11-lab/cur/linux/lib/write.o | Bin 0 -> 2372 bytes 2/linux-0.11-lab/cur/linux/mm/Makefile | 38 + 2/linux-0.11-lab/cur/linux/mm/memory.c | 468 +++++++ 2/linux-0.11-lab/cur/linux/mm/memory.c.rej | 12 + 2/linux-0.11-lab/cur/linux/mm/memory.o | Bin 0 -> 13824 bytes 2/linux-0.11-lab/cur/linux/mm/mm.o | Bin 0 -> 13950 bytes 2/linux-0.11-lab/cur/linux/mm/page.o | Bin 0 -> 640 bytes 2/linux-0.11-lab/cur/linux/mm/page.s | 40 + 2/linux-0.11-lab/cur/linux/new.patch | 11 + 2/linux-0.11-lab/cur/linux/oscomp_syscalls.md | 109 ++ 2/linux-0.11-lab/cur/linux/tools/build | Bin 0 -> 15140 bytes 2/linux-0.11-lab/cur/linux/tools/build.c | 171 +++ 2/linux-0.11-lab/cur/linux/tools/system | Bin 0 -> 295629 bytes 2/linux-0.11-lab/images/rootimage-0.11 | Bin 0 -> 10485760 bytes 2/linux-0.11-lab/images/rootimage-0.11.lock | 0 2/linux-0.11-lab/mygdb | 3 + 2/linux-0.11-lab/oscomp_syscalls.md | 109 ++ 2/linux-0.11-lab/run | 3 + 2/linux-0.11-lab/rundbg | 2 + 2/linux-0.11-lab/rungdb | 3 + 2/linux-0.11-lab/runtest | 3 + 412 files changed, 34224 insertions(+), 19 deletions(-) create mode 100644 2/linux-0.11-lab/0.gdb create mode 100644 2/linux-0.11-lab/0/README create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IAB create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IAD create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IMB create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IMD create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PFI create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PO create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PR create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PRI create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PS create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.SearchResults create mode 100644 2/linux-0.11-lab/0/Source-Insight/Linux-0.11.WK3 create mode 100644 2/linux-0.11-lab/0/linux/Image create mode 100644 2/linux-0.11-lab/0/linux/Image.bkp create mode 100644 2/linux-0.11-lab/0/linux/Makefile create mode 100644 2/linux-0.11-lab/0/linux/System.map create mode 100644 2/linux-0.11-lab/0/linux/System.map.2 create mode 100644 2/linux-0.11-lab/0/linux/boot/bootsect create mode 100644 2/linux-0.11-lab/0/linux/boot/bootsect.o create mode 100644 2/linux-0.11-lab/0/linux/boot/bootsect.s create mode 100644 2/linux-0.11-lab/0/linux/boot/head.o create mode 100644 2/linux-0.11-lab/0/linux/boot/head.s create mode 100644 2/linux-0.11-lab/0/linux/boot/setup create mode 100644 2/linux-0.11-lab/0/linux/boot/setup.o create mode 100644 2/linux-0.11-lab/0/linux/boot/setup.s create mode 100644 2/linux-0.11-lab/0/linux/execve2.patch create mode 100644 2/linux-0.11-lab/0/linux/fs/Makefile create mode 100644 2/linux-0.11-lab/0/linux/fs/bitmap.c create mode 100644 2/linux-0.11-lab/0/linux/fs/bitmap.o create mode 100644 2/linux-0.11-lab/0/linux/fs/block_dev.c create mode 100644 2/linux-0.11-lab/0/linux/fs/block_dev.o create mode 100644 2/linux-0.11-lab/0/linux/fs/buffer.c create mode 100644 2/linux-0.11-lab/0/linux/fs/buffer.o create mode 100644 2/linux-0.11-lab/0/linux/fs/char_dev.c create mode 100644 2/linux-0.11-lab/0/linux/fs/char_dev.o create mode 100644 2/linux-0.11-lab/0/linux/fs/exec.c create mode 100644 2/linux-0.11-lab/0/linux/fs/exec.o create mode 100644 2/linux-0.11-lab/0/linux/fs/fcntl.c create mode 100644 2/linux-0.11-lab/0/linux/fs/fcntl.o create mode 100644 2/linux-0.11-lab/0/linux/fs/file_dev.c create mode 100644 2/linux-0.11-lab/0/linux/fs/file_dev.o create mode 100644 2/linux-0.11-lab/0/linux/fs/file_table.c create mode 100644 2/linux-0.11-lab/0/linux/fs/file_table.o create mode 100644 2/linux-0.11-lab/0/linux/fs/fs.o create mode 100644 2/linux-0.11-lab/0/linux/fs/inode.c create mode 100644 2/linux-0.11-lab/0/linux/fs/inode.o create mode 100644 2/linux-0.11-lab/0/linux/fs/ioctl.c create mode 100644 2/linux-0.11-lab/0/linux/fs/ioctl.o create mode 100644 2/linux-0.11-lab/0/linux/fs/namei.c create mode 100644 2/linux-0.11-lab/0/linux/fs/namei.o create mode 100644 2/linux-0.11-lab/0/linux/fs/open.c create mode 100644 2/linux-0.11-lab/0/linux/fs/open.o create mode 100644 2/linux-0.11-lab/0/linux/fs/pipe.c create mode 100644 2/linux-0.11-lab/0/linux/fs/pipe.o create mode 100644 2/linux-0.11-lab/0/linux/fs/read_write.c create mode 100644 2/linux-0.11-lab/0/linux/fs/read_write.o create mode 100644 2/linux-0.11-lab/0/linux/fs/select.c create mode 100644 2/linux-0.11-lab/0/linux/fs/select.o create mode 100644 2/linux-0.11-lab/0/linux/fs/stat.c create mode 100644 2/linux-0.11-lab/0/linux/fs/stat.o create mode 100644 2/linux-0.11-lab/0/linux/fs/super.c create mode 100644 2/linux-0.11-lab/0/linux/fs/super.o create mode 100644 2/linux-0.11-lab/0/linux/fs/truncate.c create mode 100644 2/linux-0.11-lab/0/linux/fs/truncate.o create mode 100644 2/linux-0.11-lab/0/linux/include/a.out.h create mode 100644 2/linux-0.11-lab/0/linux/include/asm/io.h create mode 100644 2/linux-0.11-lab/0/linux/include/asm/memory.h create mode 100644 2/linux-0.11-lab/0/linux/include/asm/segment.h create mode 100644 2/linux-0.11-lab/0/linux/include/asm/system.h create mode 100644 2/linux-0.11-lab/0/linux/include/const.h create mode 100644 2/linux-0.11-lab/0/linux/include/ctype.h create mode 100644 2/linux-0.11-lab/0/linux/include/errno.h create mode 100644 2/linux-0.11-lab/0/linux/include/fcntl.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/config.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/fdreg.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/fs.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/hdreg.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/head.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/kernel.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/mm.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/sched.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/sys.h create mode 100644 2/linux-0.11-lab/0/linux/include/linux/tty.h create mode 100644 2/linux-0.11-lab/0/linux/include/new.h create mode 100644 2/linux-0.11-lab/0/linux/include/signal.h create mode 100644 2/linux-0.11-lab/0/linux/include/stdarg.h create mode 100644 2/linux-0.11-lab/0/linux/include/stddef.h create mode 100644 2/linux-0.11-lab/0/linux/include/string.h create mode 100644 2/linux-0.11-lab/0/linux/include/sys/stat.h create mode 100644 2/linux-0.11-lab/0/linux/include/sys/times.h create mode 100644 2/linux-0.11-lab/0/linux/include/sys/types.h create mode 100644 2/linux-0.11-lab/0/linux/include/sys/utsname.h create mode 100644 2/linux-0.11-lab/0/linux/include/sys/wait.h create mode 100644 2/linux-0.11-lab/0/linux/include/termios.h create mode 100644 2/linux-0.11-lab/0/linux/include/time.h rename unistd.h => 2/linux-0.11-lab/0/linux/include/unistd.h (97%) create mode 100644 2/linux-0.11-lab/0/linux/include/utime.h create mode 100644 2/linux-0.11-lab/0/linux/init/main.c create mode 100644 2/linux-0.11-lab/0/linux/init/main.c.rej create mode 100644 2/linux-0.11-lab/0/linux/init/main.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/Makefile create mode 100644 2/linux-0.11-lab/0/linux/kernel/asm.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/asm.s create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/Makefile create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/blk.h create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/blk_drv.a create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/ll_rw_blk.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/ll_rw_blk.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/ramdisk.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/blk_drv/ramdisk.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/Makefile create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/chr_drv.a create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/console.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/console.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.2.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.2.s create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.S create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/rs_io.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/rs_io.s create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/serial.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/serial.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_io.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_io.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_ioctl.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_ioctl.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/exit.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/exit.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/fork.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/fork.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/kernel.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/math/Makefile create mode 100644 2/linux-0.11-lab/0/linux/kernel/math/math.a create mode 100644 2/linux-0.11-lab/0/linux/kernel/math/math_emulate.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/math/math_emulate.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/mktime.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/mktime.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/panic.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/panic.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/printk.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/printk.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/sched.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/sched.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/signal.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/signal.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/sys.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/sys.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/system_call.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/system_call.s create mode 100644 2/linux-0.11-lab/0/linux/kernel/system_call.s.rej create mode 100644 2/linux-0.11-lab/0/linux/kernel/traps.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/traps.o create mode 100644 2/linux-0.11-lab/0/linux/kernel/vsprintf.c create mode 100644 2/linux-0.11-lab/0/linux/kernel/vsprintf.o create mode 100644 2/linux-0.11-lab/0/linux/lib/Makefile create mode 100644 2/linux-0.11-lab/0/linux/lib/_exit.c create mode 100644 2/linux-0.11-lab/0/linux/lib/_exit.o create mode 100644 2/linux-0.11-lab/0/linux/lib/close.c create mode 100644 2/linux-0.11-lab/0/linux/lib/close.o create mode 100644 2/linux-0.11-lab/0/linux/lib/ctype.c create mode 100644 2/linux-0.11-lab/0/linux/lib/ctype.o create mode 100644 2/linux-0.11-lab/0/linux/lib/dup.c create mode 100644 2/linux-0.11-lab/0/linux/lib/dup.o create mode 100644 2/linux-0.11-lab/0/linux/lib/errno.c create mode 100644 2/linux-0.11-lab/0/linux/lib/errno.o create mode 100644 2/linux-0.11-lab/0/linux/lib/execve.c create mode 100644 2/linux-0.11-lab/0/linux/lib/execve.o create mode 100644 2/linux-0.11-lab/0/linux/lib/lib.a create mode 100644 2/linux-0.11-lab/0/linux/lib/malloc.c create mode 100644 2/linux-0.11-lab/0/linux/lib/malloc.o create mode 100644 2/linux-0.11-lab/0/linux/lib/open.c create mode 100644 2/linux-0.11-lab/0/linux/lib/open.o create mode 100644 2/linux-0.11-lab/0/linux/lib/setsid.c create mode 100644 2/linux-0.11-lab/0/linux/lib/setsid.o create mode 100644 2/linux-0.11-lab/0/linux/lib/string.c create mode 100644 2/linux-0.11-lab/0/linux/lib/string.o create mode 100644 2/linux-0.11-lab/0/linux/lib/wait.c create mode 100644 2/linux-0.11-lab/0/linux/lib/wait.o create mode 100644 2/linux-0.11-lab/0/linux/lib/write.c create mode 100644 2/linux-0.11-lab/0/linux/lib/write.o create mode 100644 2/linux-0.11-lab/0/linux/mm/Makefile create mode 100644 2/linux-0.11-lab/0/linux/mm/memory.c create mode 100644 2/linux-0.11-lab/0/linux/mm/memory.c.rej create mode 100644 2/linux-0.11-lab/0/linux/mm/memory.o create mode 100644 2/linux-0.11-lab/0/linux/mm/mm.o create mode 100644 2/linux-0.11-lab/0/linux/mm/page.o create mode 100644 2/linux-0.11-lab/0/linux/mm/page.s create mode 100644 2/linux-0.11-lab/0/linux/new.patch create mode 100644 2/linux-0.11-lab/0/linux/oscomp_syscalls.md create mode 100644 2/linux-0.11-lab/0/linux/tools/build create mode 100644 2/linux-0.11-lab/0/linux/tools/build.c create mode 100644 2/linux-0.11-lab/0/linux/tools/system create mode 100644 2/linux-0.11-lab/b/clone.c create mode 100644 2/linux-0.11-lab/b/echo.c create mode 100644 2/linux-0.11-lab/b/execve.c create mode 100644 2/linux-0.11-lab/b/execve2.c create mode 100644 2/linux-0.11-lab/b/getcwd.c create mode 100644 2/linux-0.11-lab/b/getdents.c create mode 100644 2/linux-0.11-lab/b/mmap.c create mode 100644 2/linux-0.11-lab/b/munmap.c create mode 100644 2/linux-0.11-lab/b/pipe.c create mode 100644 2/linux-0.11-lab/b/sleep.c create mode 100644 2/linux-0.11-lab/bochsout.txt create mode 100644 2/linux-0.11-lab/conf/0.11-gdbstub.bxrc create mode 100644 2/linux-0.11-lab/conf/0.11.bxrc create mode 100644 2/linux-0.11-lab/cur/README create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IAB create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IAD create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IMB create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IMD create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PFI create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PO create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PR create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PRI create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PS create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.SearchResults create mode 100644 2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.WK3 create mode 100644 2/linux-0.11-lab/cur/linux/Image create mode 100644 2/linux-0.11-lab/cur/linux/Image.bkp create mode 100644 2/linux-0.11-lab/cur/linux/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/System.map create mode 100644 2/linux-0.11-lab/cur/linux/System.map.2 create mode 100644 2/linux-0.11-lab/cur/linux/boot/bootsect create mode 100644 2/linux-0.11-lab/cur/linux/boot/bootsect.o create mode 100644 2/linux-0.11-lab/cur/linux/boot/bootsect.s create mode 100644 2/linux-0.11-lab/cur/linux/boot/head.o create mode 100644 2/linux-0.11-lab/cur/linux/boot/head.s create mode 100644 2/linux-0.11-lab/cur/linux/boot/setup create mode 100644 2/linux-0.11-lab/cur/linux/boot/setup.o create mode 100644 2/linux-0.11-lab/cur/linux/boot/setup.s create mode 100644 2/linux-0.11-lab/cur/linux/execve2.patch create mode 100644 2/linux-0.11-lab/cur/linux/fs/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/fs/bitmap.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/bitmap.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/block_dev.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/block_dev.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/buffer.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/buffer.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/char_dev.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/char_dev.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/exec.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/exec.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/fcntl.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/fcntl.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/file_dev.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/file_dev.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/file_table.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/file_table.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/fs.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/inode.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/inode.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/ioctl.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/ioctl.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/namei.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/namei.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/open.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/open.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/pipe.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/pipe.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/read_write.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/read_write.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/select.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/select.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/stat.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/stat.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/super.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/super.o create mode 100644 2/linux-0.11-lab/cur/linux/fs/truncate.c create mode 100644 2/linux-0.11-lab/cur/linux/fs/truncate.o create mode 100644 2/linux-0.11-lab/cur/linux/include/a.out.h create mode 100644 2/linux-0.11-lab/cur/linux/include/asm/io.h create mode 100644 2/linux-0.11-lab/cur/linux/include/asm/memory.h create mode 100644 2/linux-0.11-lab/cur/linux/include/asm/segment.h create mode 100644 2/linux-0.11-lab/cur/linux/include/asm/system.h create mode 100644 2/linux-0.11-lab/cur/linux/include/const.h create mode 100644 2/linux-0.11-lab/cur/linux/include/ctype.h create mode 100644 2/linux-0.11-lab/cur/linux/include/errno.h create mode 100644 2/linux-0.11-lab/cur/linux/include/fcntl.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/config.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/fdreg.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/fs.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/hdreg.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/head.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/kernel.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/mm.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/sched.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/sys.h create mode 100644 2/linux-0.11-lab/cur/linux/include/linux/tty.h create mode 100644 2/linux-0.11-lab/cur/linux/include/new.h create mode 100644 2/linux-0.11-lab/cur/linux/include/signal.h create mode 100644 2/linux-0.11-lab/cur/linux/include/stdarg.h create mode 100644 2/linux-0.11-lab/cur/linux/include/stddef.h create mode 100644 2/linux-0.11-lab/cur/linux/include/string.h create mode 100644 2/linux-0.11-lab/cur/linux/include/sys/stat.h create mode 100644 2/linux-0.11-lab/cur/linux/include/sys/times.h create mode 100644 2/linux-0.11-lab/cur/linux/include/sys/types.h create mode 100644 2/linux-0.11-lab/cur/linux/include/sys/utsname.h create mode 100644 2/linux-0.11-lab/cur/linux/include/sys/wait.h create mode 100644 2/linux-0.11-lab/cur/linux/include/termios.h create mode 100644 2/linux-0.11-lab/cur/linux/include/time.h create mode 100644 2/linux-0.11-lab/cur/linux/include/unistd.h create mode 100644 2/linux-0.11-lab/cur/linux/include/utime.h create mode 100644 2/linux-0.11-lab/cur/linux/init/main.c create mode 100644 2/linux-0.11-lab/cur/linux/init/main.c.rej create mode 100644 2/linux-0.11-lab/cur/linux/init/main.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/kernel/asm.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/asm.s create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk.h create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk_drv.a create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/ll_rw_blk.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/ll_rw_blk.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/ramdisk.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/blk_drv/ramdisk.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/chr_drv.a create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.2.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.2.s create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.S create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/rs_io.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/rs_io.s create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/serial.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/serial.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_io.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_io.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_ioctl.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_ioctl.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/exit.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/exit.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/fork.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/fork.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/kernel.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/math/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/kernel/math/math.a create mode 100644 2/linux-0.11-lab/cur/linux/kernel/math/math_emulate.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/math/math_emulate.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/mktime.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/mktime.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/panic.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/panic.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/printk.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/printk.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/sched.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/sched.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/signal.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/signal.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/sys.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/sys.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/system_call.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/system_call.s create mode 100644 2/linux-0.11-lab/cur/linux/kernel/system_call.s.rej create mode 100644 2/linux-0.11-lab/cur/linux/kernel/traps.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/traps.o create mode 100644 2/linux-0.11-lab/cur/linux/kernel/vsprintf.c create mode 100644 2/linux-0.11-lab/cur/linux/kernel/vsprintf.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/lib/_exit.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/_exit.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/close.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/close.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/ctype.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/ctype.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/dup.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/dup.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/errno.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/errno.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/execve.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/execve.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/lib.a create mode 100644 2/linux-0.11-lab/cur/linux/lib/malloc.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/malloc.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/open.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/open.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/setsid.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/setsid.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/string.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/string.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/wait.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/wait.o create mode 100644 2/linux-0.11-lab/cur/linux/lib/write.c create mode 100644 2/linux-0.11-lab/cur/linux/lib/write.o create mode 100644 2/linux-0.11-lab/cur/linux/mm/Makefile create mode 100644 2/linux-0.11-lab/cur/linux/mm/memory.c create mode 100644 2/linux-0.11-lab/cur/linux/mm/memory.c.rej create mode 100644 2/linux-0.11-lab/cur/linux/mm/memory.o create mode 100644 2/linux-0.11-lab/cur/linux/mm/mm.o create mode 100644 2/linux-0.11-lab/cur/linux/mm/page.o create mode 100644 2/linux-0.11-lab/cur/linux/mm/page.s create mode 100644 2/linux-0.11-lab/cur/linux/new.patch create mode 100644 2/linux-0.11-lab/cur/linux/oscomp_syscalls.md create mode 100644 2/linux-0.11-lab/cur/linux/tools/build create mode 100644 2/linux-0.11-lab/cur/linux/tools/build.c create mode 100644 2/linux-0.11-lab/cur/linux/tools/system create mode 100644 2/linux-0.11-lab/images/rootimage-0.11 create mode 100644 2/linux-0.11-lab/images/rootimage-0.11.lock create mode 100644 2/linux-0.11-lab/mygdb create mode 100644 2/linux-0.11-lab/oscomp_syscalls.md create mode 100644 2/linux-0.11-lab/run create mode 100644 2/linux-0.11-lab/rundbg create mode 100644 2/linux-0.11-lab/rungdb create mode 100644 2/linux-0.11-lab/runtest diff --git a/2/linux-0.11-lab/0.gdb b/2/linux-0.11-lab/0.gdb new file mode 100644 index 0000000..6c2dbf1 --- /dev/null +++ b/2/linux-0.11-lab/0.gdb @@ -0,0 +1,5 @@ +target remote localhost:1234 +handle SIGSEGV nostop noprint ignore +b main +display current->pid +c diff --git a/2/linux-0.11-lab/0/README b/2/linux-0.11-lab/0/README new file mode 100644 index 0000000..2e56a37 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IAB b/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.IAB new file mode 100644 index 0000000000000000000000000000000000000000..27c23b6e1f3379c54bfea8c6c805c76fa235fa7c GIT binary patch literal 102400 zcmeFa36!KoweK4}&&@300F4aFOgA8i16F5cbthdDnOO)5w%JwL)oE8{7MWjmcePV; zJbI3z;)tjy%^)Z;ii(OTIFC5XBnrq3ihzoU!2R$2#Xlpyz3zGMyu0pt_pP@&*V3*Z zd&l_296KTw&T`8felwlxRNP#*#PElg#PX@?IflcSMX~>L z-A@ePWcb$^o_4opxZ1um!_)3=!*81xhrcCx@r-Qv`y2l7Y-9?4vyneND~sjbUCbr7 z<6JkRE6?TJPIFWLR3H3)xSr#7b&H|YGdfyzOH%jbTNdEI;77i8X4ik$lgkav2>Knk zPi_tR$`>pU*R#aE@{g9J=}Y}fYGiz0R~b!eJ0m`e-HJ3lV`Hu}FAZPg3x3HwN#I^x z`B8Hu?YnjPwJuHHt`6aijWx+ye!#CYax&$odie{zdotyTaZjfFeG9VTlPUk&ysVr| z`3*)+ru^uIS@&ehkMVNG|G58xssAb?CsV%C%lGs7(P#9@)Gru0neu)kCsRIbmzIB&PbcMbW~e`|XQI-) z$=83CM-2C_0=_NOFV%ko>cb2-FRh=DUpWtmpVqJb!m6u$c_M#qaa4aNHdoGFEKRGn zAFij~sDEm48b8!Gte?`HU|^Rn?{`^fmc z-RBp1UR?i%og+*B_kb50IoZqeJ7wifGUdA(IoZq0Uy0kt;ooHveox59yXi^YkGuIkKICR7Pn{mPADDyY9Y5rc zxZl)5>6qo_r{O2g{c?U(9+TSSW3!^~0sa$O{~0JU>VMLxT|QsD^4~LQOn$`ouaLW* zWO|B>{BRZU$Bmp!`8FdbQ+~>#H2<_dY^v1iizM_}4)xphfIlUX!%yq`$vRG8|LrPk z*R_z{5sy_6`Iwu?oQSJ+coy+w1=TC!*7W=gCslNBkvwTGipCS`5VfU-KM{>b*174a z^9_GH8h?m;mTxIv>)e*)nuTe4<$J6=!d1T*^Kw`HQp_t{^~*6I>8ekM_NBA3GP;p0 z`MnOjBQk8JTO=PD@-ep>e@Kxe?;*tjKd@Wb(>t)IOWRBG^NsukM*iI_4}KuDR|v0F z{a|RXls|+IAf-*y3;CCg{-91rzurlY|;GAy$cUI zUtYbuP4@B{{nz*v2D|=~Px9Ya-PaPw@f8_Wa9R4rkpGakjDBL|ZNu-4+Bka_4s#zdr_CK0MCXT{;B+{_;*e^o>u-__#PS7{6Tmh_x*#qZ?9kf z3B#W>e6Hb78UD24^9*k@e7@le3|}}a?JpR=17@e+OY;NqJu&33TM51()Q1dfdLjQj z^2hgoD&Kh)5I_32i*Mh_yBa=zR@(nke!TylCZ@LOg}l+T(GxgY84TjbjZ zm4g?X^!+(*FGfnId^B!Pz$YPNy#Jk*?bh_8LEo)}{L@i?x)PQ7So8<8+zt|-&dTYe z`Z1s1nm=pTO`MbA(FV&$Dj%z`e0Z+1e0Z+0e55?lVEIV7Uj2tDk7SjjJl-ZBT2qvk z=O?g4Apb?bKji-~eAa>}KOz6APp|6t59O|y-|b)BO7Oq?_JDG>59E)|(xB4s1^+Jb zKFD-v8Uq1`uHIe2>5xfM+$XkmdJK@L%N@!GGVLD??Am z?+B)|velA#gw7{4{iPCm&a}PP?@=oC?B&}d@+bXxPScP14q5XDe1VaZDc?LNtv~8t zdvxQLIca?Kdqzz8w3m~&8h*3kw-|nFrvDq=_%;*%+l_w5@EP8{rWf&h56bV%w0}VV z72>by120_EZBIKZNBZ2T|9(iH@?%E+w?*CbqkmfO$ndYT4!kK^pAk8k@~uWrru-I^ zCQ(WAZ~gi^WcZ{14fPNG{k`~mre9AHo*(zW;2qKXOZiE^&-(R0j{6Vv$LtU2|JlC1 zC$qki*?*GRf0EgMlG%Tf*?*GRf0DP4ue$YJzwiIo##hU*pddw1>jTDD2P)6%^7)I> z_J?w=XOb`U>zU+Z{|}GXPDXz)%Pp1q)#r_;>ZFXVl?p0jrvA8-z--|MC4q~SMQel2)@+8%a#8?J@* ze((z^cX{v}wL0V* zyf4e{LBmffr|VS+ukz2V{K$Vr^LL5Qb6I)9{PyvmnB()`b7Ov%Ym2hnUJ8~j!s|D& zzZR#r!SCzkwb5+&{g_X>d9(MY`}$ERKlA1vMxOo<@_*L+-N{3j>v*dhUiC}hxo&UD ztJnJVQXgLRhPXTo6&?0#GzMBe!PrmL^=C5k2kd$q?RD6X>&~Zy4~f<@$EGIS{?YiT zx0vr=vJ{00KZNguG2hbhm2$JT=>?0^@X0TV_7i#`-z(am=q(mb!ul!W>qOq~+q=~N z!bt}sc2ZmD-^0Our?+^bdo0>->}|GcKacaHghABFrPxGr(bX#IB7ah}!_QLhHCnw3$=!}8iEq|or*-meJ$~D4#UimD)->LpXex~Y6 zi-Pv1J+-2q)nD=ctp1AgLwn$QM~3^J_2V~bzw(tWjx6b`f}e@y>!!M_a`4j``IauH z@-6PcD8KW$oO{UdFQWX;=kl%?tzYJItB0_@rtP16KVhyvk~w~nY*@FpUgi2w%2Um4 zem+Y^ee15ruUp%m;`&f3-(0yP+CLw~r~HHAyA1!)@V$obH~gUChYkP9@S}zwGyH_% zrwl)B_!+|&`uPXa-x(f&lPr|9mC`q$j3o4nufZP9!I#jX60*nO|d-4*m* zZv8~%0mI+*{kznM+^QbO`Hs}r+=fbxEahbs{CoT>wa?4zhd?kBGh`{B(64_cS|1Vq zUbLPfd>SgQ?DtWBZyBG>UMlrj-5-Y1Khy8WLBF{u&QI`7VLZ~wt?ns)GWAOQ>xll( z{PqbE za6gEQCFEri0-5_4WbR*(57MC=^&6uH`ueVNte+-ve83lk{>A0`hw_z~-SM`|O*C3( z8NLwdo9)*tM7|*Q5B!U;o}}*Yj?)Wy%lJoqZ7(3dH^irt8*uKEQGcBq=yexH>rJ`I zu`X+S3@(NK5blRcv~NNBl?$`G?Wyt!e!YY8@5kW{_2z$S__scNSm)~G8e`Sl3_oc2 z@;E;5kM=Ga9(Y+a|H(Bb+_`c4I@DkKMyP)d^7h`*`dV&iVBp*kKPUXXX#ARM)ZOr_*2fxOh*X3$xFX7){-%qk!YWwf4?fKAPc?~@B`)i0_J$VOsmRp$C zPw)>T`-5Dgv2h9N%bu>7_6OjTLj2%%ZJKW_M!aeaiGjBInG;A^m6 zG9z7Y?&PMN`&ZEK^f4(rWd^>XBo%N6rI3*+_z z@;}Dy1GpCf&2~CpQ}^7TQumN^e~7$G7$0?V#likv!}v(~2qRx^zV$4)$nzOcVFD?{~gjdHAmNXcGvby_?2L3GU?x|!BQf~To01=O!Rk`_6Xxy z%AXI8-M++UW~pd@NPFtN&6z|EK$-ReyoDr=tIIW!<0F_^kHK z{22)A8!9iVJhhh;_a*N?^@p?HZ>ngxWVmd2#4!4YxV%iEf5K@e}(iWV>M#3Xj&uJ4%^LZ?PG8+kl%n+ua6*>)y}s_;MSlHbzf`|H70u`S8VyHQeekcN z`A1))>2}xE7wxY)!k2sd7mXkIrG7n!{HD;Ki~h#Z*=lT*Km+gtEc@qDyga<>M3m&1PGZSi=de9ADs&oV?U9UnkW*7$;d8~j)ITSNcT z$&D1j z<3ZlZZ60%E{eIx{eE#eB7n76ENBi5k>4`3@KKQb@Jb>5!7fgMwUns8~9p(B3nd=i^ zH@bFoJ=Z75cl-V*<=XlO4gWF26YC!`d{35Z4;#KW!;STi7=C+LUvRyZu`x79n%`2t zdn-w0S@_F!wL&LN6{_szz znClT5pXx;Q-5R@vY5c&*$B>`Z*65Aien$NV^ZXH+_Q2%t#QR6kM}Ms$XnuoveuIqu zThmKE-sr!^$a@U){0H6VjJ((I8sk6DchLQS(H}HCWZd)o2i>1&^l3k#-ZwI=M%>MljgtoFClCBt+tZC z`|_B|H#u@D-{hV$ax&!$@b%|nJ(BLvjMis+^C!6vg!xIQx4OywI`n_aolxJEX>X9G zZ13gf2j8K>H34nF}{iQ6P&M! z^^+fD^^?=G`fZ%giS^q{{CvTO-~N$rA0@w56?)wzQUAHBHs&6P+B0FCU+A`v!jBui zE*dY2oGjmK9E{*O|Lm+99C44t`k4QcRlns{oEp;8S(PNyZwcv9{(eZm@-L(QVs(!z z{xQp^JQ&jFR#)m{`z+~x-_GhvYr`Rayoc|te5m0S$W8e=l3$`9tsi$*_mozD-p}VK ze{pb+@LC)8HGI&Lw11HDCGxw%_`9<@cS^tIub?#g_0dkDKIU!<`+2S~*qc8%%3pA? zAk!86BtC`u`o``{!}k;3!|&8=?;^v`GtBuu_4n~|Y5&CkeGMOg3N#bzKh($hQMOO2e*L2c1Q$DUdQ|+51{7+=cQ=!cD0_q>2xsjef6aC{Lko8)| z|NV$B_j^SCAo6P_*7r3(!RIKa^J$UaAGJ4ydc#HgC&>RHw+>}_ewsc9`Pc+_9_%X+ ztn%sjV;0u;$gPmyDsMv|O&;Q>yjc_x8|q_xjri@<-Fj1Wrn|C{QH&hZ%-rN zs_{+N)5ZVyfMp2?|7dtQqrc71Z#6!M|Gzs_PW&W3(!Y{LF8wK48lf@B-znLTALZ{d z?#Wh8_y1ws|EG6PeKO-iru%mr_wO<8$#hSq`!kLE_Zs(Px+l~9`;7bd8~0?oC)52| z#{CDpd+L*!A7r}!pmF~p6F!;#k?H=!#{EZ3_+*Apru&bE_C(9a*@i!6_{y;V+v)A= zch`pTfa@*vtb+ZXmM1B%y|wWg?IXxyf5rZ?w^ko}0Y)FO{o{+l^W1?_-eKR@bVq>~ zM*RI~{2=y`e=*GSBS^2>PkuhEkE(x{`SH2R;s51^e;$w5A*cN}<3syzGVLG8=)bz- zF^T`r;`uJ@BWaI}?9`P|I3{qOXG*Px(9 z_LCFi;K+W`9ft8@WH0HKgCl#&>Z|9c{kw+WaPBqpGxn6-^Auh_!Tm$eb?zT}Zg9QA zbCc(zJ-3;D&$Yzo2i9e^ORuN=Ee>T9sCbYJ)5FYkWh8yK%d z_La%^bo>(RFR{M^AG|#v>?yfks^t;P^-yvpXUIuZunA z;;jCPd$am0J{Q^-wa0ueN}t$ck|lj&kBP=Y^GDjtJnS#YDhJQV$hUMkm2Yt$i}G9S zG0!o4Yn0z&kBRvJ$4ectzkG4DzbuUT0p)6+xnGbg?{DM>82L+#9Q#GfB*&$Ei2nx~ z`9VfLGfwa57Dv|ff@j6@v09f^4xXKnZ|QO>-{R&3xy!>|kPNx2f_cA$evef>j^|^^ z+)p5X&-ag>b39MrdEhtk_s4<-S>pqq8{*T+*QOj<<={JzaWdYQ`j?-aN;tmI`~?3d zvOg609^PI^^#_K_dwP2z@=e~JPTfPk747Am**afR|6dJ7&S%8GU!eWteKW!zR!;5Z z@{{d}AN%yfStmc(>lQ@yA&>QhMbY_wVcx%@`rtQ5^-0`w|Aq25MD?k^u(J3L!(a9F zU(zG;W5Rq~x#Y)tly8pC_lkbma4oFgy8hZ^?VXWmwA31oZ#IxPP~CPo{e^ z-M`nk|5C_54eu+4VLzz#mHxfNx6kM=RG&=$|0$DE{3L(-YxU~PX#6HD`>!%$rTo2y z&k5xn`8$}u*6&xQ`BSg%g8qEIJC^P@z9@{ZJJ4TqO3bzT#@T*9TlzPIzi~QRj}z{V z)^GZ2tzgE<*g8&8-RULkG~%T<)t&w*i z@g11j;+jFfBmCWHy-@fmzyB`r8LUiJpC7p&>>0?jyo>+B9X~&j_z0h2_}>iwz~{e| zXVKpe`Mt!g()K~Z<9RIj=Y;Fgd|No~4^Z9QHBo)Sa$o;?xRd)MG=A01ZUQXpA!M#E zkg-3lD>mePupT5uLem5HPsaIC-I5#@tuGCNXNUZ8gR6=|m;3cpaWCz~6^3cgsO>A{ z+&?7qz6UbapL7IA|E}@nmHhQkel@&vklvZz{$0Xncv63=^|7^VpU4cK%=nWTe=_HH z2;b!g%SGOQr(92(2V!)&B&|O#4@Tr!UzIr@q(0|^WX=c4@AmuqQa>fUGY!8kjQ5cK zO;dk}#|uL_M|*SmzWJd(M|*QJ?aje1U+gK--keN(Y>iK|(&GJv;7-0+bRP-dUzy_> z%0KSq8Xoj7Hu|46{AJJj{h@zARK5}3;CVqG@huL~o->VKv%&c!ne#Etzh<++`4#zM z?GICX&phOxiN9CG`u)K#^ZkwbkMK`7@tGHo2QVHc!+ocU@$dYMyw>GZUULgF@~JMT z@+r44D?ftla%9oS9eEH(6dfNc&5P&!NsO z>oVd)*7SjCAHJWIZ}6=lKak$Q(05fZ*B7)rfR}{vkm}zT##73pVgDKa*OHt4dUBfH zTCy~_S2^vywLU-}_GHX|m2*7<;VZW#Vt#%k{&W3;a;_hcdA^O|b3RQu!%x#&OJ3sh zQ}s_SyVr;LX(ta}~WU=kF4~zDj%Iil{sbpAGj5-3wCpqxB>{pVyZg zEbkD$kL!aR_OtvR%AW}F>-3Gb99h#3=J^N7zrJ2qrag}5JndUN_i(+@v*Y>&`G=u> z6#pFTRkgf(dGC+2+ynd7Sia_`SuVkzHJ0aomgO?nXQX`ejk(e91i90M^lvo$EyLe7{2jyJ4fbvt-jdLM zclrwb`FF?P7yKT>XBz%p{Jm=vQ)K<#;Ma%s9fVgOJJq*8Y5MA8_iEip?+X(-#}AZq zenGq|GisS z4^Vq=)_09B?7Oj_xeP&}PNKYk4>tO24=6v>=&vyPY%i#Pl+oW3`Zw4QSH@XhH2vU< z{QL>-#lCp-GlnlVe2L-D8m2vw_iqaJ2HGBwe{J};hCdSK1D&B_Vbw; z{1EpaH}X#y{-j}^|DpTKXUNw|?Ky{PPF* z5+`jUAp?XZv-DC z-ESBD&w}Ts_Y11~OTqrUlrrxpV0gTrfP5qLrTu1j--*t5ivK73_8t9;lG`ybj>Y>1pw_A-ce^`a^qV<&O3>nqQ;M>IuIFKW*6~qixHeV&9C(3yNmu@a{~nS)Ij_O<)rg<+56pRz9~nO0 z+auEbsZse5|F~a=_^5wJ`}ENNW5CkHk&%8RD4dt!d2Y&S|4H5t?U%S9?{DIF0OVr7 zLOIsw(DkP4;}Sodf8qQ?<9DFpgA5;R825E#+#hQAFvEu%M*FMZkMVnz#y7R+koff| zhx0eXo|)ex=KRg;RG!+mi2K)j|Ea$t`F{)MdW!RJNov7CQ7RUD$llk)pNI}fuaT3-_Rj!}J+ z^DsCM$M!|f$9yH!FV~0jFrUiAr{&0Ld|K|DIQ~Znk{T2Dwnj2|px`GhyCha(S9i8ZkgeI4If~b_l;@%;r9gD=+ds_}7sVDz6Fp2l~izaRbQGAYsIUx)py zP9Nm2fnX-$qxs#Qn7F~0U*w-#zjn02@qEhbC)hrCuCu;*p5pv4SLF7CSBK2Pw=Rx&*P@nICkXIS^tBpS22ciB6MxXJQ{2PzL zCqFNmf2_*o9PdAn`o5~S?0DXY{KIJcB=R2_ru_@@$E~W?tK0ne9qyI?f`7ezLkITr z-ThegAAA@7kRc11_Fm-8D9>zP#Xa|HDgSNMev157!?zh`dr9}aPoMlje}6ssLpr`u z`wWf$N2C2M3GZy9PkRfxXM00tdqZY>LuPwJ#{Me`Olm(P;qiV$%6Y#bnfDu#FN)e5 zagX!Z%kW9M`Hl0~86L%lq&=|cZvgxI9yI;j&!+$EAIQHA{<&58a_(lsyF~35{I5O| zwO_*WfP^0}p!_7&U5);qjQ%>Ke`&NHhVc77Z+N$?f8&47`ZqqB^>6%nM*mTxe@WEd zBEI97Wy9;=J?nldny*Uwraqf>KedO^e=Hl`)L1rtQ?MWAd`p)UL=02dz^dNFdk6R`3Ty3oJXmTu{~9NoKNBV15*Fwyb905k^dQuXGPBTlJ1v= z@wA?oc~Yu-ntyu!D-S=N$_`)pbE;9U?ESFD<#@DOITrz-w#NJW!XUvTi!}^vh7~SV6`Zs$2;h!s2$0xrP!c)Fk$Jcs)tupWbq(0Z{dq%5{ij9eYr$2VcjJ7x1MZ&Z_U_#qjl7cOv2|Il zk7hX;gGaKS>HTX@X2W;&tiIg;7{@1R`tPaVs~7jP7*2fpDSsydk}9E$^qr-gj^B~K zEuRSG!>z`C%7Jlx=q(N%6xRpv*?#>&{i{~SJ{GkvtHHd#hjO0xCV#@{(>|PX-d9cL zebr>nH_5#3k<9rg`Fs=J1%~hR_D?dtl=zdSecJ%WdYiTn>R-O67wc`yBuB}#-=O;| z{r6({Wcv5xkl&rv@bAg!{JMlsrasqm=s%fqmPg9Tlym%x_&5n~Uq2ouFJ9Vh|2nG+ zt5!$%vnu~KviA^qE{<=b-8?6}zt$-ndF(N~PeIDJF!v+L+&?07J%!Bm4DzRae?>me z@HWFcg#JUrCrf_R5FgrusDHh#4ErSQk0t*Ky(LF`M)`h)^{&eKA^EPzKCsZYvj6T3 z=T`qQ!@Y%jGF<56{SA`;1=x@B{s!{B8U6mj`vP|geFNqD1G_?BF@Ke3jo+$4_Z45h zH9dHr;b31L$%hzT;qRA5ez?NqWaG%lUR(Gm!-od<&~LOq8QKe+k8>mEhW0|(eJacO z`O$h$p}x*7i0)q!UTEZh2=Rk|Imh~`-w%9i7;meb>r*CKxl&tb$OV_K_J?|%Ae0vd)xL|npJS*4#Dd%{F%=-lB-@PcU@p)F>H=+59 z^xls2aeZ9U&-Xkf8io2q?YD9Ji1V%g9?c(c{?hHA`Tqa+=UwkW!14J~u5Tc|2(K}Q z^ZOj1DgOofv=0~g33eDAIoihnZ^+AOz+K;bxq^vdiIc zGTZM?sob+NAMQJIrKB=SMtBa(%cK7c_n)YI&tPAy%=wGvFZ4NI(eDAq`JZlihW}08 z_vhu!%6t@W{K#X5Umu;P7WX)>#r{CTZ~kZK4;|7|#C@F_p42Cm2m5s8cN@lff+V#Y zKGVned@0y3tNVrzpZ=c_?*CW$RSUxTZwVhBch7?h@1D)SZhCxvH|ak)y^k|}Ul#6@ z8+E-ewKotxDwKzg@JFKY4f3OWW2g`Ey~{r_{8Picp91Mu{RfPk_tR6(_W{U{82xf6 zpBle?u^%l{Qq@O%SAhL{c#?k!?du?y?^(Xj&tJ8Cf$ul`fZ+!XKV>vJSpnerJkvf~Hb&x86K?w@!HJTpDtq~+nRsD4QLUTxC9Hq0koVQ_flX{2+8w@)k7 zTh+7BJJ6m(81{JhrT4!H^E@@mbEi;Gj*QL^A^fCzWf(6j!#*z>|6o7QpC3=_LsC7~ zFwZ}y`I%H{Z$f?An^690wZ};9^CbKnnD%_}JBqv$ z%9qN|fLyw8^$+q7seWo-Ao@Ii54kJUH&uB4o(%guu79fhbB3RRJHLOaa@G$7qs;n2 z-YGR*a>|X-WaqG6?m8TE3wFK-51J zimQqbW_YOlP=-fJ4`=wbCqH8NPloS}*BeT1;=Zu{(J5dtocDboy`2Ka$Gq>O%QMpU zPV=Kxnc({|Je*0-RP#?+Zagi1UM+%4e{!Hs* zt3Ac{b<*(LQ~%27pH$|1JE?rj*fX*GwX2HHW_YOlT!u$VFka+*#T8CoRh*IGp)%%Y zk$j}Y@rd?UYby!IBPowII3Dqwa6FRoSe4@u&o$0(Qy#Bzd_v~(`S-{wCqjzI9F*TIqP+P}=V`N4WC( z$UbGw%3in5w~tc3)>NDI87K{Yzet(=eJY<`NBcwRKi5>Jr)YmjUKWMFrZzG0RA^s2 z!hF96{&m(A`uq8Q5BW_;Z=rL8!i|=!SEWx{f4o=$^KvCGiZ3o@UY<%4Hpe_ekkQd(#!cWnd>{`lZ^Y< z8a~G2Puan6?*yCgv_B0uW{Yr*mpORtNdt`Xr@CL&* z!*4RY(eQ-fNyD_)=l9@w2lABBKix3rC)DTt2xQn>XVQoEF~ge-Z#KNe@U-Ed`uZs0 z_4k(DO@@DFnCH>7enOx2Z_@uueI=tBcP7A>MD}mu|7RonH{q{%rh78oUvK1O%6}jF z4-KD8`HsoZp-B zZ}{?HS@R42QLgz9{-*Ko2IKz5|AOfs<@AsDv%@}D?|UIr&i4TjKfUjT?*owE?bj>F zT)!Z1^WRIu$9*r~jMkgwzL+;6x8wU>aR0I9zjwd!w3u=K%hSGmiaoL1?}GJvZ9l00 zpttu*xs@#O@1KzW;paE0`&NSXNs^lO&$thU=Rv5?@f#WK6W8bU{us1Rx*kvY%IJL) zxnJgi$o{r}!j)eE?HL&KYx^|el1u&fN_i}KYc#*_Z&bz}*8DjpjUSl%Wvbs8-MAI| zA+%5J2jhO{kbhv>&mjLhBIkHs;|o4Kn(v7G={P^Zm+O8@I-V2x@f!d1ys+?B{dhk0 zf7~6B@o(JGzBiTE$9Z0WO#56i?Q_Yr&m}L7>{I%OUh8%U_GTU7TS9xGyc5=k=KJ&X z{jF*h_gyo8obbOwdX=x&{aZ~hIH~NH(N8MRWb~5?*1MNU`O)u@G+ia6-}P^8)X7?( zz-%v-*G^P<{x{{R+Qt5SZ_2HN=YLa9rg{E1<;@$oJ^=1ay0vYt2aq|xCv*Nz=6svX z`7-&}(R;`PmC+4k$lW9u+Z&pn_&#o+Cx`2jy7j{iRK{zENbyYb2l7>gLtQt&l)o0r zkLoXv@=x5qB8;z9e|=a_>I_tB^+&>b4CE&a9UZO53QvXpUgh^h?Z3$RJ_qW9%3mC< z4~V=6<$dAoBlY_ZR5n(3^zDbFzqNLv@pZpnmhxm}hm3r(a-ET5zN762^}m*p*K12M z@_OystbFU@tbFUD3^&IXWH_nK&+z8TybN!h{Bp+st&?+&{FIPio$?W`iuGLm-csJn zD_rG|p?~d^k94QpWB6Xf{jvKaUFG`N{~kB+4a46we1l=$moMM1Tv<1<0=ht_J{i8iSndhy^JU>mI@FxtPYxq-!&og|!;R_9a#_%PEKWF&!hVlMrCOtSmm*J}oUt{=-hQDO^%Z9Ht z{8htWGkl$4+<%ja-}Q#SY51pxZ!-LI!#KZ^@&7l5Vc(gNqd(2?t%hM=l#&0=@b3-( z!SLI{cpK%hwC3%GalS;FN^O6oJaYe7+aKuTyhdn`z&MYQ;hVg@f|hr<|CyJk<-fFs z?=O&X-d5d{d%Zn{h6nd#)F-VUWJI!)Ku-G->d#+@<|vB)KIkz0c}I1R^LpAoFn-u? z%JBC?e4OOZ+q6B{G0l(a#Kdf9%XuZZcjanxa!126egBI1sC<^;IfmyNUS#-Pq5XB` zd~x78cue~(34am7kNLRB9;b{8njQ+{iB1{!_u;$;=l`x;8{N1v+y|)4_a-&|kgo{g zcglr<{E@-_sZ*{^R`2xvjpXM*&w!&nMVF)gXP{@;tqS7<=np%TZ;n@#aUNkAvQG0` z+an06fem;Qm!1YU+Zw%l*s3)TNi}3Njf1tbv<5houiR$yd zRP`VFyf2RY#;AWC=sDRf4C5ih=VXWP7sdZ%$N7|$Uy;8djBk~>U!CUH$?lC_PW^R; zn}+%R4D~k|`DVk{`SPXuxX*Y+82=&tTinYs-|J*|jA7n?m*)S;j^`oBybmtrQyl7R zw|yAsImMyAX7~qTzS#A=r>Lb^+B2Aa}5u2-k*v1s2u$Z>yLy#beEs6 z`S=YjiOVYt#+MrIi@!&$?)Ht=g9c!b{O6$Wz(ag*PyGk)ACK?BHGKUA?gVW=2R4q? z_V?ve^})|Z^F5Kno)YuP&`KD0*23&Q=xoP_Y zd1nCcrSCL1t-s`(!2)3iiu`vd*+tX|E-GGUdGANXmoUe@y#k;c~0x9*W1O;D-(KJvi$B$;kg~ z_))|7eqp=}|Ixl?7^O4AXfHB6%kXT&SPw)}{dgJvqkd`q*7%l6-S^hzdzHZ_`u0*8 z`X?FQFRV9f{`@G|>!|ztw07(HO=Z}JEtBx2ejq<5jyJr@@JoaLs=pesr9D$QnRaDw z&!+JQpKLk0zf|ku|@-uaeJ&AKbh0$>pA1!+Nap@mYC(x2!zh zla&uWFDoC)#q)<#hV$5u(fXkAo1UuvB=r9sJdd5ndU8g-Pq6n?Ia%T_`fvAgY0qM& zd{-~m@Ssnod{1AVHGdEvvgQvM_LIvbf7JhoDQA75oJ@HiNq&l)Ecwv}xDdT)&(4VZd zxPAry-AKgn-?hQCk5K=>7pi~hc@xopZy0aEePira$mhAew7mnjalSGNuhFLcMe1Lp z{dYf}()86`o%h?5dH+B8pG(s91M-Zh{EyUKtAq1sa$lp=UvTZ9IDFh!MtcwqAB^*{ zI$t1v%kO_G53cO*jq2OTU~gYh?RV2l)JE#nEsu*LLX`S0%=MboJzn_q{ZZ#g!Pj7PWQhM-bC%dO!_8jw0}wco2Yes{K5aN_Yi*W z%dezI#shqhP5hJb!w|k^{64}iVSi5LcSY+B@*cuS-i`Lrt-jkkqi-_q^xg})x+?*?%o0Ow6Ky@;>!9+5p3 zibrwJ$R11h7$ZN{$Zw6t^Mez$`hQ0CS(x^T8ho4lKG|MHMtH`rgy3FjL+gN?-1(cVdxY54{7Jvj2!M*n1&#!ux<=g3-Ko37b5ax&$!{CW)X zzcX0G1kdM}=VV5ft248l%*t|ec9tu1vh3z&xi&A$jrm#LydcYsg;{Rle4>7DAKwb! zAM@<^UV!Hny#L?xDDRv1obY~1GVkm2ypi|wd9LujE6&&qRkw`}~Xyl=|O$9aDg znfF6^?%w}I=KW4&-rwZ8`NC{?P2Ruck~>bNX7Ut#!_hF_KC)~mCe z9G~U(YYg{fIl=x#oc>BK%XPd*70ajcS#I@ZIay_Rb(SX!S)M*2%M)v|Jldb->VVsykQ zuV0$wJkKL~_p5iz%6oUp^59i|{Gt6}(9MO86W;oJ&dcx+*Gjt>O(hq~YGdR-kXfLecfq6bfxjpGH|L)GG2f?&&r2P7L zJPZ4;qeA|=K```mJgD(oJJwxaO}Sp-_|J2dbItM%E(*OI~(4`FxPkJp6fYeuHTSv_xH1=ytQ$S-;YWeHm835A?3;_*CQzBdGD0Z zc*`zPex5v4+wu`_FDK)>Q?Nhxp_r?c=Hf{I6zKDP648HMwb{7IuP2jf52cLzl4uV_ zru`I|_6zuq?sY>0D=&-IGhWxISFiUh^EKhJvM%E>h6V^W^#Yuk0s$5Q#G%6r0mursuNz2kc-QlEu?;P;=%M`Qjf^AYm9 zqxN~Iug|?FYM+JAH1hWv`TLCg{YK9HTl6;$@oDYp>l69jQ2rpFs61l$PJcgy^jAY` zT+)d8TX5<7hJRrAwR%6tf;7DoV{XS865;f|iy_>n&--{ZKfv3tpBBsc9*vhz@x2Bq z|8PIW_ZTQY-mi~Po(t>_-Mg>;BC@xDymbt|R}`Nqo*$=soHxSP zOy8Rj|M-3b!#^wjK7+3Cf%yA?KWOA1GV%`_`A3W#>&1wlo|o7Bczv{9E9q@V^W~wz zdul4IAC?ERX(FQL^ z`B5J5;}I!8^8V4!@!#Y3fBK^I$a_1h46inPR@7d~dp&%=LDDbG`^eMq#;c2?{X6l0 zN%X#h=)WVX-@@-Re5Kz{l>89)+;1me9_}~L@cI6p%Hbcszs3jdZ-~Zs65gAm_0O24 zKbeC3O8>o>KG>TsLl$a#Df+NC&F~j6dW_#U;`$r&<9j-~oTKYq;-2qS(ElGp9>1>y z`%bhU;r%7vPfq{-2zmT|6ZXF|-}eb{{QeW|%ivz#OUmCJ+3N_?eh2xd?js(Ct!WgX?AGelxcq~ z?Qah2ncwu~gG_r{GS43)ew`fbYrYrVPcOVj7_Y*=3CH)@AjkQ0_ZoLzmro1roy!dk_I)SIr8$1S zr12RVEI*5k^6z^ge)R0+s0poo4>Mk>W)Q5c~ zawu(Y5x?ox(f+A$!SJqOeAW>;&zI9b+UJwM6PE|*V|`|s4-ff2d+G%T3DYDe(De!ZVz3yWRejj&;CvmjB5g0^eaE}v_(ZJXfq9<`-QNY* z@<~&ks(u^2O?SMD_aA=*j^BU$h04SGkn=)+qVGlSYnb*Q>VIK4&;2ll$L~k^t?_&Y z;qyLn%J1~{UgT%|c#i(zy-&2@K0gp1??2S?0_J;V zG9#xw9OZN4?~C;15!-J5H=4=(c>WTxen0R+BPUbN`L5;%^vRTSeoHx-@*91BL;1H1 z9~tLA{3p|WJ5E33o8tThbH76K1H8q^$y%QxIsKnD{%2JC5(4M&Ap;BRk;hNz$8Gc1%&jI)4S4Q?6!WV}95I0=R=V)&s>jlHjYK!(3h`;iA z(fkGSP1_9L9qK>yYYj5e=cd5CpF#7Z*%+;2JwwLhNH6poqg%mqW-rqDf-v<{_l;5R zUu*s}8|&xAb|WE6`cDUMGjcNJo1**CinuTB^I^TWQ(W#wHplYi&RrJESGbWa zv3!Md(=i{3JK?nVN%t#?l}U&72F$?I^{HYdsU8&7*O(=KO~?nr`K?ZI)NOiQmZ!KL zE%moJ=0>NY^#-ux{U%bLz{y?cuV>BI^X)whulTJPS7> zO8X+=*Zukg`Bq=vG`wEtt_kJuzhy6s_lb1;E#+P8g|`~U{Z&r7EcG99+L!D1g1zp! zasGfmW%xvIzb*Aw?0dk_WG|VsPcY{lviP#Pw2K6Sbpr~e3J4fqWvb(f5tH9lhofG>kIRv z{^Fgee>=LKZg{kpl=>+CeJiT}68;Yje=XF9j>s2;@uRx`XBeLq~Tx23E@p`P0#Ov{;>VWNDw9;PZ`~OgYELseh9V z+W)5CvtC)0`JVO47f?T>hoqeMIVk6c`!OET@o4Jb)WjAa-~Hr!S5I$GdzSg9@JB=c zjPh{e$k~QJX80Vqo0;CHpzitpRvP|^Bea(!pP$LE)7uvqzR>VRhCgHYV#Ajh{;c88 z8NS@5>+dLE8vo~`e9oJ_zs^r2KL(I-@_sAjMj^!C|){+#;Ps`hAo*#Tin{94`jA;|B*AF@A4=6j^%>q7g7@bE$o z+E=k>NaNE=E}H?5@n5`t^5!t!m+%s<@2WoBbA5#T0XUTVt9^Xi&-nQfxKk{++*^^_ z#jcRbC&y~EUsrwb; z-yrW3trr&?o87nl`iS}ueju{1D7IYj!7L|yA5YWQa@FI|A4n7FIpKRHDKB??uO#Ia z?zuR>vA^`=xO|Qb4jzWo@qY5+X4k!sT-|SWP2S()d6M^;cy@Vpza)*%X4l|+*~^n* z$R)|tKM5=~jJ(LNFMF=?{!jfrn_YP|>W56RDIfOr#mn1#|HHF;1?sEZ7wS1-f1vem zZDox8LCV!F{l2|Od7{exAmypbfFJK8eAq8ElR?8nhOu7F`VV`W^6H_$YX89dp%Fjj zw%LC{e~w?+e|cW$zh!@=ynB{Q3{Ub$_D8TjuHln8-}5|(_3?}x>*FzxV0}F1A*_$b z?Dp{IX{CLT{g)G>@uBRe@V*Es-@@Dc{87G#@XeknzdF2!){*@e-Up|0?5~jVJ#_!& z;Td84Ci^dB$_IUXH9YLE@P2OcchEjci6UPd*0ZqRG3M@!&R+}jzB-Lh#2OxW_R_Tf zRsX=-@JDz3ANv8g&mS2W_E$a!j`v?AHrs#Ob6|T8Y|nxJ6FI>7j_>bAIp0aSHI4Ru znZ!%lyB1oq=NpFoS4O^<;e8D6YZ&%2-TtM7_4{hfSg$|VkGG`#EiHFl`)7^Ma#y4M zv&vVvJXz%{T^@&a??~1e+(ejedIoKn1*Mmyc(QbNV z{TIjG+>EeZY#6Err=f{+jDZj*zf9W6Xfyq1%DC-9j-T{7nM*Ty4u$~_3Z$7^! z-Y+PD-(uuH&U}yjnrD4}!M{$aTHW}iXuK)zzaG+$?~z}F`?N8>Pw#IOecX?Y5x=hg zsC&LYm&Px@=03lFLq6W$-{#y!Tb8eh66Gkh}r<9t@zi~Onq&S%NPe*K4hqG23K;rB*) zTr~iT#SE7X<34YVUs|5VC&_8~8=vI)3d9%XYkZRDE2vNV3Chp)>nD`co zz3Ly|1J?Y=uXaaa{_My9kWW;3zCQII>xV~tKEH*GO@}C5I5@mVMHExf3O?$-iyqaHVzs?Q!$2)1yaDHu>d{4*`-ne^-Ve}^% z`5}gv8$K%B52*e%XJ*}#*CS7^!68N`5vGAR+wt1 z=S9x*81$d#FX-Q$new(;9B=<^&w=eZussL&dEYkU_eIrC@9&lJ$@AruH&C!= zVn39efW`iSj3uXNJXr2op5>J=3615wSNQ%L?lFEV_g!h2_j9HFeKNi@Gk-|Nai0s~ zvrxu+7(XQAIPa_&-`g~J;s;Ek)yKdIq5ZVevDU> zJ>&4euaD=$;QPXSv{M?djgfVH59axI4R1rG`7p-6bKQYzZ%_gc>v~+eKV90;*o^m$ zHNTlFJ=>F^wUx(|n26_LTm)9T2`rl>m zfBgkn|Ld=T|8v|v^uJyK&j8WCT>SlO<5Mrpx}W0tY|&rYUcVmpMLMG)^Sm~h=e5ZP z;SZUDlaErK*X7-pME;HR_2Irqoh?xx>%~}=Pwgute6AO(9Qq>L{@b1d+jC%h4s6eX z?K!YL2mbfw!1{Rnhw;I-Fg}yau2KZ?x#D012OM|(}I&tiPIwMu(U@(aWHQkB0boG;b* zz1+x;GxCN0J_7X*>3f-ORr>V@gm;XWBR|x?+k-u>hWGyH{J+HSta!fx{{6e(&tUrA zY4{8Aek$C5)$@Kny?j4V*YhFA{s{MTG<=?ir~f<;Pd>u$H`Bir@qRV@<9%e*f6U~^ zxBdRS%At?_4DRn}_+*`LK#uc(DrbB<;XHxrlc|4T*bmbD{S(HU@}D%nH`bdA}j$yx)-WS3}_aQ~lR~z5T56{o#AKQvXny?`5ig;0NRN|G|=b(#Kch zH|&N#?Z^K}uPaSeMsfd?u5hUP;hx+T;e3iKf$@G$cf4Mjs*WBS@)Pa@>-+(X`)64H z;69(b$?#7@{8WB@*ne04LTZXG`6>QaPt*MH^9?Yz=IMW@RCGDK*R>3)G9T!anxpc5 zm$H5@@J@00$NfNLm1DDW=ZyS_E~oM%+%6gU@-C=n0f z;0@ZorS`Zb@QgTpWtaP<_g~Y8?bu%#{9ZZUGc$3gjRM$Yzx^4}Rb z%a^uKiECr>rQb`-U%6-HLvi^_DxDtQZbo5@K=ySgw@lp5O zpV#sO`TSt7Bl70O{(dH}-`p{>uNV1Fk$t@|?}wxQE=HgCiBZn`#K;GP^8^|`?RhAF zFq_^c^9T8-`VSlV!{NNU!)c7-Bi=qk(+kG^Xj)(Cp83o0-Z~G>34Y|adH>08H_Z1> z=^yQf$UN^&_ppD~`L@shX3M{?PChmJy_-zG|GrJ;51HYSnLlLa5BVC@rx`d=hxl~x z{gU+lG(BIU%=`Q)XZ=F_RL=TEX8j_wevw(f$gE#v)-N*a7n${o%=$%U{UYD#*LO7j z<(~3KL;Kl5c_^Q4_#DF@H++dzZibZFwZL@|D?W@KNI4wJSU8=z`Z?tWx4m=zWq+!_vYV| z<-(a+9$FQ*_qe~U6zu@ zp-lT)EWC6^I$lrP*J9x)C@yt}`teD#1`~RnpLqEYOz4+MJjls{c)Za}Zk!#DZ<_6I z#rDfdv;A$u=VZo1&GyGL)fzXJ{PJ~Zm{JPeuZdt|Oxk=Y-S4>$gw zX8MmenEqm|;Wrwt80PsKhBs>DlO{Z#hoL^_zvSKgc^X}>OqyHx{v70;5*|$7C(Iv| ze;DjZlsVr``{T70&UZbJa=z<%jPqU3zwa;ZgRfsxyAmH z%=xe9Hrqp#pH2x6P?I6=w7|T7QS+-kRmJ^Q_@(v(CGckOY}!kJx9a>VwI>ic?`x!c z-XBChE8HL9M1PyQpPQC<@Rxmg*6|7WT3^1%Uop(}bIQMF25dUD-6b+^r* z7n`1(;CsY6egVHYj1OH2j4KGj`pPK-LobilSHLi@<#@aU{ni3#&vnnk7z*RB>H6pr z@Jvi9;J@-y5Qsf8Ua$$#?4l+*jNB)*?iUfPv!Gx`^T|; zj`N4_5z_ywjr@!1-;Q1X`Thg-cR~T0ALSSC=cN2akjvr004g zzrir~`{@2d7@yB~FX{UK3Gh6(SC{V$_R^iwDJA!T*d7M_^RU08a-8?n98muu=X+&o zd2YE|GUdJHZZ&+H;oA-W&hQ;!zJc=Ja=$n7KN!B#@Lh)QHvC7!_ZYs{@O_5wH~fI% z2Ms@D_+i7382*#tKO273@Lvo+X83W#PZ<8I;lCOFyWuAd|HJT8hW}~!X~X|A{EXpe z4L@fXjZ@U#w%iQEGY!u&JlinemtlS4dn9DO=RoHB3S{1wOXhvDWZp+g=6#N2-j6`$ zc_%W@Gm*~>=c_w~dM){Q^j>LUuu$fEds1ITj`cBgfO>vN8S7n|f0QpW{5-?E8{WsW z^ylLLzJ?FL{cLid4E@LXKDF17_>2Axpc#>T9r{;!50Lt=K>H;v82NDTnmn#NQ`RHY zKi;RR{v-V_#Q7h8|DVba(A1{y1xxtH!6Uv`Dg1uKm+#*ShjZeefAKiafz;oKChW+wRVQ|Q;gS+`@`r*DYHUXZ8^Gd0Ijj_}5 z$1Ing-x7H%Ef*ESR1Ljr<|Q4;y~O@S}$RV)!w`j~jl%@Lvt{eLcpP?=h19Vf0~- zw+x@E`+dp$o->V{O!+J$CsU56b29#uDW7BHWXgGemVV#CpL;dfS zxNiUb|0f4{ei-FV$FDr^OXhiAGSBOhc^;R{^R{H3pC$8rEScwD$vmG*=6Omo&p(oR zo{`M+31r&yl4%b|rac##`!i(D$H|=UlJ_&?vHcBWJdqjiy~OZK4IgOuAj1b6KE&{$ zh7U7*xMAG)lZhYhBgRkf3)k|1`+Q*U5$1n(AR` zepCU+{;xAUYIw|W)$n@5<6toNnc>R~Ut#!4!&e#Rdu)t9-zOmRegiV^FCg=N z0y6ItAoIQeGVcQ*^SnQq=lRJzpHJrbdot}c$=rV>{|M=o`@_jURpxqG%l*vc$Iq2R zdHWT3ChsRidH)Z1B#e*%=LaU*Zav_@Aur|dVk6j4ep1Nx&BY) z{&>oh748R+xnEA^{s5W#=PB1~+%F(=Ki%_I?jMl3e~@x>jQa;ECpGRLq`bMp{ezUZ zPI7;q%>4xN^P}^7Wn3O}OR#6}fUA73OzOArZCSay-SF?ST;zSV-hJ`J=>9_ZH}!%z z{N=9ue!S{0cf~)%{y~1H;kyi<@6Xd|`otbSy!Q+Hz}n3p=#MhjG^YofCoablPi+%e@!5+U= zgY)pM+S|f>up7-r%Dck(tH#Glz}P-j-|pV8R|35f=#@aP1pc)Io=Cn2PbNGPe}C4v znLow4Y>xI+!cQmsOv3EPY~L%n9)D=~*(CgEoc;-J=C83Xn|J*!;pY<0;_FXzGdrUF z{j)w-llj^1dZDt+&ldQWg#Ru@sH^unAD2}>+}Nv=_43p2o$|54zukCg zKO~$7Y~k-;81_Tb@Q-@?K+=06(eLx~^`y^wB;gnN^L5bIMf2qvf94r|K)#>*%6ZuE zCwzZ^_%2WQCb|2?Zgsajb_y?&^BoDlB04WI>njhgjLu6`<~(T$-^r@=1}xd=%nE-x z_{(*&zR~s9Cj700zwP~7CI1p%d)q@^xB4a5?@SnfJaqg!jOBX#J7D}fVEj8^{5xR$ zJ7D}fVEj8^{5xR$J7D}fVEj8^{5xR$J7D}fVEj8^{5xR$J7D}f;K#lH0E~YJjDH7= ze+P_z2aJCQjDH7=e+P_z2aJCQjDH7=e+P_z2aJCQjQuiFUdmBu6IDa48+ivvv zvGzgUr%zgYk=vJKwMOIdXniKDwWj`tD+8`j>LN{-qqRe-aG zkH?GU4W%=p{b;iKRIM-3*GKEUs(&Hck4E{5$o?ji_;z@EcFVu$jJK^m34bcomyU*K z{{h1DKB~Wj#?O2@I{OpAv+{jWdjPAS5`Ifu|An{5?~A0zd>+?#qVcV!_jW0-MPhFx zx|G*c?Oj%W%kuA+@EYO8`T6yx_lNY12NEtN-16z=&tt0A_WoP&YyVAMTg+)&lQIcyGclC;UpnuO|Fj z!mlUHelm8yk{|Y8f%~KL`?4wLV9`6u14X?Bd%aaE>TTHT?K6w|JnZ%P4;FO?lRoDQ zS^bmz!057{W_bTahtba}>hmz^uTOLs{h{Db(#bZQ?JBBIW}9w`_S@^-_8Z2Y*mKvO82(u}-=>o_-TVoDzihA9 z^xM(<^-ADBErFr1zgQ;|WA))^zb<9^6V%To@{i?iM8B6-{|@u#&)E0A=`Mh&??3SI zdA$asvwyUY&+Q5G%PwnH+b>p#_N`U2@hL+7k<;?VtT&__I(yVO!!|VI*k6iM2FG; zkmxY_Gl>qPv%eho1EaJ56grHKzY{u)&ioeT80u4x=wmbQt}JM2FFjO7thA^;w;tfF-=mU%W0i z63<^8XyfnPA78_#^A*nqdkLG*cqRUR$^3=P-!IYolW1kUIvJbxBD0VPS{`E!Y}swiCg|fhc*A1@KUea`c%Z|%e`*pAv%nX{kG|n zKUnoyVeGNdVRY=L(P4D#nbBeNll}PG?oZN#(FeS4_a{1x&iEW1M!zrEyI6VNAI=l7 z@_QiR2NV8j!tW0AZ5H1qKflQH!~b9I*Xi@Y{>ScrvvWrtB*PW?Y4}S2U_b2}%z5S- zzEU1=>|dtkQ>jn7FGlN~$~Q;ro5~V#x4tQ}-p}>0md~8%8>02ON~1o7Kal2M8GizJ zC=NeWZDT(m@w-aI62F@h#-GTp7sej}{!+LfxxP8c{tCI?oEt8r*PO#234LkwepRMj z`w(qTv&gI|#G<3g9)3rKvev*Yxqt5f(tS^C2GQ@}Tc{ncG% zXx-pI^uAYy2F~0pxzq8gJa1Q-u5JIE{zFoPv9GZBhRQ?ON96I>o7hLd*gwEG`}|sb zL*>z%qWRd$&|p9Nf#l&E^>YgM*Qn#qh5m}=FE`?|J3EZcZH@JIDR zxu5*{+4|vrzDl@LnQ^sCWxZOjhZltU>MApn)oXoymggZn+q@up|0<)-{oJ#pZ}0E* zem+Ly)AkknEq$K){=r(`l`r%5U9^`l`eCvCmxPDWA92z5Ptt=`*Y@(!M2FFTljtz| z@~E#yk6>exBd%@KT8NN?cbFlerqpbiQn4G z!8kq%|4oZ8Ki@^$*Uu*HrP$L+Ym(cCNc%Y_{xwm0&AIi3_?mMs`S~w>Kcsz|-j(p4 zg!e8fwx1Y`}InoR|5Z=5?B}BuTG_1bJ$N?`_-;ZVy_BgZwjMZ`zqntzs=tN zcC9fI_kV=(Uq{D&#mCp05B6=EpBDR><>6Rt z82@?Vf5^Abrq9-=b|%bzY8GDfEY6Sc!=CMWF~GxKN$$^8M91DYWh+0?kMsWd#Lxa_ z#@Xo5BZd65r+=OBqY2}$n%_@*`msb`a&X??((ms@()2D(c#%I(ORn#XRbAiye!T11 zF5bbv*;oX77>)k=g^-H4j6g52OGy3>u8GjT1vSNHS&I3c|JTT9#LyO^CoCijD z&I2Pn_AlDM8>=?D_ApjH!uR<8o7Pv=PxAdec|HXuynHOX-%ANUwBP#&!(d~mcrJ60NYcSPUQvC>F+O;`_iW3^WOWA^>eJ3Y!DkM^Th-YvaL z_KQ)zFix*DGCH3y^-Jrkgm1%^f8no%{-hf#50t*1@HY~^I^k;)zBb|O628qpFL}Oh ztUg(z{|$3~8Z7;9>rcbd|1PlfzYBbK!qgA0zc%w@^uHPq&Cynu^*7rf< z>kszm#+O9xx$0ZAV&wfx(;3f_{*A7CUX1DI`tc3=dhag<-w?fD8b7S{?PB3dR6kW` zKNQV|GW(anjHmPXw{^$U@Y=}#c)V|Y34b*!ul``aYvnOnoqvmOPvv?yUfNjxZkT^` z<6CRfhsS#P%+irX9(`-VKl1Oh<)=L4ew^^F3I8PF+Y-J#Vb1#`e%cTC&LsTjMeygJ zcE;<|Zbh))aKi1C2_K#Cs)SeD{w%tKs??`uYw~!%Uki+XqLsHC4vfDa{D8fkHlFK@ z%X|p)O{UMd7Uw%id~SSZq6u4l5xy(jpBo=3jod2X_VeSv@m78Id~bgw@j2z!ESV?b{*NJ~D zuJ4lmy?(r9;U&F?6XtoMV=qPg*h9hW9|S)b?7u93e@Pho87pte4{YTvj6DrH_A|uK z_lWzOmiFxocXhYCPnG(i?Hl1)zkuh1|DomYk}&^dd}+cTN%#t@-!@-q;rSktAM(%r z?1;v<<0FIpcNchgi1$PC*BNiS?)w4re!#pR@XEM7kPR1z&(d$7H^KYnxkY@Qw-cY| z`Biaz;?VTQMQ(*uRe7gfXSq`e9XLHq-Xzwqey``+sGKj?$~&YSl>J2P))b~mO)F3E*Jj>(Z) zg!!i@j&un+`DrMhGkAVtO{3ChDGsk*WO6c)m~BDCb>ui*`K0bPJW>!{7v zH1U|a4Q^YzDo#9CpRH9H+@tJ*+ofZ6O8j~BTG@cnXOt1R5goHf`M$7@q_dha`iim- zZl8|X_t5HP9XGojt#^Z|F}SfY)cT=$S6Zpw7p>y}+=1sFPWd_-RofS*>EBRXlHBeU z=>)>{HJ0wD?7gK#;P|2CcJ9#q%LXfY|F)Qm!Ns0Co8K4IA&u2kIo+2sxU%P>NndYc zO}E94p#rYrxv%-TabKF}Z82ZiB;XRy)h9$dJm2OG;~bkdxVGnJN)j{7?{YBE>nH0B lq~KD|&7Jsv|J)dniS@)iGRGvQ|2+HENMD`wHHgE#VCZtLMqb3mXkq@dtPJDaXfgUnu18|CRD&*V^IepbD4j##>fQ z^MncG+kCd_CQKYZ%jZ(vgh`WU8$4xvyU(znI)0A9+f1D6bE$6P`0=~?Y}HMiJbpKy zOLddRkKf&At8UWN$$My?JaxS7bE$61cx#^Kt;Ub<(7g2&tJ7zzZkw&fKU6NtPX5=` zHnco!mD5lDAUvYVvie$s9lf(7VNb6XE+?Vz$?E;At81`Z`uXouU44TccFUvVA9%i> zA692FnO$UAQykCnPiK08JyqqeaBDw5e}%U}`R`+)(7N{9s`4%RVu_yn6JBCjD`{Rz zyq7KybxkuitErR+%dTq*UjxV0)*6l%o$22A5B+s~dgIqxet8%DI^yfy^py8g^dHsx zEPMmm-$?d9k^N1i|4jPLhk;Mln=N+tjgq?V>C547e`_`T zTlW8G3hxOD?@8ig$iJs3ykkj!n)GMLzh@DT8f#=FKF3jfjwk<~BmbT!K7s6CpzvNK z`xD9jC9;1RG3#p$@Zy&~$&6q671O`;$)N>4TKTlWJ>BMIcpGkZc@!7=Z z5T8qY9`Q2b^NBAYeihH^Rtc6o?}fVjfM3()4g9(;PvDDmc>=#d_HPo;H1eyf>n&H8 zB$x0{(fx_G=$r-0|9Ee9X_~l)I78e^oF!gJoU8KdX9+J)dV#n|_KQegOuU5bmy$ji zy_aFu7ETG2@Tc_k+XLaPh_@!5+SiQ#HpJT!Z%4d6`L_e2r8;%Gn4*8YLdA%5L&j~)9aW9_%faT z;5SLXob(1fU$xsliTfah->9Dl`ZUs~lO7^{7t%LV?Q=Z0*xsBtkMyc?>;HH@Wf%IW z@&Yb8`kLkP1YSb=BG*4jc5%O$cqxQxYwe2reaQV@WWP7@zE1e%_DTHTkKFGMy}vuY z5d8qMf5oqVOLo0wU5fsHe``cJJ{{@!Wvc%l2VYKn1@V={R}pus_N%_Gwr&0(RsOoV zlc_;gKmtcJtvGm3(if1PHuQY5$I$c13~?{nXGvd3yt(tfjglx?@%bH@Ep+(-k0aia zcs%h0;)%L^!oNwxyAP4Hz&~#Idkj(a5A1E?d8&UQ@qK8pla!A8`suZihu!hJ{6Y9C zzkh<~OQfzg+$U0R!>+m#elmWse&6RO z_gW+Tp5E(-9~q#^2kajuzTWV^ckvB|``*Pj65m98v*AA1dyApxdLwGQ9G{=Fhd5b- zLV}-gPM7acUF|G2{*R}V9kbo^a_qtF#B<1gF6rY3S@LSguM|(Gth^2ngP@O=5N!_3y!M!hWh4kG*n#)-x7|g`3K=$yv`275WZTw z4>ts_(e~h#-1b_c6z}cnN&5AXW!HyWo+O@u*n9I6@!m|KNsZ5hAJNa>o3ZyqYE@ee z&J#no7wGyEoF?ueew6&nz`vcX^D6%Jl6{u=G539wOq1{z>iQWx%kV#&n@#+lDi8JH z);aI1@*w;H@yIGaf22RNvim+tgoRfj-VH^{s`tQb9`}+2!`sfsEKZCcj_BVKI zt7Pz0>j0mv`ezvUx03!=GMCHT zUTyMk>irOXUFF^mMk4De28KUX>$hM#p!H~LXtcqR`t>!(+G87NZf^*dbbl4|0|)B< zDfl2XjC%g#VA2mX-oIFQGu=KFQazjN_6PiGAOHF7c%kPd_58xGnflU~O?~O>#&{q$ z=dc>zzj!g1+uU6rNB&#Fd#m-w`nE`9AL1>@e$^_|zfo>~)${LgwSFo7tw#FlCfjQe zzv0KfWH(rI_8;Pp#}e28@lU_Xc&*e>JI88Q>6u7&7N79P^QDGhz4fGUYUk&fwUm}^0 zKU|IFI>irE`}6yvKS=ygwMrl8`>OnF2+j)aN4&q9?-sp8`T@iT63;Qxdr|5jHU1L+ z4k12__+ZNlc+V&HhY}x7d<3~aiuf4fBgy^I#K#gJNA6D`K8g5va(^Q6$;78n`khLA z8gWUN_v9jbF19|nI&yafW?Y*OtUrsP*}VP{h7ctyd*dIr}QL{v&)f@mkp0QH2!<`H8-^+OH(M4)MCg z>#6l}u@4ZBCZ1<3hP(9m3KKSam#N3QiRYXC$5W*5NxZ0#1aNuNo2g!HJ} zd6YyE|6{~$WIu~|Hu>L9`W)i9#JdvjM&a*H`X0nKh2M?zbcdYI^X#bRqviP)8|B|l z-lgV$MW0XpEiv;edAFMH5&NCg_*OVY@mmwGR!#L-FMqq%a{CW%dUuV()~tSR{~hkT zwp9B8g~t;wHOp7`US|Bd_a<&e)mt-QoEQH57B#;L|K~>r`|WjCx;NWOys_%{#5mMyHg3fUhVhm?kQk-)PG-Wds+*|W4`;|LT`_n zU+M-gARgzpXQlZa`T1M8=_L;!ygBivzP)9`U<0KKuTMPM%`eZtO?)oRPgto>)cDn& z-Vpg%@$?3}{v+ZKi9ay8;eC^X@0mP(V?TUre!@;|L_A8(=ZU_dQ`*rbli4P+_ocIVm{=oAb={#Dcf1Ems?2jfshU||e z{W#*|P5aCVrk**G_#V_R{oVQ=>7BXP?2lybQ|nEl-%t7jq(4af5b?vrCzJ=u(3 z?`dOo$_X+XI z*P8ved>wH;aRYIXxRH1o@pR%4@h-$Oh?~^>u*AQaxP>@O+)DnUi=vG+N%C+h=gXXvvc1|bEB5W~`{Be_ z+^hYvqN9K4)z5H0)4t1ZpGt{h*1B6iUokuG9#fxquc=SGkN9YecPitDVz%oTJ$?Zn zOMH!<->_4eYxR5v_&Vb2iEkjjk@zO!n~85R!p|3PHS~P(Hsaff?;yUD_%7nRiSHrq ztL8_76YD}%nsLCb+Tdxm{WRCrHuN{REsF6$CBK6>ABXXS!8O{xetPI2f4;pGte+k} z*k?=l5aL6L4`2AfK&Zusvj~KQ-328S6=nb>@0fs3m5s zCxu#Osr95%Fch|o^`ua=!B|gfZVVagNzF~6r~LVGE7;r`d)lpU<^>5eX&anLYQr6?l^{~bet%o(xdRUOw z!-D2|SGdVo-)adr8|zyw;i$2`1vb{RTEa1`XZht5tkKUV|}YN)M~76VSVm7?H|_Xp4a|?kM+mbr3I;UTA%L` zzD?zaFwP?dq%2AMBz!CBKdSu~IQ^6Pf%seESBPIGeu?-+V(kAYH*ScJgm{r-KGxjUsWkC# zhXy~O-aiTdLDk!J3fcC5sKjHIKe1u`mo6jj}Sjf{21}$CP$VNKVfq8N#du7pC*3BN^9$nNU#fi({#mWR3IC$= z5B#_4?~DE`+5blN|B(Ifq$4tw@+HvG>d_NnsM3q{`q4a!h! zY9+i))p$_!&4@QA-ohw9nZ!8KwF!cyOyiwN_=;7)5A-zBh-Gk#!w`B zB=J$i7xt~R&lc8y;}?00ACmsyi-|8GzLfYf;&t8hcjAZj1_XGAXlK;!e|E=M_e!em4eaIAhI@ee4gYdefW2U~+ziY8; z>sD9gsl~3VMbA}UCFf`34+Dmk-#__-=mQmtj+3y;zq;r;%01-hAZ0I%m272S9}XDY zP&?Xi-%vZ)aNkh70qH|XA8YE7p{5?$$OtdkzOm1x7Q3-!6XhPyH+`6LFT9y=kMsz& zY_9BE?B?3x%3gS!(&0WjLg~We4gaFS3B(hLG16D*7Y$A(#^pg;k8P#GM{u!~RQSTE z`6~Gho-@+a=WJ{E7YlA@*vBF(8}_lt4yN9|imA8nq;x!gY*nQT*D4*@K1%7r^=5qL zG#K30@{~VbvcmO|mM1kgHUxJc;6E>hpZS0~|0ui)@q23g3f+Ff@GsP~Tys->TTsO( z+*~`&d68E9vmyoli&EeTYENFG_GBuxCmW(E>f_EYNqh7%wJ)!b`;Gkmz0-bSe^_Pw zEbg(N!Qf4aHzVGh81tKkd(8J4jQKo+$5a2I!&yJ{+UH`vQ;*lMKTXe%%Ko&YYcL(- z{$zg|_G@_KLuY^5dj9?(XMbA2U0)O@|89TUle#^|eziSRdn@*~Rc|GP-PoBX?n_+GNV zkGK=*GQgc5llVSE=^3ZzPf&V2OX-y)`_EiPFi!dp(Bnsh_c)49m3tmS!XK#n+u-GD zeOdHl^!N+>1l;#`@4plMNjHDI^gdR`!wFv*-Rea{ny3AFcbV@c%%# z9#p-BJg)P+2a$gV6CdI(CVSznPyQcDd>FYuoOlDWKZ3Z32{^Awl=NEU?*H_{$Noh5 zPx+PXuDpf)Ro?q)b>#~kkE!`*VeH2Wh_T}y{J7fRAUgJQ8TxY4pHu4vc4O3jL51Jg z*3|T(Tb?Bh;mh@WiQUk4g~8K;R}x=EtoECg8tw3ms|`KUaE-yy;I+ip5noSygTZYr zHyS)UGRhk);CZHDz4{S%{{yhpohVq3s`=h&4Ke#M;>U@X6E8FNn`V-q!{b3C&@09d z`!746SMRs*7wUZ#{!+c)!Y`=zTlg!|UnKo&%OB5+{Ws+QOMd=Zvj6vGmA}HT5Mw`L zrToFaB=##BjQxz7yRqL(cYAN6!-=eYC2N#Q*ilegm=}L-u3IenYa~i0n5e`(0H1n=KaXUzELY zi1cX#{q{-pM&eOweM|HoP=5Ql_kjto>h3p|^cFtPTRcYnv#^-V<9_DKcy(r5D0YnB zAG3sO-1L_8Us&udR1NgspIk>OU!~rs9QOBOz8ZOpP7Hp+XQ<~9KAjl*XUc`KY@e=H z&jb53_S>L5VifJ_IKQs#^TYl1$r7#)NZ9^*UMUi+ZP>$SOBm}pmFE>cK*t~MalRB2 za^)_t_&3H4Pts3#ed2Z1dZOq7;`PYB3bl{+|2jOM*Pjvh`hG6qJ5>E6e7mY|gl{GN z7UG-8{%e$v5!TLtqdaQ+qjRVV+->6uRI{;cRBf4vg^r+e2M=8s2&*CJk%cn#v!iB}_D8S(Y@ z_vNr(V5E9qgts=*C!1bo#BX8o3V(kR;=8c8nc9CK{Mb+(|Aoazi60?;nD`;$2Z`?| zzK{4`V(dq*w12r|J~`ERzI^f@BmVj1-*_Lq{<_%XJ`k0E`Q$cEc_@#EM7NFn%_skK zn$q$sD?08E2}s#1=YKxA9o)+sE=M<#6#YWgzlsE-trv+Q zVk|%Ch3)a5{oMOhz(t(5)bTIke5S$kh%a{H_6E*kp3#^r%?aoRO)|35jF396aQnXJrQoB_GcF9m|sJER4x)? z{~A5d`_!JFuljRhkMmE?^T{&`Ur2lr*i{vhX?tNR#4-$UKEAZ!!QBkmyXB#slGZ$3}c1tzy7 zocFcdKSB7tN%ejTcd7lB!rjF4iBrUT5-%W56JKb?uk|96qZbqRnCY3%n9rZ@C7$57 zPtN(RCzOA3ehceQ@~SvLIlraXn}lCh{Z~29h0^4eC+9rZ@oIm?^tRUe)BN?>()78O zeR_?*KAV~}b?Y-~{PtYo z{$w4WX)Sf9m|TCV$*rep#)j32{(ej=)zi~E$@O32ER6nbK>k~P!WhqZ<)xI$bXo)4 z@u;I`I>!z4bql&Z$kgpu{r0RBYN@wgQ|%Xc+&d~hVEbJazVM|wKUx}sd-(Mc;*%=a z=#31tHkRl(JjLmHIQ?&j=c)0p*mn?brP_DVkA#2T`B~wk$o^6zfZ9)%%A`~8srf)`hi$-lUMKvr``*O+ zYJW~D)0;S0wVz=748#A{`s0wh-uN?>$tRC@J4a6W1)o5CBJoMYe;^{>{$la(Ppe#> zJpWFX|8V=OqMt(UasJA&5Gy;METBFM$bZXE80#|u2VBPbjlozCG8pSg2IGE%K5**% z;GM0@zcAj9fGb*ln!Rzk`uTA!Ak^P#)_R;x;O{zaByaC4R-V|?s ze(z$v-$-~g^gix*Mp)193G4YlVZ9$o82go+{E|cv{(C^By|SXAX|;b1@Y|z&s=MP? zH9s%>t*UQ@zajogwXdRoMvVHrvi>JJzV~AA*W}-i6#n<5f5%ME^R3DC-w=Oo`k(mG z^e^!P@fW6j@+VVIerD=jznFU0CuaDKADcY=Ba=fP5`RGaz8PNXH#5A{uf*?|?q?k9 z*N-LSf6LoSxABL!O#idLoBn0rQ1&oyeVy$8Ci}mL|0I6d^l#=%CP!Z!U^zW%d7)5# z@-LA7Jn?g8eDbLM{qhg@&zSbHr-`2;evGuyEg?*M2#CsXx9Go^*j)&jcs8#Za!gx?KMVU#RBqgtsH!zQ$i~ z5q$?Wzb8CW&2QqkVDlS(e+BJxEb^w&Ux`ItG5R};I{w0gc;|IfnMECctN9G!e=I+L zgi+b4{=%Y;K7IW0tmvp;;9q%&E8JJL55k|T@+JI*?mvRRB)-f~PfP4CCq7H6U-uVk zvBPJ(@s&RbpF{kan*UAp#tWaT@w@OB#4Gjl%Y*2+ugA-8OBnU5HL!Y939gjFg!>2H z!@I2OPtiYg+armzFzV|O;@D%HKk}ZZl*%OwSLo->Eu8RXpNej!@*U~7-1HScgx@Cp z9n#-5_56FLo`2ua~?o7Y`Rtn*T{M4{d_kL#B zr+Ys)^la`6L(k^EH1*FY^IoaEop{TgUoPj5o%l$P7ov9bW7R(ifzQ_QX{&EKM{|2^%ee-J8_)B(6lxE* zJf-GGL->H;(+1a1U)jGO$_m-_kyYICF7Xq7#;|V)t*Y$pkll#;U;<(*KjGDgKk?fy z_}5(ftl?iv?dr>Yljoa7Q)15$;m{&A|62JN@yTwIGS}UuaFd^&a8AYCTpsuG%}{ zD%JlJt|t4_RQcKOpXNcd^&l7Bn zz3s0*mYTrt>*oWXj*M`}3#D|I)tON1v9{e5O8Dtz30DRm$UosOZ!qHWQN(xn^IeYp z4yu16?s30YrN1NGcbLgziN8_hE1k+L!1?R|f_7d~;qQnqSLvHhCkj`n^cDWpZy&96 z+Rkl<*0c|1K;$R^2*`62Iv@J>$n<@t5+ zf}OQ{FveGipReojjo9ynsB3+1HJ%h5``INZ`JudpXY2jy!mq0Q2io8J>20O+$t2Fl z2gI=xUog(k8~hXTl{)?Lx#6pH`WJHJ)>HLglU-jMaNSE7!lMm6SiioZ2kSQ=eGKVi zN#Bt4jY!{^^i4?Llyt1ON>VsKyUA|cTG;cqw%Db@l{1RW`V_`qYT1y-`jPpvB^(oQyepX@Ze+`JO=l&+*8`XNM z*yB8u;on`(`lU0;>4b;#Q-+TF!wr7QdG*TcyW$`2GdJ{+n19jFi|@%8`bwnZ`!t3= zf^>Wj$Izdo@DC#W3DWU>a>M;_@*m$fH}qkomq=eu{_juve;?8x zCHFSgL%sD{$&bCs{uNdKiT*P2OL~3{`irDLNBWb*dr^43D8Iw3@_sQ15BI-U-Y?RLVRb{KNhYft|P|%7?u1N`;$QWK9!S=_!Z`# zLVPOmX~d@!pFw;k@ma)Y6Q4tj`*Q>G>{9;ZewXuzml2-l1*Bg{`bDH)Onixx zUQQA^;p2V}%;%K%Q%HOU`t6N#-^?K6eP|yyn0TJ*pUQnR*iWY3k9K>Zk^k*>ju`u~ z4EuW3zm@xD8i<3$>pT53w>;tgm@%rp!Tm1rvBVn^Z=mWQvERt)s`~zILiU>yZ$`W^ z`M0^_U%5RL|Nl_$i|`iY{!cf*q>P9@j`Y7s-;(sdNgwZ|kDI@^PiKN@-!qYT5^=X% zzTEiqPBxz>KgG1qZ$-Q{@qArB;r^XBP!#ojJtAZhQ^7huef8;tpLW#5&;{JPS+QqL0qti~U5-_S2^f4S^`ruSFk--sux z@s`|Ag!`>jc!ktp^*nN4(P3(QF83AHtMPmf4uJM|>vKG!)r0$r8Vo&S|E}YU`-uL~ z@d0B$q8~o^FXDYrUiJM(->C7a+;6n6eqX`+5${i2BF24Pl620m2lpd=tIqq$eMsM_ z^LN7E6aPT`Bk@nfxbM)Zyd_ZS|KL8vfCTO_zDH!}_;msiXU5J;#-m9O){wwsS2UuHI+=s~iC$&FQ?0+Esp7<-`FNr@_@2~jx zDe3s$1AhMVPp9}iK>hz|qz@YBlKZ@eBD!E^o^pV6Xk^L2_KY-)& z(IADl2+upb8mIK}llb6#nNePF{>)(SzC-W*z9~KfvR)(pd-rF0dWzyV z3+dBejZaX2RqA7LkNbTC5?9YXzE5E=zF%Rm_dPDpesi}z^!Ow--xsw*jVBVHKzuy$ zam2?GA47b!$&sUok0d^V_;BLGh!0iw2jF?42NNGiTq54j^e?(E>3b6|CHp1Bi%p)r zh`2~xFu6TXoFl%^Zy!ss+Pd-gnmpkilPBJ7@}#?bw&1>Dg6iKCIy%!=4y@c)S1NSm z7Yuaka}+^`uTb;DvD)a2%ZV=|zH}g7fA=T;p*^hh*TwySL2l&(8`05z8v32;{8u5K z$lY#mSNazHJoSxDHJ^;85dLCWo&i{+Zg>Uxs!|Z{mN5F&R_YuOt13KE!>AtB4zs8~XmlYPBC)?n|7e#?!*ni9^J@5YHfPB5o#b zQR8_Dubmr}6mZpZL!&QGC+dXmJsb4>U^JqLr ziU0Bw#&lw({0bv724kdcFh;5d0}RH_nsR5y^&em2F?7rn8oVkoB3G%OT5zAtmHv39 zl<7%X7whK@H#SZ3`}d_xZ`L})AODqF@V)0V-T8Y&rXy`a!X>gSvAB1n$4c6}yc!?{^l)`9C9la6Zsrd|$?3oUb()=Wz{Q zjd*q9HHgu+T95n-5aatrM)>%?k-_-> zk-_*Lkilb#@jW3!$M=T}#`lQ~#`ls89%05mjPEfS`ewxVev_f&`%VVq`%ebrdsznK z`&tI$`&$O%dtC;fXTF~id@s$=ClllQYKFcQF}}xU=u?TeA>NjFJL2t$cOc%8cqihW ziED}Li0g?Ph=at9#M6kU6R%{JhiHiOU5K$>RcR0LKIE@f`$xdB8D!r?+)Ug;942lh zo=F@bjuOX++lXfo_xj_DQVaImWqr16{9%;eA1}4w{*|f3vwi;@{Rn@5ki#SW^mh0f zKm8nj2MzitYrHh~mfVl{uDc)3>ED3gbI+f9{66sq#2=FTkBC1e`%g&!l=w5U|D5#y z?EQ`SvSPq_So|aRH)3VI!nkkmKfJ#YGfx%!|C9S0*Eih%>-~*mNFQ77>N!zvu^S>A zn)-kG{>Dv}dpz%dcz@#-%KqQo-?*jH;otxB`x`Nnr}E=p?{D13)c?c#8@D&?|MmXH z9ZmgT?r+>#>HqHj#u_z#DioI5`hId@%%?lg(+4>&?Co#$IHC5ph#pt_PlQ|j^^8(% zPHS*acYYt~Kl}aNlHF!CzN+qbEaE)0zK^V!PW3#g=HH7w9r=Z7 z{X+N-H69W^T8%e~SU^~AxbH3M`(le2KwhqOa0H_TZ~s;?lU#!RSNN5O5W;mTz5jRa z!@NX|59B_~OEu#@%+=KQHs$_H%!dagMEMD0{ygA-%SWo`llw3)GyDrRU9S1x+=qFE z)^Q&1N|Pg3862*E*J%y0=?&wR-rgSTChxKU;cPO~?%)66Fy?QNeomGWA^$KxW`q|;e1=-n#7igqmDPA#!fPe_nZyy| zC~=IqjpFCsXX-uAEV7?X+)nOSRpr}BFS4IY_M^ytSJGD_{c4@xt>NfdYCPDROLZ?$ zJG*577w>+J^DN5-rDiec=>pWx2NNF0RkFzkcv6P3Lkwi_oYd*R8%QB4s!{RoO*QOWnzkW*Thi|`{R`hsyq)2`HN3syzBPQ0VIOI@m-s$| zW0Cs}o*ntgFFz%_)k<9J?~k=wYo`UTQ~P6uuU7e&?ZEsoaibc~i9KqXN_iKaPCP`- zCyV}`dcVM-_ldFoS!qAB9hubiYQ0GKK7{7&w->%&z3;+$JyrMywSFXgvH!l8Fdb!G zYdl}B;~G^zVEQU}t;x-}ze+uCBz(EL-vRy=u2A#K!dDVsMSL~!HN@8vUq^gB@eRZ` z67TA_UskrGnBUDG-&l5Qy}diJzE4baoAi0a9mJi)apDB=^*VinEe*RNwY?@Ro6Pm> zuJaqb2eGZ%3$cGz&F5vi?Zi>4KaoZME9s|4DVxeByHxutyn1z|zP0fAxZoOYdm{Cb z@S3ErMf%#LuS5E}q_0PMfb`L%f8nQJsTKDR7nOasH&^{gN;pH@OZJin35cL4U^==&o3sqvoZ2de#e z!Uw7SOu`2fU#iNx+%LI<%0IbJ@?({M!k?)85>ET)r=9yI^>|P2o5cFKlfP1)g|n)> z%Kefbp}czce+Yl9%AfEj#0ypWiTz|Z4*r)gPDrc9!KzzLYKcatW zhM)e5_-o>Ch`%NNj`(|*-T34esQO&)i(FsL&&mClX;r_A-b0)r-oSV7+^2aHG46k; z^jE|`+}D8qN%?%cFz#ch^pAyqCYE^rcmC=7CM5p){s>{*=U_bFe$Mlkml#EV5amJN z_gSO*bD}?_%NKZn>aU6Zu+DGrBV<32>>nk45b2MRe~%L%g8E^ERqJGlgny`d--Qn& zK3vroq8~x}k;J&4(Mc}}K<*3O-%US{abFDHXKb2sb=>y?F1L4LUoy&DyyF0*w^s#; zp2ltzZ;D6m7sYufl|SiZM$I4myZc9XQR~5S|L6?jCgNt|7UD2*e^g}p{?Qs$|H}QN zxbH@#&wqUX=ybQfFQ?bS;`v5+3yT*JUr2lr@x{cK5MN4s8S&-B*QxOZ?&D1EY&>5+ zd7zR1`Q$;!PksOB!N&WQPu4o+p*%hp|LWBETlf&Tcegw^_lq9t_RpO51A0B&>-$G9 zgW#99eD-p;FuC^GD~$ZfXRq|flc*1)tyhU5Vk|#|UueL8>ib87X8ekc#JKNBmCtnTwyf&JD_4DkAv?5I`1{_TLg%ks0M<1*KH4-d|FEJ|KWe4UEF=(C;o9i0Hz zzFocFqR-L$v%zyoH}<#I+AYTZSFo`^w$=`3Rev?#nOm?>^*@DgRP{$bK0k^5>$txX ztDF))F!tA1>Q7zR_YKDWe}i#fI(lg3pB=5AelvxK^8~2R@RdIN#Qzp@A11yY z>FH)6>~o15z*QE$(&o6&6>rq(AJ5r2KYx*5^)@!Z>G;?M;v(@P;>E;Eh?f$F-1f(b zUou|U#pe>P8(6THvX2IXGxYbfg=e6C^u}LezYp2ptlB5BZ}R=e{e;N{*Q@p>pX}~w zRr9CO;I!tM#1Y~sag4ax2oL>1wZ4~6W)c~9zFA%aVL4CS7duAF>5)lfRew?Rg~U1H zef{zb{|epv>GBNT-_)}uQ_mhid?48$WODvslZ%I#?u#wRpT6$?Q^cnjcGIK$yoDmx zbCG}L{*>s>gRl5!MGCA)0Vf4E^g6$wXfW1>?`_DdU+s#OIp+ z%{OOyzm$}EO^*Q0M zP&&OXPJTfu`?cB+E&PohPk?uH+5@-#ODB^%>G~eLv(x^#{R?m{=@01fHT2o2FTMHt zJorIf|ABG7-+y1gxKF?zzk|Q^-w!L=T-)@E_b|?UNUQao)>~`qzc)Bof5RY^zS(3F z_r-hlQ7IZ5Z@sGa6M^m5h+ijugZNG2w}`R-RE0OedfU(^*zXX(OZ*=3`@|m*M~(0% zS|1wvMEfJ+kBL7a{*?GL;?Id=M);GgFARN>{Uz~N#5d^qfSHD?lK_!-i*30M7YQ8fAx|4052fklQ>1(P25GC zB!1hBU+Y^YN8cpIdA~~k3h~Ql&F9be5^v(qFFD^Ux<&aX-z)0z_sgSvg{G}DtX!W- zt_q*y-ZvpE-z&=d^|kZ8BKiA@-~Yc9cu3thjQS;)?^n4$LF${_Zf5L?x z>%{&GwI3!LtBriA_QMDt>c8J5*cYDj`}+>R<@c8yK1{dIu*dfz0+L$teu?|TNyqml z4E=fCzlZ$`#Q460-~WgH67kE#uModV{2KA=#BUJ4Nqmc$zJ;%i_MtZR4e__c-w}UL z+|TGg#TwQnK0@~&VhzC~O%5Gpaya6TN0DDC>u5iJkw2-PV~qSs^?YTNk8tbPM)?T0 zKJ3qDz`vaJh}%DsJO_{4&Y8MKC#=lz?cMpHa(T$bcOc%;v3KWx3%U5tq}LMfr1oCh4;Mp{<71) zdW`S=RN7a#Pqvu$$*D&FBG@5x2KHd_`KF z=PU1jL3rti8Nc*Q^Lf%y$G*JZ3ig?pX`g8$o<%&{abMo=DemWxK9_h`;&wAWncW=! z%J(CRf4h_Y9>g~BJjXpwQQ`;p*-lf>#)&)3@Usas{9Ko5pX(-0n(lM+9ru;;mEY5} z$AvjY`O2qE_xZFL|9pn*dx?93wh#&rhkRwTz32` zW|JGK{rY+Ewz_=+Z>;vqi@pi*ro@{OZ%(`g@i^iwiN_O9Af8A(iFh*c6ymLjw>R`bWW!`t`S!Uz{r7e&&E^@)JJRZy!qe zrJ49ZR9yYN`VM@&uD`(BtNn0dKgew#o%#+uSnVee{RCZJz&oh@QKAna_xOGlI>c^$ z1bs&e?{~F7OWglKe5=}jjQh?yZwebKnz*PbB-3 zNI#kQ6yj5fPb2?MC;bfKGl|b4KAZR);&UmyDyQl!ugA#qpGWq~h|ed!fcQeocVwJQ!d}Ot>>#?KTpqRf!`qa7n1*P zl710%Z;DHv=VIf1&f9P4`X2hpNUy$@+aCnKP5zxi&wnaC|7niKY)Mll7DBD{W-+vlK+sJzJNHK(M|>gt*Z1GQ zPyXl0zEkfH!SfzZd=bUx8#TWm_qlyZ`~~sn#Ges=O8g1&$HX5Je?a^`@fN7c_5E>r z|BKw$)}!`|38#toB%V*4B#skz63LCpq?&_R{`{>`x~9Q;0t%`#6=? zPe?CP{BXZ&K%Q9I3whoI@u{%a-xK+i{5y^8PbWTu_)N8bU&8y0{JYKBujsBfK>wWd z+g14x_jjoBA$%w4cai=D`F9D`&tH<>;Z*&8ett!IC+T049w+@9(l4d(za{-L(!V1; zLH>VFdXn@XNWYx?|B>`7NdJlSD@p&E^ezhj7t*gH_p4xZuj}Jq$$nM6o{#(1&X_Ch>0+-eQ!0{XLQ;RDPEd??vT(Z_@W6eIDwY0oGJ`1)cZrcM89Q>ZeZP zIB|kFN!&&CRX6GLN&kc5b2a7HO32><>U%?flKn{PAFWLNr&UN_m3S1{->vsIA%Fj( z@b01a{a)e}(tDtVQ$cQe|4r`qr1V%ooF?ue&Jgz!XDNLblAa?y@05=TmH7Tc@hy=1 zBJm>P#pM4I(wCCH7wLPGz7OdqqI?XnHmbxIjfX!!hx|H8&u4&7CO(Dwzo(LZ8tJDK zpF#G0DEu{s`Sag$9&B~u)reO{>?`LlaGqkGp8-kGvrSbS`#j?cp4qr{I8KTP}(@q@(o6W>RCFY$x=JTA^x;r zYcTGc#d?2vK0(fFEmiA-!nkh*eGC75m#yw&7aiYoz_0A3@LsBaCye`8@GJKRgqI=V z_4%%)YX2Ja>=Lyv=l8i%)r~c^W=#LGx#yQU=dKJ09 zg8D=F{(#fCNwXvNS5g1zYT|3i{#xSe$iAAw-7=NU@z z!S_v#^uH0$?VG4SKAh}trsp3)`Yoj6d#^@#w?gmlcA2F--$woY+bR4zi1B?{ z!@oP>U$y0~m&3oi$o_8PmC5}*j{DUs`FAhb-$(JgpY&D8zX#~~S0(*H=#}#bi0>%U zA0qdwk^V4ronMbod{!s>!!R{D#M-Iye1{wBfqDA~W4#gI2PXX};-iU=AwHIP4T{gM zR6f@veK+XdeUDN;cBk?G9>g~BJeogTi~R3^|K9gU#ed9K2PAR4`W^Gx1}BL1{I|GY zoBZ#h=Ua#LZqhgL7LO1Id_K!wm+UeBj-Oxurzk#pzFy*Uzw>;KBd5JukNkUp+&@U^ z^$_Xrs{QfueXjud_o!2zQ3>KF;Xg*@aWvUKPUZU$$7y*yC+^oL`=Q7fyvz zY()CAj_&9GbL9W?6yGypufLbKG5L2E*`H1RokRM$#G8))GE zdvQJWCpIVj2CDyWB)$pm_4iY^Aouv*p)ntT?;!>xk-Yxnt)$;ZjPEHL_Rp&Q>C(R% zN8#;<=hfd&-JjMYOT-7z`s9J6A4K}W?!$WVKZNuV!!TTPe-giSFh1AcPu-H@yDp8t z*CP%PkEZeX`o!<4{-=CD^?l+Gh(9F$i1=gTPl!J?Ir16t=fqzSe@Xlm@z?Zy({J4V zwj{B9PxV{Uza#y7(tjZRN78>H{bw^i(O<~^SF-<&^xsMUgZ%rG_%D-Z|4sZ4F&1|# z{9}<5={4wz-#Gev>M*KPP7sOu@e?|N? z@i)ZZ5`RbhJ@F63KN9~$<#9ocyO@eHDfyWu`yS$-$^C7r{&&6?tk!>p?=bYP^qq#@ zmA;GkZv8&u`@;8-dwkzKAg_|goU@pwRd@Y;Wj z*Ny%S#`A`b`3FPC{D{GOQFwBHo8Eu*gj#=>@&0n+$MtzF=#P>9DCrXS6~7fJup$Lk zq`-<4_@AEw4;cM{?&O0;``?{>i1=aZ4?JRUsPR#g!;cX^PQ2XUaN`puho2;V%HU}2 z)5OmZKWlQ`bH?-Llg}H^mruSx{G#bT_!9BUw~ zivB@0zHlJFLNc8`OwCsaAFk#jgx?vY#!vX3(!1*XO9A{I@%zO3{EXP^^EJXBkv-1i z_~SL``n-+?Lq`n->@J`W_U&kG6b^F+d5sr0d9!N?D4KS&`JU$B!p?S=|pN`U&cOFyUJA|3tk$i15Ew`5y~~>%SrXmiRm3?}>jP z{*m}6;-86sA^w#Z=ea8LH4@+7iT@z}llU*ygtNziK~dKiTe@vC$1qL zKwLMtQa_XmJyvu5U^PF|Gp^7;93*Zeo<=;KI7GY)@eJa&Du4fap(ks%8u86rGY$Lv zxCn8SI7a-dx=*9f+mZiG-KQb^yP>Ch|1k7)?;YM|J(*AI%~}I>`i7&iKMnWA>|cia zVs@6=-(JXd#Ajou-``rN+@9n*GQa5hC)bg^5$7ZOxcA4yK6{fIUkcx%?h}YbW{kfd z_Elc{lq+Uxb^Qx|z;Iv8JgDmz=yke227iJ2q`$R^8^5LYm+E{|A-B~2O4l#ouZh1Q z`)^7Aj`(}xU;X-ssLxBt-fE%;C3zli@P{)ZTg{r>zR{Od#9 zm$-`f_I}De=BsWczJ>T^;+u$XB)*>bI^t`HuOz;l_)_AFi7zBRpZGlDbBNC-K9l$~ z;!}uEBHmxkugiQk_G^|W&rm*OelX~5-gCKuct3J~r`n$*^MTLk{s$QAVU_)SGM|V0 zqXO`{GQWrW2Mxx0n_vH9eh}+%hI`yEW!U5XDTA^8r`%5qV!cqg?@r?WDP`ZC#QjtT zV}GyV9{Yb4hZ?azSaTTrhYhw?{8psEiWK-iPJwD_5Bd@JC$1qLKs=Cm5bmc2qip{aVBmQ2o9gEHRL64sbOYH{dd|&x~ zg913{oEI$bFBNW7=l6uCsq=fn(}~wo=MzQ8c|U8kHODCr!fWgP4H)MG10wdp|3qJh z^u0)5m-M|!--qJ+qu(EP{QpV!ZxP>#O8gt~ZtA`ziU04Ez9BsSNUMCmnCQDu z{C0QyyWaEvq5GGxpFz*}C+SV(Uo+Y7LH@UpeVEuL`@bl>R`P!)xsMP>iT|ej_=nOH zo7w&TBc8txabMyp;%ef4#Qle;@e=%xx$%=SDETvw@^cF+&!hbNKpp!Ub$_t9Z$o|$ zvNjO!9DNo&e+Q-SI4aMpx%)4?@-TqXdp7Yv;&uveOY(mX*>_TW#*_W(6rVWRuR;1C z@_#Pzt`xs^|GwT*Y))%%PF1-+kn|I7((lt=`Q+dJe)^K#W@S%O^DjkwU;RooUsOz| zdahFQL&8@RU!(1NI`UQO{C*L9t+oeOtMyXRPuAi0^d_z|{Oc`VZ@BL*-k^0{kn!~b;Z7Q?@E>Pn=um!!o^x;Ny^ zhn2gu!dF@4{E+e}yo)Ly!hbs9m)j5FztnhG_y_psjjxLtd-0EIyej+?@y~|;_To(? zV0Va8%y)GE(y!9rF11C24NKMhBCZ3>oucyt9|XBoKR+($J#|QBKF2D8Z`0`kK26mZ zqMuHD2JxB1x08R5tNX2sm>^uP&hraDL41dfFZ3sg@6`T7e~S1n;-`t9G0I0Q^nww; zeC94- z72=V^s}c`Z`>)b%5uQYPiSz^9^$pMdPJg|`T9is8?;^gN_#WbWiSHx6pZEdd2ZJa(1+B>ODkx7B$K;U86hN%$SoeA%isyt+CE#eVhv5}7#wO|SM%&(3KU#*|-)~`~Y z#QnbXJo~Bfz3AJk^B%KnX9U+&^CgQr79_D>S^2*pxt5wg5FPuU1M=+U@D?O--<$lW z^P3%P58*zzfQyze?u+yFP-AdSt%KJx_2}BB9>w>8wEO6~q_3yus}`p+`GA_Q5*|&w zKJf;`x2pB$*`XHuHsaff?;yUD_;}=JUo5)H5Am^2Q1>$k-$nL!6W>F8FY$WneAw)k z@bvq%9tlQppPm1{Om ziv5dZKbGuYB7H;BUnc)vAwJOixSyNezan(+J`oB3Al3g6{*BV(cS?_dem|nI@M!&h zfY;YL_OorEb?_Kne%e}MxIfWbFD=cs!!sWD`xm7pRzvU~ukyiu5xd>Wj#2GHdwp$m ztmas49qwnW_}32qmMj03!oM1SeYP|wSR3i1;xjiG3Aai1y1%*2wbQ1l@;BFRu03#w z`!NXE?A?*+JzLEm37@0pe}vB^K9t;_NA8!A{rSYZ)|lbr{77ZLqJ)R@CYAYeVVqAf z_*cs;pWFHAWzCL+V)*{B@qXcZ#h7hd%}Eg{A5+zRk-}RO<35Lg827>dMBj=S=W~tn z{|)^2&fkjt1vvkr->+7+e^qpxCo}w?LX7ighW~GnK8YCT*$n?C65~9a;UCV+8I1mv zkzRXa|B!yau)oXjf1YkX@jSLVPb1HV`EE%%=QkVg6Ke8+i-w#XPuNKXCziv?e$@`_o3#Fy-FYUjN&il2* zx3~V?`?akqfAW4+^)bsg=F^Sxji)!t^FNl!)#M)Yw}$(^xKy9en9P|GMHFb%h8~W7 z*(*B8CoqdS3qh1MVy;kf)=&*$Hgh(DXduy?mojtN2~>|^DdtiLqI+Hbj(JzsOJ!6~ zVYAH5B8VE?=+vV+tF9lfZ;81jVc>@?`zUUDE^7C%GIQ$h=n(a5YO5+wrzf)rd$54H z073MrQ!>gMPH_|Y4OU^Uf*=}eIi(pVw}|Q|tjb&!LG*6K``vQ$1ymnkA#)*uXfVDv zn$P4GP`!cGn5!X(?mB2B%ATL!LVktSnX4m+{6svjx8tev3o!J;+zW!}stc{IIuUn{ zUW2)YDl2mnX#R4$YUG<8w<)^qrrs#~%d6@>swkMu;i3J?=#0JB7N@w=;_mM5?hZx6fg}GPhE3+UyHyeK#(&ny;x^(Zo12Jq4!aSV zE|#fgj~ezlpq5+?btX9?kGhEOZt_V){BGEuqK8d->En({3K*e~exBH3f=ga_=Yvna z$neTBJ6ti!Gy@b-%n1+7P{J(Rl=93RgN#we3a8vNPd(+N-8az48BHWvV2E+9d8C;Z X+E}E5VH>Ng(M~HVI#}YIPA>QZN3SCK literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PO b/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PO new file mode 100644 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/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PS b/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.PS new file mode 100644 index 0000000000000000000000000000000000000000..2c515c4dd3f2da9176ef09bd338843664bd433cf GIT binary patch literal 623496 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

gTMo^M<*{ia#Sx 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"s":""); diff --git a/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.WK3 b/2/linux-0.11-lab/0/Source-Insight/Linux-0.11.WK3 new file mode 100644 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/2/linux-0.11-lab/0/linux/Image b/2/linux-0.11-lab/0/linux/Image new file mode 100644 index 0000000000000000000000000000000000000000..44a9e1e755561202b630a5d8939b253678cacc28 GIT binary patch literal 136196 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

R)0H1E|O78N2>WD^Af%dRyyL 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 +#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/2/linux-0.11-lab/0/linux/kernel/signal.o b/2/linux-0.11-lab/0/linux/kernel/signal.o new file mode 100644 index 0000000000000000000000000000000000000000..e61cc198f58cc6060834a14d11ff0dcba193ad49 GIT binary patch literal 8956 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 u@H*k1%Q!y}3dnH7Wp literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/sys.c b/2/linux-0.11-lab/0/linux/kernel/sys.c new file mode 100644 index 0000000..769c394 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/kernel/sys.c @@ -0,0 +1,443 @@ +/* + * linux/kernel/sys.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + + + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + + + + + +#include + +#include +#define MAX_ARG_PAGES 32 +#define SIGALRM 14 +#define BUF_MAX 4096 +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); +} + + + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[14]; +}; + +int sys_getdents(unsigned int fd, struct linux_dirent *dirent,unsigned int count) +{ + struct file * files; + struct m_inode * f_inode; + struct linux_dirent dirent1; + struct buffer_head * block; + char* buf; + int counter; + struct dir_entry *ptr; + int num=0; + int t=0; + files=current->filp[fd]; + if(fd>=NR_OPEN) + return -EINVAL; + if(!count) return -1; + + f_inode=files->f_inode; + block=bread(f_inode->i_dev,f_inode->i_zone[0]); + + + for(t=0;ti_size;t+=sizeof(struct dir_entry)) + { + if (num>=count-sizeof(struct linux_dirent))//限制循环,防止越界 + return 0; + + ptr=(struct dir_entry *)(block->b_data+t); + if(!ptr->inode) continue; + + dirent1.d_ino=ptr->inode; + int i=0; + for(i=0;i<14;i++) dirent1.d_name[i]=ptr->name[i]; + dirent1.d_off=0; + dirent1.d_reclen=sizeof(dirent1); + buf=&dirent1; + for(i=0;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; +} + + + +unsigned int sys_sleep(unsigned int second) +{ + sys_signal(SIGALRM,SIG_IGN,NULL); + sys_alarm(second); + sys_pause(); + return 0; +} + + +int sys_getcwd(char * buf, size_t size) +{ + return -ENOSYS; +} +int sys_mmap(void *start, size_t len, int prot, int flags, + int fd, off_t off) +{ + return -ENOSYS; +} +int sys_munmap(void * start, size_t len) +{ + return -ENOSYS; +} +int sys_clone(int (*fn)(void *), void *child_stack, int flags, void *arg) +{ + return -ENOSYS; +} \ No newline at end of file diff --git a/2/linux-0.11-lab/0/linux/kernel/sys.o b/2/linux-0.11-lab/0/linux/kernel/sys.o new file mode 100644 index 0000000000000000000000000000000000000000..d980ed3232af9071fcadb972d67100e156f5d56c GIT binary patch literal 17196 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 OaHrt?f(Hbj6a4?c7gq)V literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/system_call.o b/2/linux-0.11-lab/0/linux/kernel/system_call.o new file mode 100644 index 0000000000000000000000000000000000000000..8ce29cd9d744bf0904c584eb5714b7841f47f6b1 GIT binary patch literal 2640 zcma)8U1%It6h523R*BhEqxGkn6(hzr#w1#;R>d@%)WS+PS(0vR?J(J$?XKC~S!V9W zEC?do5H%zOA4(s5NMHPUQwkD;*u@AcKBPvFDhj1ywFDm)6nzlJ@66BcbxPC&cfRkt z_ndRjJ$o~gmxm)Gfk1#f3s57~6;ZgsS$WuoZrV=Gv|_>5Q%mW?n7sNIL~5!0=ZP18 zzN;m;JT@9zZO8oLcZ;8_?qqT~`V0HSt&Ukv5L% z#oqtoVr9kN|5ClqfAt8q1Vfc~n@~pZ6c;=`am3z3Ir043(pHg{UH5yTE1~&tSEzic z(K&4S)26Fk$g#8#?%GwGT1#D{?Hy(-Gi||lCXS4Io*iq^(J|iAe-v!Ayh)qXzcF_+ zH*9vJ*u2W*O32#aJ{&t5U*9@5)L)si3!beMn^!o_x=@SaL&Vpq*DU3PItdhpgK3W$ zTDDhcGlF`Ps!*wS(lj~8|Fupy^4)521Nct;AYC?YJ=+}^*V)W@oPpqCIgZ`gZ#%}l zu5JXf?Qrj^qa0u6dobAlzx;McKA?8KJ|?btr83G}okHRY#x~6J8M!{bf_w&VPf!ZO zVN?qA^6}bM_RqgY&L?MN-DLNKYj><_UGGsFt5zG(>n%~$x)GZD;aJtW1*FxJSic>d z>vybb-3ij+Nvwy!Z3!fml76bjnN+PXo^t&WXu1Az zXu1C5&~p7L*0sJ@tvqzys#Xa?&i@Luod0!bIsa*B1;eqb^_E9%4A41XJw8AmL-VWB zu>f5F@%q`0U+;V9hDC z19>_B81xxwKQ9+gaUXMTtf!}ade)~GeEJQae$%Jl_UToh{>-P>efpwLU-s!=eOmtG z<@4Q8yBp4VZ}RCqKE2ncDR$_fGW1L&Ov8h58a{wAgb|L@NQ{PK6vp#Vl!gE!k->v8 zIvfcP$D$0e7@0y98YT2%UT6jtjErt%M2XDI$-J6nP!l4f=V>ylC#JL{nW~aj^T{ln zL364(#hA*fCru`XW(wWFV%|{9k}0&Dl2Ef*lP1+9PuPm!l}KyJVpancO3Ki4^+hR+ zI3lGRQzSAu%}_F2q){vgdqJDg64RPQ2PmDCd{SAxP$)?g1=T<;T2`7$YSWp7rsQ>@ zsMBgDt4^Y(gkCW8gl3w$ptmcYY{s~^lq*58p + +#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/2/linux-0.11-lab/0/linux/kernel/traps.o b/2/linux-0.11-lab/0/linux/kernel/traps.o new file mode 100644 index 0000000000000000000000000000000000000000..a7a72cc2319eef77fbf69f1ed66582325114b5ab GIT binary patch literal 12968 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 F{{z1=W#<3@ literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/vsprintf.c b/2/linux-0.11-lab/0/linux/kernel/vsprintf.c new file mode 100644 index 0000000..06b910e --- /dev/null +++ b/2/linux-0.11-lab/0/linux/kernel/vsprintf.c @@ -0,0 +1,233 @@ +/* + * linux/kernel/vsprintf.c + * + * (C) 1991 Linus Torvalds + */ + +/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ +/* + * Wirzenius wrote this portably, Torvalds fucked it up :-) + */ + +#include +#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/2/linux-0.11-lab/0/linux/kernel/vsprintf.o b/2/linux-0.11-lab/0/linux/kernel/vsprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..41d1faa93ed64a3b37694ce8f065d328203bbb37 GIT binary patch literal 6152 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 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: +_exit.s _exit.o : _exit.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +close.s close.o : close.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +ctype.s ctype.o : ctype.c ../include/ctype.h +dup.s dup.o : dup.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +errno.s errno.o : errno.c +execve.s execve.o : execve.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +malloc.s malloc.o : malloc.c ../include/linux/kernel.h ../include/linux/mm.h \ + ../include/asm/system.h +open.s open.o : open.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h ../include/stdarg.h +setsid.s setsid.o : setsid.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +string.s string.o : string.c ../include/string.h +wait.s wait.o : wait.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h ../include/sys/wait.h +write.s write.o : write.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h diff --git a/2/linux-0.11-lab/0/linux/lib/_exit.c b/2/linux-0.11-lab/0/linux/lib/_exit.c new file mode 100644 index 0000000..c0c9d69 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/_exit.c @@ -0,0 +1,13 @@ +/* + * linux/lib/_exit.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +volatile void _exit(int exit_code) +{ + __asm__("int $0x80"::"a" (__NR_exit),"b" (exit_code)); +} diff --git a/2/linux-0.11-lab/0/linux/lib/_exit.o b/2/linux-0.11-lab/0/linux/lib/_exit.o new file mode 100644 index 0000000000000000000000000000000000000000..0448d24f31c808c626f8782087f0ca1f3d0d1a1a GIT binary patch literal 1988 zcma)7&2QX96n|syCQCNmHVKGEsgNTTHI&$!&;^y!@|8dZRFNoDJ)kP}?mD{`u^ri7 zNGrsLxPUnIfVd!W>7T%%65J{waX=h6aY6hGoH@YnH=fxzCwS7#`@N5O@6Gef_>%M%F@$pO_t=8yz_t_U%h*__2qBBeEQzQ0#ZZU8|pT=TEeuV6$1B) zoW|@7kke@X1m-rHaaxMw%x+VuS`V~s_NJC*eh1SL)f|wHp}uYY3aI8TV0P{iE~qCv zOKrEa(pgZ8Gp8Ph{;agyFG7V32DT6>P%kaJolET(+UJ((`ts>-UR@SxHl@NZME#grc z4L$DM`gg}!5_Qwbu7b0Ww16tj z{Gtp8@B0UNRz`y|%a1A^jKf^^vvj0u=T>(I*)S5Vm#bS_m%Ozb{YhF*sw(_vCR*D3 zc(WI5^q#7;Y|W#bKxD9}J`ZWV9Qndl^g`hy8vYeNeZCd6g_%fV6I_*ND+iTDyV1L zIM{=_-xjX-dF@e6*6%apXH7}FqPWvrV`UUoBllRRxV~MpQsxei$Q5?*h+LVUMqm#X*)97>SMRs3 zK%r;zuq!l)eJ6j+aQsq4VOy)@IB;u5-!=S-;oFA4W%zZ&`SW8uo?pfp8=3EgYF6Kd N`lpTE1IPbG{sjn%%bNfI literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/close.c b/2/linux-0.11-lab/0/linux/lib/close.c new file mode 100644 index 0000000..afd8364 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/close.c @@ -0,0 +1,10 @@ +/* + * linux/lib/close.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall1(int,close,int,fd) diff --git a/2/linux-0.11-lab/0/linux/lib/close.o b/2/linux-0.11-lab/0/linux/lib/close.o new file mode 100644 index 0000000000000000000000000000000000000000..53b8b469c0a1e8ba52c54787adb158b024ebf131 GIT binary patch literal 2220 zcma)7&2Jl35TCcZ{%D*UCn*psNEj& zeti1%SA-CxNsvhsMD&xHd0J8|(E*yFH@5HBZWm$Ld2@08+P!bDUOTloy}h+KO`F9X zsK3;h|M|l$o^$&FX!~yMojacaS!^Opyaz760eg%w=!Hy>VU<`jtipZ>(<=BuLWWT~ z%|=oFTKY=gOH}+3!g>TuOdSSi;ymK!4tSy0Rd(YB6~AKp)HC45jf6^Xv+|vsBxc0H z>RiRFE>vg4Y_awzJd0GRybKdopwu!dIpSE|tRAVnSb4I3c8-IO&+neBi#Zf4kXdHW z**RmLsMw+`FoUHDJXU|Hj@rC!14DO&HQfT%<@)G3XhQr|-48C$2qz;Pr|AcsVcPYG zI>RvboDR=O13yl>&LBIzf=q7i6R)C`qF6=`Eu;6lQ9!0Ni2Z)xbsOB;VHotKB2!Uw z5RSZNkam-17&nK0kZ#(`&dQ2Cblc74%mCh|co0TOV^1nCih_{NoV(CiYqXqIr`51W zZqykZ^$)K;->~})yBCi9#O_7z$g?*>l=mVS{Qz}5yO#!?#1DfQrXaNA#O++PH=;1{ zI!PGO`g-KW*ri%~XW&NT?Z^HVFS)$ok+jm8wY4LSr3>veNYZR2_Oq!(D<7@2oaNS` z%*t&$zzig=oF}nW77Nps^(orS2ejwEd7@h0HrA^1m#XCxcd8aS@#RtCwjq-!lLM_q z-q1t09Q8f;vb_owUP!tTkpiv;h&rb*{>VaVsZi6oqd z^G#vse3zi}9Nst69{@i~Eo1ECv8AMryNAc&sVqct9ruZf)2@HA7fQqN+P_e7V>b?P zbsUwgkKyMS`F(tu+s8xj>3z&V*Z%>iv7X9`>+ga}YDl*PjV9eDgWXgYB9?S3A*kH;N9Yf6Llbw)B z(-Q#ABz%l=WD<99LMA$(d(C%u7TwB6a9_snW%kx*?={SaFa*-`{TEP9KaJSah6NU-c<6alBbk>O-Xr=F#j!uU6#o6p~Badl=X2@d9Ca}sbmAv0R9)` CulFDT literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/ctype.c b/2/linux-0.11-lab/0/linux/lib/ctype.c new file mode 100644 index 0000000..877e629 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/ctype.c @@ -0,0 +1,35 @@ +/* + * linux/lib/ctype.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +char _ctmp; +unsigned char _ctype[] = {0x00, /* EOF */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ +_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ +_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ +_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ +_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ +_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ +_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ +_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ +_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ +_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ +_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ +_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ +_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ +_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 160-175 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 176-191 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 192-207 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 208-223 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 224-239 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* 240-255 */ + diff --git a/2/linux-0.11-lab/0/linux/lib/ctype.o b/2/linux-0.11-lab/0/linux/lib/ctype.o new file mode 100644 index 0000000000000000000000000000000000000000..0c37eba62dacb16a197bdf94997805759dde460a GIT binary patch literal 1904 zcmcgtNpI6o5PmOq=n@(dg{`W9RBA;)*hwIus?b8IpbA30^@0S&cAUhbwj;+uEfVkx zkoXCl;KYSL!<7qn;EGWB<}HaUIB;U5+2_rS=PiDH@8NyUIn%(I!6q7GZw={b307kz zHm5@+pVm+#(8`3rD;))M49dPC06qKxGT^R&++TqF(?`4c|C)=ErYLLjZE#)$Sr!Jy za@Qf)K!XSdYnoH1A(&kBoqtcp*>j+IG3WdRGR!;~8%%!eBNWEVe7RUD7{!HR=?wC6 z-mdTp@-DJ=rJhH|B~~b`BLJyd%qXrFZWh{=+w-}zSbY+hqco~hA%ZLcbL>1Q=Rb>c zpyDK8|2gy0gMn{*B6JiDgI?r!s$Sno#-3sD!lxj%>!sm<)%$Vi*P~GOLZ%6~E%eJ<6s+-l8y<)ejR_G*Ne=WGSa-(YXs#Z4+gVgFKPUu^MIEYd| zfiZ}X&bPXw$V-Db8p0IC)-ZLvXVxHzQ{PMDgxa8PM2~E1b91#?+i^!xI+C@lt0SQ` zUo~5HqjgDIu|30sFm+t;G?BcorPSX~ncZ!>g@(mH-<~dj_W4= z^Q_lNoT%qxfefJTwT#@%_Tn(~Bjk?Iyp4g#j}gQEH?lyR20W(1<^7zj)pvMN#i?t| z?vSpXkgGs~i$FS)I&LEqLw>C`GBVjIu1kUf9d`x#j5dN#PcilsoNfnQ7ecCc3#ivX zWFMfclb}HRwxMg8TwkHk(bk}S4`9gF?V~Q$p}G*qbst04Yap^;P--M7(7pgV$@JX> z%eY6Mq$nu)2vfy%+-JmH77>!@xR)wUySN^>GEf{r8JKlZ+#BJMM8^@AS6kXkI1pbT zo&X*P(ws{`nn^a_H^k9Pq(SG?y5?EC$-WE%j!|d&Dslni)q~nm_SV kiq8|rL24>}Me#Mo+r;r}6z3G{9+8e@j`AZl<9Mfk1Hs^{Z2$lO literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/dup.c b/2/linux-0.11-lab/0/linux/lib/dup.c new file mode 100644 index 0000000..dd13414 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/dup.c @@ -0,0 +1,10 @@ +/* + * linux/lib/dup.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall1(int,dup,int,fd) diff --git a/2/linux-0.11-lab/0/linux/lib/dup.o b/2/linux-0.11-lab/0/linux/lib/dup.o new file mode 100644 index 0000000000000000000000000000000000000000..191ad6f7d96e3f7c25d20f49e1d25ae9cd944d03 GIT binary patch literal 2196 zcma)7O>7%g5T3WY{%M>VCk7EKNEj&<33S&9wIC`jO-Z3DpjIk`1015Yy|!14chmiW zv@19a%X#PlD3Mw z5Pz@n{MX%^yyn&;(9RFF_iuj*WU-1Yv4&Y3##CnvdMRUMSS6MWtMEOTX%+k+A;T!0 zV5KO3CvBylBr4tkvwGKL$4So_W@lHBq0K|$4Kz{|%jlqG^#3plh?54fKM1^DlN+0@Zw+@W|FMoIHP1TTt$kj|c8Ypyoi&a%^P+9NmW4o~{W zmS1ezgQndNM}A`WBX{K4n<27#5tM#_Jf7W8gKpx7K@3$8+HvA`FWH+>n0VbJjA(s5 z@?vaGmE0Y=5p9IQKo%eSSH0xQrbkjuXIEE`H|N(nX^^B@DfSDgL`xqpwVlQGLZ&5r z!x@RI7fEcF#q6YIeSy~Uq3~dmhjF@E-Z56IGncF7)3>V@Iq{WI;&#B3DC0vdMc#&! zcv}fMJvVX5>BKQPtn7K6bg=FR{SYQ8yPZzteUP`hksA!K(cA*=j$VKqxsKS(-`c-7n<=A zh1GLGmw@x6<2?^0`~R08*Q3{P9FDigf+B5O1kTs@59-^3j_WI6==xS5>opMZmf+H` zph(*;0&AH~9|AO4P^4|=f%AD2Y^nww=jHwBytt$X;_V^8d(dgp@mwhK@jgQkj>GXL zFm$}jka-R7o9O|--At4-+jwj%uKj+*lklAM$R_Rgx$@JdKeJa!!~NR7R({(25W@1l zS5_axuQ2laxSrd`W3cIcOhMM)07Ne6aVy@#Yf$KR6!uopa{n z{f6&=b7<1>G}b(?x9Gtmt!IAlPsli*fiY(vlPSNrJeL2meT6AcbRS|ppX``Snj8a2 zCgBH^Ba^s;V=~bJoq_M}G`dw8n`K|r6VE@%?5T!*0Ye}(-+h6JvkEkj`^EeT#ra1i w(EMkZ;~eLezNPp{#m^}IrsDDrA&$!!>pxQZ>x#>~xSV`$Y+q5l32p%Y3$$zWmjD0& literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/errno.c b/2/linux-0.11-lab/0/linux/lib/errno.c new file mode 100644 index 0000000..50aca2e --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/errno.c @@ -0,0 +1,7 @@ +/* + * linux/lib/errno.c + * + * (C) 1991 Linus Torvalds + */ + +int errno; diff --git a/2/linux-0.11-lab/0/linux/lib/errno.o b/2/linux-0.11-lab/0/linux/lib/errno.o new file mode 100644 index 0000000000000000000000000000000000000000..d217c7db2ed83f5bef8c107b8cd9761bd743f1ad GIT binary patch literal 1468 zcma)6OK;Oa5T3153YdmQ1wmDWf>cC7c$1W z>Wve>ffGN36aNFQ9LhJl-o!{C7-@FCnfZ2SA7j6J@Z_Nof}9BQXyy@JnzNa%G3&HM zi?jh;Gk#69V8we3Crp6I@Wq0JJMVGKtIfx$2CE^i)|Y*+zFJ?p0A828`nG@Df3$pm zW$q$)YvlX)eD5UYoP*lJwhphuvId=_%NT|DSzp9xwvG)8QhAlIwToQCM0t;mIDBaTolH*DlwCF~aL@mY9vJdlUFnCH{JzXbXNF%KgR4_3l9396)*w<+)B=ZWjTE zIrkBY2A+z`Jw~Kj_Y3NB9j?0ob#e4!% zLhy#An9=dxlsuO@;zUK9+d#~{1*e(!;SW6Km%j^>{e%O41v(2o1LgBBLHSOq>y2?Q z%yHuCI^Wr9yhh)TU7YRje=YW_J7K?Ck$v9HOuT9L+L&ivsG6_7B+oxRO9FZ3gtL%G yzBwmXVQtWl + +_syscall3(int,execve,const char *,file,char **,argv,char **,envp) diff --git a/2/linux-0.11-lab/0/linux/lib/execve.o b/2/linux-0.11-lab/0/linux/lib/execve.o new file mode 100644 index 0000000000000000000000000000000000000000..acc081243ed081e41353b132934f9182d6227b31 GIT binary patch literal 2336 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 +#include +#include + +struct bucket_desc { /* 16 bytes */ + void *page; + struct bucket_desc *next; + void *freeptr; + unsigned short refcnt; + unsigned short bucket_size; +}; + +struct _bucket_dir { /* 8 bytes */ + int size; + struct bucket_desc *chain; +}; + +/* + * The following is the where we store a pointer to the first bucket + * descriptor for a given size. + * + * If it turns out that the Linux kernel allocates a lot of objects of a + * specific size, then we may want to add that specific size to this list, + * since that will allow the memory to be allocated more efficiently. + * However, since an entire page must be dedicated to each specific size + * on this list, some amount of temperance must be exercised here. + * + * Note that this list *must* be kept in order. + */ +struct _bucket_dir bucket_dir[] = { + { 16, (struct bucket_desc *) 0}, + { 32, (struct bucket_desc *) 0}, + { 64, (struct bucket_desc *) 0}, + { 128, (struct bucket_desc *) 0}, + { 256, (struct bucket_desc *) 0}, + { 512, (struct bucket_desc *) 0}, + { 1024, (struct bucket_desc *) 0}, + { 2048, (struct bucket_desc *) 0}, + { 4096, (struct bucket_desc *) 0}, + { 0, (struct bucket_desc *) 0}}; /* End of list marker */ + +/* + * This contains a linked list of free bucket descriptor blocks + */ +struct bucket_desc *free_bucket_desc = (struct bucket_desc *) 0; + +/* + * This routine initializes a bucket description page. + */ +static inline void init_bucket_desc() +{ + struct bucket_desc *bdesc, *first; + int i; + + first = bdesc = (struct bucket_desc *) get_free_page(); + if (!bdesc) + panic("Out of memory in init_bucket_desc()"); + for (i = PAGE_SIZE/sizeof(struct bucket_desc); i > 1; i--) { + bdesc->next = bdesc+1; + bdesc++; + } + /* + * This is done last, to avoid race conditions in case + * get_free_page() sleeps and this routine gets called again.... + */ + bdesc->next = free_bucket_desc; + free_bucket_desc = first; +} + +void *malloc(unsigned int len) +{ + struct _bucket_dir *bdir; + struct bucket_desc *bdesc; + void *retval; + + /* + * First we search the bucket_dir to find the right bucket change + * for this request. + */ + for (bdir = bucket_dir; bdir->size; bdir++) + if (bdir->size >= len) + break; + if (!bdir->size) { + printk("malloc called with impossibly large argument (%d)\n", + len); + panic("malloc: bad arg"); + } + /* + * Now we search for a bucket descriptor which has free space + */ + cli(); /* Avoid race conditions */ + for (bdesc = bdir->chain; bdesc; bdesc = bdesc->next) + if (bdesc->freeptr) + break; + /* + * If we didn't find a bucket with free space, then we'll + * allocate a new one. + */ + if (!bdesc) { + char *cp; + int i; + + if (!free_bucket_desc) + init_bucket_desc(); + bdesc = free_bucket_desc; + free_bucket_desc = bdesc->next; + bdesc->refcnt = 0; + bdesc->bucket_size = bdir->size; + bdesc->page = bdesc->freeptr = (void *) (cp = get_free_page()); + if (!cp) + panic("Out of memory in kernel malloc()"); + /* Set up the chain of free objects */ + for (i=PAGE_SIZE/bdir->size; i > 1; i--) { + *((char **) cp) = cp + bdir->size; + cp += bdir->size; + } + *((char **) cp) = 0; + bdesc->next = bdir->chain; /* OK, link it in! */ + bdir->chain = bdesc; + } + retval = (void *) bdesc->freeptr; + bdesc->freeptr = *((void **) retval); + bdesc->refcnt++; + sti(); /* OK, we're safe again */ + return(retval); +} + +/* + * Here is the free routine. If you know the size of the object that you + * are freeing, then free_s() will use that information to speed up the + * search for the bucket descriptor. + * + * We will #define a macro so that "free(x)" is becomes "free_s(x, 0)" + */ +void free_s(void *obj, int size) +{ + void *page; + struct _bucket_dir *bdir; + struct bucket_desc *bdesc, *prev; + + /* Calculate what page this object lives in */ + page = (void *) ((unsigned long) obj & 0xfffff000); + /* Now search the buckets looking for that page */ + for (bdir = bucket_dir; bdir->size; bdir++) { + prev = 0; + /* If size is zero then this conditional is always false */ + if (bdir->size < size) + continue; + for (bdesc = bdir->chain; bdesc; bdesc = bdesc->next) { + if (bdesc->page == page) + goto found; + prev = bdesc; + } + } + panic("Bad address passed to kernel free_s()"); +found: + cli(); /* To avoid race conditions */ + *((void **)obj) = bdesc->freeptr; + bdesc->freeptr = obj; + bdesc->refcnt--; + if (bdesc->refcnt == 0) { + /* + * We need to make sure that prev is still accurate. It + * may not be, if someone rudely interrupted us.... + */ + if ((prev && (prev->next != bdesc)) || + (!prev && (bdir->chain != bdesc))) + for (prev = bdir->chain; prev; prev = prev->next) + if (prev->next == bdesc) + break; + if (prev) + prev->next = bdesc->next; + else { + if (bdir->chain != bdesc) + panic("malloc bucket chains corrupted"); + bdir->chain = bdesc->next; + } + free_page((unsigned long) bdesc->page); + bdesc->next = free_bucket_desc; + free_bucket_desc = bdesc; + } + sti(); + return; +} + diff --git a/2/linux-0.11-lab/0/linux/lib/malloc.o b/2/linux-0.11-lab/0/linux/lib/malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..93877394447c6a3a313be848d7f629d4da685939 GIT binary patch literal 4876 zcma)AZERI%9e>Wfrsi=Fy<;@b11Rgm(%u+`{udl z0G%*QI+E40#JXjP2CZnKM2Fdjg)qA~A|$N7#6(Tl2NRvfNh}|jY))ma{(jF(d&|Cf z!g+rG_y7O-KhJrdTaMqi`!kkh3G-MYES5MS&NM2`fP`*wn`jpk*LtqLx3I7r{qOq=3zB09?ITMj zJ#u-lNlpf}PVEIhxh-azm6XPNlgY^;mfk(3V6qiylB#)QrcCI2rlRLXs}SFO_ut6m z%zs?U#N^L`NlT8C>?tx?kf5Uu0y)<4D>S&wdfC;UsUaKCJt?7wMJbXKM_{>xQw#*T zs%x-mP}kmc6Y^CPmo{T9dO-HC7T4v%w_b*v8RmyTb?98HH8!f%GS1NC74Bm(Z%4iRjUnUu^=X@-T(f4J6K?F>3or(FN2 zqOxl!iv8_CQ|Ir{L72to$MBLVf5~u_>OT50X(#2>7C(T5R>|FT^Xn7%1hD?{aWoEU z{Hn&qk2RzPw#KMN6F{>M2fkAtaf)uS?2SA568`1=;Y^S{==#Gsx0>xY0xekolH7Ml@K4ubI|olZoyHp zkp#~+8s~DJTdg{kbhV0Pe%aB6BcAIHSEZq@M-}O0$I|&y)ybAUFR1u#PIO`FYSy;( zFv4064xI=S;3$R3rH9P`D3_4;( z=oEVkgLUp5NDkw*PR(O%DrX*tP$dv8vLEMEFuPuM{k+m0P-VWntjwR9GB+}y=5npb zBdlKrAwV0;xCw1LhkBN0gNW~-$wRE5POf+ShZO8*JS7lTo3%O?Zw$v)#@ej*NbBur zLEH+*8XGq@ZfdmRSg~dij*;0J-+)WcZV`=uI>JtTbtgj@9}s^JsyGE}Owy z8#LR7X0%z>&NvHd?-D!XeV9&ssj{t|v==MKiH}9Xjo*0%ac{gUc^_lwwMZ~GH)k>(4&I)def`SZH@dn)Hs&=_4oW%EH&!mX zeWf7h_m!)Cg?uSE(%YX}x30I4&h+&w0mh8*+>tCk>I@G}!PBbZd%_%~c~9K`*+-o1 z&OmBIYQX6&roHUgz4=dXSnu?XI=v(1V&3l^@zO=Nw^GL0;Cc||OGxMTjs&HwpD*K# z>m4bTd#iprd$70Sm3=qsmpz%P_P`eMKtvtLSqZxKZSZvEsRh#4_8FyjL|IqU0X&g}8tF z_Ki;WBblJ&2dXW-cLtJM_vE^PRR6#lB^5&cn!tv#p4cO-qfu*RlWjkZ4M(~B%>m>Q zD7MG?LvGCGHXhJ29*d9zE( zm-f>lm8n)m$}1~|%AA`CMu+pIkuppqoz7&~ht!fb?WIejE*%#gxWdK(xkM^kF7h4~ zsS*}Ag-xRtT=}?T!*Y{g0{`bDKUCP7`;UF8{hZkzJ}dFoOG*vD!ZCXRBn}JtlY+hD zPY7Oh^pVFZ@Vg+`PxCmMSPP`RvAYgJUCPS9(EVT;PaQcz(C&B2M2^NzUd1)?i%_gK zPLP{StXTjN_gMN(Nqu^`v{-GUb zFJ#P1xyf4uZG1qAF2wsg3H=yd9(--QYlz3X84u_7V!UzC^kE=zoeEEDEZ|ywZ#yt29avtoD=?j)= zaj$?B?;+lgN$AJqC7PU6UB~@ffskiG3tq-!T;?=;52QE%;o~IqW8xX!V6EI1Z!H)( zars}u`7;cbJ*C$*ZDx1s*KHBVq4@4JP65IpC?bG04w*>j72A9!=NQh(qU{nD-R zfvc$Iu9P>C;du{@;;#`Yly^-fUCL*5BvJ8j867m2*OHOi3n6T*kD>;vPKZwcL)d?x zBag|YHCBk&JZFfoI|~e9L%pQ=m&wELpXA}kpP0lBjq8BS^F{LTKR_P#_1LJ4TOdOI zWgz8iv2Dor1Ih0uen^Ntlp}6NBX +#include + +int open(const char * filename, int flag, ...) +{ + register int res; + va_list arg; + + va_start(arg,flag); + __asm__("int $0x80" + :"=a" (res) + :"0" (__NR_open),"b" (filename),"c" (flag), + "d" (va_arg(arg,int))); + if (res>=0) + return res; + errno = -res; + return -1; +} diff --git a/2/linux-0.11-lab/0/linux/lib/open.o b/2/linux-0.11-lab/0/linux/lib/open.o new file mode 100644 index 0000000000000000000000000000000000000000..8884503d8d65bee3d41406d31508807f141e3d14 GIT binary patch literal 2364 zcma)7U1%It6h3!mlHFvJZGNgIB;W|CjXyJ+*hNZzY-*w0d4MHJ)g?(FX1?o6DS zEorGW5(|bXng=OD-|DL`K2;DDVqc^}#RmiWs30h!Pd@lizjJ49clxAj?v)?cjjg@kid%bs?_Fn<8+SmPUk|;!dka>AZ-@oxq6jvD!L*nN z(u~|UP&K3H7YN0YtrR__ZZKC_hOJJ9AW`tU~%np z@Eq4E3an~7l)EV{PSbXbd|&8BBnH_OXZxJ6f%0CEu^6~tLhEPn!hK-+cM@C-ivz{c zf?k{`4vUfAp$C98MTNpsa3LvG^CZ1{SOnP6yQysZ{q`uJ5#61>}aIA5f_owB3^5sl}xrDz!Ynvu@4Uv$Iyqsg!0C2Y7`}t(-IG z&9Z&iE}K@{39HTH-l4-!npVTK>OtF!t$GM_Yc0S9aYHygA8@W!@A%c&3;YN!Kd_?M zslINlg+c6A;~=E-&T0!=z(yjk;kz}n+H^vSnn4(wcYS>4>Mf_y&00NZ=3u`X5 z0>5Fhn@-KoA2FxTRXTp$Nh-FU=tyh!@@(0jDL;~U(aQbYPms8HhQy`3m>4jOchOc8 zK0Y@lc~&Qj`Au!UIEIlwxm%Q+=58y7-Ro!87o|R^U^l@Eka@c#p$i9LDR%PaKaUDKIYTfLb9NWkd{RxRbUK+$;JnlQMnZ;W}^EgM5!c(@AS-(Ml z-BEs)_rA<*XIEfb?K+vI%Ny54&PJoVT1x6H + +_syscall0(pid_t,setsid) diff --git a/2/linux-0.11-lab/0/linux/lib/setsid.o b/2/linux-0.11-lab/0/linux/lib/setsid.o new file mode 100644 index 0000000000000000000000000000000000000000..c1561bfe09d2f4b7187220efcd6bc62a4ad0c42f GIT binary patch literal 2240 zcma)7&2QX96rZu3O`4?J%?E9wfG{W(;ltj9u25A!hy2s$H!mzt@9!;7i=E0Xu)o!aAO3uY z&IgYH`#;w1-iF{%BODn5%fmp=PzKZsA}nW|oaKz&1F_#Hf9wpfiXJiAy}URb<5$C>9AzCOPw;Z|u3=U59u zjE}^#i>DWn@@Widpc~Tn>rve94LV^x+s(vC#H=vS zqK@BYgnV~9%=|7JIEbSx?|@es#}u{?$D7Cn>zJAJGxz-xQ`Jh;e_v%1N zYoD$){ME*bg%)SL0D1kYkb4tyY1(mapr+Kbi3HWS_3Hdq6-V38cKdnI0?pHcb`6(? zJwFe3a^ZJ^JP>{>L;I-ggss75Gm1A7m=qthT50%E*&3ulyovplCa@@G0&)nyo%H)5 zI_JlziH|xLH7e$W-KMH*vF87SpM?|ee?>d<-j@$4ZGYNs=!Y1C!km&zkeq4{4!vKu;6&Vf2whFntz6Auo0Ug&jhGEus4!oHIRy@Ms zMKoY+SD`RGZCemrG8&BS3gmL$?~u0!9rJR3Ca-!3Ase`b03RCx)Wi$Gm*ahpAdJI! zlNcu6hu}Gf`zBbp@ec}CVcIzMG&O#|!tW*JQ6S^@h4wS1dD9rJpdaBI4D#xM0i~ab z4Nx3XAAtI zN?;3Ca0E6gU?TAD&Z0xCs{z*KUoU;}PK)PZk_gZHFM*g@qKKSN`jn>pp-D9TIZ`xk vMeCW5e(IirzNO`NG<{Fg4>WCQ+9O50Pqh4{rfMCyuv|0kY96QynP>bT2zmUT literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/string.c b/2/linux-0.11-lab/0/linux/lib/string.c new file mode 100644 index 0000000..1182e63 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/string.c @@ -0,0 +1,14 @@ +/* + * linux/lib/string.c + * + * (C) 1991 Linus Torvalds + */ + +#ifndef __GNUC__ +#error I want gcc! +#endif + +#define extern +#define inline +#define __LIBRARY__ +#include diff --git a/2/linux-0.11-lab/0/linux/lib/string.o b/2/linux-0.11-lab/0/linux/lib/string.o new file mode 100644 index 0000000000000000000000000000000000000000..15393528871a0be25d32766f8a1a6c71b70ab3d3 GIT binary patch literal 6376 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 +#include + +_syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) + +pid_t wait(int * wait_stat) +{ + return waitpid(-1,wait_stat,0); +} diff --git a/2/linux-0.11-lab/0/linux/lib/wait.o b/2/linux-0.11-lab/0/linux/lib/wait.o new file mode 100644 index 0000000000000000000000000000000000000000..f3ccd4f38a29f38cd9f98df051d0d57466959f62 GIT binary patch literal 2580 zcma)8U1%It6u$Gbn@u*^Zra)=wBU+ctlFJTY|v8sYpS(Us#L2&lqK_%m7ttbuZ=z2XD_CEO7_8rS=iclT1U+!icYf|U=iYPg z+}+n7Km3GY7($aFEYa75_}xxDQxdj{^!yLh9#bhx_t@&JrWFIC5uo~u^Ae&gJM z>hR*(>aaMKUxN5+nf%rdml%2ZHfZrmd1iU>#_-hx)dG$1ml0%NwX1YrUy*Z$mw$mT zEo&Qf$i^+OJO=5wAEO6!VNX;W#`Seq|zMEa^I7Wcq}NgIS!+F5+G zcxWAVrtD~5&N23mr=I)953OV5zOf6BjT@Mj&k3uL#+YNM4OOL}T9~>+9bAK2Og{8) z89zuf7W*-K$9Iim)tfO)E?*rKrQ>9ZP5@1D1l%zGDvf~4JBFKOI8NOUTJycOSC3D} zqOS^Z()AOk#T3cu1uu3wyo$ZRkCQfJSuZEKHDo-6Gd1#suK?!kANiTxg-=Wyb-XAF zLQ(I8U9TSW+DSc(>+^olJ5`%-CMRq2ZnHj-8o-<4;E`jM>B^L|!&ZaInWMruTQD{a+x9!? zI1iVD#Ct6EmkNvKbZP8lsjz>!WHWA;^6`#~=~B5-!WZkrr@M*U1SV069W6!PypwpR z65+Jn#1&36#?jN*_L{x9h9As^a7o#1HY4vu*6T)YFo#WM0(b^G05ycu3cFno?QjAd zfrDdBk0g!pIt_V@TN!O6??^KkWK8~{r^}KJ;@CW3Kl<9eIsd?JJY-_=U`n zB|F$RSm*%TLE<~M7L8#qG*RAwp?|CC*AFRQT)xHW&xw4Vh5Rpqk}o30M05FSc`#3Y!@wt%{b_~ID|}gDQ{g-j`OYc*g2Im#exdLR b5%a!N`p*jGdhyY7-}KKYtN=~u`xO2I^<_Hz literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/lib/write.c b/2/linux-0.11-lab/0/linux/lib/write.c new file mode 100644 index 0000000..df52e74 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/lib/write.c @@ -0,0 +1,10 @@ +/* + * linux/lib/write.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall3(int,write,int,fd,const char *,buf,off_t,count) diff --git a/2/linux-0.11-lab/0/linux/lib/write.o b/2/linux-0.11-lab/0/linux/lib/write.o new file mode 100644 index 0000000000000000000000000000000000000000..3d4ce0a6ec721a740e7519bd51fa8517005c8290 GIT binary patch literal 2372 zcma)7&2QX96n|sySF-6gAADq$N*HMi;ltj9u27V=v?YZSR28XE4$vy{?s~HpyLM`O z+oXyBDIki%fru|5ajD8*fH*`P5K=*a1P2aCNJyNx(F1Vd&_nsX8Bf+d!IR&|@4Yu~ zX5QH2*Pc54v=D+c2{LJjh}t<7X-G9ochLkrzjbqb`*iKVF2}ad*QU2$s98V0{`Se* z*w$ukjMfX=F#i~5`Oh!cdF1YG(AL-EFW>kENY%`V!?4Bg5R+i0qe_vHD}Djf$mM^A zGIM!9NXRgX*Vrja??K5LhV`gSEB+t@g>RwqpF@bzLy$~dQhf3mWTDee{l*Rznu87y z`;DDkvA|iQ&q!1%{U(tty_3*LZWnm;C5ZAEg!z-KEhfal%2e5`%v2`CWMTYXRH{+A z`~+M`O3e~hdJmbE#q#0u@)TC*h+|a+AFM7<@yO%TA3a$Wh!yf=mQ`vJC6T1_+ea~JC@w#{soPL0Ep4}M)t;7$57_K0+6CxySx7m!m zOWCL!xxp&-k{Q6g)B`XFIjykY_poaxKr0;_k7}(N<8@c$aj3QbA9){=uw~+pk%{k| z>vw3K)U9~mBbi*OEK4U7+h8Jl3Hi%RWDUGEWiIRC%$cs+Uy7vXx}vyqaH z%>ifE_dbfh3m@Ndd9YsJaoBncOj-oE#zsmyb{1IM9QqZ&Vk0FTI|H1Zw+1i{AJ5DC z)AM?;^%$6R3*ZtPDe0ICoUPXY;5uAy6s+rUA9xJ!o9QAx|C`E`l4H!9sn&TH(C~+4 zh7vmO%`{Jk-qHt?IyjH%V=&w5k|Vl`yaf)V#Oq`F0G!>&k<32!Bc}H;0XsX@R{+=H z)1>Fk&dISiibQ`x;})iUV6Mk~=Q*?W5;X5__%!Ky8f%^P=jgB7+RysVzcb_P42<=z z)hJWGal;BGVX+x9<%td*raaj!=3m~BOv2ACLnd(thh(Ayy4U>ePU3{J8Qhn>`%&Gi z>MsCy9V}2@{){1bW`SaSF08qCtoi3AaOn55Mo(u`zZ{P^&&zoyQ@xz(7gK#9)y-7* dSfk#DDgHFoU#42F2Olo4o%7D8+JZKK{{?;~5k~+3 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/mm/Makefile b/2/linux-0.11-lab/0/linux/mm/Makefile new file mode 100644 index 0000000..e0bcd73 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/mm/Makefile @@ -0,0 +1,38 @@ +AR =ar +AS =as +LD =ld +LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 +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.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< +.s.o: + $(AS) -o $*.o $< +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< + +OBJS = memory.o page.o + +all: mm.o + +mm.o: $(OBJS) + $(LD) -r -o mm.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: +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/2/linux-0.11-lab/0/linux/mm/memory.c b/2/linux-0.11-lab/0/linux/mm/memory.c new file mode 100644 index 0000000..adc33ec --- /dev/null +++ b/2/linux-0.11-lab/0/linux/mm/memory.c @@ -0,0 +1,468 @@ +/* + * 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; + + if (current->pid > 5) + printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); + + 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 do_no_page_myself(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 ; ipid > 5) ++ printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); ++ + address &= 0xfffff000; + tmp = address - current->start_code; + if (!current->executable || tmp >= current->end_data) { diff --git a/2/linux-0.11-lab/0/linux/mm/memory.o b/2/linux-0.11-lab/0/linux/mm/memory.o new file mode 100644 index 0000000000000000000000000000000000000000..47f156d50a75d61325408a8a1c3ed8f0c2adff20 GIT binary patch literal 13824 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 L+T;g=UUU8j%7>uH literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/tools/build.c b/2/linux-0.11-lab/0/linux/tools/build.c new file mode 100644 index 0000000..8b8c7ab --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/tools/system b/2/linux-0.11-lab/0/linux/tools/system new file mode 100644 index 0000000000000000000000000000000000000000..d07530539b21e21f00834c58682dfe4135e79f24 GIT binary patch literal 295629 zcmeFa4}6rxwLknM?2>?syU41muCnN&Yu#$p*oGQ(#k5T^ZKI-6Ma7CKwcKiL7PQq6 zT&Q_igZX)FYt^nP)iQFLPm*e_m{n;d ztdKQ9(%U6ge=e!6v}!(IX;mQ@!~Zk?)H+X7N`ILiDvh$b8L?u^ik=k%D{{dHr^W^< ztlasC%PqstNU6v7q*fEjG(WMmz7>r1Or2<1?U~J$!NYrUh_&)}oo!jafA#iP2I{TW z2>{6K7>l$GoeQnszqX-s|HLeywybKa#qMueXRYX*-h-I6te9P8pXbZ;Revu1PO#$8 zpCNifuwws*`DCHxzcL5P94K?3%z-io${Z+jpv-|X2g)2MbD+$DG6%{WD0869fiefm z94K?3%z-io${Z+jpv-|X2g)2MbD+$DG6%{WD0869fiefm94K?3%z-io${Z+jpv-|X z2g)2MbD+$DG6%{WD0869fiefm94K?3%z-io${Z+jpv-|X2g)2MbD+$DG6%{WD0869 zfiefm94K?3%z-io${Z+jpv-|X2g)2MbD+$DG6%{WD0869fiegFf5m~zE&iLoA1>IO z|AVhsR^gPwN9TO~YhS-&(br>N{d((VS6!99vUU6ftNF~c4jUU>>A4Veei(UjXVhBO z?BJ@Z$>)D*_EWgubFCG&tmAu*AKdk~d;547s8xjx;M#v}(to_2IoA=MAOT?L59Gc=#4v96A9Y?YKI07w-=ug_ z!#Vb!&O7()%xgO`+he=BcU6qDTC!H~k)GAbk5yW`z^`%Ex>T~#vNv>dMa_QR{)657 zw|_xra3FgJ#>*#qR<{G?D*jBhb_@;{gVT|(qHTPipJ{v-AjI}qZGk@jQi)Ajg~Ofr zxt{o#RX|RK30bT7vbqC5+5M$BzS^_mKGy55Gq6zjKGp?uUwaxqcYT1L32)+O%!h-6 zxo=?^P_h&B@GB7g={$a3c*(Lpum>(bu=$S5gY)m3Z&^=u9|$6yZxt1LeH6Vus=Yoc zy*}#g^~-wF)j4*jLPb}x>qn3$VqNnWv_Zr`7X~uhlW2-sGzpu(1|2_&DpVuv>+{9i z@s*|AHHU-M$isYiR`(%|2}sAsi>zF9a)rgT%*NyfD33a%C)i5BmGCN&ILeP(*X#q> zxG5i?Y)FeJ*&IOm^G>2rrw@SRDy_dV}#;C)pL!hm+R*UOuS+8$;-23pV49!H~_ zn9BT#$pIu6*%$*!F=b;+*ckJ&5&4n;NLuN+4l(Z?3c@@@lR~7uPt>;{ZCOui0Ab-v ztATC&t>p2g`1HkZBy3hI#X9Gj04K$?P3m&G#h;LVGKx>XQ6zTsHg}1=CWt~RSD=s> z)J9j~alsv2wnRxK#kmtmnj!N@eHT&=#(S=Z5uQ4F8)i*ZG76GQG^4zqWAe-~b)Ds@ z>yMFUL(b%|O;HP~CW_%Ii8@9a&=CPro8`z^YqHIX2Tax) zlXW(;&O%n?!7n z5TOWS+_$uIb9)*v!V*25G=Pept@Ror1n0I+(HsGHU=;_@Y2ex1Or7 z($rSBQYKG6NZOz#%Wf0R?l0X4BZ3_=_|P0y?hSNGik{Uvo_y#-9Q%`qvZD9r+YvQV z2```}kZJcN2*o#|1cd_g4wW~hVA}fDeKkQ#E&PfhL&1n7T^sjVtz@8&0^7aD6U}rN63fW;H-IIVK zFJ{n7)*Nc`&lw;x6+lx^wcxw`9qXmkDg9DQc~|xoR0}B0#nPA?S~1i=FCIk0g~kL| zd>R$aYz!N@ueCt?MAY$pkW^$Zxo3hip01BgcVWr=2~=P$vlf4Cc8hgFl;w-0E(_=xNwy~aG*gU)miK4^#Wod zeCT$yPMTtKkOJ6K1p6nIl^~JKDA5G9cnwH5)>pLBfewhmLN5nzTmTk94%m64tJ;r| zA>$xe7bw`vcj3~=6m1w+nalLPBw;Q zKs6&Wgsry2IgLXqreT{q0~`;n3Wn@n!Bnxi;1}g8qTN50+N+ZVq*f*)-PPRAqHsW+AjL2avU| zYS+kJN|iN^<@7##dzcMK?l)|T#sJo~#pf# zgU7nTwLRycdK>YxZt0@ZkGI+t_N4A9fGn<8R6%o9K{_)7AFX4`8*6)JGdq6P{RDm- zV7>G0*Eg9Rl5oLA7hkxcrK?L;YMyH8n*R#m^4b3y9Bk>z?7V2vpXq&a)|qF^$h6|c z73S9Zo)f*gR=+2%i3XPH%m)r>a6q=nX572t(EY}esZ(5riJ1kOegqE9+-}0 zX9uz!G_Br!dddsI$9~niZ}8{8wr2-UJ2UqiRDJgB3%+zdU0dkaVv28e9bj}aI-qo> zLlvV#1jhzrJwIg+4=$Yzg3mekyxfJs3hUyFF5J+yJKTeQT8(RB+hS;FtVWD!&Rz5Y zyR9!Dhq~efDcYQ?|2C}-ADE}%pP}z*IQI%R#g_G4y>IaDbI&`cId{Z9ObKro>dRxQ zf`V3Z!Rh#CZrHyEgZQ#%(*AX4e7?fk78`uVaq-!G-q`UyH~4R5K8%gsKRT_#8tiv- zu@bYNlI1kmaG9P;XqHIl`93I(NT#=H`SHsq^==KdWJ5ATrA15iaKQ$4PL2c(&`b$D z8=(#GO36>*$$9xp9Dg>Vrie>qdIDJv2zUu)IZMY&b(Y`>nbsf(v&U|Qs+xnbxe2qI z;tW4WOy2^gmKz7`4fYl-i)HM46H?|PMOYOa)5F5!**WpJ2$+8hgvf?PaR{0Ph@B;a z2(umSk_Iz6v-808SAg*2ObH?d9X|=FfZr8pOm>DvaVp(`tX0u(uh$}1t{9k?tqiUr zU8dqE5y!9hg*Oy(Ql!VUJqpy*82u2U(aTVkptU)Zi}mI>($Ka`1|R8HeW>%oV)ajE z#&08I2~El|G*=?KpZzqR$%-d~q-Hs&>DbV*CHQy`y1Jq19OC$-ho*5t(*=x<5w$N4 zA;g3hliAG1+6yk?cnhlH$j?@a89Wy;!ypZ88KXu5`5Hl98Wp6CAZuNadY2=H7jyBX z4KNQ+%G`WBNyP#@+3Ytm|5xFIhB&r3VP_fGIRi6!wx6N?{`uauPu< z8x^FUATve6azB%wWAY6nC2wK! zOH5u-nk*yi+5slN#^mpgl$>Mob|&93Qt}Qazs=;;rO8V9PA2bS^2}1>K$9)n4nEor zza1%eHIoBOzGtN55R=19_AMEKYY`?#nY_|$M7 zt{%<_8LQ{_eao_L@WszQ^Q`mEJ%>ik;W|S_Kzgbn*FLx?uKG z^Iu1%!ms8(2rH(rUPF)0-^tKJ^AEWekNfAJ!pB|nm-6xB`3=|Macgr;&$b=3DoFpf zm9z5~z*L;SgcLw`-w=(vL^Q)JN*3+56$69M4yEB=iMen7lYI2d{|g^$=l_I+J^1&V zEM^G>s-B7?I+Y$tHmA3>7|rp!WFD4`un(h_!+^0IZh_@c0q{a}$%1$-ouHZ7hD~uZ z?1LqEXBB+V6iVM z%lFSyjeTsa&=W&!;+vfGzr)zD#-@4)4hAwVwQ%v8Ls$dsgs|NeLFE_{`>3xJ`%QKwvl$1tNS}pTU{~xlT?UERT}eb}4tXVz-Njii-?Fkw64B+3NM8zr zz9y8c4oCXh>xtG)<2r*A%62iNXt^{YRJ6}2fnZ1>X7g=-PBb(;*UgdhFw_1V65{yQ;CSXF^xoT>%s7YY*YgrEgYzj@=b5Le7Px6hpJ^u4plIt=$zX zh8paycrnyucO{CUMsQX`^I_s@Wok5{)s3iS#L{>>XmR7}6lj4PQLhp6+=!G$G`kTE z8Ue}oWqK0QyTO=7jYZ=$;SGQ7rP~oS1tY<+x(6Wys*I*=$YK)45M-1a1gX;bzld<( z5fD`oz)CP3V@H$)$l5wtA6>G3CBj)>7X&s8HGwsFcEm82fhels7JG(l(;z82sqI%P zf9+QS7YdzZ#F4@5jG7dHYYaqdDFlNQFZaV4fIE z2|I7?85Zg5Tr)h<-`PDpa%|__!y~KwjFa{WwDeVQ{bmf;Z^mw_vNwGiOWcPeBvkef zq0&E$O2!PMQX_{@sgXmd)W{)JYUC(XUSC3GAKTnoMOA_!K$c9ne#dZXHGk!GSndV%%|DXG z5L1Eph&_I}g}H3SmQ1e3$SV?;TlL4aNynAE^@Z({ENbqc8K>QDchs|EQN^y<{%ax zN>^c*ZB}JrABL*a0t2FJ(GD~)nyfSz|7$y&E3h_FyQ#rfT~nA|sKruEZRcqfU=0^! zn${5C|!4x1%9Yt>}J9bTA!ew{c`<+s?*w_R*M3TXzA`8SEYeJcwp+!k3gboPn;6SD+ULPv_Cm+7TQ+!kxHuDiH^zu_!Y@D5$RRF_ZSObPQ|N^J$CC&!%=U4GmIf zT{8~CTu038pS2#m$EGPBUV29^YKj(BTR7M)ip%2OqH0l8t#u9iq=+}3HJ*~@x6){3 z4Hn2AF5jBc+#AIkm;_?ku3l1vb+a=&W5FAiv-4v2P1pyp`pf`j=MZU5r#T?V=!072 z#ea6lb5hY*^E0pevS_bSa^){UNlsS7#1sll*Qo}@kf&+!AHk_cN>1T0Bzee9bQss%2HoF?)JEpGR;Ad1)c#wF zGJhM!5w{wd92R0x|9bR-FuMkx^tG(RGl0^o=?sOMP;eS-RJ8Mbk*tRN*+c^o8ca_B zTpi&=K=&RsZB{Sp6CBh#4X)IGAJ;Z)tO0jJ{yu}Na_@1CA41n{23O%y7l(Es4rC2r z%v{+wO=3gwG=wO=Q^hf$*bKBM5f2X>dTu!J$Sz8vFpkMwrkvNsw-n!;9KmI`WA%!; zHbKzc0&Ps;=Rg-x&xYrTiv-6&$;WC_gcsLWt*0+BuhtLNF38@gXa z58SI?G_ucXONqsR%|El*2Wj)QPIMxfI0WkI;i%&->T00o9%D(wOix+5#kt{Zr!0rMPh}6aVEdSS;;TYFwb)CT zyCtg+gItPeu`^PM1_zaw?ERfc=Eg1s>Gp8IA=BZ2Qgy)|c+Pc;37iKG+w5IMpHx}A zpsQ7l)tW%R^I>?gP>C8FeY5&a5fpC!*P#FUBu+goqFk(?l`0HqPbtNaGj2{|-*~1| z7xGH$5|){I0JRDaZ;fI@V@`8D(K*$;8VDm++X4{9yph%;hog=RM_6p$2oRDAw|N=S zz!D;ERKOIfvZb7*J1#a_iG28q{_u8AqCs_Lk|LtW;&&xlrMxZgEqqO=Y<>;iRr}Qv)WIOBhb- z9Y_^7gABHdOnMaQ;GJ)g)5#Nv__&qQ*o8p_qp)_xkz#W3mEtPGnKnR<2PG%g5o>5{ z1T2vGMV|bi^c81W3q3*gsH9Yj|BnNem8G0w%be%U(p6U^jjwS0G7U(>#6`jBOIIz@ zrIiX{cUBf$LC2PEY=L1X&2_gRq{F6qyrb}l)Ze&Rc;w_PiPz;OP6M?gD6>?L*-2oq zJBTye&R_d_m*~Fs`G}y!W!Nhvdq)7*6|buMhX5- z=&Y&WG$ZOy4OC!;MoY~ooo{2rMCAz+&FoAre9DMzau3Q+Nh+$T1t43ue~pt15Qe7? zf&=KYOhnj>cymB;6RE>fOeU@BtoU5-nhYl=b0;kv-;L@F=Fd|TX1;}0MT7_QpFspr zrr`Ml)mV?$`j%{JUtMsj&!(_z>(=qh@X!Ykeaof1{97m-Ihw#6Sd)=y{a2ak1OZKkttjf>?tW+IK!aP#onB;lHh%_Z&k=)2N>1dXYlYgoL| z1h70#6Sfgs`@r1@jI=(%93LFGuKz%Xn1589pwDaqWzI?1_rSoWUngZF^8cX>t8*5f2?rHVv9a zgASvh(GiWLD;l8TSSOYzVUl*!Ei{MmZl1Gli7x3~i3-@^4p5O8Ldm4Idz6v`95i7? z-skILwUw&LK*>%KQ&L%bR7z#*HwSE6*_XQLdIBBR~+-|I(YGPm^mXG^0Pb^YAOjQ{gRTc~K(KO`V!?^nZ46c)ZNUMQEzi1Hqq|iT zTt{Mgd+)jeXxHX-wOpkrI5_`99zO{P$IBg~LX9j@L`&CxMFsvEo&ve{r=cAWMB^KG z_w}ex^UYX4TY&+WHrCl_X*llfiwDeIN@;bhtxEJwVJ<=;EB$e4%$97ISUJ#Oj=smR zGR&er3giW{sQ{Q?J@Zjg-0}3Yui7t;qv{R7YhA}0zX*|>c>~7-;!sZ4cX+R0SkY0+ z$_^jL(wvU~2)O`18d-H5%(rgLxjJ}M!->tCD2niJkuN~#EZS)U(pL%*$X!0 zjg4WWSvz6VYM0oa@NSXHlCcPf>#-H5`8!8vEYD#6?cF>LV|i2cpMQXM4KTk0L(>6Y z4RE)Hi#&9L>+?LptZeR;%4CBly|29n*eRNxNV@y?9mz#~=`@hr7jzfd zaJ@^1&UvU?T@?*-M6cSQ{|K~)lWkJlvxcZEP3@k-hNndJ$<7eP%|Nsoi2I8WjPgKS zZ6LBm2u67zjHP*!K}pLH&WVQLE(UEL;KWHzzrDV9tG}Y(AK!}F3y#vAH0*Eil*e%7 z{#+}k0-S61S=@xv!Z381Q!+b! z!DVDMV(T&k*m(f4JsReUJ>B6JBbb{C3)@Rsek=-8w(1JZ^4VHc1X}%OPXBPQr;BkV zK%BjS9s!zVfF#aSX%tHfLFi}WA24gtcft|5x* z%TSqM4G!&a#6V5C@lvHj*{MPytq;^Q^rSOsF@EELC0hpvKN{q5tyDnR!?Psa?1yk4 zfcJ^29AK@+f*U;}DNH_wM_msyA{jyjIq~!aQC~CJ#S&@zwvX&C0s*1SJci7oD4S*; zF0z?^xhR_jt^(GGq3z|?MHG4@;D0TZ0)Q}S3NC!c=*}>35~T&LJSQIOJe`|AF+!=u z9JRsneSo8546@Ta3Nbs}Yr+?7P`~{ITQrsv0;VL&#FY#;XDYU>X?M-PY4yuU52EgS?TVHgV>gpg5Vu8 zJk^}UDxBsfb$$znc&X7~KG%HiwBA4ZDxS=&_hk4!GtYGqH z?6TV-V-Cl#PYl7T2XS*jT*ASdGSx*~9BFZ3Z;TC9fv*2^pp~{ub4rk!h^Uo_0${3f zofIjj!&uAjX{U?BtmoD_Efb~>8kE3kc>XV)9t`=> zZyabFeTLZNUK{i#HAFHRd&!g z1e$dn%*5hdG%e@90!?cC*6+bIGXop(R+aV7=gJ`;`yh`dRw0O`okm z9}Fz%rE8S^B ze;6DDKVn4DiznF@^Tzyxm^MvoUO?$tw1-1sDW#xuL1%J1-0?cM^cz`ZWf7LWC?>c;Xzn#3ypV%3;#=n zheI9zupt%^73}V#2bZ;AD3WHu-LXdbaqEGaFJ-Eqo`67umlw6H_)H9zgz{9BIH2{vd{<&ZzmB^KmIjKid)oJ#<=5@>^jyAJqk1x#c% zqu(J%3@5#yel3idE0IJ$MaUDGT(}&`Nm1Hteq46~O9qYcIXIg{K12-Hvm$ng(^$&U zLQci0DH(_Pt&yz=Wh>&!R)rht;9h#tho1!bj3J-?3Q?4C1LERLh%o^k4oqmoDfpY- zKobpV0G?M!f(C562d#zsIKp1Dh+3b9B`4iAc+$XJO76Y)d*NOU7J(uCxxn&vN_u^T zcq|Rg@e}6g(;T&))*^OS@~8q`$s_BI&DBFaqfq18Y3x5vN+S;EqjHjztC&J52$@Q; zEDlOhSR@#LGf!3tWK9NZFz20%W5d7#nQ$7K$7Tak`Qwog7+R~eIHf{THbbj2rx~{) z!i7t7--XgAk01lp7S5iwAnfAf@!ul8E^=vRhdhu_?bO4AknmLZqLb`R_Vc^`_Ai-@ zVKEO_$#`#Wy!LZaf{^xlQx~XJ^xA{b$1+8&QiL&#iaK(5qT}ZbR8Sy_7`oPNnK2jy z~X7y$3Tg$e}bV^WF>a+!^@M{PlqI_GDS( z1$ok=v+WTKlMdOS#~74DqnXK=M0ks7t<19eQLukdyBNK=wJZM8IaMzAQDP#;)EkfA9`^${&m9~$Zi zb<;{zdnBngXFC@J&~T=Hw;q`&H7wy9OFkprMotX2CVv9zy{b{*#L+&kdyUJt(LAJ|GYg zNk*(g=fKeI&;J*Q&b4EY1n9(6r&2f*VM3yl(az=Od>n8V4w=iWLD&vD5{?ypCq`$s zsoii3eR#N|AnX2P+J5KFA)8Jz8KQ}(JdBZ?7Wg6?KoSpBNmkJhk>Jq8eim~A$-+MH ze-i11ZGx1zju&w_zHLKLc*qPk5I+sUMLjFU`%Yr|F|W>Di60fDdWiKug2Ug39xdVU zY!wT`;log%m&0%Bp2OaAI5p{i#$n&#|1WX)3e43?IsA3hEw`_jwH&KCb%?CCFqZUT zv=A|3R6x4;CTkvKMMpI3rL?gD!#bkv}B+4GD!R zzZC72(Gyerz=F2VP_HXz^P0U(l-$=YmX4_B0HAK6J_hq-0S1g(OU@Y7+URfhBOdf} zh^pn10itfxs0jQw_v8#DW~XG=ojlAf2uYz{)=+`9d)LNeW z5sKGdq_YbU2nUPt-G3v+{|1TyfSCrCVrBE)5F5plW>$oF4+dVnxH}KS| z5b@3wTtWCb^d$rA7n(C_!5~$twe>8N;Mb)(*>>Zlx?sXGb=wa|VRE z8(VsVg`-UISE6{P9FG)@0>AApMtk|`l==0)zs%>+rAo_eHD&$+DV{PJJyMzP&l#bf zX~|gJZH$^`!QCPpmz=#vuu!Iktl}3)2;06;hw9W8&(1mK`#9R%(H6TB$x$O+ViSg$ zldU$S1?G-K*}1zV;I|VT0!|nv7WpGdb3%NgF9m1>;rWn-F8yj%MhCIB%BlwkCD@WOB+I$sBXI!5zOyd z|9khDDKFYxOh7qNdNJS`A!P+BR9uoHJ`a@zj`|Ty;G&#dMow+pst;4te?kRmQ9$3h zd?oUe4{$&5&>QY@JR@YWQ*}QVKiThP!vIg|18-m8>Dt#E?P4zRQXqN8H36iFi!Y*Z zVFG);_L3Nwx$Hkk3=-%Z)6$!(hQ;VhU!gdSA60Pa8UUFn-DC>dKV&}ToXHKuytd$a zLMU)Y@l|$J?9EtI+RWXk-rhg@D>ln+6kKg*4I#jvc0Bg9v}?HR5wao9i*eV%p6c5T zX&)?H#w_02&c!IeZXq=VtweVM?KXj9duS){il}f9D`<4220v8?M;-qP3f9JW>5U7J z51&z*F_v%&%%BWrcOu0QiW=8r>E|v_OXaU-MEP?nUE^*-QgZ{LXh8~e;j$qx#$APk z8#(2AN+XBS`+hA3F5?@u<}+x|8#qS+b3i~;HR~~!JGr13+CXb8{(O@b>1}TwF_!ak z^hAZ{1baO8c6gY^_&&f>B`H#dD57Vo6NOzfcyrNRNp1!+smoKfSdkmw{VL;c1p$c1 zo=Qb)JhQX1_4DZC>ZN*(am=_{@^MiH``Ys)APOc@(U0X;19Y}Go?3|B7lltqEC^CZ z7@5}TLV=TyOA9jLC%D1I5tkcS8MVAn^VFn8wEi2ds}FUWB;{>3on>N77CrO`l!HJ! zv$(r-p3;a0W}`INVE=pTbwlbww;VjXZ<9k3S4*rDo(v`wcPREv#$aWxS+a|L@EFJOKiV4W`wDk+Q z4xZ3POrl}TWU*10yx15Q4S*q^NE`V?eu<^Yyf*lCDJmvMHMC%W&?3H=z2~Q!u_(v3 zGgGL)yUER#bR+FDu+GZYYlDE=QJR-$*LK^y3p~yH22ipZUN*+SvA?f*L6VjG?UA7F zM>3&ylDk$idSsUUWGDi(4*n)+R(f&4f?qfqt3PHL`ThsBw|Sy`zy6AcEe1) zV$+kM^|(DuirB4d?B)a?#yTyQ2n|vp$*=Yz^@W`iINi~Y3G!Z zcH>u+G=pY1xH??@C338!n5d}#!HcezxY9HB%u#x8&5Wu8- z4t&DOW37e4wUA4R9h(0zGK{W(o}w;5QEW>vj9SP6`)_f~DZ9Fb?en5Yfo z+0mNIRJeENxRKb_plsttgr_byUFKz542dOJcE`EDVoId=4B>a7D-ehus2V?t7k4opvi(%&Ia_@;KhSu6+7SmReiIBCK#Oy_Zy0}Z~cKL8rl)Q-pAwkPd+V=) z7awCdCP}Pmj42X8d&|~|&>`ElQ5_m_a2+ekMj`z~#Ts*d&Tza3fQYGN%Vk38ke@X6&XN&(1ETLq% z(-Or#64zNogsR&5QO!tITLKOIF;?@MUx@913sht|o5Vf>WkO=}cN;nwc_$-XVJj)B zi$$e;6e=ik)S{Lu%Bf9(*D!d|&o<}_O|S~0>>9!Ae+oVenA6r&HesOC;a_>c1z%?Y z;8+q!x~MVvPJ2n5@M60VtYOl9x{u)*TF%DW6_KJS4A)eHjpV_n9&=iUmFR4)Bto?4 zScJ^%g(E5(xUo0qm$_$zrKl7LTg=e%5a>Y(W-Xc}e3d0^d311)bcMx+aFJyOCS$>+ zGr$6C;JWi`brLJyrxdnPj{|{I0PyaYtqXB-8&ccHakCSlRFknWNglN=1ymTa86f#T zD#JWnnI0I*l@8Jz2hGR{nf)JgdNI%+f^Ovd z^3*;UCAc<1PYLQyN_y^NUn|=0arrdKG@!V)SJaU)txbMJ0KTG- zSoSRAw}^;vF)gfV5xbeX2WgO;etq*D-@o=mh@#w5^X^~mery5Gtye$0G-pkFfR;id zxZjPL6dbNkt>iUw#=tOYviqqO_I*TZf@mIp2d(&`N6f%!1Xg0BtKv}WU|UQkxx}%W zF&T`s+5P#39JrM{CUDtiG6F%(rkIPV)T|28my+!S0{5k4_~R=WK`mEV_^JshTM$2- zEp82gl3ZlwQNUSrF^e`2a`MvxA>?Ljg?Gbx=!byZR|c!Ybn&n`1g0yP*p3?u90A#^ z01!2bv3GuD`VV)DWzeIt0j!A666gkm-Q{J-H;hiC!aU&iGvCa%jSb0rPfdSlaYxYz z6;WM+t2ISUP1?#kH6r;dAbrx9B+a0Ls;n%`r@djd zPSZHv##zxL>wze20zx|YQL`135MokA|FqugxVXR#P_`Dbc%TddE*+!sX}Y75F_tfc zPz489-~=Qu_ZMvX<`YK4+F;Rt>O2Ca20*eu5C65n0u2nKqzLmVWuqvm zyN1Bi#3i(h4(UF;mawbeakhBKz->weWWMhxwN0tb=c1F?Pz}2vU~0Sv|oW&qLXSP^T)t-mbe67eRO_B^WvuSTQVDK^k9R0vyI*h;5hP? zv>1K&5pO1oZi`*;fFqx10J-nUv0ljL+=4H2A}PzGCD&p#(JdvadsOZvK6ErfD6XLxsv1x`B(<9J84!uWK_qYD5+bpZSIyRBhD=W!x~V#t znT3|d>L{|Zb}~Tfc*q$pMm%SrL?8x4$c~1ho<=v5k(v>Z6?*jfPJmFgy{h|MMWc6~ z4UyXQU1|T=^3;5;wF3bbW#+rf=7l0T0A=lCeLOm z?R-!hO<`6j_cTEOW*HkdjZOeX0h)e-y7S$WrmEyHH?N-(w19I&?(JXo?;d$buHt7Q z!NnR;>(=+6m)2nE-`Sg#fs+35#opl0-vVx-NGSC=&;`7Zv4;7sM!v$gnLxUpFghCY zGfU^NWOCsU$p{0GCy^Sud<1RBkWe)B{y@5i!Ui1JS*5T}X>BM?+1$mGaD3si!Yn5ArDl_GeVtQ$ zo$I`AN_|yQH>EC@rwuB;haQR&eGogw36+mvw$Hpy`>bE*h(AfJFs%3JFDe@X^u8MW-hJ4)*v{s3 zQ{?l39B9O}ZO}RSBC)q4)=@qY>?*-0elY(BNCmQq0@;C{4w*2crZ~=t!T~Ht_WXki zi$h;?WI0dFvRPC_Z~jzzl&mx2>L1ePEHXyKIR;_bpsbQo3tyvttYdGN<>lWY2eEES zokU{zYJ*F!|5+4mxG&}OY^2O)O23=pbbqM;Pa`0|yf@&YGij$xsiWU}Cyl^hXK7Ry zpL?i!foJy&ZbtdtV98)UXqtvpeM+gS<@?QAj9E-G4BYB6P#oyfT*?h|b&l@zV%>z9 z_pNQfF0J!`lfkpKkTNYTpnU`tLcXJ*QunWFLmFkqVOM}}bMO}CASxtnD;|B4daav! z3NuIx7gH~C3M#}TFJ_N+Gtpp8>m*JI#Dmn!aC9>rR75PD+kDWOpv2G{WfFL5+p8jx zy5u1PVk_n8$N!22><95F1|SK`XnZ(}aC;&On=g{mmzsxq^Nd-T!);iG+vfzQ4NlHg zt?pUU{65k9fnH#MUPb}J{yVxyaRi_RdLLn5xJzUT+^WHmO6bFoS<>d3M#%6WtE{k_ zXFHBLA$9xo1nH6Ks2-^dTwkHzP-GNW_TqQy;ADtqFJF6iPLPRaII~_fQ&x`%2Um{| z-rR$Mkel7?UG8Y(M&v}iN zK2R(knMKw(4p7TL9dagRsl2YUwi0OTNHQX4nLYURe3#=owK&vNgHY|!AiZ#~{kP6< zvM0?}NBr3~h~;6cjxmH$Uwqy|{5*n5ObrN|B+!G<6(D8~Tokqe9?>}B)&T!OFtiaN zGBh_TLth7pdtfN=>@~9{zNO6CJ)=5MAXy2l4zr?v53{BqqsylkJI}9JzF+Y1XV5@$ z0{b=?QvmSrte*wh;MI4~`i57$4*}8ORU>X6$J?Go6jKUh#+rr9ijABkSS+%~iT~GE z!{m-4M5ixGQAsL4lakRT3)KvA>z?=zQuqoddSanoc$F5n{dn^(=W@JpS9U&uSFD8v z$dtkOChm77znSeE!QiR|GQx!~fNJa-9mDg;dNVk+IKJeuy`v#MX*vG$W)+M&9D#pf(+_+)UUe+TqM7MEKSHAsfmlhY#PU=(5US4OG*P~&`7GmZ-QCTl@w-BF>Q zBGjp%2fKWn#Km}S7k`Cg_LTE>=2XAOjCyDy2aX|Q?Y?SZRrg=moXsW*OWFgvK_ja% zoNP)uJAVUK3(>UArm1;7JDZx0kxo;mY+oFZNq&;2ey=5!eX9wq(;^p}8C4dlGyh37 zS{ksO4%zejc{WB>F8R#ja*01k7uKcPR{EHw+#N&L8RdGMen1IwBn`_Nd8&~#T7O%m9J)(L4s{Y0nQ7n!E)b}rwGMHsmD^5nQKLB0 zi-KbXy8q%_GY>9_Lx$dY9V^iWFQBD}M>S{y8uUrxu~Eyb3uvXJOpzTdKNXnM@->K;43(aSei|@h5#NMM$5=cFX$s!>s9@0U(AssozjP?Gy$J&0qeP&rSvG3dtZP@z+!qJ$ zIKni`%mD!oM$Nb=6t6M9VhaLlofb1eDj82^AwGckBTf9ijAttWrwEt6Qe9FnA(r}w zrWIb443Tc7+iBvDMq@UK~s?q3>+d&U!9d&%K&+MGM@OPPwO=d@^#zu9%nefiS z%yFx!KkTt$(Q%ILJ;Kq3R{C3EPRbe@ ziLa6q0`e&chX#?HD?x)htWH#bnBV0`hE4TlS7@uMRT z;u08C$Ix#w>Tm};reW_ z{UWm6BydK=ue3_Sr#%Vm^=?8E33A^EF1q2JK+GjWyp0Qif=KK_8Bx{g((+u_#NuyW ziKB%cgARWjL0Q3a_HCX6nBWa5UXtnJeFTX^@qVR-Vk`<4g%K#3}wO9infb; z(-xwN+n%k57C0p%|FE{sS_Nz{XA-hvw)Q7Phcft_uUFGUCE)ulW>mfnYB_fzpiyu% zcYwZ7Fq#%N zdz^O&^r4=pw@>tqdtK%8SmI-AA`7K3Sxm);@;rgro_wA1sk~_Er}B!hdMs|q`Yl*V z=$ttgm5k5qeLaA$@rCd;zU9ZaZ`)D*R>#EiHOByPAP$?=l zVo{eLC|_`jaTo_55?H~o3ZKE2QIb~-pzfZN*$_zC0X<@bXw)U?XpZz+v`&)|hiiTg z=vYQRK#ZM+CEG)Otho0rjqieW#6P_5#Op4&=x3MmHUs#t`ea1{H{8jAh%n`SKa8IM ztwuWkpyxHvw{&T(!8E8bna2cba@)%QNdVr4@Nbxc=TaQ52l~h4!M+QT!3rvGDPD?0 z@CwO~+yc^vAYyBr{2IFhMIn}GyosUQs#&`lDKHA8NC{SLz{VJ&;loOoaP$qh@c|E0@Ex&R;t%0vsDqx9jE}P%5nQ%{dst3X z3UO0{%f5v;;1}5oE?eM*!2M|G0M#EM4&9v>3x1q}GZ9;N1`C5#pc6qhEQ8fg4-Rfx z8b5~gBDZfmo=(mOkQ1%(HquZeA69D}^73ty0n<>S3ZlzslL}g6t=o%%ajmbo7$&&U z(B%$?gwwyLAEM$xu{Da04}=ErfPC^pRs1U);bN&jE=_@A=_!+KC^2xgIJgKOYb}yc zKQ8^Sn*y-IO@O1$Elx#E9FVhkgvfn`;2U)JGOi|peb6`pKz)EV2y`xu*XnCEvPoA2 zkMYWGNcJy4#etXbh-DAP;5~Swbl%bNQCA@gdpQvuQAEUi7@mo61Uf*Hs1(qFk(h9~ zKV!$q5CP5^y}_!YE1XVj=oY)jMnKA&gY5^yu-tJK7tW=ZW7-@F74>=lwhBYmoRGgkWxc9k2cRdTI8Sc(-DE3=d3Kmd1Pd(mx$k zj9GL#!X$_uWjB^U_9A5?A^B1)1~vyGF?o+6f5ql$>%UpjhdNXvxbQfhT+-lm9E#Sj zaO*1_@9Yw#aw`zC$?(`ss{`c-vb>VaSDD*mc1k*h2ACWPzNDCac?aFePBOBR-c2ZlfWbbR|Z43M>UNgQlz6Fh$y+a-X`v^tI0ul0ZLY6oXPN9*z}sBN_zK z%YIkUkDGgNaiy!N7>P7dV^}7{t2CpTc?C$jfz^*gJS0M|Y|Z;OJE z?9KeGcpsnfWk_zjs@P#Ki6f+0m6|16Y4qZQzJ$^%2Gq_l-$-)fXh$GUtb@{S*bnm9 zIJovpUsRn-E2<)5L*-saIR-!`6zJPep{|=rznXejRn`|CE;kCdQf9A(nFzCMvtd^K zs?_*96lp9htHvKeCf+wxawfOE05FIZ~aGEpp*i`Zf8Yv zj}|DcG!eP~8!XTjduM?z{14$e2R*1BK8nMo*z})KJWLS_bPZmHTcDa;Vu5PZXcnkK z47Wg!rexn_O9K#w!DY`$r*gW+cQ%OydKBr!xZzl!lJmIbB64pd4OQY}s0Dg7J+9(!wnvTtLo z9b$p98?rTC$3771Dhhq?EKmpE5DRow5fO*~;TEWqud~D;5exLPVqS30SfH%x?k!L+ zHm#s*fgU&v8wtW-LC&$F#x(b!kTzDuF9bcueI*4p1dVKyR6;H1a@@Gkp***P?_ldL zJW(2jhC%;+cn;B>F{E!X>AwYdi3R#oBzV&KWi!VDb^6hCOx*yo29QMybTdN60{xA? z(gJ-*v327i7AObcku6X!Bn{6VLh_|p%pNSz0kuF~_z^A8)Ka&;Vu9YfmlmkgWFW|6 zfjY8$7&g;PtBq`dda}z{g%$@U#{zwYZKsVsa%=lRr5Yk)azZ#Kd4g=`wKx;*m@1;+ z{=c_C7d$-Fju_nneU7qmhuD-txod%bAI@ZsG5PB1QVX1CJQodqgQKimRcPBM&Eb1YB_y|&F`I?+$Ip7~^ zfzpmBTA<#}wU-v?{B6?7X)AgyP)-aXxm;`<(E^1o*#Qv#70fnNSA^!W#>=KD^(FFK zx&C`_FN(>)HB+_gl~wIDz8mH4OYDrQ8+nOk+xK{>QR%U4r76)VKDlbBM2=+H4&9;R zM$hP9L(zL`!mMPTD;eTX1s}N>d*Ua)0>(A)7%x2?E5+42oIeC$j5R=$TNKDy*c12= z7B0C#?rb6G_FU^~#m3ZiTv|4lFUj&cHg)U7^Q#U+ixU%(7;e!>%+Y`Wif9FPjf$v{ z8j(;lw{FZm;qdQc2(*WU2&_%>a*|Mi8^7==qO(CQA|vW-5WzT(E~f!nvdwgc zEw%tdQlPg9_APuI(YThDO%M?eNwks={b>W@ou;uNe;>ytkT?T)xWCbG|DICrXO$V? zKE5d>yFB23f?|!QoaQQjj}qM7?e{3Fe*tCR;5Y&OU;I7FQ?UnwieS@^%FX>AWdhN% zWT2Z&Llq%a0bKmKozft?=kP)2)db=~0554?&|-EXuMnl}%vq5QLhjyf8yH(K%U`-* zg5=_62`{$|(9M&_asyNPam6i^+6bS(Hn*XxlUfFTXFPo)r&K2~w|*|Rm7kOh?Tb%J zQi=;Hh9)c~YAU;sd>$67?Iw8&;;9np&VczSv%pO-Bv!A1xDE;?cTvB70Gnz$4r z+a)s16HO`eDYk4o{ieC?#Bzbl66bZ44Cboee3O8K61fcvXcA9~M2g;5C-Nu*%>t{jtW1|UxdU@V zlC}aR zD-9$_NP_fO@WvV)A%y%m3N`(y-njhKyK+&d0#ruhMGV)B+5p^D>zIlW*Q`HV?- zoe)C~FFxGh;f3Q+u^QmuA$A@_Q28M`c4M?>k>%mw4echG)m;EQ$PzJGqGY>rqlU?! z`gbX&lqz$-A_gHN4K7t*DWOUZG%4$&UHP8$af_^!}bADH)(BRXCh!mixH} zVq{vuh@dn!b)`pDAf5e32MBZhaSAJcRJ3#za!;5194Aq*GQhJiVH@JKFOH&1FUkK2 z%>qcZH0VXdeuY7bHjYq!IkGyGTdh@Ef#-$R^f=Rq@F9n{g zXM*UF6VnTeCHgxL8am|T9iigwfJAImDtisOxec;Eiwzd0@cj&A#k=@e;Td7vmD)?f z2;=$>XJGW_`=zlReIOmmhbR#2y5FG=R^fbPtU+wF5JUwJJT6VGBoTZnQzZ8}ShxUF z4kVP7eikBD1BfW61+cgAS}PJ)hXnI|Aj%pYu)vTQN~p%uAzj#f33?^zL0;Ty;wX~e zgDN6M40#>V4@3be0x>u~hT%0&*EV_*`hZfn@Dzwc*!Wzr%_aKa2b?xvrdZiEb(l#I z#$`7}DrtkATOJn{OYWD}$U8kTsiNaduXxBybL+=>dNX@yQ8N^J-}l>FdUsAfdcEV8 zd>WCXYsz*1xQGF6sN@PF8>V8Di5)P+fPCyN?a$!r?-i!A47(-0aY++K`gRdM@{&B2 zgGWFhJe{Cz?1+QeuXvGN6_DU5ZyIfwdb*UGrXnF|llg#6{s9FPX?ywKz&xx-4CZfV ztlBbBv_NP`3kdY*xrgnvKycX?bo4-_QYh5zgf?-4#KHV$O-bysc(rUW*TN}(FZ2b3 zmZkiI476!5z^*z#bcGrG-2xKK@)`@+1`33Y#ytlWNWk8pdm0_r@y^$Tv<_RkGiH>Ft^D+?M%PmOLSAWbsOd;e#vVzA-03{}r z6kKwi=*y24Gqxxa8UQ%Mp&IL8ej65Ry#a}6nB`CZ6HlD%$IDJWW=QZ=$lD)_p*eKC|j5431c5oVkSmjyH?tz-$W zxE~Aw1^mdvp2x(5`tiFxgj!b6{N-RF%gY|OOL?1{6Nd3pUOoWfK|c|b3s34IAJC<2 zh|$Zcq{VUtwN8Ige#eY3MhW>l>{qJjKBlR>U(*%cPlIP(=#_+KZSyM#t=^Gwbe_nN z&Lg-(;FT+2aLO^wdB!>s3jz5e5lRbAH^mqG!gujWonrg3FG!Xsvxo?e*DUm*H*ycg z?%?+|=5iYn8JutoElggUE`qxc_qwfcQ8xtwEmzHl=~yw8$>=CLR%B?$q9cl1?=+8= z2;rCBtBTj$z9H@YMZ`&Eur{EoXoSurxu=@kHX7|9eV5MhA=<;3$wme5MqWCx>}}*^ z*qC+yPN6sgQgzG{Wp)8_ka!~jGJ5<7tBfiy(>0Y>#kumbKQ@QG&{q;#%1c(WB>GZ52!yBsY0m$y zEEGlc6pdpIyZux8+keA;F=SNZ zd9N7qM9}%dLp$FyULi_15{$)c`&Vs%-E!t0IzLDUm%DMKcRqkj+B?riku)hhJaC3O zT*xs|3c6CJ?Z?Z~}Rx13Y6VPkgQl+Bs zX*HG2Fh`~20H9-Hb6_cFFyEVR3e8_;M65VxZ;_L5EbUl2+>&K+w5eGGA|(h`qKS#^ zr^Ghya@n5bc_Bg;Q}1PJ;j1z-?}n0qO9@TlK8y+Il{|PKkLB+%y|OsBjxYKK3X#SL z!$!rsEMtHcyryihwhw2+L7N^hlv{({wTX)eqs&6{xhK?!2ssSH%<9#dfc30nn994u z{P&${)`-g%jp#GXPkR1|kl-=S=ho{o@NV?+3964r9KR36xXVfbDYdT|zb)0cCFA$L zsJ`mst*YHh#_weXS0BqDGVl{Xi#~pc(0drao3{%Up6Q1mxt&O4fVe`7iY+<~ zP-*59F<7XuQs2ux`M%)h<84(!g~xp=1-r#XaiRysQ63cg5CxiMF#o3MFE-@v=U9G* zsJOY`xl`C61myKy*zj9S|GHmbZgVLJ$E5m7x%Zo|@a0F7v8%6PXTETrpuvY9v@A#K z39cn(D(P4>W;PgwMx05FI0wwdnZE2v#hK(AoJsB|ok><_Pph_1Pp~Z<46MCW8013x3 zZY#8Yc1VKz**3Qq+^u&8OHU(uZjEr;1sBW}P9If^kZ zfIreqg8pV^dV}can@rvgH11E*fmod6oaf0on>mHBW0|wK2ooPNkCdF7fywO)Mg2JD zz9Riq9^@augw;91)0C*{P`34j_K zO?N%i02Lkt%UtMg-HN{O)r(X#-Aiw47t8JeJ3ZD4u@+yun5Q_C1g=+L=fJYyU3$0R zHGUK4qB!0Ti?6ctGG)H%ND)AY`Ks~c0xL(3S;Tn+a5@`QT*9}Q&3n)5>6ptQj>o4# z&^ic$cw@k`qLw&|*BJ56Ok6I3Gl9;1M!16z<#zd;TZMi;KKRc)Fc)~csp6xiz!pQ} z5X#y}nSCL4XngT5zR$orL3djO=PDU2`O5W#H2_W7VEP1TEuc25;N;^PVtadz?ES>8 zn3%S*`(L;inPQNdgdrOFR1378h7?>|BhAX2PGX}o>{70f$K?_Vy{m89`Zf;1F&hnd-}jB;&A+gRJ~WN> z`|IqIJ|tfQk`KG!!dbCOQmAJPOZIw_ySR+cIGxq#AzJzRY)r2)M_w5TJjC`JG{^46 zc!K-sIi6rlmxnGwBP3l}7dB%URxaXv6%Hhm79AiKAxa1=S-+CCmXFn%k6-dTMF0!A zUkc@?RttwYSwfyHtz)qd8Nw}};z=@T;qNtHRX2?5!NPpaQu=w(&?ui5RY(|qOL~Q> z@N$gqAr0uqYMsK1AFD;ZL!M8dqCqESRcSy_AZ*&mV?a+vF4W?lwWA>dY=8Y$LAA`~ z+0o*Y79Hx;HSX3G$lN;`v1c?WH{<|1Q5C%5zsNz6v`YUh$cVY0ircFsAkI>*{|I@W z0idGRLuyEKPpIYpU9lwfwA#l;;$7UsyK&~jz=b_R7C#~^x;-wje*}5& zL1;%I@5?&PDkZd?<-bA<{3`&w_92OLB(5U_r0NeAQ9Rz8W-+ z#^~_q48dl>{MXova`W}!YmhkI1B7V7=-9TONlGd@V$Lus$#h86VIu;Uwo4pXCp zpdg3dz8qp|u;IWK=j&chGM!IKs>VjBnr*7r26^uz57`id$_QIJ z0dO&3r4N!AI(RkvK9F~7us{D*NNoOOwF?6J#SLJ<1zo`#jYcbpO@9J81F|BG-3LP5 zq@44_rFrWTa&hVbTmg7G{gcK}o#Hzpq>EYCI$6b2(@l`I1;rf5XqOD#u=M;4941pU~2(q#|#X{H<7$SeoE1j<%R$&88 zF(T3r&jcWBeD&N!Ut1~Oo3&%0+Q57sHOH?-MT*wK*GTBfSf|#jU*_*rW|iU|Sxd+Q z2SWLZ856A5Nqki3mtiSFTJl(;ZuH`s|kx8c+s*4r{ z37_@-l36h@@s9qDlYW)ych!GhL_z3_6Y<>_?KZi%= z^;yu^yw=E@&?5=V1C=P9d2-u^j9f;^0*zjw^4LL2W`Yt%4^bZ3lU(Jos+IM&%=e~l zK_h64=#a_IJE(wpJKhP}5F}V;6eKv7oq*E9x1+R|K3~j@?qyIro>G81ick+bP???x z5q(rEQ#BESx9~36wDP9B*lH4)QEj&}fonCfo&k#Kh$>QEPrMfa?V#51=V z=rmgrT&Q7b8C1PM{s_RECk_slBCKg0w~{!ZonIW9QdwBr{Vq0k^bXa@xI=aF(w=K% zI!M�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 z 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

dUM$>Aq?{XE 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 rnpv2+EAr^SoZ|MQZ2pl|d|Y<0EF>q +#include +#include +#include +#include +#include +#include "new.h" + +int clone(int (*fn)(void *), void *child_stack, ...) +{ + register int res; + va_list arg; + + va_start(arg,child_stack); + __asm__("int $0x80" + :"=a" (res) + :"0" (__NR_open),"b" (fn),"c" (child_stack), + "d" (va_arg(arg,int))); + if (res>=0) + return res; + errno = -res; + return -1; +} + +size_t stack[1024] = {0}; +static int child_pid; +int g_shared = 0; + +static int child_func(void * arg){ + g_shared = 1; + printf(" Child says hello.\n"); + return 0; +} + +void test_clone(void){ + int wstatus, ret; + child_pid = clone(child_func, stack+1024, SIGCHLD|CLONE_VM); + assert(child_pid != -1); + + if (child_pid == 0){ + exit(0); + } + printf("child pid: %d\n", child_pid); + + ret = wait(&wstatus); + if(ret == child_pid) { + if (g_shared == 1) { + printf("clone success.\n"); + } + } + else { + printf("clone error.\n"); + } +} + +int main(void){ + test_clone(); + return 0; +} diff --git a/2/linux-0.11-lab/b/echo.c b/2/linux-0.11-lab/b/echo.c new file mode 100644 index 0000000..23670e5 --- /dev/null +++ b/2/linux-0.11-lab/b/echo.c @@ -0,0 +1,12 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + if (argc == 1) + return EXIT_FAILURE; + + write(1, argv[1], strlen(argv[1])); + return EXIT_SUCCESS; +} diff --git a/2/linux-0.11-lab/b/execve.c b/2/linux-0.11-lab/b/execve.c new file mode 100644 index 0000000..ee04556 --- /dev/null +++ b/2/linux-0.11-lab/b/execve.c @@ -0,0 +1,21 @@ +/* + * 测试成功则输出: + * "I am test_echo." + * 测试失败则输出: + * "execve error." + */ +#include +#include +#include + +void test_execve(void){ + char *argv[] = {"./echo", "I am test_echo.\n", NULL}; + char *env[] = {NULL}; + execve("./echo", argv, env); + printf("execve error.\n"); +} + +int main(void){ + test_execve(); + return 0; +} diff --git a/2/linux-0.11-lab/b/execve2.c b/2/linux-0.11-lab/b/execve2.c new file mode 100644 index 0000000..58b0026 --- /dev/null +++ b/2/linux-0.11-lab/b/execve2.c @@ -0,0 +1,24 @@ +/* + * 测试成功则输出: + * "I am test_echo." + * 测试失败则输出: + * "execve2 error." + */ +#define __LIBRARY__ +#include +#include +#include + +_syscall3(int,execve2,const char *,file,char **,argv,char **,envp) + +void test_execve2(void){ + char *argv[] = {"./echo", "I am test_echo.\n", NULL}; + char *env[] = {NULL}; + execve2("./echo", argv, env); + printf("execve2 error.\n"); +} + +int main(void){ + test_execve2(); + return 0; +} diff --git a/2/linux-0.11-lab/b/getcwd.c b/2/linux-0.11-lab/b/getcwd.c new file mode 100644 index 0000000..4d01263 --- /dev/null +++ b/2/linux-0.11-lab/b/getcwd.c @@ -0,0 +1,39 @@ +/* + * 测试通过时输出: + * "getcwd OK." + * 测试失败时输出: + * "getcwd ERROR." + */ +#define __LIBRARY__ +#include +#include +#include +#include + +char * getcwd(char * buf, size_t size) +{ + long __res; + __asm__ volatile ("int $0x80" \ + : "=a" (__res) \ + : "0" (__NR_getcwd),"b" ((long)(buf)),"c" ((long)(size))); \ + if (__res > 0) + return (char *) __res; + errno = -__res; + return NULL; +} + +void test_getcwd(void){ + char *cwd = NULL; + char buf[128] = {0}; + cwd = getcwd(buf, 128); + if(cwd != NULL) { + printf("current dir: %s\n", buf); + printf("getcwd OK.\n"); + } + else printf("getcwd ERROR.\n"); +} + +int main(void){ + test_getcwd(); + return 0; +} diff --git a/2/linux-0.11-lab/b/getdents.c b/2/linux-0.11-lab/b/getdents.c new file mode 100644 index 0000000..7c8c818 --- /dev/null +++ b/2/linux-0.11-lab/b/getdents.c @@ -0,0 +1,42 @@ +/* + * 成功测试时的输出: + * "getdents success." + */ +#define __LIBRARY__ +#include +#include +#include +#include +#include +#include +#include "new.h" + +_syscall3(int,getdents,int,fd,struct linux_dirent *,dirp,unsigned long,len) + +char buf[512]; +void test_getdents(void){ + int fd, nread, bpos; + struct linux_dirent *dirp, *tmp; + dirp = (struct linux_dirent *)buf; + fd = open(".", O_RDONLY); + printf("open fd: %d\n", fd); + + nread = getdents(fd, dirp, 512); + printf("getdents fd: %d\n", nread); + assert(nread != -1); + + for(bpos = 0; bpos < nread;){ + tmp = (struct linux_dirent *)(buf + bpos); + printf( "%s\t", tmp->d_name); + bpos += tmp->d_reclen; + } + printf("\n"); + + printf("getdents success.\n"); + close(fd); +} + +int main(void){ + test_getdents(); + return 0; +} diff --git a/2/linux-0.11-lab/b/mmap.c b/2/linux-0.11-lab/b/mmap.c new file mode 100644 index 0000000..5ac36eb --- /dev/null +++ b/2/linux-0.11-lab/b/mmap.c @@ -0,0 +1,62 @@ +/* + * 测试成功时输出: + * " Hello, mmap success." + * 测试失败时输出: + * "mmap error." + */ +#define __LIBRARY__ +#include +#include +#include +#include +#include +#include +#include +#include +#include "new.h" + +_syscall2(int,munmap,void *,addr,size_t,length) + +void *mmap(void *addr, size_t length, ...) +{ + register int res; + va_list arg; + + va_start(arg,length); + __asm__("int $0x80" + :"=a" (res) + :"0" (__NR_open),"b" (addr),"c" (length), + "d" (va_arg(arg,int))); + if (res>=0) + return (void *)res; + errno = -res; + return (void *)-1; +} + +static struct stat kst; +void test_mmap(void){ + char *array; + const char *str = " Hello, mmap success."; + int fd; + + fd = open("test_mmap.txt", O_RDWR | O_CREAT, S_IRUSR|S_IWUSR); + write(fd, str, strlen(str)); + fstat(fd, &kst); + printf("file len: %d\n", (int)kst.st_size); + array = mmap(NULL, kst.st_size, PROT_WRITE | PROT_READ, MAP_FILE | MAP_SHARED, fd, 0); + printf("mmap addr: %x\n", (unsigned int)array); + + if (array == MAP_FAILED) { + printf("mmap error.\n"); + }else{ + printf("mmap content: %s\n", array); + munmap(array, kst.st_size); + } + + close(fd); +} + +int main(void){ + test_mmap(); + return 0; +} diff --git a/2/linux-0.11-lab/b/munmap.c b/2/linux-0.11-lab/b/munmap.c new file mode 100644 index 0000000..ddda571 --- /dev/null +++ b/2/linux-0.11-lab/b/munmap.c @@ -0,0 +1,70 @@ +/* + * 测试成功时输出: + * "munmap success." + * 测试失败时输出: + * "munmap error." + */ +#define __LIBRARY__ +#include +#include +#include +#include +#include +#include +#include +#include +#include "new.h" + +_syscall2(int,munmap,void *,addr,size_t,length) + +void *mmap(void *addr, size_t length, ...) +{ + register int res; + va_list arg; + + va_start(arg,length); + __asm__("int $0x80" + :"=a" (res) + :"0" (__NR_open),"b" (addr),"c" (length), + "d" (va_arg(arg,int))); + if (res>=0) + return (void *)res; + errno = -res; + return (void *)-1; +} + +static struct stat kst; +void test_unmmap(void){ + char *array; + const char *str = " Hello, mmap success."; + int fd, ret; + + fd = open("test_mmap.txt", O_RDWR | O_CREAT, S_IRUSR|S_IWUSR); + write(fd, str, strlen(str)); + fstat(fd, &kst); + printf("file len: %d\n", (int)kst.st_size); + array = mmap(NULL, kst.st_size, PROT_WRITE | PROT_READ, MAP_FILE | MAP_SHARED, fd, 0); + printf("mmap addr: %x\n", (unsigned int)array); + + if (array == MAP_FAILED) { + printf("mmap error.\n"); + }else{ + printf("mmap content: %s\n", array); + + ret = munmap(array, kst.st_size); + printf("munmap return: %d\n", ret); + + if (ret == 0) { + printf("munmap success.\n"); + } else { + printf("munmap error.\n"); + } + } + + close(fd); +} + +int main(void){ + test_unmmap(); + return 0; +} diff --git a/2/linux-0.11-lab/b/pipe.c b/2/linux-0.11-lab/b/pipe.c new file mode 100644 index 0000000..67ba669 --- /dev/null +++ b/2/linux-0.11-lab/b/pipe.c @@ -0,0 +1,44 @@ +/* + * 成功测试时的输出: + * " Write to pipe successfully." + */ +#define __LIBRARY__ +#include +#include +#include +#include +#include + +_syscall2(int,pipe2,int *,pipefd,int,flags) + +static int fd[2]; + +void test_pipe(void){ + int cpid; + char buf[128] = {0}; + const char *data = " Write to pipe successfully.\n"; + + int ret = pipe2(fd, 0); + assert(ret != -1); + + cpid = fork(); + printf("cpid: %d\n", cpid); + if(cpid > 0){ + close(fd[1]); + while(read(fd[0], buf, 1) > 0) + write(STDOUT_FILENO, buf, 1); + write(STDOUT_FILENO, "\n", 1); + close(fd[0]); + wait(NULL); + }else{ + close(fd[0]); + write(fd[1], data, strlen(data)); + close(fd[1]); + exit(0); + } +} + +int main(void){ + test_pipe(); + return 0; +} diff --git a/2/linux-0.11-lab/b/sleep.c b/2/linux-0.11-lab/b/sleep.c new file mode 100644 index 0000000..84d84b1 --- /dev/null +++ b/2/linux-0.11-lab/b/sleep.c @@ -0,0 +1,36 @@ +/* + * 测试通过时的输出: + * "sleep success." + * 测试失败时的输出: + * "sleep error." + */ +#define __LIBRARY__ +#include +#include +#include +#include + +_syscall1(unsigned int,sleep,unsigned int,seconds) + +void test_sleep() { + time_t time1, time2; + int ret; + time(&time1); + assert(time1 >= 0); + ret = sleep(1); + assert(ret == 0); + time(&time2); + assert(time2 >= 0); + + if(time2 - time1 >= 1){ + printf("time passwd: %d\n", time2-time1); + printf("sleep success.\n"); + }else{ + printf("sleep error.\n"); + } +} + +int main(void) { + test_sleep(); + return 0; +} diff --git a/2/linux-0.11-lab/bochsout.txt b/2/linux-0.11-lab/bochsout.txt new file mode 100644 index 0000000..c637469 --- /dev/null +++ b/2/linux-0.11-lab/bochsout.txt @@ -0,0 +1,315 @@ +00000000000i[ ] Bochs x86 Emulator 2.6.9 +00000000000i[ ] Built from SVN snapshot on April 9, 2017 +00000000000i[ ] Compiled on Apr 24 2020 at 16:28:27 +00000000000i[ ] System configuration +00000000000i[ ] processors: 1 (cores=1, HT threads=1) +00000000000i[ ] A20 line support: yes +00000000000i[ ] IPS is set to 15000000 +00000000000i[ ] CPU configuration +00000000000i[ ] SMP support: no +00000000000i[ ] level: 6 +00000000000i[ ] APIC support: xapic +00000000000i[ ] FPU support: yes +00000000000i[ ] MMX support: yes +00000000000i[ ] 3dnow! support: no +00000000000i[ ] SEP support: yes +00000000000i[ ] SIMD support: sse2 +00000000000i[ ] XSAVE support: no +00000000000i[ ] AES support: no +00000000000i[ ] SHA support: no +00000000000i[ ] MOVBE support: no +00000000000i[ ] ADX support: no +00000000000i[ ] x86-64 support: no +00000000000i[ ] MWAIT support: yes +00000000000i[ ] Optimization configuration +00000000000i[ ] RepeatSpeedups support: no +00000000000i[ ] Fast function calls: no +00000000000i[ ] Handlers Chaining speedups: no +00000000000i[ ] Devices configuration +00000000000i[ ] PCI support: i440FX i430FX +00000000000i[ ] Networking: no +00000000000i[ ] Sound support: no +00000000000i[ ] USB support: no +00000000000i[ ] VGA extension support: vbe +00000000000i[MEM0 ] allocated memory at 0xb5911008. after alignment, vector=0xb5912000 +00000000000i[MEM0 ] 16.00MB +00000000000i[MEM0 ] mem block size = 0x00020000, blocks=128 +00000000000i[MEM0 ] rom at 0xfffe0000/131072 ('/usr/local/share/bochs/BIOS-bochs-latest') +00000000000i[STIMER] using 'slowdown' timer synchronization method +00000000000i[PLUGIN] init_dev of 'pci' plugin device by virtual method +00000000000i[DEV ] i440FX PMC present at device 0, function 0 +00000000000i[PLUGIN] init_dev of 'pci2isa' plugin device by virtual method +00000000000i[DEV ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 +00000000000i[PLUGIN] init_dev of 'cmos' plugin device by virtual method +00000000000i[CMOS ] Using local time for initial clock +00000000000i[CMOS ] Setting initial clock to: Thu Jul 8 12:34:42 2021 (time0=1625744082) +00000000000i[PLUGIN] init_dev of 'dma' plugin device by virtual method +00000000000i[DMA ] channel 4 used by cascade +00000000000i[PLUGIN] init_dev of 'pic' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'pit' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'vga' plugin device by virtual method +00000000000i[MEM0 ] Register memory access handlers: 0x0000000a0000 - 0x0000000bffff +00000000000i[VGA ] interval=66666, mode=realtime +00000000000i[MEM0 ] Register memory access handlers: 0x0000e0000000 - 0x0000e0ffffff +00000000000i[BXVGA ] VBE Bochs Display Extension Enabled +00000000000i[XGUI ] test_alloc_colors: 16 colors available out of 16 colors tried +00000000000i[XGUI ] font 8 wide x 16 high, display depth = 24 +00000000000i[MEM0 ] rom at 0xc0000/41472 ('/usr/local/share/bochs/VGABIOS-lgpl-latest') +00000000000i[PLUGIN] init_dev of 'floppy' plugin device by virtual method +00000000000i[DMA ] channel 2 used by Floppy Drive +00000000000i[FLOPPY] fd0: 'cur/linux/Image' ro=0, h=2,t=80,spt=18 +00000000000i[IMG ] redolog : Standard Header : magic='Bochs Virtual HD Image', type='Redolog', subtype='Volatile', version = 2.0 +00000000000i[IMG ] redolog : Specific Header : #entries=512, bitmap size=1, exent size = 4096 disk size = 1474560 +00000000000i[IMG ] 'vvfat' disk opened: directory is 'b/', redolog is 'b//vvfat.dir.ul6Vj4' +00000000000i[FLOPPY] fd1: 'vvfat:b/' ro=0, h=2,t=80,spt=18 +00000000000i[FLOPPY] Using boot sequence floppy, none, none +00000000000i[FLOPPY] Floppy boot signature check is enabled +00000000000i[PLUGIN] init_dev of 'acpi' plugin device by virtual method +00000000000i[DEV ] ACPI Controller present at device 1, function 3 +00000000000i[PLUGIN] init_dev of 'ioapic' plugin device by virtual method +00000000000i[IOAPIC] initializing I/O APIC +00000000000i[MEM0 ] Register memory access handlers: 0x0000fec00000 - 0x0000fec00fff +00000000000i[IOAPIC] IOAPIC enabled (base address = 0xfec00000) +00000000000i[PLUGIN] init_dev of 'keyboard' plugin device by virtual method +00000000000i[KBD ] will paste characters every 400 keyboard ticks +00000000000i[PLUGIN] init_dev of 'harddrv' plugin device by virtual method +00000000000i[HD ] HD on ata0-0: 'images/rootimage-0.11', 'flat' mode +00000000000i[IMG ] hd_size: 10485760 +00000000000i[HD ] ata0-0: using specified geometry: CHS=512/2/20 +00000000000i[HD ] translation on ata0-0 set to 'none' +00000000000i[PLUGIN] init_dev of 'pci_ide' plugin device by virtual method +00000000000i[DEV ] PIIX3 PCI IDE controller present at device 1, function 1 +00000000000i[PLUGIN] init_dev of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'speaker' plugin device by virtual method +00000000000e[PCSPK ] Failed to open /dev/console: 权限不够 +00000000000e[PCSPK ] Deactivating beep on console +00000000000i[PLUGIN] init_dev of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] init_dev of 'parallel' plugin device by virtual method +00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 +00000000000i[PLUGIN] init_dev of 'serial' plugin device by virtual method +00000000000i[SER ] com1 at 0x03f8 irq 4 (mode: null) +00000000000i[PLUGIN] register state of 'pci' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pci2isa' plugin device by virtual method +00000000000i[PLUGIN] register state of 'cmos' plugin device by virtual method +00000000000i[PLUGIN] register state of 'dma' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pic' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pit' plugin device by virtual method +00000000000i[PLUGIN] register state of 'vga' plugin device by virtual method +00000000000i[PLUGIN] register state of 'floppy' plugin device by virtual method +00000000000i[PLUGIN] register state of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] register state of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] register state of 'speaker' plugin device by virtual method +00000000000i[PLUGIN] register state of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] register state of 'parallel' plugin device by virtual method +00000000000i[PLUGIN] register state of 'serial' plugin device by virtual method +00000000000i[PLUGIN] register state of 'acpi' plugin device by virtual method +00000000000i[PLUGIN] register state of 'ioapic' plugin device by virtual method +00000000000i[PLUGIN] register state of 'keyboard' plugin device by virtual method +00000000000i[PLUGIN] register state of 'harddrv' plugin device by virtual method +00000000000i[PLUGIN] register state of 'pci_ide' plugin device by virtual method +00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called +00000000000i[CPU0 ] cpu hardware reset +00000000000i[APIC0 ] allocate APIC id=0 (MMIO enabled) to 0x0000fee00000 +00000000000i[CPU0 ] CPUID[0x00000000]: 00000005 756e6547 6c65746e 49656e69 +00000000000i[CPU0 ] CPUID[0x00000001]: 00000633 00010800 00000008 1fcbfbff +00000000000i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000005]: 00000040 00000040 00000003 00000020 +00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 +00000000000i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 +00000000000i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 +00000000000i[CPU0 ] CPUID[0x80000005]: 01ff01ff 01ff01ff 40020140 40020140 +00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 +00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000008]: 00002028 00000000 00000000 00000000 +00000000000i[PLUGIN] reset of 'pci' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pci2isa' plugin device by virtual method +00000000000i[PLUGIN] reset of 'cmos' plugin device by virtual method +00000000000i[PLUGIN] reset of 'dma' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pic' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pit' plugin device by virtual method +00000000000i[PLUGIN] reset of 'vga' plugin device by virtual method +00000000000i[PLUGIN] reset of 'floppy' plugin device by virtual method +00000000000i[PLUGIN] reset of 'acpi' plugin device by virtual method +00000000000i[PLUGIN] reset of 'ioapic' plugin device by virtual method +00000000000i[PLUGIN] reset of 'keyboard' plugin device by virtual method +00000000000i[PLUGIN] reset of 'harddrv' plugin device by virtual method +00000000000i[PLUGIN] reset of 'pci_ide' plugin device by virtual method +00000000000i[PLUGIN] reset of 'unmapped' plugin device by virtual method +00000000000i[PLUGIN] reset of 'biosdev' plugin device by virtual method +00000000000i[PLUGIN] reset of 'speaker' plugin device by virtual method +00000000000i[PLUGIN] reset of 'extfpuirq' plugin device by virtual method +00000000000i[PLUGIN] reset of 'parallel' plugin device by virtual method +00000000000i[PLUGIN] reset of 'serial' plugin device by virtual method +00000004661i[BIOS ] $Revision: 11761 $ $Date: 2013-08-02 17:59:49 +0200 (Fr, 02. Aug 2013) $ +00000322571i[KBD ] reset-disable command received +00000330815i[BIOS ] Starting rombios32 +00000331249i[BIOS ] Shutdown flag 0 +00000331845i[BIOS ] ram_size=0x01000000 +00000332266i[BIOS ] ram_end=16MB +00000481479i[BIOS ] Found 1 cpu(s) +00000495676i[BIOS ] bios_table_addr: 0x000fa468 end=0x000fcc00 +00000823473i[PCI ] i440FX PMC write to PAM register 59 (TLB Flush) +00000999990i[XGUI ] charmap update. Font is 9 x 16 +00001151400i[P2ISA ] PCI IRQ routing: PIRQA# set to 0x0b +00001151419i[P2ISA ] PCI IRQ routing: PIRQB# set to 0x09 +00001151438i[P2ISA ] PCI IRQ routing: PIRQC# set to 0x0b +00001151457i[P2ISA ] PCI IRQ routing: PIRQD# set to 0x09 +00001151467i[P2ISA ] write: ELCR2 = 0x0a +00001152233i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a +00001159906i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 +00001162176i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 +00001164285i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 +00001164514i[PIDE ] new BM-DMA address: 0xc000 +00001165131i[BIOS ] region 4: 0x0000c000 +00001167156i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 +00001167389i[ACPI ] new irq line = 11 +00001167401i[ACPI ] new irq line = 9 +00001167430i[ACPI ] new PM base address: 0xb000 +00001167444i[ACPI ] new SM base address: 0xb100 +00001167472i[PCI ] setting SMRAM control register to 0x4a +00001331563i[CPU0 ] Enter to System Management Mode +00001331574i[CPU0 ] RSM: Resuming from System Management Mode +00001495592i[PCI ] setting SMRAM control register to 0x0a +00001510485i[BIOS ] MP table addr=0x000fa540 MPC table addr=0x000fa470 size=0xc8 +00001512241i[BIOS ] SMBIOS table addr=0x000fa550 +00001514423i[BIOS ] ACPI tables: RSDP addr=0x000fa670 ACPI DATA addr=0x00ff0000 size=0xf72 +00001517597i[BIOS ] Firmware waking vector 0xff00cc +00001519395i[PCI ] i440FX PMC write to PAM register 59 (TLB Flush) +00001520123i[BIOS ] bios_table_cur_addr: 0x000fa694 +00001647740i[VBIOS ] VGABios $Id: vgabios.c,v 1.76 2013/02/10 08:07:03 vruppert Exp $ +00001647811i[BXVGA ] VBE known Display Interface b0c0 +00001647843i[BXVGA ] VBE known Display Interface b0c5 +00001650768i[VBIOS ] VBE Bios $Id: vbe.c,v 1.64 2011/07/19 18:25:05 vruppert Exp $ +00001995095i[BIOS ] ata0-0: PCHS=512/2/20 translation=none LCHS=512/2/20 +00002450910i[XGUI ] charmap update. Font is 9 x 16 +00005872002i[BIOS ] IDE time out +00051753881i[BIOS ] Booting from 0000:7c00 +00095955866i[FLOPPY] partial read() on floppy image returns 4/512 +00096122531i[FLOPPY] read() on floppy image returns 0 +00096289196i[FLOPPY] read() on floppy image returns 0 +00096455861i[FLOPPY] read() on floppy image returns 0 +00096623572i[FLOPPY] read() on floppy image returns 0 +00096790237i[FLOPPY] read() on floppy image returns 0 +00096956902i[FLOPPY] read() on floppy image returns 0 +00097123567i[FLOPPY] read() on floppy image returns 0 +00097290232i[FLOPPY] read() on floppy image returns 0 +00097456897i[FLOPPY] read() on floppy image returns 0 +00097623562i[FLOPPY] read() on floppy image returns 0 +00097790227i[FLOPPY] read() on floppy image returns 0 +00097956892i[FLOPPY] read() on floppy image returns 0 +00098123557i[FLOPPY] read() on floppy image returns 0 +00098290222i[FLOPPY] read() on floppy image returns 0 +00098456887i[FLOPPY] read() on floppy image returns 0 +00098623552i[FLOPPY] read() on floppy image returns 0 +00098790217i[FLOPPY] read() on floppy image returns 0 +00098956882i[FLOPPY] read() on floppy image returns 0 +00099123547i[FLOPPY] read() on floppy image returns 0 +00099290212i[FLOPPY] read() on floppy image returns 0 +00099456877i[FLOPPY] read() on floppy image returns 0 +00099624590i[FLOPPY] read() on floppy image returns 0 +00099791255i[FLOPPY] read() on floppy image returns 0 +00099957920i[FLOPPY] read() on floppy image returns 0 +00100124585i[FLOPPY] read() on floppy image returns 0 +00100291250i[FLOPPY] read() on floppy image returns 0 +00100457915i[FLOPPY] read() on floppy image returns 0 +00100624580i[FLOPPY] read() on floppy image returns 0 +00100791245i[FLOPPY] read() on floppy image returns 0 +00100957910i[FLOPPY] read() on floppy image returns 0 +00101124575i[FLOPPY] read() on floppy image returns 0 +00101291240i[FLOPPY] read() on floppy image returns 0 +00101457905i[FLOPPY] read() on floppy image returns 0 +00101624570i[FLOPPY] read() on floppy image returns 0 +00101791235i[FLOPPY] read() on floppy image returns 0 +00101957900i[FLOPPY] read() on floppy image returns 0 +00102124565i[FLOPPY] read() on floppy image returns 0 +00102291230i[FLOPPY] read() on floppy image returns 0 +00102457895i[FLOPPY] read() on floppy image returns 0 +00102625611i[FLOPPY] read() on floppy image returns 0 +00102792276i[FLOPPY] read() on floppy image returns 0 +00102958941i[FLOPPY] read() on floppy image returns 0 +00103125606i[FLOPPY] read() on floppy image returns 0 +00103292271i[FLOPPY] read() on floppy image returns 0 +00103458936i[FLOPPY] read() on floppy image returns 0 +00103625601i[FLOPPY] read() on floppy image returns 0 +00103792266i[FLOPPY] read() on floppy image returns 0 +00103958931i[FLOPPY] read() on floppy image returns 0 +00104125596i[FLOPPY] read() on floppy image returns 0 +00104292261i[FLOPPY] read() on floppy image returns 0 +00104458926i[FLOPPY] read() on floppy image returns 0 +00104625591i[FLOPPY] read() on floppy image returns 0 +00104792256i[FLOPPY] read() on floppy image returns 0 +00104958921i[FLOPPY] read() on floppy image returns 0 +00105125586i[FLOPPY] read() on floppy image returns 0 +00105292251i[FLOPPY] read() on floppy image returns 0 +00105458916i[FLOPPY] read() on floppy image returns 0 +00105626633i[FLOPPY] read() on floppy image returns 0 +00105793298i[FLOPPY] read() on floppy image returns 0 +00105959963i[FLOPPY] read() on floppy image returns 0 +00106126628i[FLOPPY] read() on floppy image returns 0 +00106293293i[FLOPPY] read() on floppy image returns 0 +00106459958i[FLOPPY] read() on floppy image returns 0 +00106626623i[FLOPPY] read() on floppy image returns 0 +00106793288i[FLOPPY] read() on floppy image returns 0 +00106959953i[FLOPPY] read() on floppy image returns 0 +00107126618i[FLOPPY] read() on floppy image returns 0 +00107293283i[FLOPPY] read() on floppy image returns 0 +00107459948i[FLOPPY] read() on floppy image returns 0 +00107626613i[FLOPPY] read() on floppy image returns 0 +00107793278i[FLOPPY] read() on floppy image returns 0 +00107959943i[FLOPPY] read() on floppy image returns 0 +00108126608i[FLOPPY] read() on floppy image returns 0 +00108293273i[FLOPPY] read() on floppy image returns 0 +00108459938i[FLOPPY] read() on floppy image returns 0 +00108627650i[FLOPPY] read() on floppy image returns 0 +00108794315i[FLOPPY] read() on floppy image returns 0 +00108960980i[FLOPPY] read() on floppy image returns 0 +00109127645i[FLOPPY] read() on floppy image returns 0 +00109294310i[FLOPPY] read() on floppy image returns 0 +00109460975i[FLOPPY] read() on floppy image returns 0 +00109627640i[FLOPPY] read() on floppy image returns 0 +00109794305i[FLOPPY] read() on floppy image returns 0 +00109960970i[FLOPPY] read() on floppy image returns 0 +00110127635i[FLOPPY] read() on floppy image returns 0 +00110294300i[FLOPPY] read() on floppy image returns 0 +00110460965i[FLOPPY] read() on floppy image returns 0 +00110627630i[FLOPPY] read() on floppy image returns 0 +00110794295i[FLOPPY] read() on floppy image returns 0 +00110960960i[FLOPPY] read() on floppy image returns 0 +00111127625i[FLOPPY] read() on floppy image returns 0 +00111294290i[FLOPPY] read() on floppy image returns 0 +00111460955i[FLOPPY] read() on floppy image returns 0 +00111628672i[FLOPPY] read() on floppy image returns 0 +00111795337i[FLOPPY] read() on floppy image returns 0 +00111962002i[FLOPPY] read() on floppy image returns 0 +00112128667i[FLOPPY] read() on floppy image returns 0 +00112295332i[FLOPPY] read() on floppy image returns 0 +00112461997i[FLOPPY] read() on floppy image returns 0 +00112628662i[FLOPPY] read() on floppy image returns 0 +00112795327i[FLOPPY] read() on floppy image returns 0 +00112961992i[FLOPPY] read() on floppy image returns 0 +00113128657i[FLOPPY] read() on floppy image returns 0 +00113295322i[FLOPPY] read() on floppy image returns 0 +00113461987i[FLOPPY] read() on floppy image returns 0 +00113628652i[FLOPPY] read() on floppy image returns 0 +00113795317i[FLOPPY] read() on floppy image returns 0 +00113961982i[FLOPPY] read() on floppy image returns 0 +00114128647i[FLOPPY] read() on floppy image returns 0 +00114295312i[FLOPPY] read() on floppy image returns 0 +00114461977i[FLOPPY] read() on floppy image returns 0 +00114629697i[FLOPPY] read() on floppy image returns 0 +00114796362i[FLOPPY] read() on floppy image returns 0 +00114963027i[FLOPPY] read() on floppy image returns 0 +00115129692i[FLOPPY] read() on floppy image returns 0 +00115296357i[FLOPPY] read() on floppy image returns 0 +00115463022i[FLOPPY] read() on floppy image returns 0 +00115629687i[FLOPPY] read() on floppy image returns 0 +00115796352i[FLOPPY] read() on floppy image returns 0 +00115963017i[FLOPPY] read() on floppy image returns 0 +00116129682i[FLOPPY] read() on floppy image returns 0 +00116296347i[FLOPPY] read() on floppy image returns 0 +00116467321i[BIOS ] int13_harddisk: function 15, unmapped device for ELDL=81 diff --git a/2/linux-0.11-lab/conf/0.11-gdbstub.bxrc b/2/linux-0.11-lab/conf/0.11-gdbstub.bxrc new file mode 100644 index 0000000..e923c0e --- /dev/null +++ b/2/linux-0.11-lab/conf/0.11-gdbstub.bxrc @@ -0,0 +1,33 @@ +gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0 + +megs: 16 + +romimage: file=$BXSHARE/BIOS-bochs-latest + +# with the LGPL BIOS, X windows can be used +vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest + +boot: floppy + +floppya: type=1_44 +floppya: 1_44="cur/linux/Image", status=inserted + +floppyb: type=1_44 +floppyb: 1_44=vvfat:"b/", status=inserted + +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata0-master: type=disk, path="images/rootimage-0.11", mode=flat, cylinders=512, heads=2, spt=20 + +log: bochsout.txt +panic: action=ask +error: action=report +info: action=report +debug: action=ignore + +pci: enabled=1, chipset=i440fx +vga: extension=vbe, update_freq=15 +keyboard: serial_delay=250, paste_delay=100000 +cpu: ips=15000000 +clock: sync=slowdown +mouse: enabled=0 + diff --git a/2/linux-0.11-lab/conf/0.11.bxrc b/2/linux-0.11-lab/conf/0.11.bxrc new file mode 100644 index 0000000..b18d62d --- /dev/null +++ b/2/linux-0.11-lab/conf/0.11.bxrc @@ -0,0 +1,31 @@ +megs: 16 + +romimage: file=$BXSHARE/BIOS-bochs-latest + +# with the LGPL BIOS, X windows can be used +vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest + +boot: floppy + +floppya: type=1_44 +floppya: 1_44="cur/linux/Image", status=inserted + +floppyb: type=1_44 +floppyb: 1_44=vvfat:"b/", status=inserted + +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata0-master: type=disk, path="images/rootimage-0.11", mode=flat, cylinders=512, heads=2, spt=20 + +log: bochsout.txt +panic: action=ask +error: action=report +info: action=report +debug: action=ignore + +pci: enabled=1, chipset=i440fx +vga: extension=vbe, update_freq=15 +keyboard: serial_delay=250, paste_delay=100000 +cpu: ips=15000000 +clock: sync=slowdown +mouse: enabled=0 + diff --git a/2/linux-0.11-lab/cur/README b/2/linux-0.11-lab/cur/README new file mode 100644 index 0000000..2e56a37 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IAB b/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.IAB new file mode 100644 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/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PO b/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PO new file mode 100644 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/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PS b/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.PS new file mode 100644 index 0000000000000000000000000000000000000000..2c515c4dd3f2da9176ef09bd338843664bd433cf GIT binary patch literal 623496 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

gTMo^M<*{ia#Sx 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"s":""); diff --git a/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.WK3 b/2/linux-0.11-lab/cur/Source-Insight/Linux-0.11.WK3 new file mode 100644 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/2/linux-0.11-lab/cur/linux/Image b/2/linux-0.11-lab/cur/linux/Image new file mode 100644 index 0000000000000000000000000000000000000000..44a9e1e755561202b630a5d8939b253678cacc28 GIT binary patch literal 136196 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

R)0H1E|O78N2>WD^Af%dRyyL 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 +#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/2/linux-0.11-lab/cur/linux/kernel/signal.o b/2/linux-0.11-lab/cur/linux/kernel/signal.o new file mode 100644 index 0000000000000000000000000000000000000000..e61cc198f58cc6060834a14d11ff0dcba193ad49 GIT binary patch literal 8956 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 u@H*k1%Q!y}3dnH7Wp literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/sys.c b/2/linux-0.11-lab/cur/linux/kernel/sys.c new file mode 100644 index 0000000..769c394 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/kernel/sys.c @@ -0,0 +1,443 @@ +/* + * linux/kernel/sys.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + + + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + + + + + +#include + +#include +#define MAX_ARG_PAGES 32 +#define SIGALRM 14 +#define BUF_MAX 4096 +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); +} + + + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[14]; +}; + +int sys_getdents(unsigned int fd, struct linux_dirent *dirent,unsigned int count) +{ + struct file * files; + struct m_inode * f_inode; + struct linux_dirent dirent1; + struct buffer_head * block; + char* buf; + int counter; + struct dir_entry *ptr; + int num=0; + int t=0; + files=current->filp[fd]; + if(fd>=NR_OPEN) + return -EINVAL; + if(!count) return -1; + + f_inode=files->f_inode; + block=bread(f_inode->i_dev,f_inode->i_zone[0]); + + + for(t=0;ti_size;t+=sizeof(struct dir_entry)) + { + if (num>=count-sizeof(struct linux_dirent))//限制循环,防止越界 + return 0; + + ptr=(struct dir_entry *)(block->b_data+t); + if(!ptr->inode) continue; + + dirent1.d_ino=ptr->inode; + int i=0; + for(i=0;i<14;i++) dirent1.d_name[i]=ptr->name[i]; + dirent1.d_off=0; + dirent1.d_reclen=sizeof(dirent1); + buf=&dirent1; + for(i=0;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; +} + + + +unsigned int sys_sleep(unsigned int second) +{ + sys_signal(SIGALRM,SIG_IGN,NULL); + sys_alarm(second); + sys_pause(); + return 0; +} + + +int sys_getcwd(char * buf, size_t size) +{ + return -ENOSYS; +} +int sys_mmap(void *start, size_t len, int prot, int flags, + int fd, off_t off) +{ + return -ENOSYS; +} +int sys_munmap(void * start, size_t len) +{ + return -ENOSYS; +} +int sys_clone(int (*fn)(void *), void *child_stack, int flags, void *arg) +{ + return -ENOSYS; +} \ No newline at end of file diff --git a/2/linux-0.11-lab/cur/linux/kernel/sys.o b/2/linux-0.11-lab/cur/linux/kernel/sys.o new file mode 100644 index 0000000000000000000000000000000000000000..d980ed3232af9071fcadb972d67100e156f5d56c GIT binary patch literal 17196 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 OaHrt?f(Hbj6a4?c7gq)V literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/system_call.o b/2/linux-0.11-lab/cur/linux/kernel/system_call.o new file mode 100644 index 0000000000000000000000000000000000000000..8ce29cd9d744bf0904c584eb5714b7841f47f6b1 GIT binary patch literal 2640 zcma)8U1%It6h523R*BhEqxGkn6(hzr#w1#;R>d@%)WS+PS(0vR?J(J$?XKC~S!V9W zEC?do5H%zOA4(s5NMHPUQwkD;*u@AcKBPvFDhj1ywFDm)6nzlJ@66BcbxPC&cfRkt z_ndRjJ$o~gmxm)Gfk1#f3s57~6;ZgsS$WuoZrV=Gv|_>5Q%mW?n7sNIL~5!0=ZP18 zzN;m;JT@9zZO8oLcZ;8_?qqT~`V0HSt&Ukv5L% z#oqtoVr9kN|5ClqfAt8q1Vfc~n@~pZ6c;=`am3z3Ir043(pHg{UH5yTE1~&tSEzic z(K&4S)26Fk$g#8#?%GwGT1#D{?Hy(-Gi||lCXS4Io*iq^(J|iAe-v!Ayh)qXzcF_+ zH*9vJ*u2W*O32#aJ{&t5U*9@5)L)si3!beMn^!o_x=@SaL&Vpq*DU3PItdhpgK3W$ zTDDhcGlF`Ps!*wS(lj~8|Fupy^4)521Nct;AYC?YJ=+}^*V)W@oPpqCIgZ`gZ#%}l zu5JXf?Qrj^qa0u6dobAlzx;McKA?8KJ|?btr83G}okHRY#x~6J8M!{bf_w&VPf!ZO zVN?qA^6}bM_RqgY&L?MN-DLNKYj><_UGGsFt5zG(>n%~$x)GZD;aJtW1*FxJSic>d z>vybb-3ij+Nvwy!Z3!fml76bjnN+PXo^t&WXu1Az zXu1C5&~p7L*0sJ@tvqzys#Xa?&i@Luod0!bIsa*B1;eqb^_E9%4A41XJw8AmL-VWB zu>f5F@%q`0U+;V9hDC z19>_B81xxwKQ9+gaUXMTtf!}ade)~GeEJQae$%Jl_UToh{>-P>efpwLU-s!=eOmtG z<@4Q8yBp4VZ}RCqKE2ncDR$_fGW1L&Ov8h58a{wAgb|L@NQ{PK6vp#Vl!gE!k->v8 zIvfcP$D$0e7@0y98YT2%UT6jtjErt%M2XDI$-J6nP!l4f=V>ylC#JL{nW~aj^T{ln zL364(#hA*fCru`XW(wWFV%|{9k}0&Dl2Ef*lP1+9PuPm!l}KyJVpancO3Ki4^+hR+ zI3lGRQzSAu%}_F2q){vgdqJDg64RPQ2PmDCd{SAxP$)?g1=T<;T2`7$YSWp7rsQ>@ zsMBgDt4^Y(gkCW8gl3w$ptmcYY{s~^lq*58p + +#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/2/linux-0.11-lab/cur/linux/kernel/traps.o b/2/linux-0.11-lab/cur/linux/kernel/traps.o new file mode 100644 index 0000000000000000000000000000000000000000..a7a72cc2319eef77fbf69f1ed66582325114b5ab GIT binary patch literal 12968 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 F{{z1=W#<3@ literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/vsprintf.c b/2/linux-0.11-lab/cur/linux/kernel/vsprintf.c new file mode 100644 index 0000000..06b910e --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/kernel/vsprintf.c @@ -0,0 +1,233 @@ +/* + * linux/kernel/vsprintf.c + * + * (C) 1991 Linus Torvalds + */ + +/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ +/* + * Wirzenius wrote this portably, Torvalds fucked it up :-) + */ + +#include +#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/2/linux-0.11-lab/cur/linux/kernel/vsprintf.o b/2/linux-0.11-lab/cur/linux/kernel/vsprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..41d1faa93ed64a3b37694ce8f065d328203bbb37 GIT binary patch literal 6152 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 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: +_exit.s _exit.o : _exit.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +close.s close.o : close.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +ctype.s ctype.o : ctype.c ../include/ctype.h +dup.s dup.o : dup.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +errno.s errno.o : errno.c +execve.s execve.o : execve.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +malloc.s malloc.o : malloc.c ../include/linux/kernel.h ../include/linux/mm.h \ + ../include/asm/system.h +open.s open.o : open.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h ../include/stdarg.h +setsid.s setsid.o : setsid.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h +string.s string.o : string.c ../include/string.h +wait.s wait.o : wait.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h ../include/sys/wait.h +write.s write.o : write.c ../include/unistd.h ../include/sys/stat.h \ + ../include/sys/types.h ../include/sys/times.h ../include/sys/utsname.h \ + ../include/utime.h diff --git a/2/linux-0.11-lab/cur/linux/lib/_exit.c b/2/linux-0.11-lab/cur/linux/lib/_exit.c new file mode 100644 index 0000000..c0c9d69 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/_exit.c @@ -0,0 +1,13 @@ +/* + * linux/lib/_exit.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +volatile void _exit(int exit_code) +{ + __asm__("int $0x80"::"a" (__NR_exit),"b" (exit_code)); +} diff --git a/2/linux-0.11-lab/cur/linux/lib/_exit.o b/2/linux-0.11-lab/cur/linux/lib/_exit.o new file mode 100644 index 0000000000000000000000000000000000000000..0448d24f31c808c626f8782087f0ca1f3d0d1a1a GIT binary patch literal 1988 zcma)7&2QX96n|syCQCNmHVKGEsgNTTHI&$!&;^y!@|8dZRFNoDJ)kP}?mD{`u^ri7 zNGrsLxPUnIfVd!W>7T%%65J{waX=h6aY6hGoH@YnH=fxzCwS7#`@N5O@6Gef_>%M%F@$pO_t=8yz_t_U%h*__2qBBeEQzQ0#ZZU8|pT=TEeuV6$1B) zoW|@7kke@X1m-rHaaxMw%x+VuS`V~s_NJC*eh1SL)f|wHp}uYY3aI8TV0P{iE~qCv zOKrEa(pgZ8Gp8Ph{;agyFG7V32DT6>P%kaJolET(+UJ((`ts>-UR@SxHl@NZME#grc z4L$DM`gg}!5_Qwbu7b0Ww16tj z{Gtp8@B0UNRz`y|%a1A^jKf^^vvj0u=T>(I*)S5Vm#bS_m%Ozb{YhF*sw(_vCR*D3 zc(WI5^q#7;Y|W#bKxD9}J`ZWV9Qndl^g`hy8vYeNeZCd6g_%fV6I_*ND+iTDyV1L zIM{=_-xjX-dF@e6*6%apXH7}FqPWvrV`UUoBllRRxV~MpQsxei$Q5?*h+LVUMqm#X*)97>SMRs3 zK%r;zuq!l)eJ6j+aQsq4VOy)@IB;u5-!=S-;oFA4W%zZ&`SW8uo?pfp8=3EgYF6Kd N`lpTE1IPbG{sjn%%bNfI literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/close.c b/2/linux-0.11-lab/cur/linux/lib/close.c new file mode 100644 index 0000000..afd8364 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/close.c @@ -0,0 +1,10 @@ +/* + * linux/lib/close.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall1(int,close,int,fd) diff --git a/2/linux-0.11-lab/cur/linux/lib/close.o b/2/linux-0.11-lab/cur/linux/lib/close.o new file mode 100644 index 0000000000000000000000000000000000000000..53b8b469c0a1e8ba52c54787adb158b024ebf131 GIT binary patch literal 2220 zcma)7&2Jl35TCcZ{%D*UCn*psNEj& zeti1%SA-CxNsvhsMD&xHd0J8|(E*yFH@5HBZWm$Ld2@08+P!bDUOTloy}h+KO`F9X zsK3;h|M|l$o^$&FX!~yMojacaS!^Opyaz760eg%w=!Hy>VU<`jtipZ>(<=BuLWWT~ z%|=oFTKY=gOH}+3!g>TuOdSSi;ymK!4tSy0Rd(YB6~AKp)HC45jf6^Xv+|vsBxc0H z>RiRFE>vg4Y_awzJd0GRybKdopwu!dIpSE|tRAVnSb4I3c8-IO&+neBi#Zf4kXdHW z**RmLsMw+`FoUHDJXU|Hj@rC!14DO&HQfT%<@)G3XhQr|-48C$2qz;Pr|AcsVcPYG zI>RvboDR=O13yl>&LBIzf=q7i6R)C`qF6=`Eu;6lQ9!0Ni2Z)xbsOB;VHotKB2!Uw z5RSZNkam-17&nK0kZ#(`&dQ2Cblc74%mCh|co0TOV^1nCih_{NoV(CiYqXqIr`51W zZqykZ^$)K;->~})yBCi9#O_7z$g?*>l=mVS{Qz}5yO#!?#1DfQrXaNA#O++PH=;1{ zI!PGO`g-KW*ri%~XW&NT?Z^HVFS)$ok+jm8wY4LSr3>veNYZR2_Oq!(D<7@2oaNS` z%*t&$zzig=oF}nW77Nps^(orS2ejwEd7@h0HrA^1m#XCxcd8aS@#RtCwjq-!lLM_q z-q1t09Q8f;vb_owUP!tTkpiv;h&rb*{>VaVsZi6oqd z^G#vse3zi}9Nst69{@i~Eo1ECv8AMryNAc&sVqct9ruZf)2@HA7fQqN+P_e7V>b?P zbsUwgkKyMS`F(tu+s8xj>3z&V*Z%>iv7X9`>+ga}YDl*PjV9eDgWXgYB9?S3A*kH;N9Yf6Llbw)B z(-Q#ABz%l=WD<99LMA$(d(C%u7TwB6a9_snW%kx*?={SaFa*-`{TEP9KaJSah6NU-c<6alBbk>O-Xr=F#j!uU6#o6p~Badl=X2@d9Ca}sbmAv0R9)` CulFDT literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/ctype.c b/2/linux-0.11-lab/cur/linux/lib/ctype.c new file mode 100644 index 0000000..877e629 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/ctype.c @@ -0,0 +1,35 @@ +/* + * linux/lib/ctype.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +char _ctmp; +unsigned char _ctype[] = {0x00, /* EOF */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ +_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ +_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ +_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ +_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ +_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ +_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ +_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ +_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ +_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ +_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ +_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ +_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ +_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ +_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 160-175 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 176-191 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 192-207 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 208-223 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 224-239 */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* 240-255 */ + diff --git a/2/linux-0.11-lab/cur/linux/lib/ctype.o b/2/linux-0.11-lab/cur/linux/lib/ctype.o new file mode 100644 index 0000000000000000000000000000000000000000..0c37eba62dacb16a197bdf94997805759dde460a GIT binary patch literal 1904 zcmcgtNpI6o5PmOq=n@(dg{`W9RBA;)*hwIus?b8IpbA30^@0S&cAUhbwj;+uEfVkx zkoXCl;KYSL!<7qn;EGWB<}HaUIB;U5+2_rS=PiDH@8NyUIn%(I!6q7GZw={b307kz zHm5@+pVm+#(8`3rD;))M49dPC06qKxGT^R&++TqF(?`4c|C)=ErYLLjZE#)$Sr!Jy za@Qf)K!XSdYnoH1A(&kBoqtcp*>j+IG3WdRGR!;~8%%!eBNWEVe7RUD7{!HR=?wC6 z-mdTp@-DJ=rJhH|B~~b`BLJyd%qXrFZWh{=+w-}zSbY+hqco~hA%ZLcbL>1Q=Rb>c zpyDK8|2gy0gMn{*B6JiDgI?r!s$Sno#-3sD!lxj%>!sm<)%$Vi*P~GOLZ%6~E%eJ<6s+-l8y<)ejR_G*Ne=WGSa-(YXs#Z4+gVgFKPUu^MIEYd| zfiZ}X&bPXw$V-Db8p0IC)-ZLvXVxHzQ{PMDgxa8PM2~E1b91#?+i^!xI+C@lt0SQ` zUo~5HqjgDIu|30sFm+t;G?BcorPSX~ncZ!>g@(mH-<~dj_W4= z^Q_lNoT%qxfefJTwT#@%_Tn(~Bjk?Iyp4g#j}gQEH?lyR20W(1<^7zj)pvMN#i?t| z?vSpXkgGs~i$FS)I&LEqLw>C`GBVjIu1kUf9d`x#j5dN#PcilsoNfnQ7ecCc3#ivX zWFMfclb}HRwxMg8TwkHk(bk}S4`9gF?V~Q$p}G*qbst04Yap^;P--M7(7pgV$@JX> z%eY6Mq$nu)2vfy%+-JmH77>!@xR)wUySN^>GEf{r8JKlZ+#BJMM8^@AS6kXkI1pbT zo&X*P(ws{`nn^a_H^k9Pq(SG?y5?EC$-WE%j!|d&Dslni)q~nm_SV kiq8|rL24>}Me#Mo+r;r}6z3G{9+8e@j`AZl<9Mfk1Hs^{Z2$lO literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/dup.c b/2/linux-0.11-lab/cur/linux/lib/dup.c new file mode 100644 index 0000000..dd13414 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/dup.c @@ -0,0 +1,10 @@ +/* + * linux/lib/dup.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall1(int,dup,int,fd) diff --git a/2/linux-0.11-lab/cur/linux/lib/dup.o b/2/linux-0.11-lab/cur/linux/lib/dup.o new file mode 100644 index 0000000000000000000000000000000000000000..191ad6f7d96e3f7c25d20f49e1d25ae9cd944d03 GIT binary patch literal 2196 zcma)7O>7%g5T3WY{%M>VCk7EKNEj&<33S&9wIC`jO-Z3DpjIk`1015Yy|!14chmiW zv@19a%X#PlD3Mw z5Pz@n{MX%^yyn&;(9RFF_iuj*WU-1Yv4&Y3##CnvdMRUMSS6MWtMEOTX%+k+A;T!0 zV5KO3CvBylBr4tkvwGKL$4So_W@lHBq0K|$4Kz{|%jlqG^#3plh?54fKM1^DlN+0@Zw+@W|FMoIHP1TTt$kj|c8Ypyoi&a%^P+9NmW4o~{W zmS1ezgQndNM}A`WBX{K4n<27#5tM#_Jf7W8gKpx7K@3$8+HvA`FWH+>n0VbJjA(s5 z@?vaGmE0Y=5p9IQKo%eSSH0xQrbkjuXIEE`H|N(nX^^B@DfSDgL`xqpwVlQGLZ&5r z!x@RI7fEcF#q6YIeSy~Uq3~dmhjF@E-Z56IGncF7)3>V@Iq{WI;&#B3DC0vdMc#&! zcv}fMJvVX5>BKQPtn7K6bg=FR{SYQ8yPZzteUP`hksA!K(cA*=j$VKqxsKS(-`c-7n<=A zh1GLGmw@x6<2?^0`~R08*Q3{P9FDigf+B5O1kTs@59-^3j_WI6==xS5>opMZmf+H` zph(*;0&AH~9|AO4P^4|=f%AD2Y^nww=jHwBytt$X;_V^8d(dgp@mwhK@jgQkj>GXL zFm$}jka-R7o9O|--At4-+jwj%uKj+*lklAM$R_Rgx$@JdKeJa!!~NR7R({(25W@1l zS5_axuQ2laxSrd`W3cIcOhMM)07Ne6aVy@#Yf$KR6!uopa{n z{f6&=b7<1>G}b(?x9Gtmt!IAlPsli*fiY(vlPSNrJeL2meT6AcbRS|ppX``Snj8a2 zCgBH^Ba^s;V=~bJoq_M}G`dw8n`K|r6VE@%?5T!*0Ye}(-+h6JvkEkj`^EeT#ra1i w(EMkZ;~eLezNPp{#m^}IrsDDrA&$!!>pxQZ>x#>~xSV`$Y+q5l32p%Y3$$zWmjD0& literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/errno.c b/2/linux-0.11-lab/cur/linux/lib/errno.c new file mode 100644 index 0000000..50aca2e --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/errno.c @@ -0,0 +1,7 @@ +/* + * linux/lib/errno.c + * + * (C) 1991 Linus Torvalds + */ + +int errno; diff --git a/2/linux-0.11-lab/cur/linux/lib/errno.o b/2/linux-0.11-lab/cur/linux/lib/errno.o new file mode 100644 index 0000000000000000000000000000000000000000..d217c7db2ed83f5bef8c107b8cd9761bd743f1ad GIT binary patch literal 1468 zcma)6OK;Oa5T3153YdmQ1wmDWf>cC7c$1W z>Wve>ffGN36aNFQ9LhJl-o!{C7-@FCnfZ2SA7j6J@Z_Nof}9BQXyy@JnzNa%G3&HM zi?jh;Gk#69V8we3Crp6I@Wq0JJMVGKtIfx$2CE^i)|Y*+zFJ?p0A828`nG@Df3$pm zW$q$)YvlX)eD5UYoP*lJwhphuvId=_%NT|DSzp9xwvG)8QhAlIwToQCM0t;mIDBaTolH*DlwCF~aL@mY9vJdlUFnCH{JzXbXNF%KgR4_3l9396)*w<+)B=ZWjTE zIrkBY2A+z`Jw~Kj_Y3NB9j?0ob#e4!% zLhy#An9=dxlsuO@;zUK9+d#~{1*e(!;SW6Km%j^>{e%O41v(2o1LgBBLHSOq>y2?Q z%yHuCI^Wr9yhh)TU7YRje=YW_J7K?Ck$v9HOuT9L+L&ivsG6_7B+oxRO9FZ3gtL%G yzBwmXVQtWl + +_syscall3(int,execve,const char *,file,char **,argv,char **,envp) diff --git a/2/linux-0.11-lab/cur/linux/lib/execve.o b/2/linux-0.11-lab/cur/linux/lib/execve.o new file mode 100644 index 0000000000000000000000000000000000000000..acc081243ed081e41353b132934f9182d6227b31 GIT binary patch literal 2336 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 +#include +#include + +struct bucket_desc { /* 16 bytes */ + void *page; + struct bucket_desc *next; + void *freeptr; + unsigned short refcnt; + unsigned short bucket_size; +}; + +struct _bucket_dir { /* 8 bytes */ + int size; + struct bucket_desc *chain; +}; + +/* + * The following is the where we store a pointer to the first bucket + * descriptor for a given size. + * + * If it turns out that the Linux kernel allocates a lot of objects of a + * specific size, then we may want to add that specific size to this list, + * since that will allow the memory to be allocated more efficiently. + * However, since an entire page must be dedicated to each specific size + * on this list, some amount of temperance must be exercised here. + * + * Note that this list *must* be kept in order. + */ +struct _bucket_dir bucket_dir[] = { + { 16, (struct bucket_desc *) 0}, + { 32, (struct bucket_desc *) 0}, + { 64, (struct bucket_desc *) 0}, + { 128, (struct bucket_desc *) 0}, + { 256, (struct bucket_desc *) 0}, + { 512, (struct bucket_desc *) 0}, + { 1024, (struct bucket_desc *) 0}, + { 2048, (struct bucket_desc *) 0}, + { 4096, (struct bucket_desc *) 0}, + { 0, (struct bucket_desc *) 0}}; /* End of list marker */ + +/* + * This contains a linked list of free bucket descriptor blocks + */ +struct bucket_desc *free_bucket_desc = (struct bucket_desc *) 0; + +/* + * This routine initializes a bucket description page. + */ +static inline void init_bucket_desc() +{ + struct bucket_desc *bdesc, *first; + int i; + + first = bdesc = (struct bucket_desc *) get_free_page(); + if (!bdesc) + panic("Out of memory in init_bucket_desc()"); + for (i = PAGE_SIZE/sizeof(struct bucket_desc); i > 1; i--) { + bdesc->next = bdesc+1; + bdesc++; + } + /* + * This is done last, to avoid race conditions in case + * get_free_page() sleeps and this routine gets called again.... + */ + bdesc->next = free_bucket_desc; + free_bucket_desc = first; +} + +void *malloc(unsigned int len) +{ + struct _bucket_dir *bdir; + struct bucket_desc *bdesc; + void *retval; + + /* + * First we search the bucket_dir to find the right bucket change + * for this request. + */ + for (bdir = bucket_dir; bdir->size; bdir++) + if (bdir->size >= len) + break; + if (!bdir->size) { + printk("malloc called with impossibly large argument (%d)\n", + len); + panic("malloc: bad arg"); + } + /* + * Now we search for a bucket descriptor which has free space + */ + cli(); /* Avoid race conditions */ + for (bdesc = bdir->chain; bdesc; bdesc = bdesc->next) + if (bdesc->freeptr) + break; + /* + * If we didn't find a bucket with free space, then we'll + * allocate a new one. + */ + if (!bdesc) { + char *cp; + int i; + + if (!free_bucket_desc) + init_bucket_desc(); + bdesc = free_bucket_desc; + free_bucket_desc = bdesc->next; + bdesc->refcnt = 0; + bdesc->bucket_size = bdir->size; + bdesc->page = bdesc->freeptr = (void *) (cp = get_free_page()); + if (!cp) + panic("Out of memory in kernel malloc()"); + /* Set up the chain of free objects */ + for (i=PAGE_SIZE/bdir->size; i > 1; i--) { + *((char **) cp) = cp + bdir->size; + cp += bdir->size; + } + *((char **) cp) = 0; + bdesc->next = bdir->chain; /* OK, link it in! */ + bdir->chain = bdesc; + } + retval = (void *) bdesc->freeptr; + bdesc->freeptr = *((void **) retval); + bdesc->refcnt++; + sti(); /* OK, we're safe again */ + return(retval); +} + +/* + * Here is the free routine. If you know the size of the object that you + * are freeing, then free_s() will use that information to speed up the + * search for the bucket descriptor. + * + * We will #define a macro so that "free(x)" is becomes "free_s(x, 0)" + */ +void free_s(void *obj, int size) +{ + void *page; + struct _bucket_dir *bdir; + struct bucket_desc *bdesc, *prev; + + /* Calculate what page this object lives in */ + page = (void *) ((unsigned long) obj & 0xfffff000); + /* Now search the buckets looking for that page */ + for (bdir = bucket_dir; bdir->size; bdir++) { + prev = 0; + /* If size is zero then this conditional is always false */ + if (bdir->size < size) + continue; + for (bdesc = bdir->chain; bdesc; bdesc = bdesc->next) { + if (bdesc->page == page) + goto found; + prev = bdesc; + } + } + panic("Bad address passed to kernel free_s()"); +found: + cli(); /* To avoid race conditions */ + *((void **)obj) = bdesc->freeptr; + bdesc->freeptr = obj; + bdesc->refcnt--; + if (bdesc->refcnt == 0) { + /* + * We need to make sure that prev is still accurate. It + * may not be, if someone rudely interrupted us.... + */ + if ((prev && (prev->next != bdesc)) || + (!prev && (bdir->chain != bdesc))) + for (prev = bdir->chain; prev; prev = prev->next) + if (prev->next == bdesc) + break; + if (prev) + prev->next = bdesc->next; + else { + if (bdir->chain != bdesc) + panic("malloc bucket chains corrupted"); + bdir->chain = bdesc->next; + } + free_page((unsigned long) bdesc->page); + bdesc->next = free_bucket_desc; + free_bucket_desc = bdesc; + } + sti(); + return; +} + diff --git a/2/linux-0.11-lab/cur/linux/lib/malloc.o b/2/linux-0.11-lab/cur/linux/lib/malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..93877394447c6a3a313be848d7f629d4da685939 GIT binary patch literal 4876 zcma)AZERI%9e>Wfrsi=Fy<;@b11Rgm(%u+`{udl z0G%*QI+E40#JXjP2CZnKM2Fdjg)qA~A|$N7#6(Tl2NRvfNh}|jY))ma{(jF(d&|Cf z!g+rG_y7O-KhJrdTaMqi`!kkh3G-MYES5MS&NM2`fP`*wn`jpk*LtqLx3I7r{qOq=3zB09?ITMj zJ#u-lNlpf}PVEIhxh-azm6XPNlgY^;mfk(3V6qiylB#)QrcCI2rlRLXs}SFO_ut6m z%zs?U#N^L`NlT8C>?tx?kf5Uu0y)<4D>S&wdfC;UsUaKCJt?7wMJbXKM_{>xQw#*T zs%x-mP}kmc6Y^CPmo{T9dO-HC7T4v%w_b*v8RmyTb?98HH8!f%GS1NC74Bm(Z%4iRjUnUu^=X@-T(f4J6K?F>3or(FN2 zqOxl!iv8_CQ|Ir{L72to$MBLVf5~u_>OT50X(#2>7C(T5R>|FT^Xn7%1hD?{aWoEU z{Hn&qk2RzPw#KMN6F{>M2fkAtaf)uS?2SA568`1=;Y^S{==#Gsx0>xY0xekolH7Ml@K4ubI|olZoyHp zkp#~+8s~DJTdg{kbhV0Pe%aB6BcAIHSEZq@M-}O0$I|&y)ybAUFR1u#PIO`FYSy;( zFv4064xI=S;3$R3rH9P`D3_4;( z=oEVkgLUp5NDkw*PR(O%DrX*tP$dv8vLEMEFuPuM{k+m0P-VWntjwR9GB+}y=5npb zBdlKrAwV0;xCw1LhkBN0gNW~-$wRE5POf+ShZO8*JS7lTo3%O?Zw$v)#@ej*NbBur zLEH+*8XGq@ZfdmRSg~dij*;0J-+)WcZV`=uI>JtTbtgj@9}s^JsyGE}Owy z8#LR7X0%z>&NvHd?-D!XeV9&ssj{t|v==MKiH}9Xjo*0%ac{gUc^_lwwMZ~GH)k>(4&I)def`SZH@dn)Hs&=_4oW%EH&!mX zeWf7h_m!)Cg?uSE(%YX}x30I4&h+&w0mh8*+>tCk>I@G}!PBbZd%_%~c~9K`*+-o1 z&OmBIYQX6&roHUgz4=dXSnu?XI=v(1V&3l^@zO=Nw^GL0;Cc||OGxMTjs&HwpD*K# z>m4bTd#iprd$70Sm3=qsmpz%P_P`eMKtvtLSqZxKZSZvEsRh#4_8FyjL|IqU0X&g}8tF z_Ki;WBblJ&2dXW-cLtJM_vE^PRR6#lB^5&cn!tv#p4cO-qfu*RlWjkZ4M(~B%>m>Q zD7MG?LvGCGHXhJ29*d9zE( zm-f>lm8n)m$}1~|%AA`CMu+pIkuppqoz7&~ht!fb?WIejE*%#gxWdK(xkM^kF7h4~ zsS*}Ag-xRtT=}?T!*Y{g0{`bDKUCP7`;UF8{hZkzJ}dFoOG*vD!ZCXRBn}JtlY+hD zPY7Oh^pVFZ@Vg+`PxCmMSPP`RvAYgJUCPS9(EVT;PaQcz(C&B2M2^NzUd1)?i%_gK zPLP{StXTjN_gMN(Nqu^`v{-GUb zFJ#P1xyf4uZG1qAF2wsg3H=yd9(--QYlz3X84u_7V!UzC^kE=zoeEEDEZ|ywZ#yt29avtoD=?j)= zaj$?B?;+lgN$AJqC7PU6UB~@ffskiG3tq-!T;?=;52QE%;o~IqW8xX!V6EI1Z!H)( zars}u`7;cbJ*C$*ZDx1s*KHBVq4@4JP65IpC?bG04w*>j72A9!=NQh(qU{nD-R zfvc$Iu9P>C;du{@;;#`Yly^-fUCL*5BvJ8j867m2*OHOi3n6T*kD>;vPKZwcL)d?x zBag|YHCBk&JZFfoI|~e9L%pQ=m&wELpXA}kpP0lBjq8BS^F{LTKR_P#_1LJ4TOdOI zWgz8iv2Dor1Ih0uen^Ntlp}6NBX +#include + +int open(const char * filename, int flag, ...) +{ + register int res; + va_list arg; + + va_start(arg,flag); + __asm__("int $0x80" + :"=a" (res) + :"0" (__NR_open),"b" (filename),"c" (flag), + "d" (va_arg(arg,int))); + if (res>=0) + return res; + errno = -res; + return -1; +} diff --git a/2/linux-0.11-lab/cur/linux/lib/open.o b/2/linux-0.11-lab/cur/linux/lib/open.o new file mode 100644 index 0000000000000000000000000000000000000000..8884503d8d65bee3d41406d31508807f141e3d14 GIT binary patch literal 2364 zcma)7U1%It6h3!mlHFvJZGNgIB;W|CjXyJ+*hNZzY-*w0d4MHJ)g?(FX1?o6DS zEorGW5(|bXng=OD-|DL`K2;DDVqc^}#RmiWs30h!Pd@lizjJ49clxAj?v)?cjjg@kid%bs?_Fn<8+SmPUk|;!dka>AZ-@oxq6jvD!L*nN z(u~|UP&K3H7YN0YtrR__ZZKC_hOJJ9AW`tU~%np z@Eq4E3an~7l)EV{PSbXbd|&8BBnH_OXZxJ6f%0CEu^6~tLhEPn!hK-+cM@C-ivz{c zf?k{`4vUfAp$C98MTNpsa3LvG^CZ1{SOnP6yQysZ{q`uJ5#61>}aIA5f_owB3^5sl}xrDz!Ynvu@4Uv$Iyqsg!0C2Y7`}t(-IG z&9Z&iE}K@{39HTH-l4-!npVTK>OtF!t$GM_Yc0S9aYHygA8@W!@A%c&3;YN!Kd_?M zslINlg+c6A;~=E-&T0!=z(yjk;kz}n+H^vSnn4(wcYS>4>Mf_y&00NZ=3u`X5 z0>5Fhn@-KoA2FxTRXTp$Nh-FU=tyh!@@(0jDL;~U(aQbYPms8HhQy`3m>4jOchOc8 zK0Y@lc~&Qj`Au!UIEIlwxm%Q+=58y7-Ro!87o|R^U^l@Eka@c#p$i9LDR%PaKaUDKIYTfLb9NWkd{RxRbUK+$;JnlQMnZ;W}^EgM5!c(@AS-(Ml z-BEs)_rA<*XIEfb?K+vI%Ny54&PJoVT1x6H + +_syscall0(pid_t,setsid) diff --git a/2/linux-0.11-lab/cur/linux/lib/setsid.o b/2/linux-0.11-lab/cur/linux/lib/setsid.o new file mode 100644 index 0000000000000000000000000000000000000000..c1561bfe09d2f4b7187220efcd6bc62a4ad0c42f GIT binary patch literal 2240 zcma)7&2QX96rZu3O`4?J%?E9wfG{W(;ltj9u25A!hy2s$H!mzt@9!;7i=E0Xu)o!aAO3uY z&IgYH`#;w1-iF{%BODn5%fmp=PzKZsA}nW|oaKz&1F_#Hf9wpfiXJiAy}URb<5$C>9AzCOPw;Z|u3=U59u zjE}^#i>DWn@@Widpc~Tn>rve94LV^x+s(vC#H=vS zqK@BYgnV~9%=|7JIEbSx?|@es#}u{?$D7Cn>zJAJGxz-xQ`Jh;e_v%1N zYoD$){ME*bg%)SL0D1kYkb4tyY1(mapr+Kbi3HWS_3Hdq6-V38cKdnI0?pHcb`6(? zJwFe3a^ZJ^JP>{>L;I-ggss75Gm1A7m=qthT50%E*&3ulyovplCa@@G0&)nyo%H)5 zI_JlziH|xLH7e$W-KMH*vF87SpM?|ee?>d<-j@$4ZGYNs=!Y1C!km&zkeq4{4!vKu;6&Vf2whFntz6Auo0Ug&jhGEus4!oHIRy@Ms zMKoY+SD`RGZCemrG8&BS3gmL$?~u0!9rJR3Ca-!3Ase`b03RCx)Wi$Gm*ahpAdJI! zlNcu6hu}Gf`zBbp@ec}CVcIzMG&O#|!tW*JQ6S^@h4wS1dD9rJpdaBI4D#xM0i~ab z4Nx3XAAtI zN?;3Ca0E6gU?TAD&Z0xCs{z*KUoU;}PK)PZk_gZHFM*g@qKKSN`jn>pp-D9TIZ`xk vMeCW5e(IirzNO`NG<{Fg4>WCQ+9O50Pqh4{rfMCyuv|0kY96QynP>bT2zmUT literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/string.c b/2/linux-0.11-lab/cur/linux/lib/string.c new file mode 100644 index 0000000..1182e63 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/string.c @@ -0,0 +1,14 @@ +/* + * linux/lib/string.c + * + * (C) 1991 Linus Torvalds + */ + +#ifndef __GNUC__ +#error I want gcc! +#endif + +#define extern +#define inline +#define __LIBRARY__ +#include diff --git a/2/linux-0.11-lab/cur/linux/lib/string.o b/2/linux-0.11-lab/cur/linux/lib/string.o new file mode 100644 index 0000000000000000000000000000000000000000..15393528871a0be25d32766f8a1a6c71b70ab3d3 GIT binary patch literal 6376 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 +#include + +_syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) + +pid_t wait(int * wait_stat) +{ + return waitpid(-1,wait_stat,0); +} diff --git a/2/linux-0.11-lab/cur/linux/lib/wait.o b/2/linux-0.11-lab/cur/linux/lib/wait.o new file mode 100644 index 0000000000000000000000000000000000000000..f3ccd4f38a29f38cd9f98df051d0d57466959f62 GIT binary patch literal 2580 zcma)8U1%It6u$Gbn@u*^Zra)=wBU+ctlFJTY|v8sYpS(Us#L2&lqK_%m7ttbuZ=z2XD_CEO7_8rS=iclT1U+!icYf|U=iYPg z+}+n7Km3GY7($aFEYa75_}xxDQxdj{^!yLh9#bhx_t@&JrWFIC5uo~u^Ae&gJM z>hR*(>aaMKUxN5+nf%rdml%2ZHfZrmd1iU>#_-hx)dG$1ml0%NwX1YrUy*Z$mw$mT zEo&Qf$i^+OJO=5wAEO6!VNX;W#`Seq|zMEa^I7Wcq}NgIS!+F5+G zcxWAVrtD~5&N23mr=I)953OV5zOf6BjT@Mj&k3uL#+YNM4OOL}T9~>+9bAK2Og{8) z89zuf7W*-K$9Iim)tfO)E?*rKrQ>9ZP5@1D1l%zGDvf~4JBFKOI8NOUTJycOSC3D} zqOS^Z()AOk#T3cu1uu3wyo$ZRkCQfJSuZEKHDo-6Gd1#suK?!kANiTxg-=Wyb-XAF zLQ(I8U9TSW+DSc(>+^olJ5`%-CMRq2ZnHj-8o-<4;E`jM>B^L|!&ZaInWMruTQD{a+x9!? zI1iVD#Ct6EmkNvKbZP8lsjz>!WHWA;^6`#~=~B5-!WZkrr@M*U1SV069W6!PypwpR z65+Jn#1&36#?jN*_L{x9h9As^a7o#1HY4vu*6T)YFo#WM0(b^G05ycu3cFno?QjAd zfrDdBk0g!pIt_V@TN!O6??^KkWK8~{r^}KJ;@CW3Kl<9eIsd?JJY-_=U`n zB|F$RSm*%TLE<~M7L8#qG*RAwp?|CC*AFRQT)xHW&xw4Vh5Rpqk}o30M05FSc`#3Y!@wt%{b_~ID|}gDQ{g-j`OYc*g2Im#exdLR b5%a!N`p*jGdhyY7-}KKYtN=~u`xO2I^<_Hz literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/lib/write.c b/2/linux-0.11-lab/cur/linux/lib/write.c new file mode 100644 index 0000000..df52e74 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/lib/write.c @@ -0,0 +1,10 @@ +/* + * linux/lib/write.c + * + * (C) 1991 Linus Torvalds + */ + +#define __LIBRARY__ +#include + +_syscall3(int,write,int,fd,const char *,buf,off_t,count) diff --git a/2/linux-0.11-lab/cur/linux/lib/write.o b/2/linux-0.11-lab/cur/linux/lib/write.o new file mode 100644 index 0000000000000000000000000000000000000000..3d4ce0a6ec721a740e7519bd51fa8517005c8290 GIT binary patch literal 2372 zcma)7&2QX96n|sySF-6gAADq$N*HMi;ltj9u27V=v?YZSR28XE4$vy{?s~HpyLM`O z+oXyBDIki%fru|5ajD8*fH*`P5K=*a1P2aCNJyNx(F1Vd&_nsX8Bf+d!IR&|@4Yu~ zX5QH2*Pc54v=D+c2{LJjh}t<7X-G9ochLkrzjbqb`*iKVF2}ad*QU2$s98V0{`Se* z*w$ukjMfX=F#i~5`Oh!cdF1YG(AL-EFW>kENY%`V!?4Bg5R+i0qe_vHD}Djf$mM^A zGIM!9NXRgX*Vrja??K5LhV`gSEB+t@g>RwqpF@bzLy$~dQhf3mWTDee{l*Rznu87y z`;DDkvA|iQ&q!1%{U(tty_3*LZWnm;C5ZAEg!z-KEhfal%2e5`%v2`CWMTYXRH{+A z`~+M`O3e~hdJmbE#q#0u@)TC*h+|a+AFM7<@yO%TA3a$Wh!yf=mQ`vJC6T1_+ea~JC@w#{soPL0Ep4}M)t;7$57_K0+6CxySx7m!m zOWCL!xxp&-k{Q6g)B`XFIjykY_poaxKr0;_k7}(N<8@c$aj3QbA9){=uw~+pk%{k| z>vw3K)U9~mBbi*OEK4U7+h8Jl3Hi%RWDUGEWiIRC%$cs+Uy7vXx}vyqaH z%>ifE_dbfh3m@Ndd9YsJaoBncOj-oE#zsmyb{1IM9QqZ&Vk0FTI|H1Zw+1i{AJ5DC z)AM?;^%$6R3*ZtPDe0ICoUPXY;5uAy6s+rUA9xJ!o9QAx|C`E`l4H!9sn&TH(C~+4 zh7vmO%`{Jk-qHt?IyjH%V=&w5k|Vl`yaf)V#Oq`F0G!>&k<32!Bc}H;0XsX@R{+=H z)1>Fk&dISiibQ`x;})iUV6Mk~=Q*?W5;X5__%!Ky8f%^P=jgB7+RysVzcb_P42<=z z)hJWGal;BGVX+x9<%td*raaj!=3m~BOv2ACLnd(thh(Ayy4U>ePU3{J8Qhn>`%&Gi z>MsCy9V}2@{){1bW`SaSF08qCtoi3AaOn55Mo(u`zZ{P^&&zoyQ@xz(7gK#9)y-7* dSfk#DDgHFoU#42F2Olo4o%7D8+JZKK{{?;~5k~+3 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/mm/Makefile b/2/linux-0.11-lab/cur/linux/mm/Makefile new file mode 100644 index 0000000..e0bcd73 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/mm/Makefile @@ -0,0 +1,38 @@ +AR =ar +AS =as +LD =ld +LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 +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.o: + $(CC) $(CFLAGS) \ + -c -o $*.o $< +.s.o: + $(AS) -o $*.o $< +.c.s: + $(CC) $(CFLAGS) \ + -S -o $*.s $< + +OBJS = memory.o page.o + +all: mm.o + +mm.o: $(OBJS) + $(LD) -r -o mm.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: +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/2/linux-0.11-lab/cur/linux/mm/memory.c b/2/linux-0.11-lab/cur/linux/mm/memory.c new file mode 100644 index 0000000..adc33ec --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/mm/memory.c @@ -0,0 +1,468 @@ +/* + * 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; + + if (current->pid > 5) + printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); + + 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 do_no_page_myself(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 ; ipid > 5) ++ printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); ++ + address &= 0xfffff000; + tmp = address - current->start_code; + if (!current->executable || tmp >= current->end_data) { diff --git a/2/linux-0.11-lab/cur/linux/mm/memory.o b/2/linux-0.11-lab/cur/linux/mm/memory.o new file mode 100644 index 0000000000000000000000000000000000000000..47f156d50a75d61325408a8a1c3ed8f0c2adff20 GIT binary patch literal 13824 zcmds7eRP!Nm4DuMW?lv+lLQhZn6V5xDM9mvq=FVC2+D_GQBet^!(?WXj7&1q`5?rD zEI6V>s%_M2yQ0z6p0%y?cv@XQ;_d;pAa=J)x82%3$ExKN3yo{Fsn%`9?C0pJ(z{m#(?YFbw59hH|NKPO0wC+a;|U>eX~LO%>h^ z9Cn8&IPuBY*cfP^Ll<5NynNl&&#~+URiV`IEPM_8WZt`|Om%IJ3oj(&1|_+_}>wLKIZ8>>)#=E$Z;>FA5gL&3f>)KUpX*SISg z3ev?vVA)<2d%&tY)m`hx_O1y9cO4|VXXK;6C#sFyA9z0Q9#}`59G~} ztj*S`_s7Pd5;(j(R1GCHG9Lv2(aTlYjIHGk>G&u*OjT6?29ew`xhDuuQZ_fi=fsf&CmP6EHBN)tM7gKnGRUQ@rM{%INZ1ToWb7G7l3Um8sY`E0Nu#mAJ9anFIpP)=s!_*=guI+ zi;Ub~vZyx3Em})@i@L>;H`QjG)CWeIoaEOaxiw5KYEUDKp;zN%J}^*8mZ=89cUc{W zQDnHK@Y*D;*}}ng-L-{xt5JqA;nY@!#+T{F&qG1k>8;Aw+UkW@O{c@1 zAv_Xw!t^3cugZH)bpCm4tmtp%1b<%(BCOSWG@!uiv;!l^aY%iH?A2@1z@dTHKNS2sOEN_8;~b+rhuo+JeZFU6*aH zM`GdarD$zV?0O$@4~JZ~meVnot<8okLP+{@CS6oH(vZ95b6*sKgdPl%0KE! z)_`HyhHC1OxDcB&a$ZS=h@&3+q}%b&J{?$oUnREOdVE4~7IN+Qaj8XHL&dWP?phzJ zgq@d7ML0pnz9e|KYG4yR*kw3jLez7Zh7sS`8thYO3EoWrA$z|F?LP2V?|{`gq``nR z9PKnmn2Mt0MEWC6Z4RVG|5q8_U=NG`BE!G?@c(&+%h5nP!+O(ujKk+Jb_+d>C@RyF z`jCoYtk^qRxl%jWfz|eo_Hh|{o{K^CTkN#avO_zAbOuR{JpgJj z0NyIRQpsLLRk{?|K&_D(&})!Y<+cNPz8D7a;fqAW7;AnDs$RZ)Lovv)iD_6cWOC3A zCY3sQ8@}jiuUl{0dil)tmPnjUny;*S&Y%p_B2+(eHmLfEo4x(Mn`1B`eCiQQJzoiS z{7kI4CNxMe4?4jV!-i(X-MyIFOf*|rd{X&bFx46CiT9*3{ZsrZm+4RRb_H{(U}q*C z5B8>dxnry_{!eqj^NJlcB4Mro$WIPt^OXRwPeVG*eMv{rH z-X3^k0P82#l}`t=eUWrJo{?~Z*>oftS1OuH_y14)p00lps?EeBvHqZLOG&+Hw4MP6 z>(aqU4&PH47m^X~iKK(EL^jfeHf8M=Owd7|!nss9+a1ZoFG9L>d=u-*(pRvtF_sGV z+T{o&7R$u5*~N9+8iMIWY;j#|imHq07_xT8>(Lu^vAO7qbzP0IMCSUs*bTva7C|_A zQ`F-)54!1Hxea!w@o(TB>`=7zn1@a|6KT_9T#X)10&ddZyvcVNAGR zrb3Y89@-~#f%OgxJ_YTXREGl3=fPLHTD}e1dJOfr<~>sFtI2M9m@?V@0>E=VzPxVtF@P_k+#V9j*CCXf;mkq^We>pFi!RR< z{|?5w0?~Tb=~-$GAS%z5q}|qiDD+%K+G`!4{A$u=79;np_gRSFKZ*1;lvkSmH)(Jk z!>Ts@17tQF15;!A&!C!S0;c~;$ZRHPmUm>f2oo~>+_LSGdb1q;s66d--C+9nvqUp3 zrvJzErkPgLe{qpnX!=Kr%p$WqPX`+>f@K@RVIwtjiRu3Z)ikr*EbpS)^;Eme^#7D4 znptW3KVTCyv)c4?De`P$IBQJ*E{1ahnRTZBd?eFm)|>uY=|GokF#YXCW|QfkQ&ih* z`q_b=8(C@0EYIcom1i^a)@}M9WJ!c2N#vjpv2`qlW!m(gq=P7#oaujq;l#*nGyO*y zXq>s;ZuMDz66NMd&D9 zXx;D!h^!WV=^&NW2DufcwrQ+R)u)agvn@BfVx6*bC=@#o+(nm)_l@w(id0>`u{TN1<<+*^g*9udH=}Id``GusbAwOSvE+Spy zi)Q94&lgDtd~pW8h;-1J#g;E79rDE^+mz>G()GT0)S(-E@t8xm_~IQ7-Rg^H;b#f; z7eWrYjr1bO6UwucbQ^3zUqX60o%apHS~dbaj*HO~0gsb64F>$4RQ0gUK1#_mt6N zbKNs~$=GHw3|~@b;G>KOSjiDs?xOX+Z%lG3c|a1&|7sG!~CYy zSoI7&{I%3rRZs5^+IAbNe#!RfCYXb`{=I9uk+bz_2)7DW{KV|4| z+xE$-X>68o-Ku&L*^l4DH@944-zM6BPYZ1eiRNRQbE}!ZXZtJzrzq8~O$K3drViOM z#HLoa$17}7&Fo|hRYpII+O*N3qEVG&6wnQwUNk!EPKHruuoIt$;XS$&S4?(lt8)xL zhy2tTT#C&>cdZ^pbEIr@fIVFA_^jn%Fy;yytDONG<6L38YoB7%&J%W%I_nOG+O7k* z9KFQ7&e*r37(lydssIAG-e3U+Cq^JcnRywtdyO#|eqBdy;N|g5o!VZ<&`z7fx&s`^ zX@iR9;5s`WUl!e@ozsl4n`>WSuvs0PIoKUYj59G+!JJKn8$HWiYUXT4aIbM6LhR7N z++7Uj-ig6DtR2kPCkAu>#9$tn7|b_HgK?Ocn)N6nea83*RpxXGkFxTAX74^@*wam& z$E+_Ao0t zWYB{-xCy<*2&x{XlHO%JD94Jp6kqG16TBJ(&UIB61C0xpLF91-L025Z*VdwjOU+&Y zOSd-;Q3Xf9APAlRC2Dpp8td7!3zFHFLCbR|6_hd6s4K7XxyozHryA3&${7eLq*82>+9&8*^q-?)4~YPp*JN5>uwD zIWw_=L)~k;qI#Kj=5d_)OPpcKm6s@ktuTyLRrFms8@`)iKD9}_&6&v-wAI{y3F?^E zWGtC!2Rvuysw%tWflG8)RjtKv%^K{>rK&|2tYf-og5nvaijGgzM%5YcDQ%+98d#RF zGmDm8OEQ{E%?n4b3$=mG&MCRdZWpFEZ&^$&#G~@ zgltYGdh^@#(G}_(C(^Uy-W*UwT{39Hp55SkB<%=*Fv04-6p?W8~9~i-aNFw zxqWD82!>m|w`!e-E!WmxJ5-JKIeGO`5$yNw_qKcYj~?+>kLHixW}aPr`P%Dk-w#_T zsVcOLwhws=#|z%Yt|^_%U;o$a?Q55KhnowduMf{&yF|PBz2(ghZ*=)qFZ1SM(>=6* zsNl^%GCWk!#ZOuYX#eOt?GPS$@%V6|(C$TizST>P4|x~ohlZMuH+zSgy@Rf8Y>Hu_ z?Nc6ZUwg@@c}{h~+off{w!Brt8%NtmHx7e0hxlclGgX(}YHc;=R(bayX}+9%=7cxj zJlwu^+5g^l&62@lEzj#ZR$GsZ7TTLhduP3~cJXdTU|7GlRyoC}-#gp87@xtFB74+z zv-e4%U6X%qx-mjezh_bT-f&-9--M`aE|STG@g3cwa@~onEse#qQ3x~nXwJE1QRCMm zD&89l$0E6i%0|MS$p~JBa~a$Kg*y^C+{dUyxEI5GOBO^Vm*|PBy#CgAFt&f(=h#HP zCz9QwR<2sHGQ9TEwO_ibU3Ers-SLdVO-c-xJGpLsTcuW9aZPYpu(fGnQ){rXCz6SF zFHX!~cme2WG8Sy?3O078dJ?(D&P=2y-k46|4h7d!jhzWb5^wCx_eOJxRBsld-c+M* zZeu!=%EhC(RHme9;hz3%JlToJv+?*AKu;=<>loCvfU?BRab_$RSGY2ZhH(LV#=54x@A;9aoWLB-5kfyg^8J+1GB+uya?uj?>jRX_u=i(M@%B zhI2?os>jY-DjBnh__la7udne`2l_C~#3RJ8eI=Lg<%)ua9*W^@3G8NqtkDACeo4_~=_vU+4y1PFc)?ReTvMcC;(~$&Z(kiZdg~LgY30AKwN@CMM1${_u zJiIlYNp$w>hH|800z0$5H{NFtpB$$jx*(CsN$==D?RH^y>*^)v<3Q((s%=h`yXzr) z5g+HYS&ZX$7i)W}ylm+q2}j3s0=n)sqJmN8se>5+jAV@;DUcOv3dRO2>RYK ze3d+ozw;oYzN7aD^n&;e&3S@C@ZZO1qu)Y-)Z^WZ^RQk%oF^q>bqx+wPvF4fJWkm{ z2uj;gj|$rGhR${{2TnUyf_7{`s#82lIYE?^Z7iXw=f#8$l90#oaV_}Ldb_`XQx#;a zmvX1x9?*^rNL3GiPydB_6DTY7w+;T7Px@oC9e@3x>5qBj^Ty}wIcjru8Ov|Or&RB? zbCf#QQIay2-zBtD^atpbKGfm!C_bc}(5d&TQwTZZcI5A+i2 zlurClPWmscfxOdd+rp(h3O6JA;XE`^D~7FpsA)j|Okj`_%nkBqgLKwL>NkUT)L(k_iJfm-3G*YrbTHYMz-Ke_V*3zcn}yOP4wfko+oq*jCQh zX^8haptFaOkAQa`>UZJe>}4$92Hx4j$Pa*b_AT;szPajS!}z<+IF*j{CZeBxllshAZu}@U zeyA&X)0^-nc-j%A_(sc@z>?!#2gAo67?Cr^c#(5FVjJ}fYw;K)FUxvl8(6nFVogkJ zT%{=!lN{4n8JIj<1UX))cMHp*bg#(&M(_uMe@}$oOF-)VQut%Szc2iU!t++u#IFv# zq$ZvO(*8a2uwP)>Jbzjw-$9(N)bA)qe5V9AV2L1~C&K<_Alvg5k^im8pA`99MEL1| z4ef5nhy3@2=dXN}<4#PO*tFAvw-BMXkBCL(Nh0DN0UDT)32c6};}1C0d!IbYJ|vI$ zn{cho@>KPz}h@J*J(|0yE;*JDAZ{l!4~ z-zfYJ^6*~}{&n*3f079QpHhzeOvQjCUL|;&;17ss?{h%5_bB-}N*xnyE3?Zl1+pAz zR|aVODFe%{{@n+N5H-&`L<3`JHW8afy~w#AP=B%Da=}%C*9zVs*deIjJ7A~Z7l6A( zJ}CH*;7fwX1%E5}M?n|o0qiRTYX$j#s+9BRY+{?>TEUHiU4pv=`M*ole?n0IE(iW4 z;rZ_bEZ6f7=t54&R|=jbc&?zHmndH@{FQxroW^wy{$~>5N3WOQ7l=G6m=XM{;Qd7Ce@pnM1%D#= z3n?$>dI*1K3CLd2N6M)-*EeZt=(_>drmhcZC(9g6kt6$}DR@H__+HwoqhzasdA f-~qvR1>IP0XcrJ{6hE+UL;4mjW-|c>S|1dtOy3H8=%7eLw1ZKuRN#RO5OeZM^HKa&AwwFtqH#f(>u0?g2TgAYO^`C_E8%8?7~oRa|K$d2BTZt zkqiZC;vleMH;O%A)m`fD6~nuig@QW{lHE1__5*oysIF9gSSc83MUgf_SBq~qqPTV1 z@bEmf^FW@BEGw07g>HeOt&Rw~Z64|#Jb6|hXx2S=vUVDK0KV?jozR4^ZnrA_(%5;R zU=HPMcA9!;co-^yBMU>dP*OuPQ4kQle2vZ6TJDhckD?<~RYg$lVN^tDYKL7)ZF;fX z>WF?_Nx#kwjW)!iZ)K=$=Ygu7T^J}mELG?ITx0R2Ms$A;)Y_%{1wWXD<*|4ijXS=y zmvuBm#WFq!esNh~7M~hMO$dWd2N}knmRSoq5%QdR#a4yH2~wkO6VYlYZVff4!nkMQ z{P3yo+lmdvm&f!SqVc|Jl((zGm}mE)Xvp&{^NB$ox*5fdyY-lWs&fWoNii0x`xugj z-776HA0n3XVHQH>KnX!mNIj^wHHk#y)?PN*pPznqWW=B56xF;Y%+bn96C1DnQSU<3N0AZiDoM%T3$T*Dh}FYKigjWi-YjVfQI zl~#gfDh_#0w*LpRB!(h8`lJ18)c)z1lrLPf%O+9?NfO#Up?Lgbo!MMSz>ee*9!&vx zGzIhkj#@qfn%h6?X6u1(q@^Ay+;s~kDxNN z9{oec=ts>pny%K>E;)o}&t-Pu?t5sv%-SV~@LZf~7a~+#sapGxzrXl+coNedLDYln+KBXr$nItgCR^bLs9JqUB zs2cUW>?+&|I`zw(hp9$((SxT9CrpTX4%0Z~8(xOz6ncWa2_R%YFG4#HeBmvyI)<#! zCmlyW%^`-OBsrP+fK!`^H0S>+!mI4G_$v|q-TVK~BV36N+7Z?dy~mh7NAR@JX+%+l zp45j`47p-I(JGbN#sRFgpJ*ReVC1 zkmyN{rJPGa@g;B7qhqG5?pXChrP76bFx?gGiT9+lz2p2UpY2VgHU#tOU{^LC52n(o z_?AR2A5Z0jnaGCtndMqZ7oZt3VKU)-q%#@M1*4Hgr@#Ixc~Fqer$<4Q%-ncn}2-81zsMYGv>B-R_$eJN`Hc~NV;s-0oc%Ys&S*2RMZa3o3(aD%~mwvJE$7b8xHqmEJqe`IQw#*OnJ6 zz4MPihjmxsUV}T0n{~~Nm2S#2xcSz>mlVib%|BJT>p@99 zH{cF67xjiIWSay8aX3**MR zp9gq2?q0Y1IKUTCZVw6N>lDgOcc#FFiU(lq1()aQe+Oe-4R1Xw^wMwj!7IalX`^c<14yMlZpG7sz1Wf<6 zkl9SotnAEg6eeW)ITh`a2D1_qUU@oby3zFSXNhK7P5%#QO*3t#|FRM@+w>2Wm^o%; zfd*Dzikj_khn>{S<);7VRMX5tvvLE~)==$A)Bh8eXlAkLf0td*%u>_O=bL9O-C1V( zchH@6WLB8|ix5nkS!w!jqXAvA%Jg@Xn6;+={F2&w)6W6)+{8v>W@SF#t32x&w{Fw_ z5KAH~Ng@WD;alfi)XbRvQ#24IlQ;dZ(VZBXEvEk%9gQ>ATTOpI8||vc@N73Lld-(= zbk6{D4DIA{%5(Dp)Im;;b)SNM6&rG)M)ma|yl@?*v#oW%hsbK>k9Ja7?T}kxYMa&~ zv~8_tb8c$`bt0s_)*QHDbK&IZ;ESyimt zO}fE)m~?_|HCo?b-J3}_Teq?9M$)a;=SU}M{~{|$x`*^kYpVe|MY_$plysW(XRMi| zGo&xJ614w$(zBFjFB+(}@{FWapi+SiDC+^zn@F417*^O!+HE~Y#Vu6#TKChr-o=nt zAf61PhdYR*r{O7-`=T7Z>C6)4%aOi-wA+^_eIaSDuPc#Jo<`CYzOE?7r-^j6uPdEa zo@UaupdoJ|U1z-u`<_;s52z}NIGlR$YLw?{c<@utOioSf*HmnyhO$<}f6r$~yM4J_ ztMXh-+G~X=pGCR?@)^oAn{>4mqx=%mwUA$=JeQKL^F^~WmFKgh1HL#NpF=umO<~XH zk`DRekuAz|8R-UJJnGPmzIe=`TYd3Phi>!5bFedy`m-Si-A;NA_)lfaGEy!?lp)GI*&xSCCxci-Ek7YanpKj9#( z8S{>dfLjTpzZVs1E=Gur`7AJ2sM-NEZLD^75=Q^SP??xU3&v`yn0u8v>+>{qGgk>` zXJPbzM7{6R)Xkzd@$xdxU9*RVlTLV$>zhfu5*^Jw6@d3ur-0Q8ml5RdIE!KRO7XC(Btl@UXc*w4|s^%B$ zpYDRWH&(O0j9agLd)QW7tIoQY^$wGDHb_SQZ|Kzw(| z-O-7qO6S}~H>MdJL}w3Y^e@8h%WiF&Q}JBHXPUvK*xc)`*I9JFl&ueNgc}^2^-Kn1 zy0EeONvLC7AZ&O2Q|#J>!md^4+{xf}Xa}5)qS3#tWv%;>gf1b|fv~%X(?m%LM ziK!~aY&^{9S?*Gkr?TH)Hk_@i(Z8qU%$G+yt=VJ5p!GAGbHjXf{`hVm=IEw4*kFcS`1}&I-*J8BjLCvF7(oY!=%CREO$InXW1g{5y!-AU2 zfW{>YAo93^psSAKXH!YTrKZk8O}94=Q57>_F9;p~d1`7sI_ufB1Cps%Ld$a(6_hdF zm{wWib5+(?jyEP))sx^-Ncnu1L4@6mkeDg%vy`jyQr~BNOKMQL#&A{od}Ix*>?E+$xCYNk_Rr=Zq>Av+%@q=Ra>rFGQl<` zdPXUpRj%mRL~B%?1e?+)+N?v(GInyQrl-tH);n98@GPley?Sv?*nn6S_MB#f9dUw@ zGnzkF+7rbopKMS19@Jq&Ag7K5Vcz69h?sf``CzJTObX*q2s=JBBj*+KzPY(2k%}e@ zv3N_aH>XC}GO{I^NENo|GYlN)G)GZY<$E*nTyr;VK3 zQ4u0!7ZX#trW$hx2VM0`XSl|jvy26E@y2CXk611H2a6q=_P%Vj3=Uq~esr)fc=~k5 z(UubfN4+frD|O*g>v3<3tMG_sR#`5;x4GEis$IH33tqO4q6+E^9_=`Bdf;@#72 z^2fD`Kh{+(1N&P#1_lODag+Bpt@DWG+VrMF)oGh!m(CZ#e(!#7hj;(!qu$!ng%h`% z=ha@de2s1U5ep?X#n#gu1K#3^qIa%qT-U-^|0Q?F@_F9Dmg4DG2d6Hdr_H=)c?*N9 zUB0CYyam+h9@sxn^cMCF4it6qlNKD>fBLNs2#>ySVz5~3@WMae(s?HaymJc!11%?7 zyaO%Xy{;|nieaJe;~wc)e)(zhQ?*6!1}%Hj^41KlKHYJ8^&oh2fIsG^#_O`%tWDs@vOp;S`4Rr`EGq|sTN&*LvVq8 zsuFDKiDaYQa}zUXUko~$j0KxE1e?0jJ&Al%S2ofUZ_1=`MuKz7rmh4%i8pl>Qqg=O zoytL!N;m25Hf6Hud_0;@XUn=4?&;0NlU?vU7msfQ^rUghqtMnY$`ZH48L@m^;p{XT z#z~|~^4ye1G8^LgaJ(mzx6eXV7plhMsFX=$;wqAiWP4PcCj^-d_W3I`?AVpgWpy)7 z*yYSpbkkj3;XFc-?y=*RPR48^z9k+l=<{6Fi7^Z_@Nh9~pUoChTv2ewO9#8cQM)r? z!~&xtE!aI6rKwMh!(kkS!harD*d6aqXY;{Pig=f5Rrr~~pNpVe$RID`YUGqzY2U&) zQqJ~DvPBt}Og53uCU6ds2*=`^R7-cdC*G1O#PTiaoV`dkwKmU~(UgpIwzS%UmYyCR z0ToTAbMbIG6=vrZ4vq8Z8En!^E~Y9+pXDrN6@INOLY8^ z++B%e9K(^pYc|M?o??kq0(llr6?#;ryEhlsR7;Xl&FhAe zcxa%3%?NEgyeXbdboJ_vGE*^uomroXZ?@AX&*_IDNM!ReI@(dYUzpu`dSY0ehROyu z5oSD9PdJg%!H+OsFq_!FGrlyS1v~Z1kL8gWxs6UF(NuRN6-%OWJey5t?E&o)+nib@ zo8l*Xgxh|KCc>K|2wygx#-VO=uD1tS2h3+}>~^SZJlUL&W6f{Qru72WOi8>O*0FA= zW?R;Ym;2^ux<`KqX-;94XvX?uuNtU{8nJk1VM92QjifeUj+BWKsjf84*u|ZlS)_JZ zDc2&W6fW@r{@=X#U4Z)xyjSb14ZrtS2m@dluX@~gy(wM4pRUw9*ePHWrFF2q#i5(R zpR3rs-b8@@C)nbvvvX08*9_bgJ9@Wczx(oE(8E{3QSH8o&H8r8*e-23?S2+CtLrTc za2dacm0gbM`H<01M{hm!g82UDTtOl9%Nyuc;i-3l&;;7!eT|^gue<(AyHU{t=!<$m zp$W9bD~!85&N2O2)b1}{no9lM1lp+sQhfvVp1^+GxtucQLb<&>?6qS9%J^}Zo%r1b z+NlFlU568FpEEdRW%rfQ)LVBhzMuRBy?anr-tN;l&}ZD)F2n7#yAL$mZN<%N{8an9 zkImU-Eax$YGiEFsMxuR_gj|mA#4>l(3ut#A1htU!X1fTL_O0CB+RrF;o?`^%4#|08 zpgu!uqOW*EQ|8$?&!rr3+$e~xx7NFr<%r#vMgF&f-x2%=BJ3RkQtubS9~b@|;rXqI z<^0aXR}+4}BAx=W{%^^nd=_Z(Jh9gLL`>@6Q4aq;7F>nSk}nV;y9LPpd{N|oC-Nsn z{ss|tIuS6|y8}r6+rsnkm~y;oDHB1-2;NGBUOy3sa8DB9_Yly)B9cHrS&!#})O&|K z{CS@|`qPZVFqY2|yoQK+-GX-z&rxbX_`er?N8~Of8TD%f8;P(#1IYefCh{8uV}e^* z{%NHiBEl~oPtne6TcDMjrNy!oNx$_D>OE|Id^oKI4&)#Onla7yJ$p{e2e5{vIPgRjK2G?U?i| zzXHhe?ZhDbCr(!iBtHJ(2wQNiU|#Txf=>t@5PVzE&Ah}N5Ns1%A=oW=yWl=S{v8$T zAq|v)7;%pB1z7XwGu%@Ke)MrCaH8;hb*A1_BKn9>YP}Z0xq=G?mk54NaGhYMV2@z0 z;7-B4f)5KG5J&aXJccERO>s|7a*?hxePfl&VmL46zz z{*dteipFxiJ^)=9WAfF4=LlXPsMigYFBJY-!J7m(3hopf5PVYbIl;q%Zmu6}PcR_Z zAlN3@F1SokuS=*G6FwujRdAQ!eS-T0xlXaYX9ZspJSO;>;7P&v1r4rSsOJ})EI3VY zhTuZM#|8E057hf-;rT(GcHR{ni@8Yt62a4g!-9*E$jsC0iO^dod{X#Z1h{WR7F;K&*I|_BguhMjUcm>6D1SouBZ5B``LBfkSnzDDA@pau z;B3Lgg4YvauT%J)f?pK*L&ASU@MnT21SfDEhW*Jz*wO1b_*o*43T6erBzQj&`d<_N zX~7=}{#?o{xn9HGIf63<=Mj-pHwYgQezWlR3O+2jo9hwU`>(Fi|HZ<67A8yC<L{y(6@H{D%->47aMkJflWMqH=Mh0dE1doAX4phPfOlvT3Ft9STv#10H$+7V-*d+iI?Yq@?sP7TK z!lj^ql^~s^>@WWO|Ns9rE0}6N!ok0gT|O!@;yi<1ab<2vViJ%pDT2@$Fji4&j$TP> zMG1pmN@7VOgI-c`G1OurD0!e7kj-pRwIH{eL)jn-<{xPwn-fXAfQf+ts z<^W<wheV@HMo%WC{%aSp2P{LwlY!ct;M`R-~2FbFGMPy@anLrFI_hV0Y@%>Ql z_Jr&Zup>Lc5l#)IX_6)c(uOuaXq=b6#Hk%BDgrpKuXQMawBfbn#pKDDygGy!H*u_f zJ~O+g)miY`|N4hVnw$B|_s4waJ2SgGJG1w%?O&&9ns9?p_yy7Uo`Bwo^tP~~bP7X+ z#8Pnu(jbaR>)Zt%L<0hhRVWJ}`Vj|!2X+T^#ztU9(oifT5+NYVcz1&kjFcDkimqQK zg#PV-&e#Q^Zba5gx(~^G(C353I0?*1I_qFefj@=18P@)=VOtN#{x2PZ~5NFB={zCpe9!z>y1@5oFt19qa6}Y1Ue*n1qU_hro=81)( z2IQXo6k9PQ{33!x4PHth_umU zpYu1JQzh&hP5!B|Lf-mxdJg$MPJnP0V>XBmWILAz058ojji@20{~4IHH*; z_zk8QFfB~0g;>f|7h)OHkPvN5FT%WJ3de03eM6tDf#Tg0mo5`xZ1n8Z)YRT_yK3@Q zSTXvHzHLHGEf0WuYO#)A+BUVA)})v{@haG-7SpN}X(x_JOzTn{$|uGprj;oU;S&cX zrnM=9_%VrTb!sW`0f}jSiatECOJcSn#bI<}NMg1o)lGc2#B5b+J@F=q*}Bvw;%?yf zU*EOw7o*2dZ5r5|+J$kFs>jbQx2DeS#dYB;V0bHe!237W+%npI=AadYD5x=8vG(S#z#s*r9eFH7}bExzcw0~cqW%9e{rlw#3$K&KZ$b%Q~RZu5? zMA2uOC#d=OsoihvLT`?KLJ!zA_^rb5I7S9!=kDDH@v*hFqvQ2sg4!?ntkV9|KgyA` z&86)hXla540oHsCh9+9j?9y09epLTHh)=GA_OUfBU9kGPrziCX_O#ps1Kbk8VZf7% zo>k=nDGS8OdZ)zimdt(XK}nkX)FV=b^u@mZmRi>r*ErVxHEQ2=MDqCT9w+CwuXb|6 z4$oBKxN^V|PbuSvY5YFAbx+H^w1`Gsf|d`BsRHfTvzS0C?-Z??!X<0?=h77c=|avV z=}M+_&Fh$z`}VX9LF4EVnTQ>=@YTbt?met-O^a@TdHH@U~69m+wLRE_qa?-O9!a_ zEx3VdtIlD#C&xr`)z)uF>b<1C1nOthAj06vKoW>U4k!yG4MXZ0hW5)@vwPaA%38lh zz4t-y*mPgSz%Kh)pS_=bO5J(={C(=`fUbAx=i%Q^_wzCG`C^W^fg_`-iS#bR=I;NN!-f@L<}eZWe-_g2>^KIx+jE$9_i<#WXy!AhdbWY~ zH4r(_?tvhhAvHp2d6Kiho#f0rmO7LCWbTkaH6KuRV@i8jIP!;UT&2^pvw22G_2+q} z9yZVPjMKC!TyF2%D@PtWR=Nu|BjqEMyh=Q9X7(%059o_SY%98F7nt{B;8a{;&b~c0 zwTd*^M=w(1Q_4H#OW?b8@+wq)UQ^aW!OW(-ODBIE1~|T)wUbYRK3iX&cKY(0pu2+r zPuFq~)Zn3i@*iNDyvZK*JP;h%`r-DeTenR9lu{F~EyBopqj@aT(zgG*wYY6fe*HA2 z*Qk!{RnI zNAm?^mEu_)P0XN%!(l@)Tp_mRqOpu+*m;A`?8Xury~I<>XL}=sAFE*GlP-N@J{R7Q z&ZS4rCzb6|}Mcas3hBXq6+nF84^7anJ2sSTYDq5tQ2cePeHIkX=ps}=Vq^D>3 z@~gy$xhyf_(M-ljM$;KAb}F4DJCqNY(}YStIV`g}sx1D_zH(S9o#jfp<>&dzVb~%^ zoHY`+tVGe+vUXtWCUeW$-hnNS2a877C|Gj+r3Py&{m?3j6mDMsg!FFQoOL`x3?Xes%5^=1wsW)4?$xzRYXgA?P;Q{C8S!4|9Y-qa^mTQ$ zH_ffF10&*w_pE$>N6RAIDMUBo#i#>oI3arL4C)&|45N(iRaka&T|nx}04_y&hz9r6 z>3e;v=T!Nts(*w!xyX7Du^Dzokt%vmUG1m+y><1U3iQ;?AFbM0*XCPaH@|11uD<8l zy4s%S>hzu;)dgtB^N5=u>!U0JZGQ!^A7yPUKz*Y=81qrcOu(QE;erP)c;JEuE_mRA z2QGNvf(I^m;DQG(c;JEu{vUeaz}|p9gh!oy zTM?6p!-$_k{2byFh~GnWWp3>4z1CQ|HCD>mC8IOa73mCjlq71uue~$U)_IjG73VQ_ zgxjxiI2BKaTu`dTrCK}w5FN6f3t1=p9>t0h(Ds8-GeO{vwwKX&7C!O4$OWlCP<;@< zujvmm@m24H5DLF33xl7Pg;j5YGZ3i4&am+7RebmF*Q=jE;(H%@$bWSdbl)aQcBPmN zvh?1a%wEszCs>v50cP)$**JOcU(3=ge*C*-X&)7TQfAMQVe|#k0##SBrW;7ylb0pc z!<76LdB(_774W@H@)rnvgRJLKnVlf}x0wwFE+dB){4*rg3n2PP;CD|T(T{){IQHH2UrvO7{Mi4Kft=s^8`)W>(Fy!=o*4%?e_rdLwg7o zYySqe{?PkbPeeNnFc4}dXqDi$P!~a)1b2jPAZVB1?vS6LLt6})L}(iu*C}mFg?>TR zD>TmNjJW6%Bz>{^hbXKKJjO=qEfjs6S)oTs{wkXr&`kxKJbcv{5j=WwqB9jk+t!n2L|?;u~VpTKW$B?r-by-5D<1IRb&9pvx%3*?*S zr69PLIt`tk4BkkcOZ6uF25(}2Ez=vwzwr$6ZTdR$Z1SU|Q{T?~Ha4kC-^TnM%y;W) z^54n)di{Rt$#Obv(jQ_z$NYeplSo@aYvi(#BZN98scSe#%M?< z%IK8Q5Gy5xcEc|q<+o3X#sciuy5-cg-!>Zmk`_4dw9!zE39W}+=d+v8!8BQR@S6~y ze;mBnJHGh6D6Rem2aC|=X^ZO`Yy5SW*3Huzg7vsf_!bC%-L*9YSe~YN8xgK=% zx|2oURLw;xoW_J))s33JuBL`U8X#_Nu7)nKg&bJb*GPDgs~@ImT3;h2YA+XkjjbTg ziD)-0^y}2LWFal;Zu;Eng=DF#!X;Fh<-;hL8xdfXc6t~wyrcrBysvSFig{4sw2Uem zI%jBX1oTknOOvW_XPqv;Vc~VWUw;|?^NGWBpZ15kIrx=_-PpT$%bO{R)>5$`4{Qy_ zicatpcP62VXrJcpF9l93eb z5cZBCY!am8g(4kG=aEHk+v%*Oa@=Q8WS(qt$mm2LN4dXUTcsaU$4J)1bJWZd6wwO;LE=D#>2jr#=}Pszl^B< zd{;K=uN^(CUw-)Imwi_>9zFc4*|?7SmNp)eieC!)+AeORV!-$;TT{8_8s z`tppCu z;s%yzP35yzYp#^ATk}P97Y^2i+am4l;Y>8v+NKJqLTcc-u;{R5TDgRfo!sj7hG}N= z3CpwvRkJU6#!DUoD_BLVFl;3{&nsCjvgusDU~>0Mo;j176y^}FGs;#-VDo{yGiEW9 z&ka(&ZL&=~p@vI>8H?fs8p?7oe7h*7@&)ccL0dLj*lrbyl978A(qu5kGTUY2og-}2 zYRDf-fj)@Kj>!!s)SXWzS9GFIQ>kYzUMiUJe5RDm33Di46w$)qFva2+Xu=$p8(EaY z?usz;nS`4!<%;RSoRu)*sc3-$XgG!AV%mZ-k8A)MsM;V**(_cF*=pq@*>1Cx7o+%;m$Fx$*7cp+er4JAxiB$o80=<7{gZ`*-lF2^ZtQq3k~C0*n`?95GN- z8d8JCblXCL93j%DR8}0~Y+*|rIXUK?p@!3oXe9?bI!1O1{T)Gnwr<>q8_heRZYMn-y8_l51~po4I^jL2CQhG!#0*wRdiNMc70`c#S; zBPqie^67kT1~5S@SQ+xG%uvP_5p3w<*JkfWk^ms(xr-|zR?3u}V5Sm~bdi!UqlH3r zhmvsfAB}?z%A?tI92H|K^Cu!}Q5v!RD+(H- zwI}x(TO1k_mv0U7I75)9KCW56z7?*(=Pc^P>Am+My6%Qfo?2sI<`*2{9n?TB3GGS9UxA7TyUz4Zc$orobs z@^P(fgOB#O`q&0Op^hTDe0#vR2Yk0Vd|cdXzUzNb)t2TR$<@?1U+in}!Oy7?a? zk0XzgkMBlm-+}KX@X$V*&V#M>@4)wS(AgK{ljr@xH|dlik@d2Fk0ZMJc)t4VEc$38 z7c?#(-@OQ9<{5VKFuv*G>jGaF_*jn{$ir|3k>#|HM{&E2+4=qmI_qsiWFX%LnNvTc zF$VF&)D8O$A@E-gF74t9z9+$S&NT|$F5l%9eBWFw#B!JD;cKnnd-Y13#hit2rNig8 zWA{=a4tT~NMHn%Rq)(8@FmD+a=dF3>y$ z9@XHS8TbtfOVpPw>iVg$s+reGg_S~H4;5Ap<#kVCbyeZ@O<|5qbsbZfS6+3!QdqLd z>ypB1;`92WFy9QS>x{y@(jqwT*ZlI!4qR8t7?T}=?;@G{<&0F<0fjm9FkUc^6;@Xl z&TEC)D;S^7J3qf@keKt78NYMq;e1qBU4h(pgnsAECFhr-FJL0yVKVW{HHMxlUgwZ#=pVjM z;CB)n`3-1a82A7%=W~N^j_C9l$kE}Qv&6T0=mu~B_!Pz`XA0%{yy5o0fiIi>6qwgV z()m5l*MQyn7J>g84jp9Nx0}RwfZg%kfbso(U^lS-A6MX4fZh5if5JmIz<Gh zBGXLdvBu8Fq8T%Rqmo54S{e~}&K}BGwv~viSbh!Hbh9vFsgz5r=Xb1&?ZOVBp7;}` zY<34kJO~TCv^|4$dd0tPbI*pg=Gu*GV6jjsGf^}U1>#`gB zZ(iNgZ{ECa9nLPA13jzz*HWE)cMva@q^-bwe}k15KQHUpAT`vx}P4T0;f zfepR%-vAGoLdi(iipZd4n?rHaPL*=oBe4;|HH!KY4eI$_n^&Ez)wJX~#Dh;Pq*(6(76tYq|>FV%|(ea|xKp6PGiHSe){GmGdRudEeD}d7W?YyhZY5fw#cp zSN4REuSJ~Jo5>+Fbq~CR^_o*8-w~+yM0_P|-ZX4(cE)CJCR!|FV45a;><$7te|Fc) L+T;g=UUU8j%7>uH literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/tools/build.c b/2/linux-0.11-lab/cur/linux/tools/build.c new file mode 100644 index 0000000..8b8c7ab --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/tools/system b/2/linux-0.11-lab/cur/linux/tools/system new file mode 100644 index 0000000000000000000000000000000000000000..d07530539b21e21f00834c58682dfe4135e79f24 GIT binary patch literal 295629 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�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 z z^4lgf`E7ZVrIGKjCbN-7Ya`!TZsfbHkwM#s*@|zmvVUp{gQrB1{uo-(B;hi@m5&HG zs6Kg(Ji_x^PUAg&Tdxea$fN&PZS8<`$9J@*p%&@i?`nfatGnoeYusSVldRXcP114y zrfu2~v|qz(ts!OJ-wf?u#z;R@?G9;FYiOwf)U0lj;*XX3hp|SSr^E)l`Ub=Dt+>BQT>9vdX>4**r6$MgNs7F z-;pVDXenohJEg5TJE#p})DCYD~--SAD{eYDn)YiYyT0g9<&)Feuea>#u*1yPF zKhP;-AZJJ9X3m&!Gn?#YHUwQCV=Km_p7(ZyFuw6-j>nAGAx=+Y#mz|TH6w23FzL>m zt!V4tWSOmZ@37VnY5NXZ`v$drIjik^^Mv-j#oD(i==vht_c@XDcxM>U0X7`_8rvs> z?{gE|ry0>cZP3GZ)jI48)*yS_U(6r3HYjJcL677O>RiJXa>WX z?B;1<@HH8o8}KRDXt~oO`*2L*>o#5TVKv<;ABUVBoFX6F8FqC@p4iODz7SI5tSJ9P zbiI`|u9du_(?d*I?2#|9MtR}ZM)o>t7d+osdnW6PI^>l*&6;P=Bxkh?HdqVv1$cqA z0MF!Bw%|6A^vPM6cx22BVCzgOqq4k!T*$ZaOaPB@ypgM`!waOKAOk! zN26W*6}!PfeJ#IgH@GR7_7GZ-2>8}CJs>a{>Ss4KifM=AC%K8_bnaeMsuENs_%S}_ zE?7GUzq(H`85?KZr?`Jk7@Pr><4yC?Iy)@TiPDwGJsRzk zOo4N|8Sla~S_`;rs~|=zK8;JC70#^=XT`ZCZ2=JfXq;P?&2er?>jB4j7a!7pJf3~!+ef4_(e z9bNc)!8p=|zwiGF(y{Po)_mbl30U|)hJP_2J%dr#LjY4(f}V9;_&WtAb6og41txP` z_&WtAb6og41txP`_&WtA1C8|3!r%2#ye<6srquK1szJOT1LP66m|wkTf}V9e=HN=e zWKMy}kiIZ*C15hAz+^~Y6d3fZ<1q)Pz+{dd7_J0N<`kIBm7r%Gk2xp|ZLi}o2c`QQ zk2xsa?|96?DKHt*K`-a$YZ=ma1x|sodT0NF8o~yn9P-c$=up+;3;C^&!8y$JW1DL;r|e5{#jSs!k=4OU(Zvq ze>4TtdANX+`9-2Bo`@BW!m=*dimY7iQ#A~Ya{^$xkh#pwC|qP}Var`}!{A7iX}*Zg zkSkdn3vgS`wx*P_mWfN|g~44?8U5h3GP!`t1ou_IF)1EPZidmwRZ4ii zsmD_H?(%(Jkl*LG=VLiu2)!m3+B%zecsysrgfCUrAuNYPo#=qUDvS{qd~_~;Rqs0OWG`3juK%{xmMbpT?q1 znQEnssaDFEYNd>+R?3)a6_?>pl`+*y8B?v4G1W>LQ?24M{HZdgS}9|yRa{oBlrhyx z8B?v|GW=;=hCfxtR4ZjRMKwHUsmx$h!*iC(3`K$+5pUjwo;Uc@cxWq_kw~y3;xhbc zy!D?^a<7IEh_{j17uEcL4{eyte#MT6w{wOx)hgbh{v)zi9*?O1NG;D<#^*hNR|=|C z>TW@P2_EoHJVg1fD$%I#xM3f`G*!3f@&0iR|(n_$4F z8BZX%{mfp;KE%ddei=mPcxM89>cvki*Dn^LzcX$u_!8ckU-TWy$xcRD(=RfGw z^owQq*RT~=@t`OHM-NWKKh-Z{@lO%`B39s2(J$hXei4`Si@2m;#3lVAF6kGs>KB4{ z7Mp)c9Y13nE)(>NSo~8mxE;WCnmH8jELPxC(Jx}vF9h!_F6kGs>KB4{7MJvkSbu7ja3yh)eoKJg#5FhYQ&c(Sf}|t4*>u;A$Hu+4x3&G=i$kqzO94X3{0obSAxQ zQ5Zao4BuE#%%p$tY-4f=PftB59mzcDX?D2=LNyF2slx0s0XcNSOv;C*$f2=%V%ki~ zbVUx0)f4j&Gb!^ls!Ky`XZ-|)Dc;1&iPZ6OiHGhNh#Wl6!Dp4ikXy5 zF_V%hW>PZ6OiG77Gg8EI@UNIjd8L?1$yn&lSPuRbGbyhWGbu%zks>~a%my`5C{xU& zyi&}hWQv)TOfi#EbTO0C-KUsIdBs9^KI@s3{q{%Cq^wA0(v2W;Ps|B3DRU@ts8df& zn@L$+K9iEpXVMj*6*<(YC*~iRNm(|ZNlE83DeLXEnUwSqHj|RhXHwR+$YxT~iX7_H z6Vql=rYmx&Q%_8rNtvFX@|!S|>J2}H%Z9&XGbz&*IdtMox*F;EOe!ANI+JSrNV(JXHwFN92%>qr_H2HSNx?|Jw0tEWxC=o#p>xP_)D>R zdJ6thte&1WlQO^JFU9KVDe)_nR{SNU6@N)-#b1im(^K%5V)gVC{H1sWWorD&SUo+7 zzZ9#dC-IkJ_4FkEQmmey#9xZl)06m1v3hzEe<@Z^Pr+Y`)zi~vQr4o#p}#wmvTL6; za_9w|uNr;}IrKtIKH>*B{)6=Yd7W5Hnk| z%xv8{vyHZJYb~5kc{ps<%zd|A%WjCu*qp75&DpxJv^m?ASHG^j`gL1r0Gi7V}WJ!jRn#@|C0mg*&3KO zX?3pieUIQ7nvI>OsdF3qc<_&jHufix2W#Np8~nqK2mko53Gep%f`7R2;2*9O{KJ)k ze;mTb9zTPP9qEOQJucbU<7cq3|Bnyv_9q4Zcs-}YTFz^CU?hcOE4a#(Nwsz>hg@!B zH%{Xm*Q*_Pm|?yqu>=j`unCKaMSYTJSDJhag&+3qLin2s;fGBSZk!6ARubM_56#S0%vK_s{7H@gMDk@SLtNVL$#kU4b)1*K@i8bw;knOM$|o zddzCG(l(+a$5av0c23Db%+-1-;JW`Gd*1>dS8?5aUwe0UwX$TbWXo^KZ@`x12gZP9 z3uA~aSzy3`RyNqOBum1wWGt<0^9p7Sd5|Uu@@nI-A_+;`cnM9KG_X!cNYWre($F-B zw#io#5G73-5=0+g(tdpZ|IFOoyDM2XuO{uUws!Z-+?g}4GiS~@b7rm+EJK>$Ova1g zZ8HJS;tY!fH!^-U;o@KwE?EiA;XABKgC^tW)<8!nx8X<}l&k;j;2zk+gB2{P0-N;m zkm6%lghg=qA0RF`o4Kk;tVZxXgsYjIp>9;T z6Y*1*5KGf@=Xo9lw;^lkgECTyGQe^ODOA9b)ofCA5K)Q0Sz|2w9tDscDq-g|dQ+G^ z?^}zyO&{Tt!DHu}MohNmB&$lagI*bI{h&hYl*!`nlgb3Hax8z9xj+76y&LaLjc{y=AOq<$9WzKIX4z{p!O&*QnDIQz zn8^_i*mcNZd@RDDDu)S0%Unx9CzP1Zxxh3&j)C6^bB>ajPJhTV@B<*W-6mAuCB1gy z6Xe%xw7<}mGxx2lLWymTx)<6}mq7>U(dkqS@LL&P+>ZnPB0eFB%Qn<&SOc4`M5l+< z9f<^uu(~6WgzbdY9f`*Pi?F&Q@opvwt2+`27lhw|z6#V6j)c`6iG&No>W;*nXiafg z-I2HlaA{cGkw~~atnNr8JUguJNF-cg6gaGI<{k?o37jH2e?>oFV#>D3A7LvVIGPP>``R9 zpJ`eZ*{YioJAq+J_)EmIm(*7gKFTy5%)2lQM<*lDNqA}aPYHLitYu+(BLr?BTotA_ zLSP@^ny|Vlk@#1Jd7DLGKjBs3$MGHLA-p>LQNq21&kfTXA#i~3nlQZ)0yh%&4ul5! z*`MJw6UAA85gsNyK-dban-U2-VR;|oVI~)0dLsmm+>7`K`jg!lSb(Ttu$S4Sw_~t| zHy(!7F-P8hXN0+D8eI8hU~s~h5MD(B5Mg>F1Xq_JO~fc-(qhH~F)>UnaHir%9dmS- z-U-;Ix1)O&>B^AD9Nn`Ct7DGtIfT_QM|T-vb3kfUf%3VjeBD@Km>edooC@nGWdcsR>dOIpuy@pl6H8#B+ z6|7#v>TY2AwTM4pxOIfpYgpZj2-n&4c62uq-ehAB#l4u|W*d7b?k0j;QA^yGL2#Rm zJrws+g7TQ7`woKgn4`OypgQL0ZXvuo%q7#UC)^euBHU1p{_Hf|Z(#U2Q)SoAGhBJu z9ww{q>H>!|P_9;={fLs%m02!HL`qlY48l&B(v>+=krbsXQ%P50N>`?m zuELbA%sE_~O2d?{%(r zX=(T=#!I*?d`SkLW|T-dt(`J~lGC=JRG!f@+t~=nU`EMLS-JhYk>t;S%RIgxNlO2g zjoZ&YVw$pJ#Chw~3vseirn!e`c)sXXIgycM+QUq8H*;)8vb$umzx9&ct&>fs)Mfoa z15%XVi?3oNo5A}f?_)cxK_r{`RU#Vt9-e+lBKc1sne`MHy!8o^39MvB$yH4A__1}S z!6@_icE|&zJFxg#kAGaI**S~Lwe?Nag6>(rMI)_msX}fj{}eKoBAqPyNfo;fbLx-S z?SI2Ozd?$xNYqaN^$eV)e8xj15$jN=Laal(=ghBFh#zJqw(IW|@(!c?fPN&Sf1;vy z;Xb_o$EN)3FYpv0G-d8DS=HZ6!>eFlmJ#zl%ZNfV01uY0%b1EwNfHapzeG$-#q<)( zx#qk&&zx6r4r8u0w_jxHd&TD!FjtFtKVmLXxqi+xH<-^OW{-;5#h3x}l8s)PN{cZG z^Sy{+517Z_hr^-s(II!5x<`zPBBuF}8NApu(2Yn_xtnEu!aRr=2LoXq|2}dpkY~_7 zWh!FmUMPv-bLMA|$XIlkIG!{IE-{TOC63pSqx_Qya-`<7Grwo5ZaV~mc!r&_j5P?@ zpMpR<>q6#Vt|I=J5%=MlRiz?MAi`zljRl&6xW=quqS&|+F#-EwCg8kn^%CIqa6N3q z)mO;`6+eNi(M2rdfI|5kBc5QyjVj^=M*JHi4t_>vc?l5(4w24Ev#7qiWo`e0l_TG= z`c=f286jtUTtz&>2s!NsRK%lK3cX-|LJ% zxU_<^_$F1*aU@$>!@Au}6ajk(5eDa?V|-{OzSZV$3Mr_bJb?lI080I1@T1?cdg5s# z7lHgjN*f_)gnZga$fu2jeA-CJr;UVs+DOQ!jf9jo!mYdFkkUr309+bU+6dwDkkUp7 z&kiYVgm8rsmfA>xx}L_pj7X$cwAMzXSG3kfq%W7&MxSI^6fK90jaYher+W3XK1#1 zvdJps+h^Pz$576tR)lY#QGv}?gm0fwfqE;#x6imcS)Hv`gm0g5uVY}F72(@wRA9Rm z;oE0apvj8RD_RA1S`m6htH5q6;@3tB`SuxiH~X#Aitz0-ZVRi^jXt2Hx#s~CeZYz+ zZG?e-EAlHOaN8I-Y(;*_X1BAiZ?Piu!EpEf1BT~zOI{A`cK!(EA|N7sK#ZA5x>X>BAlgu!$hg6L0Z zBUEQOQ)Sme8{unv_|aV*b~pp2HWI)>D`TOJ+>J%ASgd|8qC$@X7UyyX7$Gk9Vhv$4 zL`guLN7%AkkHGG^marXqfN9Pr?1b(hd;#G==q9GWkgyy2JmGbOgQ1@juBB)tLSJC| z^@Jmk9I@&yG^bl&ai>y=LOzv9R!FNvA)iVVQYsNw$kLEfiO3eTN~9Jrr4q3uE?{i7 zrxGnkTu7-zoH0g7sYFZ)mFR5Lx7=EO2NOv_NQ!MnNUB5>Nw#(=c@_{fI(|(vO}*YH34mXN#!&OjY{P ze1#&#UM@^yy{9`=#gc^q(cp zPak=&hD>vxWXw|YM~E>c@m>dEZ64};wx{IHLp8iWXN6Sc&e4k8?s@WR7BAQ~udf|9 z?<~_#cUH*J@`Bsv$>H*XO%-ySm+QpaDy2?XZTic;ls;yf2yBx~k_t>PE z`C~l4NjBh*QQetgm}@vxR4-(f>oWS{^cww4#$T`FF<50%k6gn34cNu!SVo!DBbTa( zQbyd#!p>C@<%n>}rhbkxB$p2v(>g(L7ydmW0(J$SFYswydLF!P>7QzKV>QGKS;Yg4=l+!@CFi0KB*~*Qt;vjV>N1h!n)o&%| zj-2;aa>CwQ$q83r3-J!%$h?)DNc3CD*#bkqm7K8mR&v5Zzm=S@_g3<07?9In@yXWe z^DqJbr5!4u&%>yIJ`bY;nYWU&NPQkA;J>s(1@w6s70~BlR6w7H3HVQzs(?NZqXPOo zOu&D#R0Z^T7!}axVFLb>rRwfZeI7;yw7<;n=!#GFwLT9M*h^dL?Up=Q8t7byK<0{1 zz6BXNlyH`TDuweNj%gRZwt^Pq3AXI{(ppGx`mN+lVd%G#6ZYOpuE?1>ls;b?-%8GMy| zHh^d;9Co9+wBv2L;*VSTUZANm^oM~p94H-rRzCwPN3Yp8pu zJ+q4ddRK$8Iul(Dx*2Jpr822>FU8Oi18xZ6=?-;*H?TAfSf1bw_)hQ!d?$DVz7xCw z-wED;?*wnacY-(fYEYurH-yNSld~tIhAnRh39KTEJ=N8q@&s?dcSA_PcY-(IyCEdt zJHZ?9o!|}lPVfeNH-rRyCwK$C6TAvmCwLXCPVg#No!|}lPVffm$hy@HApzeB-az&Q zZye`nRcHphE_ zszpn2ExWZ^Rn&pwwY5gUhxtw<>pWGTeq&aM>E7`dKy|_*syM_W-YQ~kQ5}IRRiH%j z5Q9DVi`&$-r40&IC(&+Ia9i2GvtErVv|AQ(nJQ#w`M0pBot6?qGZ&;-)17dQcWz3z*h%#ab*asjt8^g%q z7)PL_YN7T#r1%Ctt=F1H8uInG&qt0kd`Il>^BZ#_&1m#*@R3LAUbFEA1;$MAjQtM! z>kYm_XFldmagj3iF9XhEt4JC9S0PYp6)9u?PZ21$ij=XRf!S6ObP3q^8K|&|m9d|J zg;r5f=E+j4SQ-0?dYM(EjQtGMSVhX%&%kP{NE!PXSZft2V?P7ytYT&CzW{+ct4JC9 z8Q5qQDPunao2+7G>}TLot4JC98Q5$UDPuna^;VHG_7nA1t4JC98Q5kODPuna+pQvH z>}R0KDpJON26kFS%Gl4qZmUQc`-!^EDptmR_FJb_q>TN1(v3cl#{TV?WCyGwW$b65 z-zxeQ61Z&)9JY#n30imC*@?GUMatN}62o)5Rjgc($mhO~a-^|;1bHB+h8zRAA}nYo zs9@?<0K9|S!Rz4Z@>ah>CyY|m>sf<)Np}_QQ4|^MkYg`jH6QFG{JVLD4tw%-yh4Y` z^IxIEZuDNE!}r9$jjzxldI&fqCJv_@Jnvw&yNXlue_x?vY=1+q&}l}0Lcr-p*K!WY zuEoLXjez;lT^({bLn2>CswOYi!t#Q(d7)U7LX>+n0unio6m7Um39lvWxEl$dPguCE zgfAc*ap`9(F1!eEvHLLLbwo4Oh%o9aULnQCl(~3V?1YMgFuS_&WRh2^XSExjl z@*X4#MO7*FgiAT+A_aT}Ua0J6EX9~|9vALBvanu zr7XXZY2No4q(SR}ZB`v41|LO48j`ko{OL^P26g31Vfnm|(e!14jVx(_B|OS(FS3&H z>rJBvBW@l)LK!e2A1uNH)NDG5znZ&WvnERg$&NrF!`4-bCL8Z;(zeNq_ z$r{c#brmaQ73Z6}juot<%7#i-&L@_I5=+4DheS7DR(p}D>fJUU^v;d&%pWGtSAhvC9i z2rT|Lf>T&hg!8Knagsx9FcueM;M{j_XDVLd@l<>aspL!lnZ?1vxsn%3w-1OjDVwD;3IT_ zca#f!gigKA_FBv_8q`Qj9QKnJO?-8H7N#sw7M>)Soe9rF?pYwZU6Y(f_lgL8C%K1I=IB_cH_sB;H zE9dtJn2Vv^O(GLHzq2PJ>=Et!9vLP)a17s8WC1Ir+)X0N`JKr{#P9qbcG!*5-Nf}d zzq>Wp5i<>W?ut%;M&xOHxhu;6JCREWE9dvfyO?HmFOwTZOsbsU!wxY_4Ld#fQSK(r z(w_pB?k0}U`Q7n3zdJtXcgN@a?)aSF9iQ{NqnzI(GtpG1hUm4s3CTqghv)q6tm4#< z(D~g_&hL@KgniEMj&gpF(D~i*Ilnu~`8{$6?{b=ctyl

dUM$>Aq?{XE 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

s!vYB5+N>UaejLPJqYDWiF^gXApM3AQm#_ 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≥O*PjYqpYdw4NXPGA(OeD&-_ZN1h-U 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

n^;`jXo&T+({vX63eyZTRyIyx!L=AU5Jc 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%0A>PAjuV8~-2XO}Uuc1L=IIJC2X^#IYxD3L#PV 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

Ukrv2s91nuR2%Q)3K^xXMo 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 Cri=yv literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/Makefile b/2/linux-0.11-lab/cur/linux/Makefile new file mode 100644 index 0000000..ecbcf30 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/System.map b/2/linux-0.11-lab/cur/linux/System.map new file mode 100644 index 0000000..d60f5ca --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/System.map @@ -0,0 +1,587 @@ +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 +00006bd3 T print_nr +00006c04 T show_task +00006c89 T show_stat +00006ccf T math_state_restore +00006d2d T schedule +00006edf T sys_pause +00006ef5 T sleep_on +00006f54 T interruptible_sleep_on +0000700f T ticks_to_floppy_on +000070da T floppy_on +00007109 T floppy_off +00007119 T do_floppy_timer +00007311 T do_timer +00007400 T sys_alarm +0000747f T sys_getpid +0000748b T sys_getppid +00007497 T sys_getuid +000074a6 T sys_geteuid +000074b6 T sys_getgid +000074c6 T sys_getegid +000074d5 T sys_nice +00007500 T sched_init +00007690 t bad_sys_call +00007698 t reschedule +000076a4 T system_call +000076df t ret_from_sys_call +00007728 T coprocessor_error +0000774a T device_not_available +00007784 T timer_interrupt +000077bc T sys_execve +000077cc T sys_execve2 +000077dc T sys_fork +000077f4 T hd_interrupt +00007830 T floppy_interrupt +00007866 T parallel_interrupt +0000786d t _get_base +0000789f t die +00007a81 T do_double_fault +00007aa4 T do_general_protection +00007ac7 T do_divide_error +00007aea T do_int3 +00007bb2 T do_nmi +00007bd5 T do_debug +00007bf8 T do_overflow +00007c1b T do_bounds +00007c3e T do_invalid_op +00007c61 T do_device_not_available +00007c84 T do_coprocessor_segment_overrun +00007ca7 T do_invalid_TSS +00007cca T do_segment_not_present +00007ced T do_stack_segment +00007d10 T do_coprocessor_error +00007d44 T do_reserved +00007d67 T trap_init +0000804b T divide_error +00008050 t no_error_code +00008080 T debug +00008087 T nmi +0000808e T int3 +00008095 T overflow +0000809c T bounds +000080a3 T invalid_op +000080aa T coprocessor_segment_overrun +000080b1 T reserved +000080b8 T irq13 +000080cd T double_fault +000080d2 t error_code +00008104 T invalid_TSS +0000810b T segment_not_present +00008112 T stack_segment +00008119 T general_protection +00008120 t _get_base +00008152 T verify_area +000081b9 T copy_mem +00008313 T copy_process +000087c0 T find_empty_process +00008854 T panic +0000888f T printk +000088e0 t skip_atoi +0000893b t number +00008bac T vsprintf +00009038 t get_fs_long +0000904e t put_fs_byte +00009066 t put_fs_long +00009072 T sys_ftime +00009078 T sys_break +0000907e T sys_ptrace +00009084 T sys_stty +0000908a T sys_gtty +00009090 T sys_rename +00009096 T sys_prof +0000909c T sys_setregid +00009155 T sys_setgid +000091ec T sys_acct +000091f2 T sys_phys +000091f8 T sys_lock +000091fe T sys_mpx +00009204 T sys_ulimit +0000920a T sys_time +00009266 T sys_setreuid +00009348 T sys_setuid +000093dd T sys_stime +00009433 T sys_times +000094d3 T sys_brk +00009515 T sys_setpgid +000095ee T sys_getpgrp +000095fa T sys_setsid +00009674 T sys_getgroups +0000967a T sys_setgroups +00009680 T sys_uname +000096e9 T sys_sethostname +000096ef T sys_getrlimit +000096f5 T sys_setrlimit +000096fb T sys_getrusage +00009701 T sys_gettimeofday +00009707 T sys_settimeofday +0000970d T sys_umask +00009740 T sys_getdents +000098d5 T sys_pipe2 +00009ad7 T sys_sleep +00009b10 T sys_getcwd +00009b16 T sys_mmap +00009b1c T sys_munmap +00009b22 T sys_clone +00009b28 t _get_base +00009b5a t put_fs_long +00009b66 T release +00009bca t send_sig +00009c49 t kill_session +00009ca3 T sys_kill +00009e53 t tell_father +00009edd T do_exit +0000a111 T sys_exit +0000a12a T sys_waitpid +0000a350 t get_fs_byte +0000a35e t put_fs_byte +0000a376 t put_fs_long +0000a382 T sys_sgetmask +0000a38e T sys_ssetmask +0000a3ba T sys_sigpending +0000a3c0 T sys_sigsuspend +0000a3c6 t save_old +0000a419 t get_new +0000a459 T sys_signal +0000a4dd T sys_sigaction +0000a5e7 T do_signal +0000a7d3 T kernel_mktime +0000a918 t oom +0000a937 T get_free_page +0000a973 T free_page +0000a9e2 T free_page_tables +0000aae1 T copy_page_tables +0000ac62 T put_page +0000ad4e T un_wp_page +0000ae06 T do_wp_page +0000ae91 T get_empty_page +0000aed1 t try_to_share +0000b063 t share_page +0000b117 T do_no_page +0000b2ac T do_no_page_myself +0000b40e T mem_init +0000b482 T calc_mem +0000b577 T page_fault +0000b5ae t get_fs_long +0000b5c4 T sys_ustat +0000b5ca T sys_utime +0000b677 T sys_access +0000b753 T sys_chdir +0000b7c7 T sys_chroot +0000b83b T sys_chmod +0000b8d5 T sys_chown +0000b950 T sys_open +0000bbf3 T sys_creat +0000bc16 T sys_close +0000bce5 T sys_lseek +0000bdfc T sys_read +0000bfef T sys_write +0000c19d t lock_inode +0000c1ca t unlock_inode +0000c1e8 T invalidate_inodes +0000c257 T sync_inodes +0000c2ae t _bmap +0000c69a T bmap +0000c6bd T create_block +0000c6e0 T iput +0000c84f T get_empty_inode +0000c9a4 T get_pipe_inode +0000ca19 T iget +0000cbde t read_inode +0000ce14 T sys_sync +0000ce77 T sync_dev +0000cf70 T invalidate_buffers +0000cfe2 T check_disk_change +0000d08c t remove_from_queues +0000d183 t insert_into_queues +0000d248 t find_buffer +0000d2b0 T get_hash_table +0000d332 T getblk +0000d4d0 T brelse +0000d519 T bread +0000d59e T bread_page +0000d6c0 T breada +0000d7b5 T buffer_init +0000d8e4 t lock_super +0000d911 t free_super +0000d956 T get_super +0000d9c5 T put_super +0000da98 t read_super +0000dddb T sys_umount +0000df3c T sys_mount +0000e0ad T mount_root +0000e2bb t get_fs_byte +0000e2c9 t put_fs_byte +0000e2e1 T block_write +0000e433 T block_read +0000e55e t get_fs_byte +0000e56c t put_fs_byte +0000e584 t rw_ttyx +0000e5cc t rw_tty +0000e61c t rw_ram +0000e622 t rw_mem +0000e628 t rw_kmem +0000e62e t rw_port +0000e6c8 t rw_memory +0000e79e T rw_char +0000e808 t get_fs_byte +0000e816 t put_fs_byte +0000e82e T file_read +0000e9d9 T file_write +0000ebd3 t put_fs_byte +0000ebeb t cp_stat +0000ecc2 T sys_stat +0000ed0c T sys_lstat +0000ed27 T sys_fstat +0000ed84 T sys_readlink +0000ed8a t _get_base +0000edbc t get_fs_byte +0000edca t get_fs_long +0000ede0 t put_fs_byte +0000edf8 t put_fs_long +0000ee04 t get_fs +0000ee18 t get_ds +0000ee2c t set_fs +0000ee33 T sys_uselib +0000ee39 t create_tables +0000ef84 t count +0000efc3 t copy_strings +0000f17f t change_ldt +0000f302 T do_execve +0000fd84 T do_execve2 +0001085e t get_fs_byte +0001086c t put_fs_byte +00010884 t put_fs_long +00010890 T read_pipe +00010b65 T sys_pipe +00010d67 t get_fs_byte +00010d75 t permission +00010e16 t match +00010e7e t find_entry +000112d8 t get_dir +000114c5 t dir_namei +00011544 T namei +0001165a T open_namei +000119ad T sys_mknod +00011bdd T sys_mkdir +00011f8e t empty_dir +0001216c T sys_rmdir +000124c4 T sys_unlink +00012765 T sys_symlink +0001276b T sys_link +000129c5 T free_block +00012b37 T new_block +00012cdb T free_inode +00012e42 T new_inode +0001301c t dupfd +000130f6 T sys_dup2 +0001311d T sys_dup +00013138 T sys_fcntl +00013277 T sys_ioctl +00013348 t free_ind +000133e7 t free_dind +00013486 T truncate +000135bb T sys_select +000135c1 t lock_buffer +000135ee t unlock_buffer +000137e0 t make_request +00013984 T ll_rw_block +000139dd T blk_dev_init +00013a2b t unlock_buffer +00013a60 t end_request +00013b11 T floppy_deselect +00013b48 T floppy_change +00013bce t setup_DMA +00013c84 t output_byte +00013cfa t result +00013db7 t bad_flp_intr +00013e16 t rw_interrupt +00013f05 T setup_rw_floppy +00013fc6 t seek_interrupt +0001401f t transfer +00014154 t recal_interrupt +0001419e T unexpected_floppy_interrupt +000141e3 t recalibrate_floppy +00014245 t reset_interrupt +0001428a t reset_floppy +00014307 t floppy_on_interrupt +00014372 t do_fd_request +00014576 T floppy_init +000145c8 t unlock_buffer +000145fd t end_request +0001469c T sys_setup +00014a4f t controller_ready +00014ae3 t hd_out +00014bd0 t drive_busy +00014c36 t reset_controller +00014cb3 t reset_hd +00014d4b T unexpected_hd_interrupt +00014d5e t bad_rw_intr +00014d9c t read_intr +00014ec2 t recal_intr +00014edc t do_hd_request +000151dd T hd_init +00015257 t unlock_buffer +0001528c t end_request +0001532b t do_rd_request +00015461 T rd_init +000154b7 T rd_load +00015763 t get_fs_byte +00015771 t put_fs_byte +00015789 T tty_init +0001579a T tty_intr +0001580e t sleep_if_empty +00015846 t sleep_if_full +000158ba T copy_to_cooked +00015e75 T tty_read +000161e3 T tty_write +000163f5 T do_tty_interrupt +0001641d T chr_dev_init +0001641e t gotoxy +0001646c t set_origin +000164d2 t scrup +000166c2 t scrdown +000167b9 t lf +000167ef t ri +00016825 t cr +00016846 t del +00016878 t csi_J +00016909 t csi_K +000169bb T csi_m +00016a22 t set_cursor +00016a88 t respond +00016ae0 t insert_char +00016b43 t insert_line +00016b87 t delete_char +00016be5 t delete_line +00016c29 t csi_at +00016c67 t csi_L +00016ca5 t csi_P +00016ce3 t csi_M +00016d21 t save_cur +00016d36 t restore_cur +00016d55 T con_write +000173e3 T con_init +0001761a T sysbeepstop +00017643 t sysbeep +000176a1 t mode +000176a2 t leds +000176a3 t e0 +000176a4 T keyboard_interrupt +000176cd t e0_e1 +000176f8 t set_e0 +00017701 t set_e1 +0001770a t put_queue +00017743 t ctrl +0001775b t unctrl +0001775f t unalt +00017775 t lshift +0001777d t unlshift +00017785 t rshift +0001778d t unrshift +00017795 t caps +000177b7 t set_leds +000177cd t uncaps +000177d5 t scroll +000177de t num +000177e7 t cursor +00017807 t cur2 +00017830 t cur +0001783c t ok_cur +0001784a t num_table +00017857 t cur_table +00017864 t func +00017881 t ok_func +00017894 t end_func +00017895 t func_table +000178c5 t key_map +00017926 t shift_map +000179e8 t do_self +00017a50 t none +00017a51 t minus +00017a66 t key_table +00017e66 t kb_wait +00017e6f t reboot +00017e81 t die +00017e83 t init +00017ef8 T rs_init +00017f7b T rs_write +00017fc8 T rs1_interrupt +00017fd0 T rs2_interrupt +00017fd5 t rs_int +00017fec t rep_int +00018009 t end +00018017 t jmp_table +00018028 t modem_status +00018030 t line_status +00018038 t read_char +000180bf t get_fs_byte +000180cd t get_fs_long +000180e3 t put_fs_byte +000180fb t put_fs_long +00018107 t change_speed +00018185 t flush +00018197 t send_break +00018198 t get_termios +000181f4 t set_termios +00018244 t get_termio +0001830c t set_termio +000183d0 T tty_ioctl +000186ce t get_fs_byte +000186dc T math_emulate +000187bf T math_error +000187df T _exit +000187ef T open +00018838 T close +000188ac T dup +000188e3 T setsid +00018912 T execve +000189af T strcpy +000189cb T strncpy +000189f0 T strcat +00018a1b T strncat +00018a50 T strcmp +00018a77 T strncmp +00018aa5 T strchr +00018ad2 T strrchr +00018b01 T strspn +00018b3e T strcspn +00018b7b T strpbrk +00018bb2 T strstr +00018beb T strlen +00018c0e T strtok +00018c91 T memcpy +00018cb1 T memmove +00018d05 T memcmp +00018d2f T memchr +00018d67 T memset +0001cd48 d envp_rc +0001cd5c d envp +0001cd80 D sys_call_table +0001cefc D NR_syscalls +0001cf00 d init_task +0001df00 D current +0001df20 D task +0001e020 D stack_start +0001e028 D current_DOR +0001e040 d thisname.2124 +0001e080 d month +0001e0c0 d last_inode.1935 +0001e0c4 D start_buffer +0001e0e0 d crw_table +0001e100 d ioctl_table +0001e120 d floppy_type +0001e1e0 d cur_spec1 +0001e1e4 d cur_rate +0001e1e8 d floppy +0001e1ec d current_track +0001e1f0 d callable.1844 +0001e200 D tty_table +00020720 D table_list +00020740 d quotient +00020760 D _ctype +00020861 B __bss_start +00020861 D _edata +00020880 b printbuf +00020c80 b memory_end +00020c84 b buffer_memory_end +00020c88 b main_memory_start +00020ca0 B jiffies +00020ca4 B startup_time +00020ca8 B last_task_used_math +00020cbc b mon_timer +00020ccc b moff_timer +00020ce0 b timer_list +00020fe0 b next_timer +00020fe4 B last_pid +00021000 b buf +00021400 b HIGH_MEMORY +00021420 b mem_map +00022320 B inode_table +00022a20 B nr_buffers +00022a24 b free_list +00022a28 b buffer_wait +00022a2c B ROOT_DEV +00022a60 B blk_dev +00022a98 B do_floppy +00022a9c B selected +00022aa4 b recalibrate +00022aa8 b reset +00022aac b seek +00022ab0 b reply_buffer +00022ab7 b current_drive +00022ab8 b sector +00022ab9 b head +00022aba b track +00022abb b seek_track +00022abc b command +00022ac0 B do_hd +00022ae0 B hd_info +00022b10 b recalibrate +00022b14 b reset +00022b18 b NR_HD +00022b20 b hd +00022b70 B rd_length +00022b74 b cr_flag.1923 +00022b80 B beepcount +00022b84 b video_type +00022b88 b video_num_columns +00022b8c b video_size_row +00022b90 b video_num_lines +00022b94 b video_page +00022b98 b video_mem_start +00022b9c b video_mem_end +00022ba0 b video_port_reg +00022ba2 b video_port_val +00022ba4 b video_erase_char +00022ba8 b origin +00022bac b scr_end +00022bb0 b pos +00022bb4 b x +00022bb8 b y +00022bbc b top +00022bc0 b bottom +00022bc4 b state +00022bc8 b npar +00022be0 b par +00022c20 b ques +00022c24 b saved_x +00022c28 b saved_y +00022c40 B drive_info +00022c60 B user_stack +00023c60 B hash_table +00024140 B super_block +000244a0 B file_table +000248a0 B request +00024d20 B rd_start +00024d24 B _ctmp +00024d28 B errno +00024d2c B ___strtok +00024d30 B end +00024d30 B _end diff --git a/2/linux-0.11-lab/cur/linux/System.map.2 b/2/linux-0.11-lab/cur/linux/System.map.2 new file mode 100644 index 0000000..b8c6d84 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/System.map.2 @@ -0,0 +1,1084 @@ +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 0x18d8b + *(.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 0x744 init/main.o + 0x00000000000064c0 fork + 0x00000000000064ef pause + 0x000000000000651e setup + 0x0000000000006555 sync + 0x0000000000006799 main + 0x000000000000695b init + 0x0000000000006bd3 print_nr + .text 0x0000000000006c04 0x3d14 kernel/kernel.o + 0x0000000000006c04 show_task + 0x0000000000006c89 show_stat + 0x0000000000006ccf math_state_restore + 0x0000000000006d2d schedule + 0x0000000000006edf sys_pause + 0x0000000000006ef5 sleep_on + 0x0000000000006f54 interruptible_sleep_on + 0x0000000000006fe7 wake_up + 0x000000000000700f ticks_to_floppy_on + 0x00000000000070da floppy_on + 0x0000000000007109 floppy_off + 0x0000000000007119 do_floppy_timer + 0x00000000000071ed add_timer + 0x0000000000007311 do_timer + 0x0000000000007400 sys_alarm + 0x000000000000747f sys_getpid + 0x000000000000748b sys_getppid + 0x0000000000007497 sys_getuid + 0x00000000000074a6 sys_geteuid + 0x00000000000074b6 sys_getgid + 0x00000000000074c6 sys_getegid + 0x00000000000074d5 sys_nice + 0x0000000000007500 sched_init + 0x00000000000076a4 system_call + 0x0000000000007728 coprocessor_error + 0x000000000000774a device_not_available + 0x0000000000007784 timer_interrupt + 0x00000000000077bc sys_execve + 0x00000000000077cc sys_execve2 + 0x00000000000077dc sys_fork + 0x00000000000077f4 hd_interrupt + 0x0000000000007830 floppy_interrupt + 0x0000000000007866 parallel_interrupt + 0x0000000000007a81 do_double_fault + 0x0000000000007aa4 do_general_protection + 0x0000000000007ac7 do_divide_error + 0x0000000000007aea do_int3 + 0x0000000000007bb2 do_nmi + 0x0000000000007bd5 do_debug + 0x0000000000007bf8 do_overflow + 0x0000000000007c1b do_bounds + 0x0000000000007c3e do_invalid_op + 0x0000000000007c61 do_device_not_available + 0x0000000000007c84 do_coprocessor_segment_overrun + 0x0000000000007ca7 do_invalid_TSS + 0x0000000000007cca do_segment_not_present + 0x0000000000007ced do_stack_segment + 0x0000000000007d10 do_coprocessor_error + 0x0000000000007d44 do_reserved + 0x0000000000007d67 trap_init + 0x000000000000804b divide_error + 0x0000000000008080 debug + 0x0000000000008087 nmi + 0x000000000000808e int3 + 0x0000000000008095 overflow + 0x000000000000809c bounds + 0x00000000000080a3 invalid_op + 0x00000000000080aa coprocessor_segment_overrun + 0x00000000000080b1 reserved + 0x00000000000080b8 irq13 + 0x00000000000080cd double_fault + 0x0000000000008104 invalid_TSS + 0x000000000000810b segment_not_present + 0x0000000000008112 stack_segment + 0x0000000000008119 general_protection + 0x0000000000008152 verify_area + 0x00000000000081b9 copy_mem + 0x0000000000008313 copy_process + 0x00000000000087c0 find_empty_process + 0x0000000000008854 panic + 0x000000000000888f printk + 0x0000000000008bac vsprintf + 0x0000000000009072 sys_ftime + 0x0000000000009078 sys_break + 0x000000000000907e sys_ptrace + 0x0000000000009084 sys_stty + 0x000000000000908a sys_gtty + 0x0000000000009090 sys_rename + 0x0000000000009096 sys_prof + 0x000000000000909c sys_setregid + 0x0000000000009155 sys_setgid + 0x00000000000091ec sys_acct + 0x00000000000091f2 sys_phys + 0x00000000000091f8 sys_lock + 0x00000000000091fe sys_mpx + 0x0000000000009204 sys_ulimit + 0x000000000000920a sys_time + 0x0000000000009266 sys_setreuid + 0x0000000000009348 sys_setuid + 0x00000000000093dd sys_stime + 0x0000000000009433 sys_times + 0x00000000000094d3 sys_brk + 0x0000000000009515 sys_setpgid + 0x00000000000095ee sys_getpgrp + 0x00000000000095fa sys_setsid + 0x0000000000009674 sys_getgroups + 0x000000000000967a sys_setgroups + 0x0000000000009680 sys_uname + 0x00000000000096e9 sys_sethostname + 0x00000000000096ef sys_getrlimit + 0x00000000000096f5 sys_setrlimit + 0x00000000000096fb sys_getrusage + 0x0000000000009701 sys_gettimeofday + 0x0000000000009707 sys_settimeofday + 0x000000000000970d sys_umask + 0x0000000000009740 sys_getdents + 0x00000000000098d5 sys_pipe2 + 0x0000000000009ad7 sys_sleep + 0x0000000000009b10 sys_getcwd + 0x0000000000009b16 sys_mmap + 0x0000000000009b1c sys_munmap + 0x0000000000009b22 sys_clone + 0x0000000000009b66 release + 0x0000000000009ca3 sys_kill + 0x0000000000009edd do_exit + 0x000000000000a111 sys_exit + 0x000000000000a12a sys_waitpid + 0x000000000000a382 sys_sgetmask + 0x000000000000a38e sys_ssetmask + 0x000000000000a3ba sys_sigpending + 0x000000000000a3c0 sys_sigsuspend + 0x000000000000a459 sys_signal + 0x000000000000a4dd sys_sigaction + 0x000000000000a5e7 do_signal + 0x000000000000a7d3 kernel_mktime + .text 0x000000000000a918 0xc96 mm/mm.o + 0x000000000000a937 get_free_page + 0x000000000000a973 free_page + 0x000000000000a9e2 free_page_tables + 0x000000000000aae1 copy_page_tables + 0x000000000000ac62 put_page + 0x000000000000ad4e un_wp_page + 0x000000000000ae06 do_wp_page + 0x000000000000ae38 write_verify + 0x000000000000ae91 get_empty_page + 0x000000000000b117 do_no_page + 0x000000000000b2ac do_no_page_myself + 0x000000000000b40e mem_init + 0x000000000000b482 calc_mem + 0x000000000000b577 page_fault + .text 0x000000000000b5ae 0x8013 fs/fs.o + 0x000000000000b5c4 sys_ustat + 0x000000000000b5ca sys_utime + 0x000000000000b677 sys_access + 0x000000000000b753 sys_chdir + 0x000000000000b7c7 sys_chroot + 0x000000000000b83b sys_chmod + 0x000000000000b8d5 sys_chown + 0x000000000000b950 sys_open + 0x000000000000bbf3 sys_creat + 0x000000000000bc16 sys_close + 0x000000000000bce5 sys_lseek + 0x000000000000bdfc sys_read + 0x000000000000bfef sys_write + 0x000000000000c1e8 invalidate_inodes + 0x000000000000c257 sync_inodes + 0x000000000000c69a bmap + 0x000000000000c6bd create_block + 0x000000000000c6e0 iput + 0x000000000000c84f get_empty_inode + 0x000000000000c9a4 get_pipe_inode + 0x000000000000ca19 iget + 0x000000000000ce14 sys_sync + 0x000000000000ce77 sync_dev + 0x000000000000cf70 invalidate_buffers + 0x000000000000cfe2 check_disk_change + 0x000000000000d2b0 get_hash_table + 0x000000000000d332 getblk + 0x000000000000d4d0 brelse + 0x000000000000d519 bread + 0x000000000000d59e bread_page + 0x000000000000d6c0 breada + 0x000000000000d7b5 buffer_init + 0x000000000000d956 get_super + 0x000000000000d9c5 put_super + 0x000000000000dddb sys_umount + 0x000000000000df3c sys_mount + 0x000000000000e0ad mount_root + 0x000000000000e2e1 block_write + 0x000000000000e433 block_read + 0x000000000000e79e rw_char + 0x000000000000e82e file_read + 0x000000000000e9d9 file_write + 0x000000000000ecc2 sys_stat + 0x000000000000ed0c sys_lstat + 0x000000000000ed27 sys_fstat + 0x000000000000ed84 sys_readlink + 0x000000000000ee33 sys_uselib + 0x000000000000f302 do_execve + 0x000000000000fd84 do_execve2 + 0x0000000000010890 read_pipe + 0x00000000000109e6 write_pipe + 0x0000000000010b65 sys_pipe + 0x0000000000011544 namei + 0x000000000001165a open_namei + 0x00000000000119ad sys_mknod + 0x0000000000011bdd sys_mkdir + 0x000000000001216c sys_rmdir + 0x00000000000124c4 sys_unlink + 0x0000000000012765 sys_symlink + 0x000000000001276b sys_link + 0x00000000000129c5 free_block + 0x0000000000012b37 new_block + 0x0000000000012cdb free_inode + 0x0000000000012e42 new_inode + 0x00000000000130f6 sys_dup2 + 0x000000000001311d sys_dup + 0x0000000000013138 sys_fcntl + 0x0000000000013277 sys_ioctl + 0x0000000000013486 truncate + 0x00000000000135bb sys_select + .text 0x00000000000135c1 0x46a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000013984 ll_rw_block + 0x00000000000139dd blk_dev_init + .text 0x0000000000013a2b 0xb9d kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000013b11 floppy_deselect + 0x0000000000013b48 floppy_change + 0x0000000000013f05 setup_rw_floppy + 0x000000000001419e unexpected_floppy_interrupt + 0x0000000000014576 floppy_init + .text 0x00000000000145c8 0xc8f kernel/blk_drv/blk_drv.a(hd.o) + 0x000000000001469c sys_setup + 0x0000000000014d4b unexpected_hd_interrupt + 0x00000000000151dd hd_init + .text 0x0000000000015257 0x50c kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000015461 rd_init + 0x00000000000154b7 rd_load + .text 0x0000000000015763 0xcbb kernel/chr_drv/chr_drv.a(tty_io.o) + 0x0000000000015789 tty_init + 0x000000000001579a tty_intr + 0x00000000000158a7 wait_for_keypress + 0x00000000000158ba copy_to_cooked + 0x0000000000015e75 tty_read + 0x00000000000161e3 tty_write + 0x00000000000163f5 do_tty_interrupt + 0x000000000001641d chr_dev_init + .text 0x000000000001641e 0x1283 kernel/chr_drv/chr_drv.a(console.o) + 0x00000000000169bb csi_m + 0x0000000000016d55 con_write + 0x00000000000173e3 con_init + 0x000000000001761a sysbeepstop + .text 0x00000000000176a1 0x7e2 kernel/chr_drv/chr_drv.a(keyboard.2.o) + 0x00000000000176a4 keyboard_interrupt + .text 0x0000000000017e83 0x145 kernel/chr_drv/chr_drv.a(serial.o) + 0x0000000000017ef8 rs_init + 0x0000000000017f7b rs_write + .text 0x0000000000017fc8 0xf7 kernel/chr_drv/chr_drv.a(rs_io.o) + 0x0000000000017fc8 rs1_interrupt + 0x0000000000017fd0 rs2_interrupt + .text 0x00000000000180bf 0x60f kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x00000000000183d0 tty_ioctl + .text 0x00000000000186ce 0x111 kernel/math/math.a(math_emulate.o) + 0x00000000000186dc math_emulate + 0x00000000000187bf math_error + .text 0x00000000000187df 0x0 lib/lib.a(ctype.o) + .text 0x00000000000187df 0x10 lib/lib.a(_exit.o) + 0x00000000000187df _exit + .text 0x00000000000187ef 0x49 lib/lib.a(open.o) + 0x00000000000187ef open + .text 0x0000000000018838 0x37 lib/lib.a(close.o) + 0x0000000000018838 close + .text 0x000000000001886f 0x0 lib/lib.a(errno.o) + .text 0x000000000001886f 0x3d lib/lib.a(write.o) + 0x000000000001886f write + .text 0x00000000000188ac 0x37 lib/lib.a(dup.o) + 0x00000000000188ac dup + .text 0x00000000000188e3 0x2f lib/lib.a(setsid.o) + 0x00000000000188e3 setsid + .text 0x0000000000018912 0x3d lib/lib.a(execve.o) + 0x0000000000018912 execve + .text 0x000000000001894f 0x60 lib/lib.a(wait.o) + 0x000000000001894f waitpid + 0x000000000001898c wait + .text 0x00000000000189af 0x3dc lib/lib.a(string.o) + 0x00000000000189af strcpy + 0x00000000000189cb strncpy + 0x00000000000189f0 strcat + 0x0000000000018a1b strncat + 0x0000000000018a50 strcmp + 0x0000000000018a77 strncmp + 0x0000000000018aa5 strchr + 0x0000000000018ad2 strrchr + 0x0000000000018b01 strspn + 0x0000000000018b3e strcspn + 0x0000000000018b7b strpbrk + 0x0000000000018bb2 strstr + 0x0000000000018beb strlen + 0x0000000000018c0e strtok + 0x0000000000018c91 memcpy + 0x0000000000018cb1 memmove + 0x0000000000018d05 memcmp + 0x0000000000018d2f memchr + 0x0000000000018d67 memset + *(.gnu.warning) + +.fini + *(SORT(.fini)) + 0x0000000000018d8b PROVIDE (__etext, .) + 0x0000000000018d8b PROVIDE (_etext, .) + 0x0000000000018d8b PROVIDE (etext, .) + +.rodata 0x0000000000018d8c 0x140e + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata 0x0000000000018d8c 0xc9 init/main.o + *fill* 0x0000000000018e55 0x3 + .rodata 0x0000000000018e58 0x438 kernel/kernel.o + .rodata 0x0000000000019290 0x1b5 mm/mm.o + *fill* 0x0000000000019445 0x3 + .rodata 0x0000000000019448 0x62c fs/fs.o + .rodata 0x0000000000019a74 0x7a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + *fill* 0x0000000000019aee 0x2 + .rodata 0x0000000000019af0 0x133 kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x0000000000019c23 0x1 + .rodata 0x0000000000019c24 0x19b kernel/blk_drv/blk_drv.a(hd.o) + *fill* 0x0000000000019dbf 0x1 + .rodata 0x0000000000019dc0 0x188 kernel/blk_drv/blk_drv.a(ramdisk.o) + .rodata 0x0000000000019f48 0x17d kernel/chr_drv/chr_drv.a(console.o) + *fill* 0x000000000001a0c5 0x3 + .rodata 0x000000000001a0c8 0x80 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .rodata 0x000000000001a148 0x52 kernel/math/math.a(math_emulate.o) + +.rodata1 + *(.rodata1) + +.eh_frame_hdr + *(.eh_frame_hdr) + +.eh_frame 0x000000000001a19c 0x2b88 + *(.eh_frame) + .eh_frame 0x000000000001a19c 0x108 init/main.o + .eh_frame 0x000000000001a2a4 0xbb4 kernel/kernel.o + 0xca4 (size before relaxing) + .eh_frame 0x000000000001ae58 0x1b0 mm/mm.o + 0x1c8 (size before relaxing) + .eh_frame 0x000000000001b008 0xe10 fs/fs.o + 0xfa8 (size before relaxing) + .eh_frame 0x000000000001be18 0x98 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000001beb0 0x23c kernel/blk_drv/blk_drv.a(floppy.o) + 0x254 (size before relaxing) + .eh_frame 0x000000000001c0ec 0x1e8 kernel/blk_drv/blk_drv.a(hd.o) + 0x200 (size before relaxing) + .eh_frame 0x000000000001c2d4 0xac kernel/blk_drv/blk_drv.a(ramdisk.o) + 0xc4 (size before relaxing) + .eh_frame 0x000000000001c380 0x12c kernel/chr_drv/chr_drv.a(tty_io.o) + 0x144 (size before relaxing) + .eh_frame 0x000000000001c4ac 0x2c0 kernel/chr_drv/chr_drv.a(console.o) + 0x2d8 (size before relaxing) + .eh_frame 0x000000000001c76c 0x54 kernel/chr_drv/chr_drv.a(serial.o) + 0x6c (size before relaxing) + .eh_frame 0x000000000001c7c0 0x148 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x160 (size before relaxing) + .eh_frame 0x000000000001c908 0x5c kernel/math/math.a(math_emulate.o) + 0x74 (size before relaxing) + .eh_frame 0x000000000001c964 0x1c lib/lib.a(_exit.o) + 0x34 (size before relaxing) + .eh_frame 0x000000000001c980 0x24 lib/lib.a(open.o) + 0x3c (size before relaxing) + .eh_frame 0x000000000001c9a4 0x20 lib/lib.a(close.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001c9c4 0x20 lib/lib.a(write.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001c9e4 0x20 lib/lib.a(dup.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001ca04 0x18 lib/lib.a(setsid.o) + 0x30 (size before relaxing) + .eh_frame 0x000000000001ca1c 0x20 lib/lib.a(execve.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001ca3c 0x38 lib/lib.a(wait.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000001ca74 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*) + 0x000000000001cd24 . = . + +.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 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x000000000001cd24 PROVIDE (__preinit_array_end, .) + +.init_array 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*) SORT(.ctors.*)) + *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors) + 0x000000000001cd24 PROVIDE (__init_array_end, .) + +.fini_array 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*) SORT(.dtors.*)) + *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors) + 0x000000000001cd24 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 0x000000000001cd24 0x0 + *(.got.plt) + *(.igot.plt) + .igot.plt 0x0000000000000000 0x0 boot/head.o + +.data 0x000000000001cd40 0x3b21 + *(.data .data.* .gnu.linkonce.d.*) + .data 0x000000000001cd40 0x0 boot/head.o + .data 0x000000000001cd40 0x28 init/main.o + *fill* 0x000000000001cd68 0x18 + .data 0x000000000001cd80 0x1330 kernel/kernel.o + 0x000000000001cd80 sys_call_table + 0x000000000001cefc NR_syscalls + 0x000000000001df00 current + 0x000000000001df20 task + 0x000000000001e020 stack_start + 0x000000000001e028 current_DOR + .data 0x000000000001e0b0 0x0 mm/mm.o + *fill* 0x000000000001e0b0 0x10 + .data 0x000000000001e0c0 0x60 fs/fs.o + 0x000000000001e0c4 start_buffer + .data 0x000000000001e120 0x0 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .data 0x000000000001e120 0xcd kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x000000000001e1ed 0x3 + .data 0x000000000001e1f0 0x4 kernel/blk_drv/blk_drv.a(hd.o) + .data 0x000000000001e1f4 0x0 kernel/blk_drv/blk_drv.a(ramdisk.o) + *fill* 0x000000000001e1f4 0xc + .data 0x000000000001e200 0x2538 kernel/chr_drv/chr_drv.a(tty_io.o) + 0x000000000001e200 tty_table + 0x0000000000020720 table_list + .data 0x0000000000020738 0x1 kernel/chr_drv/chr_drv.a(console.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + *fill* 0x0000000000020739 0x7 + .data 0x0000000000020740 0x20 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .data 0x0000000000020760 0x0 kernel/math/math.a(math_emulate.o) + .data 0x0000000000020760 0x101 lib/lib.a(ctype.o) + 0x0000000000020760 _ctype + .data 0x0000000000020861 0x0 lib/lib.a(_exit.o) + .data 0x0000000000020861 0x0 lib/lib.a(open.o) + .data 0x0000000000020861 0x0 lib/lib.a(close.o) + .data 0x0000000000020861 0x0 lib/lib.a(errno.o) + .data 0x0000000000020861 0x0 lib/lib.a(write.o) + .data 0x0000000000020861 0x0 lib/lib.a(dup.o) + .data 0x0000000000020861 0x0 lib/lib.a(setsid.o) + .data 0x0000000000020861 0x0 lib/lib.a(execve.o) + .data 0x0000000000020861 0x0 lib/lib.a(wait.o) + .data 0x0000000000020861 0x0 lib/lib.a(string.o) + +.data1 + *(.data1) + 0x0000000000020861 _edata = . + 0x0000000000020861 PROVIDE (edata, .) + 0x0000000000020861 . = . + 0x0000000000020861 __bss_start = . + +.bss 0x0000000000020880 0x44b0 + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + .bss 0x0000000000020880 0x0 boot/head.o + .bss 0x0000000000020880 0x40c init/main.o + *fill* 0x0000000000020c8c 0x14 + .bss 0x0000000000020ca0 0x760 kernel/kernel.o + 0x0000000000020ca0 jiffies + 0x0000000000020ca4 startup_time + 0x0000000000020ca8 last_task_used_math + 0x0000000000020fe4 last_pid + .bss 0x0000000000021400 0xf20 mm/mm.o + .bss 0x0000000000022320 0x710 fs/fs.o + 0x0000000000022320 inode_table + 0x0000000000022a20 nr_buffers + 0x0000000000022a2c ROOT_DEV + *fill* 0x0000000000022a30 0x10 + .bss 0x0000000000022a40 0x58 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000022a40 wait_for_request + 0x0000000000022a60 blk_dev + .bss 0x0000000000022a98 0x25 kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000022a98 do_floppy + 0x0000000000022a9c selected + 0x0000000000022aa0 wait_on_floppy_select + *fill* 0x0000000000022abd 0x3 + .bss 0x0000000000022ac0 0xb0 kernel/blk_drv/blk_drv.a(hd.o) + 0x0000000000022ac0 do_hd + 0x0000000000022ae0 hd_info + .bss 0x0000000000022b70 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000022b70 rd_length + .bss 0x0000000000022b74 0x4 kernel/chr_drv/chr_drv.a(tty_io.o) + *fill* 0x0000000000022b78 0x8 + .bss 0x0000000000022b80 0xac kernel/chr_drv/chr_drv.a(console.o) + 0x0000000000022b80 beepcount + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .bss 0x0000000000022c2c 0x0 kernel/math/math.a(math_emulate.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(ctype.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(_exit.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(open.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(close.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(errno.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(write.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(dup.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(setsid.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(execve.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(wait.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(string.o) + *(COMMON) + *fill* 0x0000000000022c2c 0x14 + COMMON 0x0000000000022c40 0x20 init/main.o + 0x0000000000022c40 drive_info + COMMON 0x0000000000022c60 0x1000 kernel/kernel.o + 0x0000000000022c60 user_stack + COMMON 0x0000000000023c60 0xc40 fs/fs.o + 0x0000000000023c60 hash_table + 0x0000000000024140 super_block + 0x00000000000244a0 file_table + COMMON 0x00000000000248a0 0x480 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x00000000000248a0 request + COMMON 0x0000000000024d20 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000024d20 rd_start + COMMON 0x0000000000024d24 0x1 lib/lib.a(ctype.o) + 0x0000000000024d24 _ctmp + *fill* 0x0000000000024d25 0x3 + COMMON 0x0000000000024d28 0x4 lib/lib.a(errno.o) + 0x0000000000024d28 errno + COMMON 0x0000000000024d2c 0x4 lib/lib.a(string.o) + 0x0000000000024d2c ___strtok + 0x0000000000024d30 . = ALIGN ((. != 0x0)?0x4:0x1) + 0x0000000000024d30 . = ALIGN (0x4) + 0x0000000000024d30 . = SEGMENT_START ("ldata-segment", .) + 0x0000000000024d30 . = ALIGN (0x4) + 0x0000000000024d30 _end = . + 0x0000000000024d30 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 0x17a4b + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x0000000000000000 0xb73 init/main.o + .debug_info 0x0000000000000b73 0x513a kernel/kernel.o + .debug_info 0x0000000000005cad 0xba8 mm/mm.o + .debug_info 0x0000000000006855 0xa497 fs/fs.o + .debug_info 0x0000000000010cec 0x932 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_info 0x000000000001161e 0xc9f kernel/blk_drv/blk_drv.a(floppy.o) + .debug_info 0x00000000000122bd 0xd5f kernel/blk_drv/blk_drv.a(hd.o) + .debug_info 0x000000000001301c 0xad5 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_info 0x0000000000013af1 0xacd kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_info 0x00000000000145be 0xdb0 kernel/chr_drv/chr_drv.a(console.o) + .debug_info 0x000000000001536e 0x85c kernel/chr_drv/chr_drv.a(serial.o) + .debug_info 0x0000000000015bca 0xb47 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_info 0x0000000000016711 0x7b5 kernel/math/math.a(math_emulate.o) + .debug_info 0x0000000000016ec6 0x66 lib/lib.a(ctype.o) + .debug_info 0x0000000000016f2c 0x77 lib/lib.a(_exit.o) + .debug_info 0x0000000000016fa3 0xd0 lib/lib.a(open.o) + .debug_info 0x0000000000017073 0x97 lib/lib.a(close.o) + .debug_info 0x000000000001710a 0x36 lib/lib.a(errno.o) + .debug_info 0x0000000000017140 0xc9 lib/lib.a(write.o) + .debug_info 0x0000000000017209 0x97 lib/lib.a(dup.o) + .debug_info 0x00000000000172a0 0x95 lib/lib.a(setsid.o) + .debug_info 0x0000000000017335 0xcb lib/lib.a(execve.o) + .debug_info 0x0000000000017400 0xed lib/lib.a(wait.o) + .debug_info 0x00000000000174ed 0x55e lib/lib.a(string.o) + +.debug_abbrev 0x0000000000000000 0x4536 + *(.debug_abbrev) + .debug_abbrev 0x0000000000000000 0x237 init/main.o + .debug_abbrev 0x0000000000000237 0x101d kernel/kernel.o + .debug_abbrev 0x0000000000001254 0x20b mm/mm.o + .debug_abbrev 0x000000000000145f 0x1a50 fs/fs.o + .debug_abbrev 0x0000000000002eaf 0x169 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_abbrev 0x0000000000003018 0x27d kernel/blk_drv/blk_drv.a(floppy.o) + .debug_abbrev 0x0000000000003295 0x23c kernel/blk_drv/blk_drv.a(hd.o) + .debug_abbrev 0x00000000000034d1 0x1a8 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_abbrev 0x0000000000003679 0x279 kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_abbrev 0x00000000000038f2 0x26b kernel/chr_drv/chr_drv.a(console.o) + .debug_abbrev 0x0000000000003b5d 0x175 kernel/chr_drv/chr_drv.a(serial.o) + .debug_abbrev 0x0000000000003cd2 0x18d kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_abbrev 0x0000000000003e5f 0x163 kernel/math/math.a(math_emulate.o) + .debug_abbrev 0x0000000000003fc2 0x3e lib/lib.a(ctype.o) + .debug_abbrev 0x0000000000004000 0x51 lib/lib.a(_exit.o) + .debug_abbrev 0x0000000000004051 0x97 lib/lib.a(open.o) + .debug_abbrev 0x00000000000040e8 0x75 lib/lib.a(close.o) + .debug_abbrev 0x000000000000415d 0x2c lib/lib.a(errno.o) + .debug_abbrev 0x0000000000004189 0xa1 lib/lib.a(write.o) + .debug_abbrev 0x000000000000422a 0x75 lib/lib.a(dup.o) + .debug_abbrev 0x000000000000429f 0x73 lib/lib.a(setsid.o) + .debug_abbrev 0x0000000000004312 0x85 lib/lib.a(execve.o) + .debug_abbrev 0x0000000000004397 0xb6 lib/lib.a(wait.o) + .debug_abbrev 0x000000000000444d 0xe9 lib/lib.a(string.o) + +.debug_line 0x0000000000000000 0x486d + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x0000000000000000 0x1e5 init/main.o + .debug_line 0x00000000000001e5 0xf44 kernel/kernel.o + .debug_line 0x0000000000001129 0x2b4 mm/mm.o + .debug_line 0x00000000000013dd 0x1de8 fs/fs.o + .debug_line 0x00000000000031c5 0x197 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_line 0x000000000000335c 0x24c kernel/blk_drv/blk_drv.a(floppy.o) + .debug_line 0x00000000000035a8 0x2bf kernel/blk_drv/blk_drv.a(hd.o) + .debug_line 0x0000000000003867 0x160 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_line 0x00000000000039c7 0x33b kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_line 0x0000000000003d02 0x3ab kernel/chr_drv/chr_drv.a(console.o) + .debug_line 0x00000000000040ad 0xd9 kernel/chr_drv/chr_drv.a(serial.o) + .debug_line 0x0000000000004186 0x1db kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_line 0x0000000000004361 0xe1 kernel/math/math.a(math_emulate.o) + .debug_line 0x0000000000004442 0x28 lib/lib.a(ctype.o) + .debug_line 0x000000000000446a 0x39 lib/lib.a(_exit.o) + .debug_line 0x00000000000044a3 0x62 lib/lib.a(open.o) + .debug_line 0x0000000000004505 0x5c lib/lib.a(close.o) + .debug_line 0x0000000000004561 0x28 lib/lib.a(errno.o) + .debug_line 0x0000000000004589 0x76 lib/lib.a(write.o) + .debug_line 0x00000000000045ff 0x5a lib/lib.a(dup.o) + .debug_line 0x0000000000004659 0x77 lib/lib.a(setsid.o) + .debug_line 0x00000000000046d0 0x5d lib/lib.a(execve.o) + .debug_line 0x000000000000472d 0x7a lib/lib.a(wait.o) + .debug_line 0x00000000000047a7 0xc6 lib/lib.a(string.o) + +.debug_frame + *(.debug_frame) + +.debug_str 0x0000000000000000 0x2132 + *(.debug_str) + .debug_str 0x0000000000000000 0x3bd init/main.o + 0x460 (size before relaxing) + .debug_str 0x00000000000003bd 0x9f1 kernel/kernel.o + 0x2494 (size before relaxing) + .debug_str 0x0000000000000dae 0x193 mm/mm.o + 0x4ee (size before relaxing) + .debug_str 0x0000000000000f41 0x87e fs/fs.o + 0x4980 (size before relaxing) + .debug_str 0x00000000000017bf 0xec kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x48d (size before relaxing) + .debug_str 0x00000000000018ab 0x1cf kernel/blk_drv/blk_drv.a(floppy.o) + 0x66f (size before relaxing) + .debug_str 0x0000000000001a7a 0x15e kernel/blk_drv/blk_drv.a(hd.o) + 0x5e4 (size before relaxing) + .debug_str 0x0000000000001bd8 0x43 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x586 (size before relaxing) + .debug_str 0x0000000000001c1b 0xf7 kernel/chr_drv/chr_drv.a(tty_io.o) + 0x4df (size before relaxing) + .debug_str 0x0000000000001d12 0x1b9 kernel/chr_drv/chr_drv.a(console.o) + 0x5b3 (size before relaxing) + .debug_str 0x0000000000001ecb 0x1a kernel/chr_drv/chr_drv.a(serial.o) + 0x3f8 (size before relaxing) + .debug_str 0x0000000000001ee5 0x8b kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x4a3 (size before relaxing) + .debug_str 0x0000000000001f70 0x65 kernel/math/math.a(math_emulate.o) + 0x38e (size before relaxing) + .debug_str 0x0000000000001fd5 0x89 lib/lib.a(ctype.o) + 0xb2 (size before relaxing) + .debug_str 0x000000000000205e 0x8 lib/lib.a(_exit.o) + 0xde (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(open.o) + 0xee (size before relaxing) + .debug_str 0x0000000000002066 0x8 lib/lib.a(close.o) + 0xe0 (size before relaxing) + .debug_str 0x000000000000206e 0x8 lib/lib.a(errno.o) + 0x8f (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(write.o) + 0xec (size before relaxing) + .debug_str 0x0000000000002076 0x6 lib/lib.a(dup.o) + 0xd8 (size before relaxing) + .debug_str 0x000000000000207c 0x9 lib/lib.a(setsid.o) + 0xe8 (size before relaxing) + .debug_str 0x0000000000002085 0x9 lib/lib.a(execve.o) + 0xf1 (size before relaxing) + .debug_str 0x000000000000208e 0x11 lib/lib.a(wait.o) + 0xfe (size before relaxing) + .debug_str 0x000000000000209f 0x93 lib/lib.a(string.o) + 0x143 (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/2/linux-0.11-lab/cur/linux/boot/bootsect b/2/linux-0.11-lab/cur/linux/boot/bootsect new file mode 100644 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/2/linux-0.11-lab/cur/linux/boot/bootsect.o b/2/linux-0.11-lab/cur/linux/boot/bootsect.o new file mode 100644 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/2/linux-0.11-lab/cur/linux/boot/bootsect.s b/2/linux-0.11-lab/cur/linux/boot/bootsect.s new file mode 100644 index 0000000..711f103 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/boot/head.o b/2/linux-0.11-lab/cur/linux/boot/head.o new file mode 100644 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/2/linux-0.11-lab/cur/linux/boot/setup b/2/linux-0.11-lab/cur/linux/boot/setup new file mode 100644 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/2/linux-0.11-lab/cur/linux/boot/setup.s b/2/linux-0.11-lab/cur/linux/boot/setup.s new file mode 100644 index 0000000..2329d00 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/execve2.patch b/2/linux-0.11-lab/cur/linux/execve2.patch new file mode 100644 index 0000000..7d99d4f --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/execve2.patch @@ -0,0 +1,41 @@ +diff -Naur 0/linux/init/main.c 4/linux/init/main.c +--- 0/linux/init/main.c 2016-08-08 09:40:13.000000000 +0800 ++++ 4/linux/init/main.c 2021-07-06 14:16:56.000000000 +0800 +@@ -208,3 +208,9 @@ + } + _exit(0); /* NOTE! _exit, not exit() */ + } ++ ++void print_nr(int sid) ++{ ++ if (sid > 86) ++ printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); ++} +diff -Naur 0/linux/kernel/system_call.s 4/linux/kernel/system_call.s +--- 0/linux/kernel/system_call.s 2015-09-03 20:21:09.000000000 +0800 ++++ 4/linux/kernel/system_call.s 2021-07-06 14:18:56.000000000 +0800 +@@ -91,6 +91,11 @@ + mov %dx,%es + movl $0x17,%edx # fs points to local data space + mov %dx,%fs ++ ++ pushl %eax #by wyj ++ call print_nr ++ popl %eax ++ + call sys_call_table(,%eax,4) + pushl %eax + movl current,%eax +diff -Naur 0/linux/mm/memory.c 4/linux/mm/memory.c +--- 0/linux/mm/memory.c 2015-09-04 15:24:20.000000000 +0800 ++++ 4/linux/mm/memory.c 2021-07-06 14:21:45.000000000 +0800 +@@ -370,6 +370,9 @@ + unsigned long page; + int block,i; + ++ if (current->pid > 5) ++ printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); ++ + address &= 0xfffff000; + tmp = address - current->start_code; + if (!current->executable || tmp >= current->end_data) { diff --git a/2/linux-0.11-lab/cur/linux/fs/Makefile b/2/linux-0.11-lab/cur/linux/fs/Makefile new file mode 100644 index 0000000..970acd4 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/bitmap.c b/2/linux-0.11-lab/cur/linux/fs/bitmap.c new file mode 100644 index 0000000..73951a8 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/bitmap.o b/2/linux-0.11-lab/cur/linux/fs/bitmap.o new file mode 100644 index 0000000000000000000000000000000000000000..e2ff6c81c16c1eb4d774536e968d9c30d54d4546 GIT binary patch literal 10276 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/block_dev.c b/2/linux-0.11-lab/cur/linux/fs/block_dev.c new file mode 100644 index 0000000..a50ae3f --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/block_dev.o b/2/linux-0.11-lab/cur/linux/fs/block_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..cdf73318e1c2982d43e13f2b6bfecf1c6b439a14 GIT binary patch literal 7292 zcmb7Ie{5UVb-wSu_w;CzqGeOI<-}bWlun#Pq9~hjRNG1HSdlINNR?Pl>{V+;e}tOFnu3o>5KHMEGbz7gr@AzK{%Baz3mRy<(Zz zcX}ipDLpGrT{!i3hc3*$ZBRaCq@Oj?rzg_!(kVIjigDrLeRFS*pk?B;_};tG`H}RN zKv=t=3juNX2P5e$qrSNm9lj_GA?|<{EjbwGHjktypNN1>QuE1^=^QQEH$bxm8umFp zZ=^53zp$_Xx&I2iwwxK4gsq6(gNB89*;rSo*0;u!lN3_sYnj$1b3tJ0Y>4 zm;cX#zJ(NjO+gXoH!jxyUZ_*(kflV_uvlw;lVaTr$HhAR_{_(&XO}Pi?vFUl^S$ZI zU;MzYLPyPBXGinb)+&awL5*7NJaplk5y9nx$IyNc-m335a?Mgh7l zbdyBr1;q?u7}nRZHUXRA0(iog%x-{bn3cLG3~9YWr55>Tm~=e|-jzCpFoxE(8-2<# zsME&CEoiX%sK1|7Sbs>bQTAw9%lW;dg71j+H*hj`Ho>FTpV4NFJZ7cIcag`f|0Lf{ z-fca~%=TpA)nna6-@P00-D^#fKS17RU8Ma-$=6u-laG_9M8tRsF_!!(gqL;m0S2)w zw437`fw0~|Z1X{XG*&P9L*x-_6AaCL> z4sf)6GWyv?VU3L50bS6NlCeT-MhR&dMMx#Ald)!{B+P>h-7ljbXNxanWpo>p@r9g> zeutrbVOU0si!EDZtjz!)V~w}UXg>$(3-`(B&uQihBQiEcvqLl+mC;eQ_`*&Z9bsr+ z*d?QXPhpbj?2*wb(|MG_xQx!x#}_7K^c#!90U7-Pef*Y58J%5hIV_{U%>a+F(~^vN z-f>|bEG%RB_Sxiz6xI%NWrc<^~=B)(j1Ev=G+M z$nPXKbl1%ab0c}g`W5wek;kDQ66P>@kJZAr`4RG7=+_H#6M3IrY;6$cX7V+t}6*SwoNtvmLtFz+E>r#r=v_v=n6IMlMo9M{OJUwmI=e{(DptBX~n-_KD5ddyLxUfmG`2XInCm4kruKLiX}aCeKbLn?kN&c*w8IR0I@Zw-#JHx7CE0)X&0;J$ zh&YKA+O4apS!zOqZM#C;x>|^38KldYx2_&batvGhp1aStTW&7qA+f%axy6A{?7hX0 zvf`@yHO?#HtcFeNRT=Hx)z|m)`JkUZ1XkmvDGn+Wk;PTFKr)`a;lq<$iZ4ObwD%I- z`1XGTagAg$gOz%*+AcYRwp$Y&Vzp9l&vq)@<8Fs2gzHSzoVu5p=G(APZ4_tn*b|u| zd!2Ud5*m<0*$vPwPCH8F9dA0+V%fNrsk&VS$6m+$`Z*^*e0ESzX3n2Cr0(uI_}Zms z4!(AN?tJ7kGMC)l77}+&58o17%+L>X9eiyra`W8WAR8i|x->`BYcJ_5p5I;Bt(@g% zoZZ*^?e28^#Udv<52WkcG1ZfDqhWQib}qYy3V+wIBmCFh_+X$Iil@<4EW<2Xto-jQ}h}w*dQW#}SQkIgf%?rd-DZ zab}%j+p`N*gh6%ltP6U}yG_(fwCh|NPDyndbW_P=5GYq6?-#n>3i7(f7SmH{c}S3V zTX(wA@>18eH(SopAfsj*sk!;Waf}ef&+=;s(Yclpq20tx`xU?vD00}%R;AIZ;L2L@ zmqM}HaGiXkp66IFpo%hM;kd|!%OvnJC_Ak@w?wc_9AN&KU163d8g)kuPB&`KV7*=P z1{?06zwrjLnW3S9s$Ce&28uzvYPrt*Je*)@p+vSntq9~#i|e>9W?A628_qz{^-Bf= zAMH}9CG4u*s$DHH*CJ+*uQ0#PSa{_Mr=??0L(vpdn7FWBg*@wsj_d83IEJElPCf8Y zn_4udT20}w0)7WUG+J^3xhzB#B|&Fc7+4alDQ7O&aelHv>exyCp1_14RwbC7TE0@} zj9>|IMPOz4E7!y32}d4o!)d!-s-l|$Ce&*LQ)=g1j*FGgp{hu35Z#}bR-@qwv19x8 zO{sPJ3pfYb!PXmC-}a@UCx&vFZ0@!|i=&;V7ar}zLqaEv7RF<4VdkTdqH_+sB zyHMbKceL6qyFP`>Vuy-nP3V9=M5frN@f{&DbsRMr9Ad%I6ZkmO*oHW+Fo6H(!@n?4 zR)Gtl|M1e&`J!VRpBwR6;@+w9fzHM-c5WHPd#+%50E_S>$sR-loXFKhG zogMQDeLw}{Jx@pVgl$>Ko%wml?{x%cez=M(=C>6*^Z^xfxRp$FC_?(sb#@oyLZs-R zp3v?A$esO;;O5W+9s6aPVO=;Sp%19|55&8(LlIINZJqHZ5RY*fFN#kX?{RSYaNKfy`$9ITLsJh|%(0{EU{uz8EI=eu`!pNf=iS_VvBIMIpbd-5k zY1kC3f`{IWv+r$_ytEBq^k{A-;0e^mIULjHe9JE>$jwn2;@F|5~ zRQM+ff2!~tHVFN`sql)zcZjI9f#Zhlw=2vNq2H_INrh#lKd + +#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;iLB*g=Pj~f9OHX&(4<0T) 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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/2/linux-0.11-lab/cur/linux/fs/char_dev.o b/2/linux-0.11-lab/cur/linux/fs/char_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..c7f8402c1f0282705e51af77991c05336e864f2d GIT binary patch literal 8284 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 Qso-A-o)>&Y@EyVb1*ZoUcK`qY literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/exec.c b/2/linux-0.11-lab/cur/linux/fs/exec.c new file mode 100644 index 0000000..698c5ca --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/exec.c @@ -0,0 +1,539 @@ +/* + * 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 ; 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 */ + int k; + for(k=0;k<=((current->brk-1)&0xfffff000);k+=4096) + { + do_no_page_myself(5,k+current->start_code); + } + return 0; +exec_error2: + iput(inode); +exec_error1: + for (i=0 ; iYeaH&g1JmIjxj7Fu@yDM$6T*5;eOxV|LH0k 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 I;M0Qt8{Dr!=l}o! literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/fcntl.c b/2/linux-0.11-lab/cur/linux/fs/fcntl.c new file mode 100644 index 0000000..c201aa8 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/fcntl.o b/2/linux-0.11-lab/cur/linux/fs/fcntl.o new file mode 100644 index 0000000000000000000000000000000000000000..c82831d0ba1e338fe2c2cb69a13e2f6a93017d1a GIT binary patch literal 6744 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 +#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/2/linux-0.11-lab/cur/linux/fs/file_dev.o b/2/linux-0.11-lab/cur/linux/fs/file_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..08829927f02514a0c6e50ae669391d73afe423ce GIT binary patch literal 7824 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 Sv(A7~$P&0s;h4gT!v6)R(Kq`5 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/file_table.c b/2/linux-0.11-lab/cur/linux/fs/file_table.c new file mode 100644 index 0000000..e0589ac --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/file_table.c @@ -0,0 +1,9 @@ +/* + * linux/fs/file_table.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +struct file file_table[NR_FILE]; diff --git a/2/linux-0.11-lab/cur/linux/fs/file_table.o b/2/linux-0.11-lab/cur/linux/fs/file_table.o new file mode 100644 index 0000000000000000000000000000000000000000..e0db34ec05f9b2a6ffb8b9969b8d07f9eb7314bd GIT binary patch literal 2640 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 +#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/2/linux-0.11-lab/cur/linux/fs/inode.o b/2/linux-0.11-lab/cur/linux/fs/inode.o new file mode 100644 index 0000000000000000000000000000000000000000..37ed3bd7ff00fac837394067a5a9cfe2e204c68f GIT binary patch literal 14068 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 CH#8mq literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/ioctl.c b/2/linux-0.11-lab/cur/linux/fs/ioctl.c new file mode 100644 index 0000000..36fc976 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/ioctl.o b/2/linux-0.11-lab/cur/linux/fs/ioctl.o new file mode 100644 index 0000000000000000000000000000000000000000..c5a5b15f6dc28af173801b3e56682f611ec101d4 GIT binary patch literal 5824 zcmbVQYiu0V6~6P>*`3|BV`rVjDJg6!M{&Sj+le72B*Y{k*ffelNJ@Bw&Ft>1cksU0 znau;GEhLImHxdL@rG?T$)gKgoMWWECQ1MhN6;Y)xp(09uQ1NPM%S#kRYWjV5?%13D zs(PiF?>pz7d+xdCo;x$UU%z(8c1_bn)HGp;1xbiEy2GAv34>yZSS*hJZRq&XfziyN zFaD6)lY0h6?|Jc2GV|2jwt*GsTp`-YGoPJ5fBwCPsfY69Wa6Y)^wZ~I&=0wPmH4L+ zn?zQKU|ENJ0CN1y`xyCGR}Cwloa_z<_CeG4!n=v%|B4@spZS1BlS*~cJb{VCiRat# zGw-lt^@SZLcMMD*(DAt)1Btmk115OiT;IU?v&UZ^dWj?d&z6Y`Val=AZPW_GK zX?ucvPp>6JPx3?B?4`a(PoAZ4(>e%!dh*8<_8o)JuO|mNL<%ePWIuGFkkwO#)~pf+ z^dvfzFsP@RUP%}?)Af*^+`}FzjOxkL^d^OIJvluuOz6p%=Y@@Ws!a#CY{1A#J;~w? zg)Mq=AC?~q+w{~7&2FXHc0KtN9Y|qHPrk)5Qn+4Eo?`^JF`ONGa*D!!3cK{=I~*g0 zJ$f=p*HYN0Crk4^x9Q0@=7j@#@>V*yos*XIR1h2y#sTK7q9=E<$6-$uIXHya3U9$@ z6W-{$NFmUZS;khPa9B^iNWndZF-P^}4>(VGCAQ~oJyk6Q!lQZVdgzIpTL7_c_^%p+ zPlH=UR>vAvp|E`NOUX?uAis<}VU@k6Fowv}R=J4%A13dy%8iCFa^!vB(2tP!+neFv z7^V9aB25*`MHWX!#BN69zc<$L=-ZdmaGVyxK1F^xxoP?Ss4%V|PuSn4em!{_`Y~Zl zkoVXRQGX?QAM|U5v4OnbDz?@M<0|qMmdn65l4tEP%xi2SAFy2KurRJBAGF+J#D^@m z6!B5ZEku0Wa((#OO#2Dw!6(T#LhlLV8uCeu1>Zux4SHd0C7rUEu5F|{5T!7#CEaC} zK(~|bvC5#=k?yl*K&MD=v*ekZCO=?bio0<=dCC4Q`Io1W&x%NYg3aa`m8rc%q{qN{ zsZ_^Jp1`z&A=gD(U6}VG5!#~N(8SGsxc9O`?gWvgvTzfNFGGs8i)8`9gs&Lw;WuHJ zDVLyUed_m%OtH2gnHi@wgT7<3FVV;6h?Zqc`u)`|_9+RAVTgan zC4-NPzEy}_%W%3Fm=H@}fqguq&4Dkw0o?c|p8!JZ)mC+9QbzYh-M!jkt7jR!4~SIi zYN%kOXaZ%mR2bbGQdgy>Gw_+wjP6v5q6X3G5=J8In@C}rMQ}i~gfxpqW;V=}3z{W6 z#F!AN4kr-Pnl_!G^RAU*Ix__z^YV?DWZ8mwsKD7orf?xM^3GfI8A1MY zT)JSoHSJt?7w+=ojWvN6q7w#k5vi?vC7jA&M1C7yZYV@W@Tu!u12E736U*&We)j7eQO?Vj$dlDPM8|NBB;@Ty=2jf|gTs^93)cIZff^ z>sZvR58?z~%@ytNUUU3eQFelg+Y)WxE#+(A;<}xCvs<&{xry9(cDUxWij_^?x``{m zi`7zgcqThsZq&SBxZHAT?r^h#?=iOprN>F!;c~lP47^6&hpOHfmcb4;TaCai28|X% z@LhKnP;0dDAqUUvsq^k~kr*d%MYU0%$?_Yo43mrL5M-u~7yZ z<#HZ*IP4bNfm5i$*%3c4H%b(ctvuI{3G#juc@gb8H^eQed5U2udBlz6$N(;|@bdf` z@+*y2kiDP-Ptj3<+Zb;mfJK8Q%@CphC4#oOMeWd{?9HijhjA=8n|crC_AthlM&knj0G%t~!O0(NHmh z$1m$a&hCcQfYmy3Q{YG@)pva#dnAhOR?9`M@eLGZvgpe!z%VS5C{@LZ(-JaMsFt#a z6wCDHn*qdp6E90BWv#Vqs@_F&rqvWKS0qQvsjE0L@Q}}Q!l1!YD0!`byN{g7Il~B0 z%d$X`RXFhSOogcBy*ks1ZRTEiSSHITKqW^D2*XlU;N&Y#y;Q}7aMyBulpw=bUZRui zhcg^yd9o};k9ikjeTuwJU2SNCe(^PJ_gXVyLJohXhORv zZJOV}^MHCjkJ#ihXlwVV{%W@=a{iGTf&*gt5-SmFxz$|Y9u7o~OdjZ50q@vQbPMen z#9eNPTuE}LP-vl~I(nU!Q=h@BxU!yX>daEx2Y%VQnJ z{lDBVff1G~@K%#;9QV#=F8kOn!evVq-YR%o@Fx#Ij^`5_uQahn$?^>eo`r)fFlt#v z_^$5scQ@ZY(9s{qM*c>?={NE>83hC#TO>|&aO!Ed48KpK7TIxqo%5dJyl~EWnS*HF zZQ#)uP;nE2xUxeL(XafM-6=TFa)4@)-EPR8^FF$CVZGEx^LpUX7`ix(&KF2ji~3y1 zo&HY4AM?a@;Ke@guMN&Iqqx}a#LrPLN+x9X@w!`KWcPZP5d6%GT4Xl|1$op=^&d$j zM}6Oif;@bmBOcgAzG=(#vOS2aa~)?o*1>v+^3n_55w;kIzsI19S~PFxoa`G|j66fh z^UP4`kA6Al1^$q@G3cTe`HSQTJN2gc@O-2vUij}3<<1!>$L80Xg+2do>TJgRDGarS z+|dOKV}5kh&z)XqhQOwEG(#-vkT^eAzR(P0WXXakd-*(I<1=6}B3vV-@Fqt`&)m+( zG=A!$cZl;YRrn=^IfWY(ZdbTl;q40VP;Duvf8d_v(b75+})pA~+l5I>frzs(9iR~SP9 ubDk-MErmyk$kk7jd{*H<6rLj@R)N~*__RW(g@&6vCm8<#WndPl1OEf#*iC)_ literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/namei.c b/2/linux-0.11-lab/cur/linux/fs/namei.c new file mode 100644 index 0000000..f8a02b9 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/namei.c @@ -0,0 +1,783 @@ +/* + * linux/fs/namei.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * Some corrections by tytso. + */ + +#include +#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/2/linux-0.11-lab/cur/linux/fs/namei.o b/2/linux-0.11-lab/cur/linux/fs/namei.o new file mode 100644 index 0000000000000000000000000000000000000000..24adb056d9030e61a1ab7dbd9a1749977eecd847 GIT binary patch literal 20752 zcmbt+4S1B*weFs8W-`O%7ZMUwKg(f z9U@lF)wZ^1f<1cFN^h;_QF`KS<>!Ldo{F|rYt`BwX{E8+mfHGv%6;Fx*EchXD4yre z^USKoir^;|jwaqX!)f&pxXf;Y*(OVbvHg8wA z9k}h4)d!OA6oD`4RfSJJovI7wX{NTKW!uy7QKYxm=5KvE;n_A4t8e57dX zp+x+LqLuDkBKp1!l%eVS8zMFq2_`kubf{rKuG`S1QwM zIU1Cw8+?G_!SD(I8U-u)d6O z@v}_jsZ7d;SVi*bT3ApqI2Vjq11g9zFR%{i0xn2lK)e6@#0mJ04qAeN2DPio2g{R? zFFFAwsHlMHfx_FX;Bjzi^Yzpx56(c?P-;dxE^15w)i8kIsG78+{%Sm1mGOKL>Wk9# zFG_uSkVPl;g&lR@fjE5V7ax{tzw0RPRkq7Z3cuQede~Q*lKDfEQfcC++l@D>>}v2s zt(x%#ts03={KobEJC7xdw=zcg_r2-TQ(T4Rbm9K)g%B@kq0`u|HeH*l=j2o!s-5oW z&8MAvCu|#B{*Pn(K60m?+4sSO$@_P+)N#ZpOVyWaMLH=IZo36lU#uC|xOUy(G#Y?8 zuK98aLVzo(8rtElUw(Ar#Gv(kg;b$y96z~jj)kD`W7honH$MZ((nGbm4&V$X7#%#N zg9Qkl5(ba|SSJ>H@?Zrsi?+H~uXF@laTeQKTg9}Oci0u=$n?^d>MrDkENQY?(hM*y z4FhUva1aLHRu?>{=ceE}Qxl`J`oOG~z@pm0(^;n^>Gt+eBkKkwlj+H3uFOgms1KqC zvq4N!e^zRys#Pk%L|Xzcx*V{B-9P>z7gJ&k%gHlGnFM(h5|Gp>V$db)s&+@c0|Blr zzYa}p%T?TC2Jo`BH8Fzvj@=IxI}n?&hC5UR&_;f)g_WrF_qu~DKVQhS+t+Mpe((Jz?V=)Z&$Dk+tslnda~_&pcj-2MG%z) zE1S_ZXjp|(|6m~oICg4+= zwI=o$YgZ)SsewZR=)nuLP1kM?n_YuLErsba>A!~kRE!e(y7bsjSYVbyURRgucLJKY-PRF0*I6aq{htXZwS0;X<~Lc~kPuS>q^#F*X5CBZs} zES5G@BRc+ZWYP(Q^+aqFw=BU<-=l+%zNAk}#XjxRd^5*(IQaI0KXL3;=wav3e}V3I zuI@L%L_*OesUqX1$BbY)+V&2z`L|hW&N6W%D1}!CP$ddsv{|*wU*Ha~ME5&Knl2 zT3~3B<$7K?i6+8Ib~Ipo4T!KMh%h;5JTxS_rn4E2p(g6fZ>#4vU!KYYPsV%NkZb9R z6~Q7(=_6E%9al)M&W^ftL)7yCP;O7lIOEMsvS3JMl0|^}QYSG0<#m$~EsQbW-uLL1 z=fR;^XDVR8ZkF+-Z?AUwgGLZX7DQlHqRpjJ6RWg>|9 zmdKofFFsf0y?V+pb6zO07ghj$awh#)Sf#@k)@AQ!jXS|pb=q*FBA>CEp7*^R%wR1v zGXI`rF%4;*$}EVqH+7afRlMwQ>UcTnp0&rM0?Ge&ysSnGSj0VxnJB$`nCv^#)Rtz) z%jmzP<0T`lvmWy3=LHig$OM(hXp)uGO4DGV8v%9SRDk%j+uxyQ6_o{pFF~r(%I05#2`)v zL6ulByc_fM^BL_v-;R5^y2HkfpgiuF?KCSgOYn@3=ZZ@D5Ht^r_NI%w13XXb)o4pq z9;&s(+xgrig0e{jQ<+$<(`SK{dGP4%;Su2DBnlHrT* z#q1zTETC9cHyi_=$Unz3hiXr@I)^)gS&+&EioV9k+Uo2}8u-nx5<~7L)}X2Q0@LTW&ppyY93~G8%T2!+CGCb! z^aa?^Z64OClU`daz?xzEl$fb6*LZD#OSN~Zce9-w*RuBSb4@-z>Hd8h_Fb6bhf-!= z*}rk?NcVik{{1_X-G=Pn+i=j8?4903%<19ZDSe9lyZ)W5e5|*Cj1qlh=rmpOy3m9s zuE{<-GD*&BY4SI(-UF?^W890Rg%HhtNkA_%;_12Jz3-`w>hiOkw#;1GY^iWN2 zJy#ZOX58!ZE}#5y7r5bnpzS)N&3_>@CfF{!=g%4MxwaKUPojDtr&fWfIdSYg1eV?5 z;~(p({$d9Fime}$*4UF~Sn+XG1QIvNvecKL-oE-MwQrH^te2iVHnVf4JPrDh5f?Ed zHo&<{@I4QjobG&yqilsC9*eRCI%Vzffzn6|)hub9thb*1zchl=x zd1tK@*sm41m+`eieEzTszg_V^SOp$q!l$0AzF0i!1aJ`MN)X~*$SffXpLm88OsX8Z zZ)e??U|;G&V>?(GkNQ^PbA$F%N3kz{7G$WV!xD6Ql}m`uII#Cs49UI_sZB{VBQE7G zM>2Yq3A~EoPoq3;r&pLs*lvg-=7(R8)KT}lCQ%2_%8u|%YyH@J*h~+vN`^m&1#Ig~ zKld8RfJu%OCOPVdx3u68I#?1KpjS@j$ervpGVpX=Af6E-UAR z+8FNch<2s76zOQ*&;< zx^uhS(T=!sS)OmQ(BWN<{&IMKkrP-AH7-Zat0=Knpk>ficP1)4d<*8fl%(=ZXRCSa z(d9Xvzw@K`^?EkAK`&q?@p-PN%tF$+o)B8O7Lm^L>|^<2()pekEn8BB-y+X<(4lMT z`JhWYeP9dnmhT0&UdhpxTE2%_ zqZz;DyBKAL30S#}-Rp%3TD~#qnsO_*E848wtEjrd^4-B2%~V;w{WL~1)s}CNsx?z% z`Tmx!nPKH7sNfp4e2)OKi4ygbUW$k zo|Uw%gLJj$4APyX&-3_6cac8d^9=Q0Px=C7U5^fmTygr-vz$T+cAz|Wk={Vs@|?j2 z8%eu7cd@fg6!&^=rg57$qC5}&q#Lb`Xx8Ss>3T?cj&R&xHtHawTsIqaKV`G87Qzb*54BKY$x5|nMCRjuYOr5uLPMSS?DZhihY4vQP4R?@^dUmk+pH2E)Hgb9DSTMa2zg`df_EZ-^CQlVmw2z{+U1OsK8Li|*%Iwi?h4X*&Xy*umno!+oGqQ5%3Vpi1T@O0 zk}map1pV$Rs`slr7IArLj}$8_A71!{dpc94=O_iMDWN=1!XxhUNV}Y|Se0_0PulBw ziscuO&O`Y$<*p%JQ?h8qmp!{6rzKC?Gv#EQ!a$ii^?~Ks!8KeWAz3`-aCh4Fv z65gcTmyj-ZMw)E8!Wn6{=_+TW(Wa}Nkr?#MqI?a?LD!O=f%2$w&n8`qwxH*bu0y$U z&n3CQNq5zeTmmbV`%;qi&SsGFNUm_UfSgZqrE?v~1tc4sI!7%ez1GA0<6cC%*>es( zws;Ku*{bsPVNRLTv}-4*ynlk`S6uCNF<0eHLca)7`rHeQeGsx5~Mc(0tT$ zX)$Z3YxHkedNvzbJ2$D3Kfsh&v&jB$d|S1SccEiUTckrOsDo?8nq>@fjll`annfvV zr+4&HR?VgcM?K7A^pD-bvejIOW6}8q;2gW|MnV{agBL1DrnNSR)=@sRv>K=gYDZl{ zI~%^OCG$pC(9AWaZtdvrvo2(~mBrCC-B#S#s;sr_*V@@yOf$pA%;w@)qp})zYjq7U zlg{zFSm||fXBt}sBdrJ6bQ!+Psg7M!e74CC*v{0BcyNfx4;n+n?IM1`zty| zs&kbp(?*SPh*f2}gRu@)A=1jUtHwGm(yVtJY%X&cqt}gpi{l(8E!)QFuo$nqz{Fun zXrv&vlsbwvNLoUs*QWJYL&svkk_8 z>0-djaSWqshjARNLmZvwF#cGf{O@rpmTSewVc->Tk7L(;dA2{6+Xj{WA6jk%=?}f~ zY}Q-W$N9V5Vb(&Pv3`ZLZ7|kfDb_a|>uq+evEF7^8tbnT>sO4|F<`T;dN5ZH8O%x< zOuh1#(#Bo7pLrNUmBqnaf@iX_#hmtC>A`60jUWbdns%qndX4q>iLiLLPpn^S?CTf% z8jO85YwX)S#J>B*zLm-!qJ7V6O&gFPAJfi$gZAm*dw!^WMiBNHgI7q&s;f6eK(S`^bc#g;5b zjZB5V60;;V*{qqGSM8}WF8;OXZ7|F7H5uSaHQ~SEDED?A zT_^Dgls#kQl*Nk(*q$}a;DZY8l_?^OUIy%jF#-!Pb>erQC=!F?o78* zgXdeV(Y>&kD#l5-!j6~zg!NZCW|bN7PboT0Y!T5fRVrIFYoM6g%m`+c&45P&=joA6 z%=Bc+aWcp3;)_|-zx=Upgh=zz-ck>MayULN$j7h#qkE>9%F3zHj;6Lmb7X2b){bkd zG>dzx#HQ?m*ydOkt5htqt{sPOdXk`<7YmJ1PQ3!)tVg_SPtr01TZ|;h) z6rmi8uImW5frfRlcsK6A42=NPgDE~^=Tw*FJiT(}bIQWq(|_dbNqCb9@6J`4^;YJ1 zixaDyzD2V%AJ6elP1scN=7Zk3&ca2`+!=|j$NLify5i9sYf_1Kao_vi#GaR*ebt-j zv(75+OZKhu77rvTVV#MG8kggT-u^vR{obQ}t-32`*COYrmj+fj3l`1(PGW1K&%3J6 znuLb^-o*n+Zy(f5D&FHP2{=1e_IqdU^cE+rvr3Lrx9;{n{94`__;ptDC+Dy(UX-&T zi5?cOc8*w7r%T?#5C$@ociqu-32#Z?Q`)v1@1h)UV!(_OC2Jgf#RA}Ku5>{_r>>ROjx$g3roIR_&$)uKh zwy%GnAJm>b1O4pNyNW+E_pmkrXASfpO%4q7X+_WWd0#f;^e%!TD`yXXz5lgjU;{kx z>_FeD)yuubeOj;4MkP?8l~UM|^Vgi?1J-$P8*7pS8>oHY^V=mM5B&qMrax&_fH+RF z@94muqsNoU0V^o#yvMb|JzC|OIWOxDw< z@Ozv;d%Qb$CI^zqJ(yaUy(&6)xc5F!z4T!8eJ?iimYFec|5hl}aS5wdEiGPk#`5Ec zOL;-SH59 zo7SsFU4q|mJgk}{u_lyvCz|3a($Q=RW8qLsTNn??@$PU_B-9vRJiMQq&NYelaBRJ53CCL_-6|1_G>6(jtL_Nw(zo~Xmt7f{8>p_V zsjLo6X%BZdwa$!AuQ?xdQ(JRj3NGR7Y2`CCRwspe69g&Tu zYs`QaZV`8~L)+P%ZOvM!F@!e@@lZ>5B%(T7T0(KA-dH3KLVGZ>DbkdPha1}>+V7@^ zM$BVK52>>&(h<`69d?IeU6?PG=wSAa@XbhEg`1mYvgirjrbWgO4Z(wOQKPXNXIBVx zt_v}KWK{H^_QVjKI+_w)A!&_xfYqVy=1^xx+h&Csvb)qHjD~p09c%6Ejt7RQX$*CB zM>d$DBX+73ex|`1?Zjv((S-=r(}B=!;v95!M?1TtxUY_ypw=om$XMtGM5q~tiBIE_ zrnb&l1XhLUMTIvwq9|reXAnoZR50z_`&7I&8q+q%Xfj{)Xs$8Q(t_FL-l^j$p%;SE za}jBV#T&y>gp+ohn%dgg9+}#aXpT?qj7^2Z6Pu<~RZg2Wr7hezwaOGs#a$Fvn;sR` zMN_Mam=%Ya3+uR+F#+&K3xkhAzYauBV|P0b_OXbGTm2?0#FC~&cQ*#5)**h#Tiw6V77C3Ri2rG=hs z33cImlIvn!w24(++Lo4BsBtsq(#(pPcZ{ba(Qce5#|=dvsIGP0T`HnuMyD`)T6O>0 z1&!gDOpIPUstpqZOF|(IHr|O9&YZ{2_{fD|(E+Mcpc%UP4Z}?2C`1}2J8HtNU9uC_ z9G3=`h+e^Q2-=>+$~DeHnrsbsG`FGaMnr48)5L2y1TW&XBZ{>%nL?yNs3qDRi!0(m z+Bb!4^HpnhLEf#-*#$*Om(_TnAaC}e0`Kg@RHOUo0or$f&{ON2Zl&vXq0YW+LtT|~ zLZ)sn>g+2p-R_t}x1(*pz}LQsVms@`0#^WK@8D}+5t;F@!y*R^(&M5GpB(L5n~cm- zXSPf=WbDh3jLg|qwhZ6o*cTERneV3c(7!i9#=aELV|dk!p&WJJM4kQk&i1#`k4YyD zu6M$V2hiCejF@^3Le_rJ)_U$We!|0~dJ}c_BQRJM!1r$`vmbynwyj9puPU+aVdDT| zQD|(nsqRQyWgOd%s?>*o%0}FnS9UXg!$4FvM;a6B5Vb9x5YcqFu@T8SyEfb%?pTL4 zpVa`_E@C%8U#haHvz?D2s?l52YGXatqw!R8rqiTG!pQTvG z&v<-s37r1CG8cb}h38v5!0PslTRcFkNy6iSM}PiB-qZ`LWl5idFXc}qR|Of`V4nAs zx(oX50dIfUFF!NzwQVIo1^?`*k`pZ-yN>HKdmMKz#M@KcgK!+Y4zb6v0JPl(q*^`2 zTq~32$FAcWQJZG@f~iUcNXW;oy9#`EznhQ{Xde4zx!rF&XuAza)e3!=*@Migi-OM9 zcN_H4pVWs-hP1xTpsBA4Uw)pPuGDjwH~YgnezywRa$7D`>TFv`>L|BEXuIlB$Yp;h z!_RJfN!#;Axe}W}xjm$NL1&NSPK=`mWgJHlzLev*M&fJ73P|9KO} zupmDgNP4&M0ieB4u>MT&_C7#<8hAVRlh6J*@%PSfOFI9velB=B=aXLw-p;L`ZqF5v z`8c)bv-#|q;&>QonU7QDXBbdURXB{N=QAHCMt*gM)$#z%+o9mDweF#g72e9thR z@oRr*4gYY%{*b@lW`N`$8piJdZ|{|(;Lpdw+xsH<9}Sa#W*E=ECA0TP%KsX?y&sZ4 zI!yk(Vf;tK_^kgxs@B zt+O6TGEYPH5gBJgd44+iF&YOn9OR;1iMYZBhz9`tw#D$!#7E*Ll*I9XtdDN?8F3qTZp)De}Fh% zsh>*uY@`jA^Q8^tJ``TRbHe^NA4!bm4+9<8=YCB567&oIci|Jr^Xz}C;5|gV6ul2< zVdMXfl>b2Ru+;xl>fe@f7t#XttOL^i_XNL$*NU|BY$D1pAqKElB4Lx?K}7vM!tWuX z{s546|B48^MC<;u%UU6}|yT`JV{?lAsgmi2W53(QdKuR|~&| zi2e@(>4!f^`QOOH9v@!h(Vj}66-0aT=;z~CUcM0wh{7=^7`zyhtM93Gx*DUu7mJ?Cl38cMo^04^;hIwEv4> z5!zZ4vF{O4zE$vk!S4yaEcjo7BQf`sKTWWah`J8pZxH;k;B$f>5FzJ6u4Mc1K-xEr z2>a@#oTnWJ)(V!jVoW2vHDY=-!hGdGPKN2qfyy(be4${y;MIa_1lt5-f|~@l32qns zy5RkS-xK@~!9#*C3cexuN5Q`fTG&@;e}N$XK|J{>f)@$S6TDn-jUfN&5#=`s@-;8{ zI|cc-{Nx`InU^6zG-?^(fL3jS7*e^Ac)4+Z(h zOXNoi;zh0ICkvh@I9qV3;3~n0;13Xa8sq&*u2?-J}6 zd{pqD;A?_;ICrq!A;A{~$MSrEa=+l2M8wE>!tZm$ z-xoX~_5Kk?@7aPig7XAd2tFkE10wW3FZ}C*gMuFlRwDP(-Wnq0=L;Ve>=fKC_@Ll^ z!T%(p-D|=R3VtLwhUXyYpDnnA2>I2*Unlqt!50NzCqnKW;XfAC=PBqbLxQE=a=|MF zV}gBxj}W2fhr&N2_5)^B2oo1vd)bD)_I0`viX@_(vkze<=JI zp2MJLxggJJtY0tu4T34be-r$<;2T89|4H~y1ao;lgWk!4R|>8rQoryUgx@CoU4oAZ zzApHV;3tCo6LIPvD|osfmWgt}2C%xH9|#737W$nbxI%ENV87r~g0BevS+E58p6zP{ V8w7g<`M27ve@5^vLGBYQ|9=}pflvSd literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/open.c b/2/linux-0.11-lab/cur/linux/fs/open.c new file mode 100644 index 0000000..3695ff1 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/open.c @@ -0,0 +1,208 @@ +/* + * linux/fs/open.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#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/2/linux-0.11-lab/cur/linux/fs/open.o b/2/linux-0.11-lab/cur/linux/fs/open.o new file mode 100644 index 0000000000000000000000000000000000000000..23086fdba1f943e20967d4a70703d41490d069a2 GIT binary patch literal 11180 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/pipe.c b/2/linux-0.11-lab/cur/linux/fs/pipe.c new file mode 100644 index 0000000..dfc4480 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/fs/pipe.o b/2/linux-0.11-lab/cur/linux/fs/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..106606a8b562f82924a575b0a399c92a910bc50d GIT binary patch literal 8100 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 +#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/2/linux-0.11-lab/cur/linux/fs/read_write.o b/2/linux-0.11-lab/cur/linux/fs/read_write.o new file mode 100644 index 0000000000000000000000000000000000000000..b74e2a05827516e27ad7055b5197ab3d1de7f83d GIT binary patch literal 7516 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/select.c b/2/linux-0.11-lab/cur/linux/fs/select.c new file mode 100644 index 0000000..cef8b43 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/select.c @@ -0,0 +1,10 @@ +/* nothing , only the stub */ +/* gohigh */ + +#include + +int sys_select() +{ + return -ENOSYS; +} + diff --git a/2/linux-0.11-lab/cur/linux/fs/select.o b/2/linux-0.11-lab/cur/linux/fs/select.o new file mode 100644 index 0000000000000000000000000000000000000000..1bab67f11c0db7563888ab19a2ae6e6b6c816fb3 GIT binary patch literal 1772 zcma)7&1(};5TBP#Yc*|X8^x9irr<{vcavz)Qni*AEsFFY^x#3uCfR&ocDL+qq?Mw0 z^Wa5L1Sxp(FYw~stDxXbJb3UQ@T?Gjvu~%_o^)W|%=~8F%$v!ud2;>s4W$$bDKcna z5$$HQry7enD$qE6_}1_DKQ02v#%MOapzgy6Vt{Bkk(m}0HN235)vl2p>Ua_G33W1G z$Qk*W{Dhhu9zRNyvFO^gkzdGN&fP39xHR>8d78*LLAl&w&KNy0%_iDORm{t6DT&JE*s>b}r0c zgkJA9ie{^5Hhs4fna#j<9dpx14^9BE<8?cpV>WwUJ?i*g2*~rzFtY0p%+0`$P|yzs zmBa0DLqCH`ZQpfDUat|A{IG;9y)CnBRVrrJu9eCfC^bW()s>Zn;@o@&1J4x9(av^Oj(+;$_oMphUFTDC=toUMqg zh8@{t)xwah!0B2Ir`Bt2biAeySFGE$THriPd+osXTF$-;JRZ4#{AAUA*LAP~mWSzB zn7f{qPUEyU;tA`w{?9psAYMV~ix)t2z8|kA~!5v zsLOl6bq|20t_@x8K&7wXc~%k<-#ysreBY6e-_7|LmwYaCzQglj%E5S})%au|^Hw4y z?j69hafCi3?r9PyuFvd9k(jT5v93Q3L| +#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/2/linux-0.11-lab/cur/linux/fs/stat.o b/2/linux-0.11-lab/cur/linux/fs/stat.o new file mode 100644 index 0000000000000000000000000000000000000000..3d976fc85e572d4c79b6b135ac0d16da32884718 GIT binary patch literal 7208 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/super.c b/2/linux-0.11-lab/cur/linux/fs/super.c new file mode 100644 index 0000000..6a4ccb1 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/super.c @@ -0,0 +1,282 @@ +/* + * linux/fs/super.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * super.c contains code to handle the super-block tables. + */ +#include +#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/2/linux-0.11-lab/cur/linux/fs/super.o b/2/linux-0.11-lab/cur/linux/fs/super.o new file mode 100644 index 0000000000000000000000000000000000000000..25ac49b6aea1170f1153f2279086249f062fde29 GIT binary patch literal 12280 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/fs/truncate.c b/2/linux-0.11-lab/cur/linux/fs/truncate.c new file mode 100644 index 0000000..36f3ea2 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/fs/truncate.c @@ -0,0 +1,65 @@ +/* + * linux/fs/truncate.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#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/2/linux-0.11-lab/cur/linux/fs/truncate.o b/2/linux-0.11-lab/cur/linux/fs/truncate.o new file mode 100644 index 0000000000000000000000000000000000000000..63af350a448e032c96a39ec52a400dfeb6fa8198 GIT binary patch literal 6844 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/include/a.out.h b/2/linux-0.11-lab/cur/linux/include/a.out.h new file mode 100644 index 0000000..3e67974 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/asm/io.h b/2/linux-0.11-lab/cur/linux/include/asm/io.h new file mode 100644 index 0000000..d5cc42a --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/asm/memory.h b/2/linux-0.11-lab/cur/linux/include/asm/memory.h new file mode 100644 index 0000000..51b69e7 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/asm/segment.h b/2/linux-0.11-lab/cur/linux/include/asm/segment.h new file mode 100644 index 0000000..94dd102 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/asm/system.h b/2/linux-0.11-lab/cur/linux/include/asm/system.h new file mode 100644 index 0000000..0b5a21d --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/const.h b/2/linux-0.11-lab/cur/linux/include/const.h new file mode 100644 index 0000000..7828e61 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/ctype.h b/2/linux-0.11-lab/cur/linux/include/ctype.h new file mode 100644 index 0000000..7acf55d --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/errno.h b/2/linux-0.11-lab/cur/linux/include/errno.h new file mode 100644 index 0000000..c282f69 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/fcntl.h b/2/linux-0.11-lab/cur/linux/include/fcntl.h new file mode 100644 index 0000000..a5bf9af --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/config.h b/2/linux-0.11-lab/cur/linux/include/linux/config.h new file mode 100644 index 0000000..c979fb3 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/fdreg.h b/2/linux-0.11-lab/cur/linux/include/linux/fdreg.h new file mode 100644 index 0000000..01355af --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/fs.h b/2/linux-0.11-lab/cur/linux/include/linux/fs.h new file mode 100644 index 0000000..7a90b10 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/hdreg.h b/2/linux-0.11-lab/cur/linux/include/linux/hdreg.h new file mode 100644 index 0000000..e6c593f --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/head.h b/2/linux-0.11-lab/cur/linux/include/linux/head.h new file mode 100644 index 0000000..db3dda2 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/kernel.h b/2/linux-0.11-lab/cur/linux/include/linux/kernel.h new file mode 100644 index 0000000..cb40dd5 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/mm.h b/2/linux-0.11-lab/cur/linux/include/linux/mm.h new file mode 100644 index 0000000..5a160f3 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/sched.h b/2/linux-0.11-lab/cur/linux/include/linux/sched.h new file mode 100644 index 0000000..772646a --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/linux/sys.h b/2/linux-0.11-lab/cur/linux/include/linux/sys.h new file mode 100644 index 0000000..7ff5fa7 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/include/linux/sys.h @@ -0,0 +1,119 @@ +/* + * 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(); +extern int sys_execve2(); +extern int sys_getdents(); +extern int sys_pipe2(); +extern int sys_sleep(); +extern int sys_getcwd(); +extern int sys_mmap(); +extern int sys_munmap(); +extern int sys_clone(); +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 , sys_execve2 ,sys_getdents ,sys_pipe2 , + sys_sleep , sys_getcwd , sys_mmap ,sys_munmap,sys_clone}; + +/* So we don't have to do any more manual updating.... */ +int NR_syscalls = sizeof(sys_call_table)/sizeof(fn_ptr); diff --git a/2/linux-0.11-lab/cur/linux/include/linux/tty.h b/2/linux-0.11-lab/cur/linux/include/linux/tty.h new file mode 100644 index 0000000..ad846b3 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/new.h b/2/linux-0.11-lab/cur/linux/include/new.h new file mode 100644 index 0000000..6d4902c --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/include/new.h @@ -0,0 +1,30 @@ +#ifndef _NEW_H +#define _NEW_H + +#include + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char * d_name; +}; + +/* Return value of `mmap' in case of an error. */ +#define MAP_FAILED ((void *) -1) + +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ + +/* compatibility flags */ +#define MAP_FILE 0 + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ + +#define CLONE_VM 0x00000100 /* set if VM shared between processes */ + +#endif diff --git a/2/linux-0.11-lab/cur/linux/include/signal.h b/2/linux-0.11-lab/cur/linux/include/signal.h new file mode 100644 index 0000000..0eea9a3 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/stdarg.h b/2/linux-0.11-lab/cur/linux/include/stdarg.h new file mode 100644 index 0000000..fd79ec0 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/stddef.h b/2/linux-0.11-lab/cur/linux/include/stddef.h new file mode 100644 index 0000000..97f72ff --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/string.h b/2/linux-0.11-lab/cur/linux/include/string.h new file mode 100644 index 0000000..48b91e5 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/sys/times.h b/2/linux-0.11-lab/cur/linux/include/sys/times.h new file mode 100644 index 0000000..68d5bfb --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/sys/types.h b/2/linux-0.11-lab/cur/linux/include/sys/types.h new file mode 100644 index 0000000..557aa31 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/sys/utsname.h b/2/linux-0.11-lab/cur/linux/include/sys/utsname.h new file mode 100644 index 0000000..0a1c5a0 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/sys/wait.h b/2/linux-0.11-lab/cur/linux/include/sys/wait.h new file mode 100644 index 0000000..53190c2 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/termios.h b/2/linux-0.11-lab/cur/linux/include/termios.h new file mode 100644 index 0000000..2b7b913 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/time.h b/2/linux-0.11-lab/cur/linux/include/time.h new file mode 100644 index 0000000..d0a765d --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/include/unistd.h b/2/linux-0.11-lab/cur/linux/include/unistd.h new file mode 100644 index 0000000..4a9a3f7 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/include/unistd.h @@ -0,0 +1,277 @@ +#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 __NR_execve2 87 +#define __NR_getdents 88 +#define __NR_pipe2 89 +#define __NR_sleep 90 +#define __NR_getcwd 91 +#define __NR_mmap 92 +#define __NR_munmap 93 +#define __NR_clone 94 +#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/2/linux-0.11-lab/cur/linux/include/utime.h b/2/linux-0.11-lab/cur/linux/include/utime.h new file mode 100644 index 0000000..83f07c7 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/init/main.c b/2/linux-0.11-lab/cur/linux/init/main.c new file mode 100644 index 0000000..bd86a68 --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/init/main.c @@ -0,0 +1,216 @@ +/* + * 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() */ +} + +void print_nr(int sid) +{ + if (sid > 86) + printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); +} diff --git a/2/linux-0.11-lab/cur/linux/init/main.c.rej b/2/linux-0.11-lab/cur/linux/init/main.c.rej new file mode 100644 index 0000000..375d6cd --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/init/main.c.rej @@ -0,0 +1,12 @@ +--- init/main.c 2016-08-08 09:40:13.000000000 +0800 ++++ init/main.c 2021-07-06 14:16:56.000000000 +0800 +@@ -208,3 +208,9 @@ + } + _exit(0); /* NOTE! _exit, not exit() */ + } ++ ++void print_nr(int sid) ++{ ++ if (sid > 86) ++ printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); ++} diff --git a/2/linux-0.11-lab/cur/linux/init/main.o b/2/linux-0.11-lab/cur/linux/init/main.o new file mode 100644 index 0000000000000000000000000000000000000000..a02f483e035a7df6015471a87ca5a0786451c6d2 GIT binary patch literal 12208 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/Makefile b/2/linux-0.11-lab/cur/linux/kernel/Makefile new file mode 100644 index 0000000..29b8f8d --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/kernel/Makefile @@ -0,0 +1,83 @@ +# +# Makefile for the FREAX-kernel. +# +# 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 =-m elf_i386 -Ttext 0 -e startup_32 +CC =gcc -march=i386 +CFLAGS =-w -g -fomit-frame-pointer -finline-functions \ + -nostdinc -fno-stack-protector -mcld -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 = sched.o system_call.o traps.o asm.o fork.o \ + panic.o printk.o vsprintf.o sys.o exit.o \ + signal.o mktime.o + +kernel.o: $(OBJS) + $(LD) -r -o kernel.o $(OBJS) + sync + +clean: + rm -f core *.o *.a tmp_make keyboard.s + for i in *.c;do rm -f `basename $$i .c`.s;done + (cd chr_drv; make clean) + (cd blk_drv; make clean) + (cd math; make clean) + +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 + (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/2/linux-0.11-lab/cur/linux/kernel/asm.o b/2/linux-0.11-lab/cur/linux/kernel/asm.o new file mode 100644 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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/Makefile b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/Makefile new file mode 100644 index 0000000..1fb57f9 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk.h b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk.h new file mode 100644 index 0000000..7a69b71 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk_drv.a b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/blk_drv.a new file mode 100644 index 0000000000000000000000000000000000000000..029c613816f6aa08df75c2987a2ea966da7f90df GIT binary patch literal 52196 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.c b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.c new file mode 100644 index 0000000..b1a7f3a --- /dev/null +++ b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.c @@ -0,0 +1,463 @@ +/* + * linux/kernel/floppy.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * 02.12.91 - Changed to static variables to indicate need for reset + * and recalibrate. This makes some things easier (output_byte reset + * checking etc), and means less interrupt jumping in case of errors, + * so the code is hopefully easier to understand. + */ + +/* + * This file is certainly a mess. I've tried my best to get it working, + * but I don't like programming floppies, and I have only one anyway. + * Urgel. I should check for more errors, and do more graceful error + * recovery. Seems there are problems with several drives. I've tried to + * correct them. No promises. + */ + +/* + * As with hd.c, all routines within this file can (and will) be called + * by interrupts, so extreme caution is needed. A hardware interrupt + * handler may not sleep, or a kernel panic will happen. Thus I cannot + * call "floppy-on" directly, but have to set a special timer interrupt + * etc. + * + * Also, I'm not certain this works on more than 1 floppy. Bugs may + * abund. + */ + +#include +#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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.o b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/floppy.o new file mode 100644 index 0000000000000000000000000000000000000000..b4871a5df233fa5926607b6a5d161d3d293fb7e5 GIT binary patch literal 16608 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 Z75swW*93X)pgzwT#192CL2G{m{}&|+x&Z(H literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.c b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.c new file mode 100644 index 0000000..c0e908f --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.o b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/hd.o new file mode 100644 index 0000000000000000000000000000000000000000..5ac5783d7fdc4d39f17d41386cc27f187ee31410 GIT binary patch literal 15516 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/blk_drv/ll_rw_blk.c b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/ll_rw_blk.c new file mode 100644 index 0000000..f57d998 --- /dev/null +++ b/2/linux-0.11-lab/cur/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 ; 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 J#}pn@_ + +#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/2/linux-0.11-lab/cur/linux/kernel/blk_drv/ramdisk.o b/2/linux-0.11-lab/cur/linux/kernel/blk_drv/ramdisk.o new file mode 100644 index 0000000000000000000000000000000000000000..1abb642d433cbe4b629bcf8510bd6c4e6d3dfec6 GIT binary patch literal 10660 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 b+;7nC^MV#o2hVR1BG*wO_cTQARfzus7wvEC literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/chr_drv/Makefile b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/Makefile new file mode 100644 index 0000000..9d4d8d1 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/chr_drv.a b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/chr_drv.a new file mode 100644 index 0000000000000000000000000000000000000000..8f9e7e9e6efb5f34c78d20517de1327d95899608 GIT binary patch literal 68886 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.c b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.c new file mode 100644 index 0000000..a12ffbf --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/console.o new file mode 100644 index 0000000000000000000000000000000000000000..201b995c8b2cfcd0b623e4c53db4d36891325e2e GIT binary patch literal 20892 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.2.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.2.o new file mode 100644 index 0000000000000000000000000000000000000000..031174bedf6e5d505616ece4312873277e2a897e GIT binary patch literal 6024 zcmeI#e@vA39S88wa~u>bD0IWd5iG3IN(IWPxG|4bR1~PJf@9^R^fvbklw!D>pTL?RpQ+*Mn* zGU;48w;s8AWVm>EqS<*&@?`N8oR_q?$>S<71X zqpQhU;>c|B>|}qn{cv?^^rDvZp)vE_uF)a;tZgVgQf5p+v(a!e&zk68+i!oIV{VD0 z$qveBBu~6MYUVcNcSdg;yG52o2Y7R&Lo%_2xmI$m;#$r11+F_NiwEVgc?!jaWqm1K-D*hd(S5D({u2 zo>`smUelLS`%*>SH(d2qFYbJ!H;u}7ZQZuLvigM`U;FX_+P}MD%QrWFy~g?6^Pe}s zb8!Rkt)*2&Z!|XbzI6@kYn>>G%03Hi{=n zKXUF_qjl!{-1=kwC2jvN*YEN04?E`X9^#lGKA#Ef{{#35JIW98gVZwKZ#~y-aaHE~ zpK@!PTu5U{h;Lu z-jVMJ@d9TQ`L6iWBS;w8CMAn&iV>NADwp!>m>c9c*@q{~-y%e^TuaWsKBFwh_X^U* z{$vG_O`o@4M%+HqhxAu00g5$0k>AgYOi%*W(9Ev7UddzABgmu5aDbK|L?%*VdOk+hj*KDN>d z4HbHly*F2dR&##u{1sz`erfR-h1PQ19G91JET4sDQD_SX1y;&ES8?o%%Xe`s%Y|7K zYT!U#>1I(#R%Cgdm_?yh4&*0q7RBgGmJTcLKhzg9$6;@gp3|tHUe`^>ZLg zhglRl!ol*z3!u=qIUiemZWVf$b9vR6MKR_oONo`A=0KJgD?h`5EFD&Uj)S(i`~v5{ ziR=FZ&c7A6{a2jJC!kpr`Yi|Y8EEBluJ6R8h?$s}}N;$FGszVT5{zB>r%_uT9zzgsdDvtEV$;3}Fnn zr^Vgv@flqh?X97p-%lNSfLirXI2aPvQb=tH1~rLg6Q;u%qTn94Y-;0qklNvO8v!>O z${*|}rxNgVk})GA;t3migYK~EZ=;T2he`oohaM)cPnC0T33@_ax35D}Lm|CWBi>Wf zdg2<4Yhzx?aC@-Z9o9S=-;Z3b@^9qRP=3!gehIjcx4?k7j_5t)XW=j4NAUOXk8le9 z72bvkJf@7h1ZKcISOhn~=V2Xegzc~k?t@Wy6w1GtHeR%*kyr6UD&xNh8{jMORj9$Y z;CJ9ppu8KUpNsGkybQ0vYw!jfhm&vy&cS(j3ogJrP~k;F#!ZANFb!tFOt=DO!(5mL z^I;)$z!F#r%V0UIfK{*t*1~$|f=$o^Rp^5O*adai1AE~?7=`_C03LV2lHVebifi=3d>+QtbkRp2G+uQ=z>kq16AmQ0oVm~*aLgvK^TSoZ~z{K z$KY{z0-l7Y;2=B=&%m?rJiGu$;269JFTu<33cLnyz;QSUXW$&1hqvGYyaN^f<}&U- zOo3@I17^Y%FdOE=JeUs)p#zq{QdkDdVFj#$HLw=eLl" +# 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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.S b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/keyboard.S new file mode 100644 index 0000000..25210b4 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/rs_io.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/rs_io.o new file mode 100644 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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/serial.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/serial.o new file mode 100644 index 0000000000000000000000000000000000000000..08791804f7d2c1e2d886e733b271b9853a625921 GIT binary patch literal 6748 zcma)AYmgjO6~5hlXLn|HGy4qWrA%N`NyzT(Zg!JwUb1-;2r)oXLup~rz%Cis)Ev2-K{!xsetDO5>UOB# zdQ-e9P7Q&b*xlEwq^R0B#YRmE>y&k&LY`{7P+^>!)vP%Fi*t8v?&~=AT<4kVkDcrN zaTcLH+lSX_SP8gKisJDXil@ar$BpAXKc2(t1^=!3sr%Z6I4=9%Sa<&X`KSIdClUrB zoLUHP=!*kEe?52O>3HVni~a)jY1X}U?77~X&S2c{b7Uv(+bl6yvfHl&Tm6f$Ka$2F zjn6phfTNCMzc%5EsX6fg>o>mj0mrj9DFh@GY21moaXoUgkNH8_f-$g|X6qk8O(Xe= z36QNj0M>1&=`&Z}3y=$`Uqve9C{4$dTE0pBYVxFfn))^5?J|qExwaqgPWe;Xta})| zi@tvbvjl6tg{NhNCZbg)ylRLvqpnk0o$o*^&qA=eqCQiI*y@h@+{WN~qCR)iruPGA z+EWvaqOfKguGt+(3HS5f_1|8hE2rb9W^g0ew2^-DyUudR; z&1Tyq&2FOERx>@1HA=YBOz)v#nRd z(NB^4D=R-qn@P6qlRskH68RE2pY|U6>X#Pn50K~N56Gv;hvbvwW%^$(N60JWBXTkQ zRLMu>+jzIu$XCd7tAtEra!FeOL0 zQj+o|>PH`hzFlN!+Ce=W(?eIgd;nm58ljZsl9m=sy~ACwl+!3u0r}QlXErk3#`3iEG3W6aaSCS{?zo=hD-VXh+kYnVX@;&NTllMZuT*x)#b5f2!BIH`~ z1u2(-uOrXOThXsvPu`bu?ZZNTf_zEJbz1Nq47;pxa3IrY1qJB;A)%XUlf- z{c<(aa}{|(en5WpW0=K~NNfi1EK;exL?rG2=c7~IF1Z8MHhv`5nxgw@B*K^nKca!h zc;ZFW_1ubV8uPeT%=<-e5y*SX?EEdlxRi_By#H2A;~K2Y| z#>*n(Lqc2(l`vMki}y8TPprXxU=ELCV+GG8_S1`A8HsATdb*zk53DUPpDX757SUR( z*mk~$^EQ#<(It#7V^OB3&C1NrbQ#?(o#@Q$6K!pufC~0KhLve+Thq3-&FDeCW(g}p zVSCRQMwKv(?LE}DEEL;&2BB%yP0>kGHBH1#Q)rr;X_{{Ggxt3^)k19VKm^<2c$RVu zO=h;ScrLr@NT4gM+KZ+m!ET%_7SF{8B8Onv#p1af%J`f|HmW8)iD_FCH@V(6jJX^8 zX!huINYr1HGp?9>p@WAb2N(Zmjdnc;uJx$sV(vm@bROL5BwaCg9pail(@&(pW=59r zAfxKdSA35ne+7>zzKXYDe2|%ix4L$7W#w{%`0rJna--mi3#7raS8W{rh%Pu12obox zXP0vheTS}J@oGV?B;XE<2n3-7PRT7qwB*{Fg-7Zx4Y5v&MA~_iRd`a3u>jN{ta--z zWY5`TPxSBPHCHFkCeQxnH|C{1R(kLHg~^85-?Pw^7=|C@5BXl`ih>(B`OuyyyCMi} zKg{FpObI8CF}T957V-rx)L<7V;Hv_^;LLZXq7H*tT;|c2jmVH%!$Al!G#=uz*$Ofyj%8 znZwReQAN8&MGyrwy|)KTwTe4fZ4|=6S`eKD14Fst;eoO}F*p<{2B%!V>XrwclAka5 zw{U-{O@o<1_giVd0MF>_O9f%%zCa>JPn&setIi|1WD{D`Wy+fkJZ zj#My>z|fDd6f@r~=R)^zC~|6j=O%FN$Wd8vCmNF&YO#hY#qEg+AFH>i*7oh{ByKNF zDs{B!2IxcNoLZ&gV%O)YI6ZPWm!i`oYU7sj>I7o2|6jQTW=NC3r%e^+r1`7DI+po( z_{T|H`YsY;96~o9+Av@EfQv<1<~4!kNbDdIl`ZKqJhcB`c8sUl1^w+~LtWxJ-ol&X zDGG)^XD*74!rx6O8I5!~g_ z#U-};0uM+Yz-2Y>!+3R}Dk zf8T&EE^)ujeX{ORY|e2gajg@$b1HufnSD0<`~7Sou7WNuvA8z9H$ApOl;57ieY{?hP|1V0$YIfwg?->6es z-XzU@0H<$tLL7x}14HA{NLJtsm65QsY{U+caLUF|Tn-;~|a5G(Mp5dm5kB_`JrKG`_Bpd1QPE zq*2AI@nag7YFwd_KUmRjr^cH!mNfGGV*R}uzpe2Zjb}8zpz&`S-_h8G+_3$}H7?UQ zrg4kL>on#ymNg#H_@Ks<8c%C{UgOIe`8yl?<1doL#Txk|5ala0Uaj#4jgH2;#)mXM zqmjS9u>Bu2@^>D}?`v$qp+mV_Nlu*R=z{GP_s z8h@qnMUAg%d{g5)8Z8_bj1zyhDx9xzvBotTw`japDYkXhh#n>?Pf0@QX zjoUQlHQuXnJN6ds_h@`n +#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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_io.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_io.o new file mode 100644 index 0000000000000000000000000000000000000000..649bc7813ba9c2ba657f367e157600043549baf1 GIT binary patch literal 22500 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 NtP8XgR +#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/2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_ioctl.o b/2/linux-0.11-lab/cur/linux/kernel/chr_drv/tty_ioctl.o new file mode 100644 index 0000000000000000000000000000000000000000..6d9237dada723dc47381236cfebe028c99834d58 GIT binary patch literal 10644 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 tv&ImRdz$Ank>@Uv=PB`k#z!>r+@k!X# +#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/2/linux-0.11-lab/cur/linux/kernel/exit.o b/2/linux-0.11-lab/cur/linux/kernel/exit.o new file mode 100644 index 0000000000000000000000000000000000000000..cbe7c24cbc0eaa9d0ea78c184eef47914af32877 GIT binary patch literal 11160 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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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 z 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 F{{yjBU?%_o literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/math/Makefile b/2/linux-0.11-lab/cur/linux/kernel/math/Makefile new file mode 100644 index 0000000..b35d488 --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/math/math.a b/2/linux-0.11-lab/cur/linux/kernel/math/math.a new file mode 100644 index 0000000000000000000000000000000000000000..af6a92de910dce7d4fe836fdf979dc43c23015b1 GIT binary patch literal 6624 zcma)AZH!!189w*U?AdAOW4F88?KZ7ps#DoQcXoC=Y?sonr3+_s@?(S?u zq9;4|dESrnp7*@x+;i{U4cjfZRNc99G`+lyO^jbMu{A$7o=>N9%G7yHr?*Um{zq2| zAx!+L{M9YLTCnTwn&sOf5L~zEY8vRX&Czsc{IOgP!56O+d5k%cp9ls_A6@ymD`u`V z3W#x^Z#r=DuhXafOzZTKjDLD2 zGk^NQ%n5j(z9(}EP+9OZn=1=PGQ*XHnM|g#a4?guEKFzCS56+!q4}B?iIcBPAHMbMo9`&wy)XI$ALeux zT{_ohTY6(IKfi5bZgPHQ61HoxZs}m%oMt24uLBFTF zg@`g45jCF19x(31CBw~two0#&8SQ=_q8aUa7!ZkeISpT!X7?u8O(QlCLGRaSNpDte z-S;bldhLZ-k-iHPGH@?pxrpz)oY|2Nm+8;(;sAoZ5RupY4N1ud;Uo7m zTOp57aXood7T_swAdkr}Q-6RwA(^>67?;RD`2_im)c2anlN3J5vt}I zaZy-rCWoL4ENL@Ubmz2?F}ZSD7&cQar!3^B7Wi#db$Amn} zx>e2Ob+lNt)KG&vky~*GHf769E-*lef^Q~&MYl4Ac{ADOI5um2+)Or^L1i75=Y*N6 zm3<+rV-Q}$IG!iuZ7-tFyCycypWxraftXqE0g#yJ+6q3|earhC>o*A7t&$Y-A}G2G z^fu-FxON}qa8bDiqjg*4G5In27pK4zaw~mGAl}9pt9uY2AG%c~rJJ@I2jP(&50zxET_t zC(GFN3WS;*{toQ%5?5~%cZrC5 z037;J@*(*bTxE{o*NYyixSVS7`bF1!$n$l%g}0`Bn~r&U2)P}4c?o$m?s+*OC&*)R ziu$eO3Fya!oFwm+S5ki|`2h6eLT)1;ikI9iLS9C`K5jGd?c{0s6Z-EU&%|wOUdWx~ z!*RP5^38F(9P(V;E`~fGw>`w!MgK|Y!FQ8yhu#r#ihMWvf?rNP4ZVcMCfH4 zz`pr3v;#LoTK$v(dmp>~L3O^n1q-EEA9D_+#2^>K><{|& z!gEO)805l)wjqqLB&{Dr(aZt0@6Q~;aErpBK~y%h9315Oo2%bZX>A_FQkbiQPW$_~ z9YRxn5KChY2BsOrL$AT0*Y-8vKvm2k7Q#H!Tyq~$OARq}8wzZ0d=JVre#RqfBk-0B zJUZ6?2_wiak_uy$u`$&jkEGV6RvCS=cMW=FL_EF|DjaQ^#<2AVMI^N?ep!59Kkn0h zBa({8DH;%Ea?v&!$34B;xNt4?u`WUH6+H+@vU0V!a4qg;xW|G}bWf;YU16|fN3bsJ zf(~bhJ%+KbpRs#4AoeJ_ugW49cD``!zJAVO_s~}^SHt&pEv9ASso9@j9G2q1$5nEx zv&OEqVSu3fLqYdJbk}Lpe+|0p0#F>viu3znSQK~3ZP(iEP~fCNP4Pnw)s+{%MuhFR zAf|W$wnr_mE|zP&W8QMja%r^YG}`k*c=l}FZur?M zgLc07WlK!LKi0B67?Gss%r>kVICf9fw#r~g+ACFUO)GR%^XO7@>i^i8(Wn{e&6<;g zCu7gQ5Sxw7n&bVk9Zvt~nb;1~z;ry{a{U6Xr8!Zyy%MO~F8RW4lnZ6cw}fXEDm4pd zjPF_{yHIrey44a+p@ID8JP^xw>b7VH*Sh7+i3(m(ZCA8CyIkOm;N;o%oIphiC975| zxV8^nz1hb5rL$#nD~eERHp=vK?y?24!8b{**_g$9tuHF@EZZ=)oR%%Dn&sAo%{QQm z&Ws_#yqlFu0ol*nrM7PsYqlt2W(DSoum!J$If!zWkY33wWenmnvDYU zM6!-nNowOn!4bvLH>r1ROyY(70w=Qr^Vtp5afsa8&p%%(>w&AQ`{R9vfWkF=WD zLADEJqdB5>`AExc`gY03r!LmSaeZz#ESJhSD9GX>s{wHXs9lZaMJ7&xiy`U-r@{4w z(X~AU!!#YelT<17Z3KJOYLsg*2lux6#;%0DgNS!pjxXG1(--2ZJ$tsLhi@$6&S(dd z92svbY3#FO`D`w~DbV7Gn93iD>i`ju0Gw>QtkRk6SU7ik&oP&ZclM z3`3mMdOn6}yU(0TB~C{6r1qO{rV>+UQ?aR6>B~>`GJfGxitZxo9joKE0{U)%)sVS% zE$iF!zR0R$BU{A7G3z!1fyT03Y|moil_p#iw~9peQS?0~UE zw$!Ziz!cdA)-j9i5Ugv^$F3IC!mDimugeAS;*pLw71i>%c0K`UV_S#c3dMrUJ@~di z1d7L<>d$i*k7B_uVD`Zwt=bh~04;~&#gOU$zx;CWVV~eBg?B>;H$V;>$7SPx9>Um^ zABOM@Ub4a#+PMCm^LPvM;1>ty!5W0~*b5%^0TrJ>r&5O^q$N?3)k&YXgcSS!8~{m za~`ZuSeI4c9chc-Bi^^63tKpD=a{s;jzIgNzkQTDN1z;4W7C&slew&twBs$ZqeT|)%0L-WE4<_oSynmr=gKd&h*1A` zSyV(+1r|m4vl2@!f~@#P7=EVoA-_#aX5}63531RF;yn9K$l;mE{`=0epZ~1ud>D4V z{_)kJ;m?Vd)o@CSPw$S0NbN%&+Zd~epMe{B7HA^DhL%0b*hD|q@-Mah4a$8&{7&Qh zL~NFSYm8vQDf4VFaDyd?C^PpXk^kZ(V%rJ>n|%Wj_w2CNk80eZaatqm!hSp#h}?Tb zl|N9O13-2E0`JxKGa4V&__D@7YW%ate`-|uqkj+Q0bHl?LXBHA?$&s%#+xxW-c&AJq6YjZbO(p~hD + +#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/2/linux-0.11-lab/cur/linux/kernel/math/math_emulate.o b/2/linux-0.11-lab/cur/linux/kernel/math/math_emulate.o new file mode 100644 index 0000000000000000000000000000000000000000..144cd503e12416d76b8c526ae983c6644f246c33 GIT binary patch literal 6460 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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/2/linux-0.11-lab/cur/linux/kernel/mktime.o b/2/linux-0.11-lab/cur/linux/kernel/mktime.o new file mode 100644 index 0000000000000000000000000000000000000000..6bec513fa96b422f0b693aebe63f8644d5f0acbb GIT binary patch literal 2868 zcma)8U1%It6h3!mHraGH+f8=c=BLKwv}hC4A7V?5rNx&**q=#u>F#XY zowZFZ?aC4~gg(?CL=Y+nA}CVu#UGTk`p^f#3W`2S@kJj5?Sl~LLp|S}dy`3D^uXNn zopbK_x#!HC-K$4W9uq>4CP5~xOGN1o-!dlI5GARH+JDBEkED~!v>AUNLX2 z8m#g+ixuVdh{IiRhhsO?y>b*@~d;6{CI6TwL+OuT;{}*7JgVpXjye zhyR&F$D8H@ppt7zKToiH3$?Cgp0*y@i6iSUy1;1r+xRzrTjkpNb%_Z&mx<{L2-4Tcpc8_9-;CSD$rYniP0}pr&nY^&jBX-9U5i>Rz>k+*j@ogL>O_9jc ztm1Yggc*)R4n__|M1tGUO=b+jRN_E{L#T~mq7GXe?)Pnv_fI7dYP|35XZqpQ86q?6 zdl`M)w6P6h7mF$;teZA-@+tO;2r-p_dvqsFC9<53w)114Xf;(JJx1UPKL+9U3GpD- z&8xhuXrgUr%Wk34EILHh^Io~?*af&qRPt|eNX9mY#bIuj==h=|ocP5!mk94t;?Hfv zP8fR<;V*BTFf5MVbQ|S4*D0njIjDwBY2VsoW?wJZh9L zIo`s&L)lWT>SWz!(aY8vSq|U4m>IE0M>CaNK0D$ovVJ6aJQbyiW76@-$%Cn(v-zg$ zHT~mco@h#G^vdX%Ju)`zYx!EB`%L1}X%d&iVlZl1ukob#6_9g=P0n^QmNX|sOx|O= zu~7ALd9oW`-RC8Z>Q2S>oQodW#hjNTJKt!K4Q0{EH|J)`?re=s66f;yy7N-dnycsB zIlfZ?2lQ1ta1OEywQAMjIomF`)#icuZT5Yf(u^Dps{VhpgSYWJ1L!v-4U zr%NJ#IkSmx5W`-6um^pCjE@0i|5g*VSQuehQ%Zro%&}kZyQvc?yB6gwQaUi~OKT&` z8X`xqzH?mPXRJegA%1jyWwCxnj!MsWSK*U*x zyf~lE%lCaly!SZXJnJ;+csW)Cj@ErRB=h)0P-IpH5`W;|MEspm- zfFhkYm=mTW9Q<$Q{9z{kfspagcjOGl8{?)u#yU+po|ZKa>MgqeQ0u`r{=0%4%mCRU z%m##c;Qv^VO!)?`YfO^A@oNfGPIygZZyn9onG{_&GBV|f*HtE=qw8c+w|obo!Cmgf z#MVCj{x8GEZ!poDyjO79_znmz4;clQf%$-MQM@0Vhrbh?n?0oTS;Y@4enRmV6fY=V xQ~YJcUse1K#rdC<%=f9{Ux9PJ-<2HWqoAII;yb`~-CR800qmbpJjL8#`CmPqonrt1 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/panic.c b/2/linux-0.11-lab/cur/linux/kernel/panic.c new file mode 100644 index 0000000..7d8a06b --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/panic.o b/2/linux-0.11-lab/cur/linux/kernel/panic.o new file mode 100644 index 0000000000000000000000000000000000000000..8c9e7191b1c2d678c3dc637c3db2a206b7de8cbe GIT binary patch literal 5420 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 +#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/2/linux-0.11-lab/cur/linux/kernel/printk.o b/2/linux-0.11-lab/cur/linux/kernel/printk.o new file mode 100644 index 0000000000000000000000000000000000000000..9955ac0a44f36d5a107fbcc8c5e4265cc6e7169b GIT binary patch literal 2420 zcma)7&u<$=6n?Y2PMkP#>V!~7iON=TO8|N8fK^I?l9E6awTeWWB2W?0+Fsk+*z2&n z4oOwukb;OJkSYNZfw zp1=Qncz6gozxPTZKem5j?9P=I>#s+aorCnXu{(&(?;OltyUUjUpdX-*mSD(biEp5I zCw6`z=2{OxGs>8C;|yj)3>+{sQeR0n_$pZHCro1UeauW8EIwsvpwS6o_z+OLO@rwT zwj4ht#rBX(BF|ph?G_CiDc1{8aJ1ScCk3AvO)iWv+IL$#fe z>NDe242^i#Lj08-#Vl_R4o6s4$@OaOUfm(u@X@GstHvQgShxMA)ru}wN@mw5#mY|l zH$9X7;-Z#9mZg=e=7L$V&RP|-*s=Xu>uL9~vuA*7?YdcPn#D%99uUia4yS853@VlW?3%fqGyI#}md4b#XoVv+ph!q92X|J{2 zAf&*(;e^{84wYKnj#Kh_^{~_pO32*XDweIexnkR{mdcT$wC?zx(~fd-s-wNuTDBic zL`w?`=girw)t(pjqJ0$~?MZ3w&AEzIt~?ZJ3Exyi;>KkXH`8Kz#4z4PLrtjpIGE%S zT*#((w1sS0yO>R1xSN&Vg%xafLc2;<5c&~sDdanCD|EI(vg&qdlT{4@vRGMns=el# z>ovMCNo-fEzO$LM+P>{IoqGbf(JBBn$f|Wa9S04tJoMSZ2}XU7(m1U(c~;T-|IhpY zocJRjh@JV(NnSm+F->C(Nfb@r;zFB%;~4D2eSwPj3uZa`{)pZNPLj&^2$bxv{Px)? zdUP1c+{}4BDu(5KjGr0Aq-^{SCD->Wl5auB>q}v%_00pT7(luX;d2HtDcfbp3bQGP zFUVvNld`QqPS#z8a11)G%llJx9bgp$NOQ>d5`&nO&4!%JSBJoPINvaa%J&*D$MC+H zc9HLw2+EmlJZ{EZ`Mr#WKP)|>N%`?PF;=vr4klJ8+sBX@%LfJg7W|%yeVC~u%rA{M#Bakk4 z+*j$u9qp4&qemY6EstYGlYO(ipC|q$_a9XLiAJw0Z3YrFC=9pPUiaP5A^Bclj|IeQ zDEm0LfP9{1900!~0^8#i3tU(}U*=q&`4n?po|DXRSf^wC6EUBU`BKa;#r#F)hzn!+ X>zIGf9Q9>gOne8}Zz1L;xCZ$jnX(S- literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/cur/linux/kernel/sched.c b/2/linux-0.11-lab/cur/linux/kernel/sched.c new file mode 100644 index 0000000..15d839b --- /dev/null +++ b/2/linux-0.11-lab/cur/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/2/linux-0.11-lab/cur/linux/kernel/sched.o b/2/linux-0.11-lab/cur/linux/kernel/sched.o new file mode 100644 index 0000000000000000000000000000000000000000..725b9fd4491fb4a6def8533390d7a4721b953df5 GIT binary patch literal 23040 zcmeHv3zSsVneINPP8VfW)7{Vwf;3VMjetORgDoNoG!Ic;N)Q$BQB>EXyX@+!vK~AX zwXs3zbWmEI7$Xz#k&L-l949fk2*!XC@sTJd-sqiVW*j3?S9^^y=4#Z)eBVC*sV+{O z$z8M7UH7iLIEy;p|NZ;l|K9uG`|NYhU)9`v!Lmh$VJPP?lt&FPr52uRmo#gbsD`U* z)&1U-BMa+CEG$>5cVT^VZMV%4+aJD(pvejIgbN&2nh zkYG`J9=zN*oYIb+PkL-`#?h~;tq1eJhIWK_sufQo98cYcr#xeK!gkm|7roXtdf#?1 zKdOYXDrt{ZuRFn}yEoU@&b{eHdg&d;I`{K*?$ZUcf7yLnhLeC6{^_w5=$95BEL!$< zMKRPkj0W3AduY^O^{d}#8b6}T4TU}iG3ct#QS;qz;DnA;^`eKBTiI2c^>!_TGx(Y% zd?&efbneqPju+)BR2Q} zi`-&ic57}LR-~AT8W2wAh~vxbSx|+?F&Q-~Z}u;CBIS5Px9g;`jNa;b<&{763h@~) z^sKN>=>CRh-)%v^QE9}XH>@2if|O)g^c*^OFb9(#8Rr_kO_SrvdY`Q>n3dk{!@*~C z+>huhKrfelti!d2ZZ;_l^%89{y9;qBlw)s?6V%5=TeI+KY z%2Rp!1-Od357)@LZ&v905RCCty-IHmpxNf*N8kN3Dmr^Z|4=Avds{5@!|bo@1}Vp` zQrm)g%f3~VxFp(9&ADP~aWyyNGS-z>@q+0c#wz4JD|i>FeUQ9At1Wn=K_k9iHR)+> zA_@zaU9(eWdvlz^xTFbQpWLjp6I~fC3bmWJiN1_&5wmovV`AIlPEq-_BtnFB!23|G zzF=WDQVSP7hymIcF@jO1hl;=jRlY`-_wHPQbvVCAL;q0Gt+I85`#EB`TdIZLswF*D z{gZ9Eg(EH3@{txxx1+<=;?rS5Kg*9Fb?OJ~I&gKwaTGWfWNU-S62uihbK+Z(vid^7XbaY^{@??s;Y3m~H)E`S{&KpO*DJcj%Kb zP#vYIy)&Xhjk;-U@3Q(Dl)hma&+RDJw{C;1=aBYfJl9{QH{YIHct7OGx(`>``*W{; z)Nte`6gzSYM|N$guRs3daZ81VYksC6J$!$H@r%wFuz0 zdHk>0d|5f`4gIo$|3kXn^!w>SrSZdqx|OaWczD&)fBtkTs(#sr8!V14eLi_Q8G(}# zI2nPH5jYuvlMy%>fs+w98G(}#I2nQe2P42QLjI%Uua*Btb^pI8!wVzd8Toy}mmTAy zvx1pKboTh@lwd9&&d0QbZ||bPiRpN7d~{MU(jLy{g7IuD7EGjq9kFaGmZWW@!#`N% z!?}(to30M#vzrpBwqQOT%q3&7jEX1Inark8IyEbp%Fa1UU7QYfrn9kNKG7KqW@FbC zV!6ESRDFuRA=8G#GM>QMxVlWK>urtd@#_+0GE3<*twjJ&Sea!Ml&4iBOIg;S(~(Xs z8xFPUU5&GsNl|9|2k~^A7X7dQ{1J=BvdZQId{$W^l~5uDB7T#ths+vYO)>VFt$2Op{tO!0*6q5;V(OvmHX}%|KnTWTIJ) zc~sUKx}IVNcCkd0CNnUSozbM(3|v9in#?oh`|Q*t@RVQ$(Vub z*y{*M-V8j(?nFs8nt@-iqcO&Mvl;jTIxD^s)6->^C!<&m?d>2((M~R>tZP3;Ki)Cb zVCx~+d)d%asIFI)PnkbL>CCdL{~k{Ki*YK`omBqsKwlQ3wdp?_ZI`WMbC&;6+Jq_l z{43$7thE<%x&LOI%OaEq`%kA$^ih;n_^-tv%HmviLH~Bzw6Siz-_N@3lqdQhq?}+| zQ~c#@_gcyg{?{mXP;T=7kaCj#r~4OC?xcK{eGn<2-~m++Kz%b3MA8v?jg{=816SOyUYvo*d;fDO;XA<;j$No_Hdo ztSOYsJ@E+E##G8xo_IQ~tOm+8kfCp+Ji`AT{98?QU#q-SaVhDAQ?1M{jP_OQEN%<_ z*J#*G3+3N{s90xHwmi99ld@(|_W3tce-7nx=%*=bCgm#s7V6KXTm$`dWzC{I!V}4! zrL6NP*Lq^?`1zEB{sy#b&8A%MiG?>RYYyd!o>;_@r+8vfM{e@OS{=FB6U)KRT-wis z9&!ui^Px{DYaZnm)P+2s@ukQ(ouK;%qIU9Q8LbVoN!X?aF%!fY+}M?HJ{4h0KqHda%W-Q{N9ZI$Bdz z{}4)5Wt_bWx|(@#Va#|4nwl0YE8`q$mG^IP+6!rzzK2w*;XdPn7r=23G8R!#xCa>* z9))CKfw6CvS@vB_$*KQ}9+n$^BQOZF@d4U00tU;~$aqQ_<;GCxtr3qyVGK4#fcVsD z)D49n)){QQ2Ct){aATatdfRBaD~6)lR2DieWV27zW*~EaF#D|031!sU`sCEQU{`eG=5)W6`c*KD)}bc9o4m-FIR6 z(Gg{coEeQSb>{FYLvMm`6pV

nP+vP2QN6RTNZf3`eJ=G3b*vTJ1ngK@o>f=AcY_oySCYr+-3!`{V2v zLq;`v#U_v^hRzoq+WDUL3Q?wsU@WHRuDx*PR_rVTm^8|hnR3V^qEkE_MMjxis+}{` z;o6chC+l$OnnTR|B~v2bPu6$ou!qC6Ep=G)^`O%72kmNK8_)Zv*@{&7DJP(pS)|KF zVZ55kM(nAS8~}7oY8HJ1{a#C_=Q=#@O4luQ(EHNCPlw@xnn4hj)f zx&1+DL0QHCEr?FrVC||qr6;Hxw%o1eu1%ar7-bfk&-KYBqLQ946NXb+jF%^}0Ok(! z-$5Q}v|*PmnxNvCpY(j5kl?W_TgWo-ZuIf7s*i^qzYoE<3lif%O6_aLZ%Z|9+4!CR zHH!O?Bk~s2Ze`>5G8no>AIl)Jme8V)?;-SF#_tw&UiVBt1WCp%^4nS@mkU)i&7nre z!dwcmFL9a%fFP&?0=!Fah;iO16dh*hH!!*rE<%P69s0GTFiY zr(cyC<57K=l70nqP)lO-5KXRyJ&QC`?#15K4H4f07h8u1+aeFP*)Fz=6kB`>FlLxf z#GplCrM``xd^K)9p6M4V$}Lf;h@cqbLE-bD_#3BxXqv&oKTUtJA$NCU`58^^67VFp z>sULct=D&9!+$aNpPAbno#dF*P$jn`@)aIWrmOd}GvCuHXmCBQmgQ(Y!F7(AN;*2z z%m(Aoh|{SNXMwr!e9nEc9pBRJ9>1)3>O0$e-wW8U_3juyX`MTh4CYP>+MlT*wGIYS zJw~Y(Uik2ClxCe=``)lS(|5~1hwD1?RJh8z&K+iPfoPs_wOxJn$wo=!5k#jMjf4LFCvaa);p?YVw ziEzGQ!Lf|n3ay_XlHh*a!tDiDX|d823p^y8O%jAD)x%43Ngk(ZHj&5UJSYxyQEV{M z3?al`$TWz9%Ht-!adc80<5)tT^%9IrZ&FyRFV(IOdF0W*;f3~Q5NvRl&vie#El5!n zUR-pm;F3z6hj$~Q4aTqBEQrWB^~gWG5@9qtF0rHz&}-y9vr!ta(!)j(sW3PIP{{ny z<&j1kJ!Lzz0fZ%iT#kfG?#F(K+!#s*3w=i1AkpqT><*+d2QjQ7q?Gd$g-ob&OsR4d zV_X0)*Gz(bJ~M46`gtakw*!s(n{*%+Cpk~_6 z>1JVV2o*2}5Z%`kSEDcVT&$w$UJX_!Uuu=UjinE)#n&w+a5I7bLxG)R9fJ2f%m#qh z>CJ7=%&9v%LV9+(Tf14{96&V((7rXiI5 zl#~s83p+Ia?gJ_5OX7(-Vq$t#;a+K0-WRp=j(7UQ5A?VCeNPql$@V6eyh}uj3ic-C zi36CuKZ(PnNit)xequ)q|LV5uIqj`pydNGZtCc5C1qk2Vq0khb!;h2}lrV)jeA|9< zR$g4dtqzcX&3x@eW`0)FJD`W`6WT;zCmM%#eS$-WN>S4Jt^;>lo%J{2(a(M(JThY- zd2}!fIl>g8!o=uLGdg0TVT0@D@mk)b#joD(eB(A!4$+Y=WQdba@tn@9@HuYh0xeV@ zR}}>cGpJV}k$b2gZBgbOUUPAuR7FyyR74Z(0qbPGwm z<(ncmt$e=#?}U=UN;ufg=;YM<14e1o(;|CgV8dw`KLeo+M#k>=lk?pjFAbX$T0$=HRiCr`+Avq2{^p9tb@?f{Fp-&6Vt zB8rEK5ecFqo-C~+u@4!+T}a|dGIqi9ny8%0-uB zbdR{cNuI(>pY%e#Bc2aMp+Sp3kQQ=ul{E4Q(36#G2e@bLXowKoUvG2`ic1#;YcNGlz!qWg$o~SD? z(p*2@!fzEzN_~1iF&yub9^Q>IpHD096|(fHHPH=nSD?5YL3PL#P7-K;oYM_&yt($VUEc{lU#7>?&4A^ z#0DGpHmCwTmdD~%P+KuBlD72`nGMl={x*^1vU0b)<+wwT-@7HRfUK^}w*C*vdzZ7% z-ILca40)d^k;h7!8LMpCw4+tYhqA~tA_HWBwr91Ea=TO-@XyEuNIA?F*-aN zUm9mA>ajO<3>Bz8d^4wX#nQ;OUkS!^eAt{(RFdhCs6&SZxYhyaOCPF+1wl~|y?r^v z)QZQWCVj+7rt{$))z}CHDRR!oQA@WrMr??|ic^F_Tmi|6^H!9I@nVd71ti0o#L@mb z4pM*ls^%~YHwiA`1JS3aJ6e!rC;QR~$f?CEB$K$e8CD8+N%;yZff@~VA&2S^1TAD` zJ|;1A@M`hDFYnf1f8jz%Y~cj_ASR^u5(5LSF$iB{G+J3~=2HR}!7p|n2=#rCP#%}z z*>vRM)C0Ie@O1i?#<1hywq?@AtZSUC;;HE-$l5|kR=p)ois^J8E zJ5#hOF3v?42{A(oIzb}67#E$qOOzCn)asN9VNYO){57w1zPeY14KyW)NU!G(LD=}} zxv#UXO1wAgMnJWJ`8<$=U+#~Y2_0P->(zP<$o!q!qDtH&>j+uoKq%jO5H->|mJgqP zKZ_zXd$x#By$!j!=mW?NlQR?$VBH69q5Dg|3?&IMyatxuYXbibz{{uW6of9BaSInk z77yTC>lD1P&alNWEvqVqaeO{bn=an|sVeKTzqxORBR{U6cJYRZmtzOyJb^nz^R1tQ zQoo+X$_%ETNX4Ir#%7(m!QooWAS*mih+qYnZ81P zA9+5iLS`!IJk$aW_Wx6H9hg!s zrQOXawiX*)mL(#lPEjh0_s~5;gE)H8Hd#cW#j;l3h{78l&K%;xt-Iesyj)i8UQ~VO z$gQJ`R?$Fj&G_&996U3pZw)bW>puJi38AfizV)IIF8S;dT*A~l2e$^~Il?@v6g3nS zjPdiGdrshZ7h2T;+Ay?K6=#VWK)s5`cE70{Ar1f?46YoU9q7U9L2%SNs67)xOla*} zfZAS6LTcmG3E?AP9Bt?e5F>RS8ssWA;%nzPoudIoh=Zh4s_~_{fzX&<;b9f$4=Mc! zlywAzV`4v2!QlkTO0?r$uJ}(CFJPEynaPmd)X26fT(W_46nc$Vs+&}zbxmEQg*%pX zfkx0RA6^%_mzUA~GtylTy2X%I59qkIUQ6&~m;{b4cCzKDtmKe*hFfo~KlcXR6R{ z&7>Tmol2ozaL8Ipt`o<#A~dxt!(Q}BMNdh{e*@_At-$LFU_9T;^uXn)#loX}D)n^s z0uRpx4_E$JtB0%CI@Sr=QT-;FUlv|@J(CrjELU(1AIk8LO6mI|jCw+cSotcvuiEq^ zCV{vZSi%3vR$|ohbksz>prlh*=lhv#I!PdZCxnUZg?sjZk^@)%*8s>TfENekG84)g zF1sU<2`?YVrdxRfe(Kk?hVpj-G(Qh`ieYKAn;u8m`B&NUir5fyK=|JNRXs?<7EygE zu4gslP&hDH`C~~PBMjw-DdjjRZ{-hQnpSKaacxjs<4bWps~IN=YpDdcvy(WL9i3kf zmdSX&>KYKw6^Q(2KxP5w{w-~}BaTMPv1TwYrh+CMIJ5FUMPu)w`4%&oc?`+lrsy4s z%+<_%!JadpjAVzvK%RTnLt0}30P@%3hpn-{+ZqGFo!v1TYjnGGL8Msu%@ETen4X0b zU%u&I!9-DakVx+)>Wu-mFCOf9K4sf)@kKVL!k3_!J#gz(B$q0D%&uhClFU{3aYSM~ zb9h7|tZ5<=BM7|BB{QYmAensuW}(FQ1t=8y=BOy(eugS!;+cbk?`a)w1}&w*^!>H3 zJM!ZWBY`fC4A9B(ueH4?pbCUhh|~AD4(vWhXDlD5R>0HQEhDD%x27cr?u5FD(VA%V zfW&wZqC|f?BoS0fCx7ciQD(n^{Ifae1(NIwP=@*EaC3D2eG2mnVCgE>6KZpG{v<{{ z!YG<25cxpieka6BO69{xG&Q!79na4It4pTU!OnYWy0;ImGtA%Pf>EXS?x?c4&w@{| zz%~q6VD@VEQp1OSMMCQh9UsF4=>`c#=Q92#ijpadw_=G|ihE+EV{_KFfZt4u4GSu4)jz?^mJP3P)6b=%FL*Z0h&x(i-(z7`g#4diG5g1y(AfX>ko zo)PWP6Cl12hIw%A;6SpiffB&awnGFWeSsDreFkZ3UOU6G?tc?MYx4_fhvB}Oxpx2D zwbu7-pFOsF0$5iv8Nx6?!f3ecz(Z@9vYmq%1sJUH80U?o$PbDbJ!EEo?(rqnMf;KCe;ujJ3EvKOwog6U5<<)D7FDBGg4wNy)w@eY$Ag1`A@GjYm zDXz#8tNF~Lr*Ol3RX-Yux?cCA{}bK1FTgndfw^L&6`nu<^@P`&xE|p$BzqGidJ`r3 z|Frim@KsgU{_on4V2B}!8WaU}p zOM9%xb81^s(E7K&+T*p++7^TY$Ac9sww!7$ZLLij+xn_fi|qUT&AHazJDct6+0Qd52jshPG-;?H|=cnK?%+pqmw$c&FfDoy%_FvtT zezVG@Ud{6{c(J=>(~n+dYAo~2<+J2cVs1*Y$d%g~epwa#G12)%`<0}gohrb0ucYT*!Y0|y3GK=G zr`d^MRvb36|AtqR*`>hvfQ}DTu;irYNX&sXp{4qGY(Cx#=T($J;yXF=lw;2w`Znrl zIZ)<5`=zD%Tzl{1xQ@3icMR+ZI3J;@53y#RY`Lq~cLPgw+o`0`+(~uTsSsCC2o^cD zvrC=mK!NuF!kka~s(G*|k!mn%#0=D*e%~KkJpC3q<4oM1-iAd;^{QK2_eAMhcbOJp z!tfo^<7!xstBARRNS`$9nHuuwB9;{`Bt4?!Qxm|V6Jv8zQ+)&eJ|>w zbz7Rw3ZrMUmU6cATs;-LN!6U0)Z6UL7%gBvy=fk$qh`vK;yhBcFjg}IsLo~Zqk1B# z>M{O|rm-Un>`dlm4q2$fd_N#7tmdZAlMOiaB1UrDVfhNhZH*uP+|)NU)iRyBorE8mcUqXR7N{0-wqc}VT;O>_<; zvU{2BY-bjC$N--*bKYmQHKJ;f?N99*rlsm{y47jCg+YA>3zilx%V*&r-wPLA*2=p| zqD9sd%kn?sxzuir+ayfqOFa12`G^s#_=Y*A28uf`@dY!}bS=zx+w9xQ()dj|JiEgr z+L@y)@8O{zOPo=#*C<$BN|;L|jOz(=6BeJ}`9tPK$ez>Lh8ydYWwvb3H)75(9L>nN zlj2+ccH|r~#<)TC)y_Q=8)X(H2m0aE$oYFByERGX3{8*;Zl=^D)xbB})?YoM*Q>B} zSh`qS_ju|y$f>j~{8KsQ^zra*?=v30UY2a*<n$)DfF)$; zw5wx&RaMmoT`zvvy31_adcBOzzgH0Bw}l#>u(l+IcBq6X#7wEHihL&c+?H(`kqyFz)0;*__SAOvLTou!wS*=I3Hd zGSHGm`9h>_$;$ngiR?_s+WPBOmq(Dlb$?&;hWJ4qPy~Qs4e;`jr7`o=Js)j=7^DxX z+Vo{|9DGAHHPwDhO9zb7e5IH<>nTbFL$eE_t-q0;?{Mjf&7EvGe0OvA`CiVN_YU^L zx{;t(qxpmR;F(XXlH9D4lyj5A?<>w##xL`)W&04bxX(;?GAdj*!EAgg-lPJ;9r?zTm7Sn+0uV-A7jNAN7(ikbIa zYud|L^AWt9uKz<)b~y~u)_0xHlA1~Cs4PQA-lqJNp28~C zsodA|bi~Vxr1}hk8(NbDNhJ>Qa`WUXk$k5~{JRl`ILQaod+n7u-EH-I^ivK40?%Zj zl+q=}!)s8kwHS}-G%Tf853>z=dA zIz}r>+V}-bz`UbUpFS~LE!Zg-76pS@Rs>)2b{Uw}r#ACcG%;aq-JWbdM1_RG?y)_& zUe=TAiH2R4v@Hi#F5cy5fSMz$i+9eX^~oLc5}>Xs8V-rs-J_jZk+r44C{ve{Jt%4f zu&=;rEgQqV!jtC-IiDH0ZwQ$bq0D;mtKXa1bL>+M78XX5|JZv zJsW0Nplh&m=>t#xb{IdlQUAD)5Y37HjYVQDui80ko{4GM!sl{KC?#aRxkFaCN^jdN z{P7GcyKenFxrIF|tF>>i>wbi?MS?n)9B-3kC$H3-10!wCrI@KozhhOfjNr-?+Cu>w z4BdY%MYKd2v}&`PxKyZlCKxtyarQK8R~5~LK)NuRjvtq%0B#W( z1%#>Xu9Zx<)8dZt;({pWW3tp%8&s1i=3!a#9jBzuZI&#t7m=MwAN?P$@2;wzR&#<; zOq2WuyUa9Ibh`8wl(a$~-;)Fir^|&TS>6ElH8U;2Q8vNxxSud|hOiaSaH9sdZ;(YA z?a^tpSYncPlxX!xhpp!Z=TUpzGH~>jqsU#lq|hS22R{8fCSm&oF(x{LpI< zpV9PfQ#MWL@D%2G71PuTzx+k7IQm4B=Ft*olaFOKK|N~x8RS@t>9sr?U1Q$#xn`Yd zy`Pk_TMx8&e2u%CI^^Wfkjx~?+Je)Vs3ltNYBN1`k!;#!qb;v7H0sk#aD$q7DqXtU zFI+v3shQ$(W<%79&HQ1oT(|DFsnaT@+bzMYhM-1mj*bS+3f*L9nYY+~vD%?tSLH2P z=d?b%^>;aeJvsYX|0l6)d#2{8)CZTQ3tAi1jcRWS&h9P7i)6)pk>jvUuC%hwCb4Td z@mh$h$lf#)E(bZhe6hctO(nsAz#ayigKp2yukm`5Y^ZIv8AD(WT z?_S-uboWZ1YkQKo9*HJSjfW0f&+C)Mt0i#NWvZ514iuXu3O7getyIy6EUt9j;b&&D zpn&e$RYA{JtEGB*r&)>HYVwdTFa&F()|;9aiyfEO14y-FU?V8 zUIJ1onY%_4&b<&ZyGtxXa~6uQ$kH1RFM^pu$ypWJdn9pV{PUBQ&1z24ULG z#ehq@-E5pooE>r5n3?S}?6gipU`xV0H9mf4j&QP9{>8}=QL#57Qe*VcG?OiEH6tSb z*{$@+<2jLdaeSD1R3IOE#AClO5IoX%&DH^!~ELTif*)hjPJS`4iJ)e?f6-LF!=?QDbmXHPd#|Iv2-}zPPqJ<8?2DI%>Wct|z)!&&b+V>-u`?sVKeRNkv6A#-2gm!_ zfLpk_7UO8Y4^*1_P<7LPBUiRijI;k}AR~;5fW!*7^_SeHP+l3@`makv6!wti1Xu=$cmC{41oNuqc<)DiC(YyDz>dYr4mJvdAFQ;&lmOE_>oli!%+o@Udr2Vn1?&S4&z5naz%I^E7eQ zcUk!0o|bO5B?THMfhrLwr)vY{YwNF)T4(qy{%@t1iBJjAQ^d;;QyvM|7WR1BKlu_<^Hr zpuRiTqtOOAjUMvbAA}9|Vb+9_UR!Th_Pn++hfnv~+JBiXMHa7Zzxyy~A2NSvo`qvg zXEd@5TARoJ$eO9aC`A;Q)`jyVlPe$WD_z)YfA*&uMaB%JP2c*s zvF#gF*gWJHX3LH~2pJ?R!o*{uI-75S=COq$tUGx5cHEiId&w3U1vPB5i)KZpYf%=a zH4?}*Eo+n7nK8vpYNef5GY=LYgA>R#u+KwERnkmr8<#9Vx7O|TFrx&`MMfmc)%%fc zt$9Mdk~DKeV)s{kMhSny9qH^6CWiuxk2FCf4R`DP0%6BICZx4tr~3$8Mynl|gzXn9 zu*s%3xA~)oFsbWpIX@=#quElMl9A!3=KVyr)XGqUm`}}HpTwl}JtbEo-xNN9ij>FQ zluL*SY;L;(Sb}1>17KFRpJ!a$vOQNzldy@jr7gK>Bqvv4mn5;*t|@GRHB`-Jl!uWs z$h#ux{288XKk)!1R9|Z3s7U9+VO+#mhJn-Zdah+Di7xgrv;c1tW!j9ci zqZ@>nQ#U&5IZ4 zbflRF4$SAKXek+Vy#tN#egNMR@LK>)=S;!ZM(qk8k((5`-J{NJI>YN|3Rh`yJ+puD z`<<@8phdCo+jN_u;ll@Oo_##`^gU9o$;QA8q*S?uKL*uB zdH1!7zM|=f&U4A6d$O)dxq62wd-nypy1uDEhSQ4wdziHsJ~*gCv>Z4Os?p3NyNf+w z3}Wf~q+Q!tV(Iz`|90lc=j+!!(76Adwlfi8uA`eoV1j%oa`7vv1hxS1FeSQ}PdhLs z-{h#p=%49DXA><6FKjx&V^OfAD2;E|g&x7k6{aNTuROc0e=@^1?mdt>TMpRV$i~jr zt+vi~wRBS0uPLtUL!`HopyV_y8_Jf>Xv=|f3cvI+L^PQ9OoM4xI;1<&1SW6Nr8hn@ zxp|HHz&q&aJ`#HLO_n~INzbrd+V*|HRwavlY%=9ws@a<*`N`HQ*@%xxW)igZvw|u! z)}1htR-PrCrgZu$Mm8zEbV||IU#T_X_frl~O149gk`Qi&4Bds@{W|B7d3T@AdQKZ?_Ni|Y6|UY4);ZDi zM&|YOdM$79?l1G&y*^G~?jbwggQlC*v6}8Yuw|2`Iy-aJSsqV`*xzR;za0mt;_)y} z?h$@^?mW}T^=w#-=P!tIoFhfmOz?>i0nOn5uTV#xW#W?;#Ru-lsT8N3Im?x*`ADj@C6Rb)m!1vSt!D#rs;Ixu_H4k=kH{o# z(@r^;8Jl+2Y+JLhWmhw`__SipFx`aK?E6a#@91CS^qyVX)J7S$IupUeWkFew(0Ay702x_`t%4_vOZOwsz-s|DpA= zaNA}1tN%UTXD1mt&h@jlJs#%4*rMifMg+E-Y{|_DBF*9W`+Hm))7(!4fo;u0bw0Gs zUI)GFkG8#U$eIgRuP2A*b3zb>o6iw#)RH!LK7_s=|MMGjJKG6t6vZ2Jz4R-$*(8DP z|FnT%_nwkV8%oFKFNroCYkB9#``JLGaPSm^_C_x&943dWDK(V?b-QLn6R{_gyM z)Ab6Y<85o3I|z?Ge@XC(6Z%8sf{Es_W`+ zxUrv8-dI^Rf5FWQYcBl4Txa&JODh)7t6fwwVx)71y`M9Fdg&#XPQL8&sTZ8G!dZU(%!$`dxbljz z7hU{m8C;Z>0r%V-hI+T%aO3T>d%(^Lt$qI2e#=wI)}Pq9AmG?ab({LHKk-Y+%TQCF z^(UUj<=Sv4mkpqnXlgufYo4(A>sgNz_6`@nC+l*$X@BmCmQN z!sJ;}(_I}S$(BFV>1$e-aLQtInsQe^1R{EKj@v`=loL)`Li4sLw7F6 zxl*k zbF|`j0*<#96Pm1b3om{l^ zJ({Nir?T1z9@xdEL*66dEnVbbjQ;v~%YjoD|ID-?-2s;Q!$?DFr~6coQPKKAT3D7E zT>Cw~jf}?DguIzfkyz|iHm!*AJW(DyW6OG(O898lK~O4!%aN6E)Gn>-1y)gZ0!Vcd znlP)=r9(8qBAlwGf#IO zv0`5`h4f-}Q<$eEOGKZcmp`-grIcdZa^R?>UdBo+m{YGI(aG6mS>CBOb8&ji*33T8Jdz-R6QPXyt)`7zoLTa8N!wWIZZ?CMvZ2@ z^Bx^XNE&gL9m~RE=a<<{`<-GI5psFJFQNyU$S3(gT~5YsD`RTI12dSG9XO%zOXl-A z;nfFWlGsmvdbCC*HpU@=x@yT$K+Bd$E4iHj=Et9G!#&beE6oKqO^=9;iWuCJ+4Br4 zeP%zm;T~y5W1U@p#=B5lJ_oAZ4@R&D($amMu+duAb_hHEgiV-DiZ+Q}u;hzA2g>d% zga^#-ltDT2ysZ>!l48zQOwhb7+)pvw%O^=VNQ8MdlWUZnEUfGDWX9u@q4ScV;e?Q4 z42BUVKa=6#j-=qcVocJpHQaCMXLD!CvOJ(_RCOTTUs(h;`*V3u*$^A;y|uOn&vx-7 z348~&tu>vILSHraELbVL<9BlDs^3;t8h63e^3v>7>C)x9rUx(WHZxqmsvT%rb?nJ& zxzDS+)TpL=oIRauPb2MVm^}@)rxWby7<oAI??i0G`|>Q!i`;=0nf4UMTJjJ9m2mE9>L5*HV=JvP%mTC&1sw0 zX7RrW{%*bo20|O}U78VAPiGzQz=n2S3>7 z%WBAsta|=TvRdlDWm5C(o#{{4gomi;Yr{jJU$gz;G5h0v;r@YMo#3>-HMwPbm={;4 zh|R;XWMESK%%*4xwZ3y1iQdz0IFTDQJS{aqncK>4rh{$R@jH)x@Zyx#=N{&5QhB;= zees<~<8NQt`j+vjxw^IS`4Tt%7ZUgLb0%?jaMb&)Z;|KpG>KdoF2SnsA!l9K{FM+2lf1=BE;yEihi9)|XoMnP&roi+Hbk>$_6iu|ACWg8S^~3UMyhG}S=k@Ko+M>Z~SCSP^Mq;Vsi;XSXL8XHD7)YZkE zk(IHd=2m*?d5t5{H7Q>g@%)x<2RjxTU4>MCRI(8%be zBsY0q;MP}HjvHE8;x@+1<1rI5G7YP%BI)UF#e#Aqt5W{(UKnerjn#;@Vj(Qz<&6t( zh}`JL8R_|2R)YaE7n^RYNfm_>f(b>+Gb?&0NhL{_#UKDd1Vz)HK z8snBJc{NffPohav$}Z@uiwlO<=S{j~>iA2ib4_r18tzp2DV%xbjWJT!m$)_6i>l)a z<~h?P+y$;PwBB{{oU-alDXqkXz?H8vuUt`UA{{-RiI+!dpSrrIQf8PlgbewozVaucu_LOwk=~iq*KRwgPj6AdKc}Do#JO41dWWHGUE-A zi9n~in4^n1ahYPHTTxykPiFkpl7>3`3idm{RyL_Rn341~hD}p_(gdtH)@M30#ATm{ zZzlZ(WZMucuUzJuvZUo(Pw6Ev-o`DD8=r$*Y{8z>_53hOE}K8Rvby1hp_MnfO^rnRbiBrCVojYKVHI5fF20E> ztZsB8&ai37e|mK-PJj4C)pHhc9yc^{ZXL{qUDr?@k7bW@X!7bO@b_fo*45&&7vT-m zku=Kf&zVO-FL3A8)Kx4T8|iU*(Y)&Uq(?=RuV+n}>N1>hy|{RH=(&}B)itCd8kHxC zbgJja;#PmSt8wEZ&J`*Z5?IL=lsC$4%*P8g&ZGRPoK#~Tkqk(N3J0gDR<@-M$`TAW z1vCYaO{LN=ky;LCfXB3but`F1(-=q5xW{^gN;3^p6!Xva>CQamcY#ZB=G81D^LP^- zXr+7QHB+Y|w?+d-sj)b@($&_^k3o%R#ShXW;f>217GVsP_(>G+YeDtklhZ)sjg1RS z%>Oi+q^4ZeJlY!<%~(woNJQWG6@ZB8fa8#(pMWj zVzDDJMq6yzgnV-vW+XBGdhl-@=Q56Zj(a#B;wW#JUm5oI7FaRTD3tGkwbSlSa7H8L5gMAXtlJbUH4PJ)3^VH!~H_+?j)nxWqjvbotapVzV7F$#wUzSFL z9lEtO)wK%;k2}j9#&8LmQaoy04AZ@!X_>?9$fol2656h*i;CT~;i z!rHne#w6v7lCeG0OR;}+1CBE|;GD?O!m)v4N7_+SGpE6;l@Sc2te>I`aaT<@rtaMg zy^N@)2~^ZAT7-)zaThh=_U6UhX(O*2Ic@yN>&DC8W+c75@eAoiH!Ox*TM%1sUO-2s z>4cZ_yqFqGQ>~Y~N8?Tzd6gX{lF)C5C7!ua&Hem2MkS-m8k+0{Ze>F?enSPZh$%|S zl`&SelPmQCmy}L~#ig;hW<5=fW@6Il;xs@@4IdnuaZ2hAyt#m3IF0<`!#&4oofK)( z%H~aPY#)Ji@rJr(G##4)eXE>l>Sp#ar>b&}m+Ar(VJq5Gy5lfbsFc6|WUcvBpRTu* zMofLt(Zs7Y&0*B1E|OuLRisfe<U{6hm9!Y~O@Zo8AW4yYi21{wwD3fr)?ZIY+y@?&brS7VlX@+)RRB?6iTLH}L8=+mplBl`53N#pl1;wAGt%!+*J zJc^Wv&b0DHW{81?yu}4G*QeGsvW~lvr9+phGb+`X!pzv*B`h4oa0hh@MWa!O$96D; zK0i4&#=!BqI=YJagI)E1*18+jzuC#<>3Po7y7Ee~@pD(5&?S3PjTkY)jqqFOBpbXs zKwCad+so%MF;w~*_~bdc`VAdjxzL6f7RB5=XTq$2b2&$?cg#o&-N(tO=NL0L;5;}l;H=}kjpIX(v&sWb4ac`RW^)h*=kLoGXZPZJfMZZ7fz9(*V$0%W{&`#)J57#BqvM2!4TEr#XS;xq*TC;qV%| zR^hsX|N2XZ5+g-0v7mTiLD=AwbACaTRCMMuL|YgvE0o$2Rb#;_1l}C8#v-ak#%alvvH#q`AY&mrow+!7uUg2?b$o zJ{SW2L-3n~^ArCuU^#3y)oTafF(mY8z{o868DL+3^-$ti!ulysb}l;K0GlH~a^7I` zYzBWF{GWXM%Qnw@!RP$?P-2*He&X>kSR>ef2oR5*mWS>PpY~c(udeDzahiljo(p_KYk|$ z`_rWTx!hEq^!lO1S>oy2bd9xX)lHQ6>xloI$Nx_8ZwXB-h=zU@fZH}mcfd`0tbw-Q z8;267ir2&fcaDdz0w0hCzYqM>Ecg@PBfxiAKGEQITOYf@U&})OI(SzW{2=&yS@2>S zUm^=$0-pEB!{sjp@1F&q4en;a^--HMv*7E%&&`5w1|OdVe+GOi_-Id`^`1WWf-lIR zccFO`yb=6$Y$92gq1S@8Hm$!Y;=XcjclP>L9Y%;hfq0gGY#Xd72+Iy8gI9xJf4Ch? zOSc2rWE|Rme)CY`5#;$8n~a9q!&z-oGCV>0@Y{zHcN4~rih~<$yW0)k41S@-U6=EI zuTeQr5TvMvU76=HU?}q*i)V?ru<+5J}~;v!i=ti zU!&`@{*Soj#F3@>N%rMnwHeq3u(=u7X0T})SO-{X8YUg@20IsQwsKJaFw^>l*THWE z|DDB)gRfbie^5L=Je2sFa4YXWNnV%B0lALzBjR`wZ_+06gJnsZP<~^f`71OVMT0*J z-sky$@FjdGW`b~jrvAb12h-LbXp4g{TiRyus)IfIio3yX0y8%wAeXKl1ltaluD@r% zo=n4(&mOP`!Kw)x9mH%to#1~@qZQACVBHy5QD4XTbp|#B?1c<$4A|BTY%18lrD2k1 zF4+BGXIpuS>(H;pN=w1FfM@GhB-_2j|D1T={>AHIu;;)kEw4y$uC2%I;KzRC^~1Iv zZ&y7k&3@vR5oc}yN$=O%GzY+c2>!VI6?GSSIMv@5Gyl0NaVW9Y&*#p9uuHfEd@HzK z-|72_NN7aT2PnTXXkH8?62}u3-)oRVZDRrW&%sYqT8%GGv12^Nts?H#P$E%4*z%n! z@s0c&iTfFGnf`%?_6+XpM>^XLwgXxpGvx>SF<6OsQ~m`o7VQD>pM$5{Q~r_ISQ@7E zF4&V`({1`l@T!8a>TeAA+u%{*o?jhwt8E?;pqa!U#p6V)y!bC^TyUqx9W7xsm0KBY zY-4<|gCq>&9Hm)DnsU>a_K!xL1ig;)q0I zl8q}4jZf9_0pcRLiNwj!sh${)IxfK?ly@Gu`l+N0Eup0v$4E};WHdBaK~pCh6@~$) z@TuSrfNPVc>NxlhYipI@>-+M?T3^Q7Q*tyD_f8)2`)N9De|j(Y4z}ra2v6xkxjmky zHY3k=Xs7Z0NYj>}sP*K06}$#~md_hwl$`H@KLQ^0@a51;U->M)ybS(TU(UNyat#&n0ZDN{Ey&FBUR>T=%!Sf*~AU!Ma*%VrZ~s|Mfu0UTfzTk@o4aEi?0L! z2HWV&yus@uWviRPzYgx(s(9#`f%RaISRRq!|FJywfS+=7BJrw^@3VL(_#5D!ED>K8 zhekKyn8Wb_;NJxQSD(*4mQMuSWjpR|KEA{o|A4oEZ}NOYavU59eLa{l4vs_n;jxJx zi+U5BKnD4<8HOcTgh1C$tUy^&UP0 zyb!$3;t{`n)PPrkU+3e~tqrXLzaRWf#^Y)?q0SJTJpV^rliO2QrvAa3GjNrC4|p3m z&q5fPLJL!6f0MY^c)R5_HZBsnI#u>u4DGm66Nx60sqDd9tZXiL9Q>z#nyogC{MA_E zP8^y@{6%R}ZPfE|k>Kk+-Ieii^`!YFX-*Zt!_$P0&+u_7>t@pIIPLIyc?SF?@CxNG zf5U`I^n1Zi;_c0U_wm13{7vu#INMt+J&r>3;iDX9*04n4As>Ih;)B4u!9TFL8+_M} zB}RikcRD%|&QClhgWYyUBC$Y#`q@g$V=nlAfPc~Ak>Coe*QMa+oS8^`)7R_2rt0Eu z;(kz)NKCP5+~6e3>tXOt@YO!AI|{-P!rQ^G;ky8*WYuXjG$4yk50GZ!h@=mS$Op-O zijJmz^L)@qD_3#o%#>Uu#GTED@iN;%Dfnb?*UIJ2_S(U0@G|hs_7n%d5xmaQC)>w5 z@F&1u^6?jJ`8I>sjY=dYs(oa!ne#(E4Nc|PN17F*6A6|DOwB=CTd&F%!Cy}_t zk6V{a;?|FL%&a%0ic=&kJ2> z*Fk&A1&PF&9@kns0weMmQwSfEm4b8?G2G*2;jRl*ZhAFQy{>=jO`i((Buisbz{tEanY+l8| zpIaH4!T)7!B5||Dqroa`hxdYagX6AEowo#2W5Oqh`!#Xti+`Z0g4>jQDg5T)V&$9Yn1%4a2uWyYn?*&@~c9v+dd9#-4tvji#9mKCBKAV2_ z5_b!6>Ej5M<4y27@N~VYZo?1?XINx@q8$J>A53BSvofy?5%7u(Ts$U&&jDvjX@0_H zgG~eT%cXql!AimOPzihog)U9`mvzK7^0|bI#eua+mJ=P9;AZfD1=ssud|gCCPbTY5 z?Q9n`XO*()-=j&kvuNnH^maBH+V`MsorF(j4v^_jE-BcU7i!Au=};h(>?Oz1-&~bl z=aY&1DRG&)o$KMgZWSK~`w_I)S{+0}tPrWccR4l?_d!`Au`;c!kTo$5IFje>9q!D13_0yljbwwFE+3C>HOwOGBB zLa)!do@ae#G<0^#XU-+={cGv(eSdm#DsDM(AI(f8{%rLS4Rxh#;a=i?c0GEqvPHDE z>=J$){G1!G?KJ&FLq$pbh-NP|Uzp9D&Fe4JcA}vxLcSjr%>ihxos&rDrPnE&IwLuk z70n`a8JK8KcYEtdU1?vEt0d{>4`DY~M7tdFrSzF6^$I2E7)mqsi#2p}R ze_bN6+0$cs9ZOpbM|w<9#joT9{QE751kaDlULv82l-*7y?&}SS#IHPlcN(4VRlV$x zLR^y6Ky!5*8p6`Kr;p$-G`WOIzGee7M>Hi8Ul0xB&jzLEtq@dg9WuAt z;$FPft2fobMjNMmb`v*i`Qh{3*TMf4{7Rcoaqu!*zJuU=pJFFvZNT`?2d(4C3IH1R-pX6(V>(7$J(@{NIJ6f~K(QwDw|xYw54AZ^KoegXK);Q!Xc zmp+p8rQ*2`n##3_#JPmkA5rzjCN_hA5&R|(4>Hjf{WIXZ!2fJb&15iqEGoHd58^ZZraEaf%X|_89E#P#B!j)Cxib0{2~v( z6gWMDvP4I5;?cfi4wwm5IT~e?m z5c*ayqxITx$Zpb&`C9g|PA73^5GNl>Udg$UGuYxxhm9Vu@al5__^HsxEuLJvi-4~L zA7gPh?$J*M{}y<;hX-%8Ha8c%6Fl8sB*Rkh--G`!hYM-v2RSkW>;H-S;@1<2TGgRC z{{5=TonN>^aV3DW0o;-1@>uzLom6P6&%TKDVVzXA_Hqo4Yz17JJB zOrPLk`KK_SY4_R@gWSl` z4E?X5H*KEulI?D=gBjR^U?*)(BoN#DME4BXnP6s)#I@{i57-p2uZYUeU+ryBur;&2 z9fbB#Xup3r?L+Cb((SNQ>G$tv>?2y)DgzVA5Cv}mH@=2z(ar#S8EhtD)lra}n!;~dL2 zocpLZKk)nvon>;YD!yx=Is5TM;&j5&FSqSXejC9{!83Kx0bbLQT(2zFdZkO!J>dTi z-XcC;UW0BMB)n3s4l12{ycvudpVxY?mvbRH-)%ky)?KgBVQE!QgF3R zcqQ*&&-8GA-e>9`>|$tFcs#fXWNc^^`2FC<2N9=wyBF-+VCil4VX!Z!VdA+3Y&qC$ z%hTNRbqVhS-vVAHJgJAvdg$RGG;cz)OEmZy?IUps7N6!g_x&)D*e={lTN3$T&TW3w0=l&Gl)CsCx`1%?X#Y^BI15eSiF;cTv_my^gd2HxDVQ$(7K}K zC*F^Py#%IsE8CUZWN0pzyFGfdZtBTBfO&{NZed91yammhq&H(&pT^sxruZTz9-%FX z#5lr!*#|7KEEFFh-X%U;deui6@#hggQt7cR?Zr~M1>jeH0^c>nFZ`Hz@qLi^HN?|& z#kWX%hg^bN!2bzcc}QNbubk=kv!Zz&nl@;t?sS@RpGNhP%fEHdoY|Ac`0ZGl+ZOF; z{)wL%6QuGqv~_8;F0^x@y&GCYNYA^%&s#LBp!sKLM)ah)*{4z29)zYHn&BRe=9l^N zsTbyrir+>2qr@A%Ba?}*w(+u?PU3$=ykD<(25&R-QpJUFIG#dDc&njp}K;!!?uT2D3dW;a= zc@UcQ(1<>*o{i40Pt&>j;Jwh^0qu+|v_YCnY7}Ps%shzZzl@59cP z(DphQ&pnNO{u^rzPja6Td<5s+EEo+fW)CtncYV)so@Ibg&^O>Lrt>d?HnM@Ws5fZa zKj7YWoc$~R$$G;+viK*~LAm}K=X0Ui)5u!PA06khTJBXojtziK;P^h_`=L97@Kw8* zo88NrDB+8a3^>mh1)LQw&!>FI`~yB$g16nxUO;5HlQgGqbezSU@8Q@C_7KP89Qy_b zoPQzRlZ2m#{u$0=?qQvgBZ%CI$LOz!zkzfQd<_{m9)Z_12IV(#ob*+EF?nquyq2S# zbdPX+hvVNkp5pikM+wJS9D{};BYL`&^8JLPwiEuImJ2!S=>7F-;L|ja;P+`X+2WP% z=xh=HA7L~J9K;sKoZs1Ea?wZZicILg{_i-FW;^7^`8AvWz5jYO(5r!74fJZDR|CBo z=+!{426{EntASn({14Q?{%1aU4d&D0{|6T7|5cHqX9Ufh(O>J&WX@YynwGjFB97k8 zQ(L|$=J@X;b9nh&qn_91*>2ur$W#8AY5nWw*O)z?aFx@1V2RVbni*^5E*?PntJD0# zfPnMp_<(a^b)fn9uLhbQc&J2y_VQd|r_S-|2 zeIZiL-rUzYBlsKhOqAA=gqLyXH_-WwlS!`}M87d7#mA=?o{j$0Kz4fJQJ#6x`a;iq zUvRYUpr7*s&)*Y&Sjhko!TgTQ;}jaSvVRz|qmDVjIlAz;W4$a^J2V6O&x zHPEYpUJdkWpjQLE8tBzPuLgQG(5nHffeU>_e8T+V)mq*Y7V-&u&%GMx)xiID4fOhh z|LqpgTmD`R^lG421HBsP)xgJV;4{xJbc3Y#*QLDV?+-Y8Is?vrUPydIimtEI=eY2!kQ0gqn*&>%xlWX~ zfevu;ojwjXGtB31^lzAc$*W{wV^PmvIQjGN@#YuE^0NdJ%rBVbr}*5Iod5rXE}b~> z0(aOo^Z2-1lRJ9Em=U9gpVefpMy(h%dPHRO=@#Wt*2V>VYKw1JIV0k+rEzCOL!G{g z=ZuIgm{Y~qhGNbLdp)nQ(HWsHIC_*MIe%#T5@V&yNAk_@c>eoz&uj=dW52?8g3N=)Hr}T@)uYp`t>_Q=mJUZCIbn4i z*OEIt+H7PH-Q4#B&Q^}cOT9==t{2p^{h#9eL%jUopP)O>zu+ty{r+#; Cri=yv literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/Makefile b/2/linux-0.11-lab/0/linux/Makefile new file mode 100644 index 0000000..ecbcf30 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/System.map b/2/linux-0.11-lab/0/linux/System.map new file mode 100644 index 0000000..d60f5ca --- /dev/null +++ b/2/linux-0.11-lab/0/linux/System.map @@ -0,0 +1,587 @@ +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 +00006bd3 T print_nr +00006c04 T show_task +00006c89 T show_stat +00006ccf T math_state_restore +00006d2d T schedule +00006edf T sys_pause +00006ef5 T sleep_on +00006f54 T interruptible_sleep_on +0000700f T ticks_to_floppy_on +000070da T floppy_on +00007109 T floppy_off +00007119 T do_floppy_timer +00007311 T do_timer +00007400 T sys_alarm +0000747f T sys_getpid +0000748b T sys_getppid +00007497 T sys_getuid +000074a6 T sys_geteuid +000074b6 T sys_getgid +000074c6 T sys_getegid +000074d5 T sys_nice +00007500 T sched_init +00007690 t bad_sys_call +00007698 t reschedule +000076a4 T system_call +000076df t ret_from_sys_call +00007728 T coprocessor_error +0000774a T device_not_available +00007784 T timer_interrupt +000077bc T sys_execve +000077cc T sys_execve2 +000077dc T sys_fork +000077f4 T hd_interrupt +00007830 T floppy_interrupt +00007866 T parallel_interrupt +0000786d t _get_base +0000789f t die +00007a81 T do_double_fault +00007aa4 T do_general_protection +00007ac7 T do_divide_error +00007aea T do_int3 +00007bb2 T do_nmi +00007bd5 T do_debug +00007bf8 T do_overflow +00007c1b T do_bounds +00007c3e T do_invalid_op +00007c61 T do_device_not_available +00007c84 T do_coprocessor_segment_overrun +00007ca7 T do_invalid_TSS +00007cca T do_segment_not_present +00007ced T do_stack_segment +00007d10 T do_coprocessor_error +00007d44 T do_reserved +00007d67 T trap_init +0000804b T divide_error +00008050 t no_error_code +00008080 T debug +00008087 T nmi +0000808e T int3 +00008095 T overflow +0000809c T bounds +000080a3 T invalid_op +000080aa T coprocessor_segment_overrun +000080b1 T reserved +000080b8 T irq13 +000080cd T double_fault +000080d2 t error_code +00008104 T invalid_TSS +0000810b T segment_not_present +00008112 T stack_segment +00008119 T general_protection +00008120 t _get_base +00008152 T verify_area +000081b9 T copy_mem +00008313 T copy_process +000087c0 T find_empty_process +00008854 T panic +0000888f T printk +000088e0 t skip_atoi +0000893b t number +00008bac T vsprintf +00009038 t get_fs_long +0000904e t put_fs_byte +00009066 t put_fs_long +00009072 T sys_ftime +00009078 T sys_break +0000907e T sys_ptrace +00009084 T sys_stty +0000908a T sys_gtty +00009090 T sys_rename +00009096 T sys_prof +0000909c T sys_setregid +00009155 T sys_setgid +000091ec T sys_acct +000091f2 T sys_phys +000091f8 T sys_lock +000091fe T sys_mpx +00009204 T sys_ulimit +0000920a T sys_time +00009266 T sys_setreuid +00009348 T sys_setuid +000093dd T sys_stime +00009433 T sys_times +000094d3 T sys_brk +00009515 T sys_setpgid +000095ee T sys_getpgrp +000095fa T sys_setsid +00009674 T sys_getgroups +0000967a T sys_setgroups +00009680 T sys_uname +000096e9 T sys_sethostname +000096ef T sys_getrlimit +000096f5 T sys_setrlimit +000096fb T sys_getrusage +00009701 T sys_gettimeofday +00009707 T sys_settimeofday +0000970d T sys_umask +00009740 T sys_getdents +000098d5 T sys_pipe2 +00009ad7 T sys_sleep +00009b10 T sys_getcwd +00009b16 T sys_mmap +00009b1c T sys_munmap +00009b22 T sys_clone +00009b28 t _get_base +00009b5a t put_fs_long +00009b66 T release +00009bca t send_sig +00009c49 t kill_session +00009ca3 T sys_kill +00009e53 t tell_father +00009edd T do_exit +0000a111 T sys_exit +0000a12a T sys_waitpid +0000a350 t get_fs_byte +0000a35e t put_fs_byte +0000a376 t put_fs_long +0000a382 T sys_sgetmask +0000a38e T sys_ssetmask +0000a3ba T sys_sigpending +0000a3c0 T sys_sigsuspend +0000a3c6 t save_old +0000a419 t get_new +0000a459 T sys_signal +0000a4dd T sys_sigaction +0000a5e7 T do_signal +0000a7d3 T kernel_mktime +0000a918 t oom +0000a937 T get_free_page +0000a973 T free_page +0000a9e2 T free_page_tables +0000aae1 T copy_page_tables +0000ac62 T put_page +0000ad4e T un_wp_page +0000ae06 T do_wp_page +0000ae91 T get_empty_page +0000aed1 t try_to_share +0000b063 t share_page +0000b117 T do_no_page +0000b2ac T do_no_page_myself +0000b40e T mem_init +0000b482 T calc_mem +0000b577 T page_fault +0000b5ae t get_fs_long +0000b5c4 T sys_ustat +0000b5ca T sys_utime +0000b677 T sys_access +0000b753 T sys_chdir +0000b7c7 T sys_chroot +0000b83b T sys_chmod +0000b8d5 T sys_chown +0000b950 T sys_open +0000bbf3 T sys_creat +0000bc16 T sys_close +0000bce5 T sys_lseek +0000bdfc T sys_read +0000bfef T sys_write +0000c19d t lock_inode +0000c1ca t unlock_inode +0000c1e8 T invalidate_inodes +0000c257 T sync_inodes +0000c2ae t _bmap +0000c69a T bmap +0000c6bd T create_block +0000c6e0 T iput +0000c84f T get_empty_inode +0000c9a4 T get_pipe_inode +0000ca19 T iget +0000cbde t read_inode +0000ce14 T sys_sync +0000ce77 T sync_dev +0000cf70 T invalidate_buffers +0000cfe2 T check_disk_change +0000d08c t remove_from_queues +0000d183 t insert_into_queues +0000d248 t find_buffer +0000d2b0 T get_hash_table +0000d332 T getblk +0000d4d0 T brelse +0000d519 T bread +0000d59e T bread_page +0000d6c0 T breada +0000d7b5 T buffer_init +0000d8e4 t lock_super +0000d911 t free_super +0000d956 T get_super +0000d9c5 T put_super +0000da98 t read_super +0000dddb T sys_umount +0000df3c T sys_mount +0000e0ad T mount_root +0000e2bb t get_fs_byte +0000e2c9 t put_fs_byte +0000e2e1 T block_write +0000e433 T block_read +0000e55e t get_fs_byte +0000e56c t put_fs_byte +0000e584 t rw_ttyx +0000e5cc t rw_tty +0000e61c t rw_ram +0000e622 t rw_mem +0000e628 t rw_kmem +0000e62e t rw_port +0000e6c8 t rw_memory +0000e79e T rw_char +0000e808 t get_fs_byte +0000e816 t put_fs_byte +0000e82e T file_read +0000e9d9 T file_write +0000ebd3 t put_fs_byte +0000ebeb t cp_stat +0000ecc2 T sys_stat +0000ed0c T sys_lstat +0000ed27 T sys_fstat +0000ed84 T sys_readlink +0000ed8a t _get_base +0000edbc t get_fs_byte +0000edca t get_fs_long +0000ede0 t put_fs_byte +0000edf8 t put_fs_long +0000ee04 t get_fs +0000ee18 t get_ds +0000ee2c t set_fs +0000ee33 T sys_uselib +0000ee39 t create_tables +0000ef84 t count +0000efc3 t copy_strings +0000f17f t change_ldt +0000f302 T do_execve +0000fd84 T do_execve2 +0001085e t get_fs_byte +0001086c t put_fs_byte +00010884 t put_fs_long +00010890 T read_pipe +00010b65 T sys_pipe +00010d67 t get_fs_byte +00010d75 t permission +00010e16 t match +00010e7e t find_entry +000112d8 t get_dir +000114c5 t dir_namei +00011544 T namei +0001165a T open_namei +000119ad T sys_mknod +00011bdd T sys_mkdir +00011f8e t empty_dir +0001216c T sys_rmdir +000124c4 T sys_unlink +00012765 T sys_symlink +0001276b T sys_link +000129c5 T free_block +00012b37 T new_block +00012cdb T free_inode +00012e42 T new_inode +0001301c t dupfd +000130f6 T sys_dup2 +0001311d T sys_dup +00013138 T sys_fcntl +00013277 T sys_ioctl +00013348 t free_ind +000133e7 t free_dind +00013486 T truncate +000135bb T sys_select +000135c1 t lock_buffer +000135ee t unlock_buffer +000137e0 t make_request +00013984 T ll_rw_block +000139dd T blk_dev_init +00013a2b t unlock_buffer +00013a60 t end_request +00013b11 T floppy_deselect +00013b48 T floppy_change +00013bce t setup_DMA +00013c84 t output_byte +00013cfa t result +00013db7 t bad_flp_intr +00013e16 t rw_interrupt +00013f05 T setup_rw_floppy +00013fc6 t seek_interrupt +0001401f t transfer +00014154 t recal_interrupt +0001419e T unexpected_floppy_interrupt +000141e3 t recalibrate_floppy +00014245 t reset_interrupt +0001428a t reset_floppy +00014307 t floppy_on_interrupt +00014372 t do_fd_request +00014576 T floppy_init +000145c8 t unlock_buffer +000145fd t end_request +0001469c T sys_setup +00014a4f t controller_ready +00014ae3 t hd_out +00014bd0 t drive_busy +00014c36 t reset_controller +00014cb3 t reset_hd +00014d4b T unexpected_hd_interrupt +00014d5e t bad_rw_intr +00014d9c t read_intr +00014ec2 t recal_intr +00014edc t do_hd_request +000151dd T hd_init +00015257 t unlock_buffer +0001528c t end_request +0001532b t do_rd_request +00015461 T rd_init +000154b7 T rd_load +00015763 t get_fs_byte +00015771 t put_fs_byte +00015789 T tty_init +0001579a T tty_intr +0001580e t sleep_if_empty +00015846 t sleep_if_full +000158ba T copy_to_cooked +00015e75 T tty_read +000161e3 T tty_write +000163f5 T do_tty_interrupt +0001641d T chr_dev_init +0001641e t gotoxy +0001646c t set_origin +000164d2 t scrup +000166c2 t scrdown +000167b9 t lf +000167ef t ri +00016825 t cr +00016846 t del +00016878 t csi_J +00016909 t csi_K +000169bb T csi_m +00016a22 t set_cursor +00016a88 t respond +00016ae0 t insert_char +00016b43 t insert_line +00016b87 t delete_char +00016be5 t delete_line +00016c29 t csi_at +00016c67 t csi_L +00016ca5 t csi_P +00016ce3 t csi_M +00016d21 t save_cur +00016d36 t restore_cur +00016d55 T con_write +000173e3 T con_init +0001761a T sysbeepstop +00017643 t sysbeep +000176a1 t mode +000176a2 t leds +000176a3 t e0 +000176a4 T keyboard_interrupt +000176cd t e0_e1 +000176f8 t set_e0 +00017701 t set_e1 +0001770a t put_queue +00017743 t ctrl +0001775b t unctrl +0001775f t unalt +00017775 t lshift +0001777d t unlshift +00017785 t rshift +0001778d t unrshift +00017795 t caps +000177b7 t set_leds +000177cd t uncaps +000177d5 t scroll +000177de t num +000177e7 t cursor +00017807 t cur2 +00017830 t cur +0001783c t ok_cur +0001784a t num_table +00017857 t cur_table +00017864 t func +00017881 t ok_func +00017894 t end_func +00017895 t func_table +000178c5 t key_map +00017926 t shift_map +000179e8 t do_self +00017a50 t none +00017a51 t minus +00017a66 t key_table +00017e66 t kb_wait +00017e6f t reboot +00017e81 t die +00017e83 t init +00017ef8 T rs_init +00017f7b T rs_write +00017fc8 T rs1_interrupt +00017fd0 T rs2_interrupt +00017fd5 t rs_int +00017fec t rep_int +00018009 t end +00018017 t jmp_table +00018028 t modem_status +00018030 t line_status +00018038 t read_char +000180bf t get_fs_byte +000180cd t get_fs_long +000180e3 t put_fs_byte +000180fb t put_fs_long +00018107 t change_speed +00018185 t flush +00018197 t send_break +00018198 t get_termios +000181f4 t set_termios +00018244 t get_termio +0001830c t set_termio +000183d0 T tty_ioctl +000186ce t get_fs_byte +000186dc T math_emulate +000187bf T math_error +000187df T _exit +000187ef T open +00018838 T close +000188ac T dup +000188e3 T setsid +00018912 T execve +000189af T strcpy +000189cb T strncpy +000189f0 T strcat +00018a1b T strncat +00018a50 T strcmp +00018a77 T strncmp +00018aa5 T strchr +00018ad2 T strrchr +00018b01 T strspn +00018b3e T strcspn +00018b7b T strpbrk +00018bb2 T strstr +00018beb T strlen +00018c0e T strtok +00018c91 T memcpy +00018cb1 T memmove +00018d05 T memcmp +00018d2f T memchr +00018d67 T memset +0001cd48 d envp_rc +0001cd5c d envp +0001cd80 D sys_call_table +0001cefc D NR_syscalls +0001cf00 d init_task +0001df00 D current +0001df20 D task +0001e020 D stack_start +0001e028 D current_DOR +0001e040 d thisname.2124 +0001e080 d month +0001e0c0 d last_inode.1935 +0001e0c4 D start_buffer +0001e0e0 d crw_table +0001e100 d ioctl_table +0001e120 d floppy_type +0001e1e0 d cur_spec1 +0001e1e4 d cur_rate +0001e1e8 d floppy +0001e1ec d current_track +0001e1f0 d callable.1844 +0001e200 D tty_table +00020720 D table_list +00020740 d quotient +00020760 D _ctype +00020861 B __bss_start +00020861 D _edata +00020880 b printbuf +00020c80 b memory_end +00020c84 b buffer_memory_end +00020c88 b main_memory_start +00020ca0 B jiffies +00020ca4 B startup_time +00020ca8 B last_task_used_math +00020cbc b mon_timer +00020ccc b moff_timer +00020ce0 b timer_list +00020fe0 b next_timer +00020fe4 B last_pid +00021000 b buf +00021400 b HIGH_MEMORY +00021420 b mem_map +00022320 B inode_table +00022a20 B nr_buffers +00022a24 b free_list +00022a28 b buffer_wait +00022a2c B ROOT_DEV +00022a60 B blk_dev +00022a98 B do_floppy +00022a9c B selected +00022aa4 b recalibrate +00022aa8 b reset +00022aac b seek +00022ab0 b reply_buffer +00022ab7 b current_drive +00022ab8 b sector +00022ab9 b head +00022aba b track +00022abb b seek_track +00022abc b command +00022ac0 B do_hd +00022ae0 B hd_info +00022b10 b recalibrate +00022b14 b reset +00022b18 b NR_HD +00022b20 b hd +00022b70 B rd_length +00022b74 b cr_flag.1923 +00022b80 B beepcount +00022b84 b video_type +00022b88 b video_num_columns +00022b8c b video_size_row +00022b90 b video_num_lines +00022b94 b video_page +00022b98 b video_mem_start +00022b9c b video_mem_end +00022ba0 b video_port_reg +00022ba2 b video_port_val +00022ba4 b video_erase_char +00022ba8 b origin +00022bac b scr_end +00022bb0 b pos +00022bb4 b x +00022bb8 b y +00022bbc b top +00022bc0 b bottom +00022bc4 b state +00022bc8 b npar +00022be0 b par +00022c20 b ques +00022c24 b saved_x +00022c28 b saved_y +00022c40 B drive_info +00022c60 B user_stack +00023c60 B hash_table +00024140 B super_block +000244a0 B file_table +000248a0 B request +00024d20 B rd_start +00024d24 B _ctmp +00024d28 B errno +00024d2c B ___strtok +00024d30 B end +00024d30 B _end diff --git a/2/linux-0.11-lab/0/linux/System.map.2 b/2/linux-0.11-lab/0/linux/System.map.2 new file mode 100644 index 0000000..b8c6d84 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/System.map.2 @@ -0,0 +1,1084 @@ +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 0x18d8b + *(.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 0x744 init/main.o + 0x00000000000064c0 fork + 0x00000000000064ef pause + 0x000000000000651e setup + 0x0000000000006555 sync + 0x0000000000006799 main + 0x000000000000695b init + 0x0000000000006bd3 print_nr + .text 0x0000000000006c04 0x3d14 kernel/kernel.o + 0x0000000000006c04 show_task + 0x0000000000006c89 show_stat + 0x0000000000006ccf math_state_restore + 0x0000000000006d2d schedule + 0x0000000000006edf sys_pause + 0x0000000000006ef5 sleep_on + 0x0000000000006f54 interruptible_sleep_on + 0x0000000000006fe7 wake_up + 0x000000000000700f ticks_to_floppy_on + 0x00000000000070da floppy_on + 0x0000000000007109 floppy_off + 0x0000000000007119 do_floppy_timer + 0x00000000000071ed add_timer + 0x0000000000007311 do_timer + 0x0000000000007400 sys_alarm + 0x000000000000747f sys_getpid + 0x000000000000748b sys_getppid + 0x0000000000007497 sys_getuid + 0x00000000000074a6 sys_geteuid + 0x00000000000074b6 sys_getgid + 0x00000000000074c6 sys_getegid + 0x00000000000074d5 sys_nice + 0x0000000000007500 sched_init + 0x00000000000076a4 system_call + 0x0000000000007728 coprocessor_error + 0x000000000000774a device_not_available + 0x0000000000007784 timer_interrupt + 0x00000000000077bc sys_execve + 0x00000000000077cc sys_execve2 + 0x00000000000077dc sys_fork + 0x00000000000077f4 hd_interrupt + 0x0000000000007830 floppy_interrupt + 0x0000000000007866 parallel_interrupt + 0x0000000000007a81 do_double_fault + 0x0000000000007aa4 do_general_protection + 0x0000000000007ac7 do_divide_error + 0x0000000000007aea do_int3 + 0x0000000000007bb2 do_nmi + 0x0000000000007bd5 do_debug + 0x0000000000007bf8 do_overflow + 0x0000000000007c1b do_bounds + 0x0000000000007c3e do_invalid_op + 0x0000000000007c61 do_device_not_available + 0x0000000000007c84 do_coprocessor_segment_overrun + 0x0000000000007ca7 do_invalid_TSS + 0x0000000000007cca do_segment_not_present + 0x0000000000007ced do_stack_segment + 0x0000000000007d10 do_coprocessor_error + 0x0000000000007d44 do_reserved + 0x0000000000007d67 trap_init + 0x000000000000804b divide_error + 0x0000000000008080 debug + 0x0000000000008087 nmi + 0x000000000000808e int3 + 0x0000000000008095 overflow + 0x000000000000809c bounds + 0x00000000000080a3 invalid_op + 0x00000000000080aa coprocessor_segment_overrun + 0x00000000000080b1 reserved + 0x00000000000080b8 irq13 + 0x00000000000080cd double_fault + 0x0000000000008104 invalid_TSS + 0x000000000000810b segment_not_present + 0x0000000000008112 stack_segment + 0x0000000000008119 general_protection + 0x0000000000008152 verify_area + 0x00000000000081b9 copy_mem + 0x0000000000008313 copy_process + 0x00000000000087c0 find_empty_process + 0x0000000000008854 panic + 0x000000000000888f printk + 0x0000000000008bac vsprintf + 0x0000000000009072 sys_ftime + 0x0000000000009078 sys_break + 0x000000000000907e sys_ptrace + 0x0000000000009084 sys_stty + 0x000000000000908a sys_gtty + 0x0000000000009090 sys_rename + 0x0000000000009096 sys_prof + 0x000000000000909c sys_setregid + 0x0000000000009155 sys_setgid + 0x00000000000091ec sys_acct + 0x00000000000091f2 sys_phys + 0x00000000000091f8 sys_lock + 0x00000000000091fe sys_mpx + 0x0000000000009204 sys_ulimit + 0x000000000000920a sys_time + 0x0000000000009266 sys_setreuid + 0x0000000000009348 sys_setuid + 0x00000000000093dd sys_stime + 0x0000000000009433 sys_times + 0x00000000000094d3 sys_brk + 0x0000000000009515 sys_setpgid + 0x00000000000095ee sys_getpgrp + 0x00000000000095fa sys_setsid + 0x0000000000009674 sys_getgroups + 0x000000000000967a sys_setgroups + 0x0000000000009680 sys_uname + 0x00000000000096e9 sys_sethostname + 0x00000000000096ef sys_getrlimit + 0x00000000000096f5 sys_setrlimit + 0x00000000000096fb sys_getrusage + 0x0000000000009701 sys_gettimeofday + 0x0000000000009707 sys_settimeofday + 0x000000000000970d sys_umask + 0x0000000000009740 sys_getdents + 0x00000000000098d5 sys_pipe2 + 0x0000000000009ad7 sys_sleep + 0x0000000000009b10 sys_getcwd + 0x0000000000009b16 sys_mmap + 0x0000000000009b1c sys_munmap + 0x0000000000009b22 sys_clone + 0x0000000000009b66 release + 0x0000000000009ca3 sys_kill + 0x0000000000009edd do_exit + 0x000000000000a111 sys_exit + 0x000000000000a12a sys_waitpid + 0x000000000000a382 sys_sgetmask + 0x000000000000a38e sys_ssetmask + 0x000000000000a3ba sys_sigpending + 0x000000000000a3c0 sys_sigsuspend + 0x000000000000a459 sys_signal + 0x000000000000a4dd sys_sigaction + 0x000000000000a5e7 do_signal + 0x000000000000a7d3 kernel_mktime + .text 0x000000000000a918 0xc96 mm/mm.o + 0x000000000000a937 get_free_page + 0x000000000000a973 free_page + 0x000000000000a9e2 free_page_tables + 0x000000000000aae1 copy_page_tables + 0x000000000000ac62 put_page + 0x000000000000ad4e un_wp_page + 0x000000000000ae06 do_wp_page + 0x000000000000ae38 write_verify + 0x000000000000ae91 get_empty_page + 0x000000000000b117 do_no_page + 0x000000000000b2ac do_no_page_myself + 0x000000000000b40e mem_init + 0x000000000000b482 calc_mem + 0x000000000000b577 page_fault + .text 0x000000000000b5ae 0x8013 fs/fs.o + 0x000000000000b5c4 sys_ustat + 0x000000000000b5ca sys_utime + 0x000000000000b677 sys_access + 0x000000000000b753 sys_chdir + 0x000000000000b7c7 sys_chroot + 0x000000000000b83b sys_chmod + 0x000000000000b8d5 sys_chown + 0x000000000000b950 sys_open + 0x000000000000bbf3 sys_creat + 0x000000000000bc16 sys_close + 0x000000000000bce5 sys_lseek + 0x000000000000bdfc sys_read + 0x000000000000bfef sys_write + 0x000000000000c1e8 invalidate_inodes + 0x000000000000c257 sync_inodes + 0x000000000000c69a bmap + 0x000000000000c6bd create_block + 0x000000000000c6e0 iput + 0x000000000000c84f get_empty_inode + 0x000000000000c9a4 get_pipe_inode + 0x000000000000ca19 iget + 0x000000000000ce14 sys_sync + 0x000000000000ce77 sync_dev + 0x000000000000cf70 invalidate_buffers + 0x000000000000cfe2 check_disk_change + 0x000000000000d2b0 get_hash_table + 0x000000000000d332 getblk + 0x000000000000d4d0 brelse + 0x000000000000d519 bread + 0x000000000000d59e bread_page + 0x000000000000d6c0 breada + 0x000000000000d7b5 buffer_init + 0x000000000000d956 get_super + 0x000000000000d9c5 put_super + 0x000000000000dddb sys_umount + 0x000000000000df3c sys_mount + 0x000000000000e0ad mount_root + 0x000000000000e2e1 block_write + 0x000000000000e433 block_read + 0x000000000000e79e rw_char + 0x000000000000e82e file_read + 0x000000000000e9d9 file_write + 0x000000000000ecc2 sys_stat + 0x000000000000ed0c sys_lstat + 0x000000000000ed27 sys_fstat + 0x000000000000ed84 sys_readlink + 0x000000000000ee33 sys_uselib + 0x000000000000f302 do_execve + 0x000000000000fd84 do_execve2 + 0x0000000000010890 read_pipe + 0x00000000000109e6 write_pipe + 0x0000000000010b65 sys_pipe + 0x0000000000011544 namei + 0x000000000001165a open_namei + 0x00000000000119ad sys_mknod + 0x0000000000011bdd sys_mkdir + 0x000000000001216c sys_rmdir + 0x00000000000124c4 sys_unlink + 0x0000000000012765 sys_symlink + 0x000000000001276b sys_link + 0x00000000000129c5 free_block + 0x0000000000012b37 new_block + 0x0000000000012cdb free_inode + 0x0000000000012e42 new_inode + 0x00000000000130f6 sys_dup2 + 0x000000000001311d sys_dup + 0x0000000000013138 sys_fcntl + 0x0000000000013277 sys_ioctl + 0x0000000000013486 truncate + 0x00000000000135bb sys_select + .text 0x00000000000135c1 0x46a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000013984 ll_rw_block + 0x00000000000139dd blk_dev_init + .text 0x0000000000013a2b 0xb9d kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000013b11 floppy_deselect + 0x0000000000013b48 floppy_change + 0x0000000000013f05 setup_rw_floppy + 0x000000000001419e unexpected_floppy_interrupt + 0x0000000000014576 floppy_init + .text 0x00000000000145c8 0xc8f kernel/blk_drv/blk_drv.a(hd.o) + 0x000000000001469c sys_setup + 0x0000000000014d4b unexpected_hd_interrupt + 0x00000000000151dd hd_init + .text 0x0000000000015257 0x50c kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000015461 rd_init + 0x00000000000154b7 rd_load + .text 0x0000000000015763 0xcbb kernel/chr_drv/chr_drv.a(tty_io.o) + 0x0000000000015789 tty_init + 0x000000000001579a tty_intr + 0x00000000000158a7 wait_for_keypress + 0x00000000000158ba copy_to_cooked + 0x0000000000015e75 tty_read + 0x00000000000161e3 tty_write + 0x00000000000163f5 do_tty_interrupt + 0x000000000001641d chr_dev_init + .text 0x000000000001641e 0x1283 kernel/chr_drv/chr_drv.a(console.o) + 0x00000000000169bb csi_m + 0x0000000000016d55 con_write + 0x00000000000173e3 con_init + 0x000000000001761a sysbeepstop + .text 0x00000000000176a1 0x7e2 kernel/chr_drv/chr_drv.a(keyboard.2.o) + 0x00000000000176a4 keyboard_interrupt + .text 0x0000000000017e83 0x145 kernel/chr_drv/chr_drv.a(serial.o) + 0x0000000000017ef8 rs_init + 0x0000000000017f7b rs_write + .text 0x0000000000017fc8 0xf7 kernel/chr_drv/chr_drv.a(rs_io.o) + 0x0000000000017fc8 rs1_interrupt + 0x0000000000017fd0 rs2_interrupt + .text 0x00000000000180bf 0x60f kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x00000000000183d0 tty_ioctl + .text 0x00000000000186ce 0x111 kernel/math/math.a(math_emulate.o) + 0x00000000000186dc math_emulate + 0x00000000000187bf math_error + .text 0x00000000000187df 0x0 lib/lib.a(ctype.o) + .text 0x00000000000187df 0x10 lib/lib.a(_exit.o) + 0x00000000000187df _exit + .text 0x00000000000187ef 0x49 lib/lib.a(open.o) + 0x00000000000187ef open + .text 0x0000000000018838 0x37 lib/lib.a(close.o) + 0x0000000000018838 close + .text 0x000000000001886f 0x0 lib/lib.a(errno.o) + .text 0x000000000001886f 0x3d lib/lib.a(write.o) + 0x000000000001886f write + .text 0x00000000000188ac 0x37 lib/lib.a(dup.o) + 0x00000000000188ac dup + .text 0x00000000000188e3 0x2f lib/lib.a(setsid.o) + 0x00000000000188e3 setsid + .text 0x0000000000018912 0x3d lib/lib.a(execve.o) + 0x0000000000018912 execve + .text 0x000000000001894f 0x60 lib/lib.a(wait.o) + 0x000000000001894f waitpid + 0x000000000001898c wait + .text 0x00000000000189af 0x3dc lib/lib.a(string.o) + 0x00000000000189af strcpy + 0x00000000000189cb strncpy + 0x00000000000189f0 strcat + 0x0000000000018a1b strncat + 0x0000000000018a50 strcmp + 0x0000000000018a77 strncmp + 0x0000000000018aa5 strchr + 0x0000000000018ad2 strrchr + 0x0000000000018b01 strspn + 0x0000000000018b3e strcspn + 0x0000000000018b7b strpbrk + 0x0000000000018bb2 strstr + 0x0000000000018beb strlen + 0x0000000000018c0e strtok + 0x0000000000018c91 memcpy + 0x0000000000018cb1 memmove + 0x0000000000018d05 memcmp + 0x0000000000018d2f memchr + 0x0000000000018d67 memset + *(.gnu.warning) + +.fini + *(SORT(.fini)) + 0x0000000000018d8b PROVIDE (__etext, .) + 0x0000000000018d8b PROVIDE (_etext, .) + 0x0000000000018d8b PROVIDE (etext, .) + +.rodata 0x0000000000018d8c 0x140e + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata 0x0000000000018d8c 0xc9 init/main.o + *fill* 0x0000000000018e55 0x3 + .rodata 0x0000000000018e58 0x438 kernel/kernel.o + .rodata 0x0000000000019290 0x1b5 mm/mm.o + *fill* 0x0000000000019445 0x3 + .rodata 0x0000000000019448 0x62c fs/fs.o + .rodata 0x0000000000019a74 0x7a kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + *fill* 0x0000000000019aee 0x2 + .rodata 0x0000000000019af0 0x133 kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x0000000000019c23 0x1 + .rodata 0x0000000000019c24 0x19b kernel/blk_drv/blk_drv.a(hd.o) + *fill* 0x0000000000019dbf 0x1 + .rodata 0x0000000000019dc0 0x188 kernel/blk_drv/blk_drv.a(ramdisk.o) + .rodata 0x0000000000019f48 0x17d kernel/chr_drv/chr_drv.a(console.o) + *fill* 0x000000000001a0c5 0x3 + .rodata 0x000000000001a0c8 0x80 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .rodata 0x000000000001a148 0x52 kernel/math/math.a(math_emulate.o) + +.rodata1 + *(.rodata1) + +.eh_frame_hdr + *(.eh_frame_hdr) + +.eh_frame 0x000000000001a19c 0x2b88 + *(.eh_frame) + .eh_frame 0x000000000001a19c 0x108 init/main.o + .eh_frame 0x000000000001a2a4 0xbb4 kernel/kernel.o + 0xca4 (size before relaxing) + .eh_frame 0x000000000001ae58 0x1b0 mm/mm.o + 0x1c8 (size before relaxing) + .eh_frame 0x000000000001b008 0xe10 fs/fs.o + 0xfa8 (size before relaxing) + .eh_frame 0x000000000001be18 0x98 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0xb0 (size before relaxing) + .eh_frame 0x000000000001beb0 0x23c kernel/blk_drv/blk_drv.a(floppy.o) + 0x254 (size before relaxing) + .eh_frame 0x000000000001c0ec 0x1e8 kernel/blk_drv/blk_drv.a(hd.o) + 0x200 (size before relaxing) + .eh_frame 0x000000000001c2d4 0xac kernel/blk_drv/blk_drv.a(ramdisk.o) + 0xc4 (size before relaxing) + .eh_frame 0x000000000001c380 0x12c kernel/chr_drv/chr_drv.a(tty_io.o) + 0x144 (size before relaxing) + .eh_frame 0x000000000001c4ac 0x2c0 kernel/chr_drv/chr_drv.a(console.o) + 0x2d8 (size before relaxing) + .eh_frame 0x000000000001c76c 0x54 kernel/chr_drv/chr_drv.a(serial.o) + 0x6c (size before relaxing) + .eh_frame 0x000000000001c7c0 0x148 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x160 (size before relaxing) + .eh_frame 0x000000000001c908 0x5c kernel/math/math.a(math_emulate.o) + 0x74 (size before relaxing) + .eh_frame 0x000000000001c964 0x1c lib/lib.a(_exit.o) + 0x34 (size before relaxing) + .eh_frame 0x000000000001c980 0x24 lib/lib.a(open.o) + 0x3c (size before relaxing) + .eh_frame 0x000000000001c9a4 0x20 lib/lib.a(close.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001c9c4 0x20 lib/lib.a(write.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001c9e4 0x20 lib/lib.a(dup.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001ca04 0x18 lib/lib.a(setsid.o) + 0x30 (size before relaxing) + .eh_frame 0x000000000001ca1c 0x20 lib/lib.a(execve.o) + 0x38 (size before relaxing) + .eh_frame 0x000000000001ca3c 0x38 lib/lib.a(wait.o) + 0x50 (size before relaxing) + .eh_frame 0x000000000001ca74 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*) + 0x000000000001cd24 . = . + +.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 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x000000000001cd24 PROVIDE (__preinit_array_end, .) + +.init_array 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*) SORT(.ctors.*)) + *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors) + 0x000000000001cd24 PROVIDE (__init_array_end, .) + +.fini_array 0x000000000001cd24 0x0 + 0x000000000001cd24 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*) SORT(.dtors.*)) + *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors) + 0x000000000001cd24 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 0x000000000001cd24 0x0 + *(.got.plt) + *(.igot.plt) + .igot.plt 0x0000000000000000 0x0 boot/head.o + +.data 0x000000000001cd40 0x3b21 + *(.data .data.* .gnu.linkonce.d.*) + .data 0x000000000001cd40 0x0 boot/head.o + .data 0x000000000001cd40 0x28 init/main.o + *fill* 0x000000000001cd68 0x18 + .data 0x000000000001cd80 0x1330 kernel/kernel.o + 0x000000000001cd80 sys_call_table + 0x000000000001cefc NR_syscalls + 0x000000000001df00 current + 0x000000000001df20 task + 0x000000000001e020 stack_start + 0x000000000001e028 current_DOR + .data 0x000000000001e0b0 0x0 mm/mm.o + *fill* 0x000000000001e0b0 0x10 + .data 0x000000000001e0c0 0x60 fs/fs.o + 0x000000000001e0c4 start_buffer + .data 0x000000000001e120 0x0 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .data 0x000000000001e120 0xcd kernel/blk_drv/blk_drv.a(floppy.o) + *fill* 0x000000000001e1ed 0x3 + .data 0x000000000001e1f0 0x4 kernel/blk_drv/blk_drv.a(hd.o) + .data 0x000000000001e1f4 0x0 kernel/blk_drv/blk_drv.a(ramdisk.o) + *fill* 0x000000000001e1f4 0xc + .data 0x000000000001e200 0x2538 kernel/chr_drv/chr_drv.a(tty_io.o) + 0x000000000001e200 tty_table + 0x0000000000020720 table_list + .data 0x0000000000020738 0x1 kernel/chr_drv/chr_drv.a(console.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .data 0x0000000000020739 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + *fill* 0x0000000000020739 0x7 + .data 0x0000000000020740 0x20 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .data 0x0000000000020760 0x0 kernel/math/math.a(math_emulate.o) + .data 0x0000000000020760 0x101 lib/lib.a(ctype.o) + 0x0000000000020760 _ctype + .data 0x0000000000020861 0x0 lib/lib.a(_exit.o) + .data 0x0000000000020861 0x0 lib/lib.a(open.o) + .data 0x0000000000020861 0x0 lib/lib.a(close.o) + .data 0x0000000000020861 0x0 lib/lib.a(errno.o) + .data 0x0000000000020861 0x0 lib/lib.a(write.o) + .data 0x0000000000020861 0x0 lib/lib.a(dup.o) + .data 0x0000000000020861 0x0 lib/lib.a(setsid.o) + .data 0x0000000000020861 0x0 lib/lib.a(execve.o) + .data 0x0000000000020861 0x0 lib/lib.a(wait.o) + .data 0x0000000000020861 0x0 lib/lib.a(string.o) + +.data1 + *(.data1) + 0x0000000000020861 _edata = . + 0x0000000000020861 PROVIDE (edata, .) + 0x0000000000020861 . = . + 0x0000000000020861 __bss_start = . + +.bss 0x0000000000020880 0x44b0 + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + .bss 0x0000000000020880 0x0 boot/head.o + .bss 0x0000000000020880 0x40c init/main.o + *fill* 0x0000000000020c8c 0x14 + .bss 0x0000000000020ca0 0x760 kernel/kernel.o + 0x0000000000020ca0 jiffies + 0x0000000000020ca4 startup_time + 0x0000000000020ca8 last_task_used_math + 0x0000000000020fe4 last_pid + .bss 0x0000000000021400 0xf20 mm/mm.o + .bss 0x0000000000022320 0x710 fs/fs.o + 0x0000000000022320 inode_table + 0x0000000000022a20 nr_buffers + 0x0000000000022a2c ROOT_DEV + *fill* 0x0000000000022a30 0x10 + .bss 0x0000000000022a40 0x58 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x0000000000022a40 wait_for_request + 0x0000000000022a60 blk_dev + .bss 0x0000000000022a98 0x25 kernel/blk_drv/blk_drv.a(floppy.o) + 0x0000000000022a98 do_floppy + 0x0000000000022a9c selected + 0x0000000000022aa0 wait_on_floppy_select + *fill* 0x0000000000022abd 0x3 + .bss 0x0000000000022ac0 0xb0 kernel/blk_drv/blk_drv.a(hd.o) + 0x0000000000022ac0 do_hd + 0x0000000000022ae0 hd_info + .bss 0x0000000000022b70 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000022b70 rd_length + .bss 0x0000000000022b74 0x4 kernel/chr_drv/chr_drv.a(tty_io.o) + *fill* 0x0000000000022b78 0x8 + .bss 0x0000000000022b80 0xac kernel/chr_drv/chr_drv.a(console.o) + 0x0000000000022b80 beepcount + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(keyboard.2.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(serial.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(rs_io.o) + .bss 0x0000000000022c2c 0x0 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .bss 0x0000000000022c2c 0x0 kernel/math/math.a(math_emulate.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(ctype.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(_exit.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(open.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(close.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(errno.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(write.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(dup.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(setsid.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(execve.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(wait.o) + .bss 0x0000000000022c2c 0x0 lib/lib.a(string.o) + *(COMMON) + *fill* 0x0000000000022c2c 0x14 + COMMON 0x0000000000022c40 0x20 init/main.o + 0x0000000000022c40 drive_info + COMMON 0x0000000000022c60 0x1000 kernel/kernel.o + 0x0000000000022c60 user_stack + COMMON 0x0000000000023c60 0xc40 fs/fs.o + 0x0000000000023c60 hash_table + 0x0000000000024140 super_block + 0x00000000000244a0 file_table + COMMON 0x00000000000248a0 0x480 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x00000000000248a0 request + COMMON 0x0000000000024d20 0x4 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x0000000000024d20 rd_start + COMMON 0x0000000000024d24 0x1 lib/lib.a(ctype.o) + 0x0000000000024d24 _ctmp + *fill* 0x0000000000024d25 0x3 + COMMON 0x0000000000024d28 0x4 lib/lib.a(errno.o) + 0x0000000000024d28 errno + COMMON 0x0000000000024d2c 0x4 lib/lib.a(string.o) + 0x0000000000024d2c ___strtok + 0x0000000000024d30 . = ALIGN ((. != 0x0)?0x4:0x1) + 0x0000000000024d30 . = ALIGN (0x4) + 0x0000000000024d30 . = SEGMENT_START ("ldata-segment", .) + 0x0000000000024d30 . = ALIGN (0x4) + 0x0000000000024d30 _end = . + 0x0000000000024d30 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 0x17a4b + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x0000000000000000 0xb73 init/main.o + .debug_info 0x0000000000000b73 0x513a kernel/kernel.o + .debug_info 0x0000000000005cad 0xba8 mm/mm.o + .debug_info 0x0000000000006855 0xa497 fs/fs.o + .debug_info 0x0000000000010cec 0x932 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_info 0x000000000001161e 0xc9f kernel/blk_drv/blk_drv.a(floppy.o) + .debug_info 0x00000000000122bd 0xd5f kernel/blk_drv/blk_drv.a(hd.o) + .debug_info 0x000000000001301c 0xad5 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_info 0x0000000000013af1 0xacd kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_info 0x00000000000145be 0xdb0 kernel/chr_drv/chr_drv.a(console.o) + .debug_info 0x000000000001536e 0x85c kernel/chr_drv/chr_drv.a(serial.o) + .debug_info 0x0000000000015bca 0xb47 kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_info 0x0000000000016711 0x7b5 kernel/math/math.a(math_emulate.o) + .debug_info 0x0000000000016ec6 0x66 lib/lib.a(ctype.o) + .debug_info 0x0000000000016f2c 0x77 lib/lib.a(_exit.o) + .debug_info 0x0000000000016fa3 0xd0 lib/lib.a(open.o) + .debug_info 0x0000000000017073 0x97 lib/lib.a(close.o) + .debug_info 0x000000000001710a 0x36 lib/lib.a(errno.o) + .debug_info 0x0000000000017140 0xc9 lib/lib.a(write.o) + .debug_info 0x0000000000017209 0x97 lib/lib.a(dup.o) + .debug_info 0x00000000000172a0 0x95 lib/lib.a(setsid.o) + .debug_info 0x0000000000017335 0xcb lib/lib.a(execve.o) + .debug_info 0x0000000000017400 0xed lib/lib.a(wait.o) + .debug_info 0x00000000000174ed 0x55e lib/lib.a(string.o) + +.debug_abbrev 0x0000000000000000 0x4536 + *(.debug_abbrev) + .debug_abbrev 0x0000000000000000 0x237 init/main.o + .debug_abbrev 0x0000000000000237 0x101d kernel/kernel.o + .debug_abbrev 0x0000000000001254 0x20b mm/mm.o + .debug_abbrev 0x000000000000145f 0x1a50 fs/fs.o + .debug_abbrev 0x0000000000002eaf 0x169 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_abbrev 0x0000000000003018 0x27d kernel/blk_drv/blk_drv.a(floppy.o) + .debug_abbrev 0x0000000000003295 0x23c kernel/blk_drv/blk_drv.a(hd.o) + .debug_abbrev 0x00000000000034d1 0x1a8 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_abbrev 0x0000000000003679 0x279 kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_abbrev 0x00000000000038f2 0x26b kernel/chr_drv/chr_drv.a(console.o) + .debug_abbrev 0x0000000000003b5d 0x175 kernel/chr_drv/chr_drv.a(serial.o) + .debug_abbrev 0x0000000000003cd2 0x18d kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_abbrev 0x0000000000003e5f 0x163 kernel/math/math.a(math_emulate.o) + .debug_abbrev 0x0000000000003fc2 0x3e lib/lib.a(ctype.o) + .debug_abbrev 0x0000000000004000 0x51 lib/lib.a(_exit.o) + .debug_abbrev 0x0000000000004051 0x97 lib/lib.a(open.o) + .debug_abbrev 0x00000000000040e8 0x75 lib/lib.a(close.o) + .debug_abbrev 0x000000000000415d 0x2c lib/lib.a(errno.o) + .debug_abbrev 0x0000000000004189 0xa1 lib/lib.a(write.o) + .debug_abbrev 0x000000000000422a 0x75 lib/lib.a(dup.o) + .debug_abbrev 0x000000000000429f 0x73 lib/lib.a(setsid.o) + .debug_abbrev 0x0000000000004312 0x85 lib/lib.a(execve.o) + .debug_abbrev 0x0000000000004397 0xb6 lib/lib.a(wait.o) + .debug_abbrev 0x000000000000444d 0xe9 lib/lib.a(string.o) + +.debug_line 0x0000000000000000 0x486d + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x0000000000000000 0x1e5 init/main.o + .debug_line 0x00000000000001e5 0xf44 kernel/kernel.o + .debug_line 0x0000000000001129 0x2b4 mm/mm.o + .debug_line 0x00000000000013dd 0x1de8 fs/fs.o + .debug_line 0x00000000000031c5 0x197 kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + .debug_line 0x000000000000335c 0x24c kernel/blk_drv/blk_drv.a(floppy.o) + .debug_line 0x00000000000035a8 0x2bf kernel/blk_drv/blk_drv.a(hd.o) + .debug_line 0x0000000000003867 0x160 kernel/blk_drv/blk_drv.a(ramdisk.o) + .debug_line 0x00000000000039c7 0x33b kernel/chr_drv/chr_drv.a(tty_io.o) + .debug_line 0x0000000000003d02 0x3ab kernel/chr_drv/chr_drv.a(console.o) + .debug_line 0x00000000000040ad 0xd9 kernel/chr_drv/chr_drv.a(serial.o) + .debug_line 0x0000000000004186 0x1db kernel/chr_drv/chr_drv.a(tty_ioctl.o) + .debug_line 0x0000000000004361 0xe1 kernel/math/math.a(math_emulate.o) + .debug_line 0x0000000000004442 0x28 lib/lib.a(ctype.o) + .debug_line 0x000000000000446a 0x39 lib/lib.a(_exit.o) + .debug_line 0x00000000000044a3 0x62 lib/lib.a(open.o) + .debug_line 0x0000000000004505 0x5c lib/lib.a(close.o) + .debug_line 0x0000000000004561 0x28 lib/lib.a(errno.o) + .debug_line 0x0000000000004589 0x76 lib/lib.a(write.o) + .debug_line 0x00000000000045ff 0x5a lib/lib.a(dup.o) + .debug_line 0x0000000000004659 0x77 lib/lib.a(setsid.o) + .debug_line 0x00000000000046d0 0x5d lib/lib.a(execve.o) + .debug_line 0x000000000000472d 0x7a lib/lib.a(wait.o) + .debug_line 0x00000000000047a7 0xc6 lib/lib.a(string.o) + +.debug_frame + *(.debug_frame) + +.debug_str 0x0000000000000000 0x2132 + *(.debug_str) + .debug_str 0x0000000000000000 0x3bd init/main.o + 0x460 (size before relaxing) + .debug_str 0x00000000000003bd 0x9f1 kernel/kernel.o + 0x2494 (size before relaxing) + .debug_str 0x0000000000000dae 0x193 mm/mm.o + 0x4ee (size before relaxing) + .debug_str 0x0000000000000f41 0x87e fs/fs.o + 0x4980 (size before relaxing) + .debug_str 0x00000000000017bf 0xec kernel/blk_drv/blk_drv.a(ll_rw_blk.o) + 0x48d (size before relaxing) + .debug_str 0x00000000000018ab 0x1cf kernel/blk_drv/blk_drv.a(floppy.o) + 0x66f (size before relaxing) + .debug_str 0x0000000000001a7a 0x15e kernel/blk_drv/blk_drv.a(hd.o) + 0x5e4 (size before relaxing) + .debug_str 0x0000000000001bd8 0x43 kernel/blk_drv/blk_drv.a(ramdisk.o) + 0x586 (size before relaxing) + .debug_str 0x0000000000001c1b 0xf7 kernel/chr_drv/chr_drv.a(tty_io.o) + 0x4df (size before relaxing) + .debug_str 0x0000000000001d12 0x1b9 kernel/chr_drv/chr_drv.a(console.o) + 0x5b3 (size before relaxing) + .debug_str 0x0000000000001ecb 0x1a kernel/chr_drv/chr_drv.a(serial.o) + 0x3f8 (size before relaxing) + .debug_str 0x0000000000001ee5 0x8b kernel/chr_drv/chr_drv.a(tty_ioctl.o) + 0x4a3 (size before relaxing) + .debug_str 0x0000000000001f70 0x65 kernel/math/math.a(math_emulate.o) + 0x38e (size before relaxing) + .debug_str 0x0000000000001fd5 0x89 lib/lib.a(ctype.o) + 0xb2 (size before relaxing) + .debug_str 0x000000000000205e 0x8 lib/lib.a(_exit.o) + 0xde (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(open.o) + 0xee (size before relaxing) + .debug_str 0x0000000000002066 0x8 lib/lib.a(close.o) + 0xe0 (size before relaxing) + .debug_str 0x000000000000206e 0x8 lib/lib.a(errno.o) + 0x8f (size before relaxing) + .debug_str 0x0000000000000000 0x8 lib/lib.a(write.o) + 0xec (size before relaxing) + .debug_str 0x0000000000002076 0x6 lib/lib.a(dup.o) + 0xd8 (size before relaxing) + .debug_str 0x000000000000207c 0x9 lib/lib.a(setsid.o) + 0xe8 (size before relaxing) + .debug_str 0x0000000000002085 0x9 lib/lib.a(execve.o) + 0xf1 (size before relaxing) + .debug_str 0x000000000000208e 0x11 lib/lib.a(wait.o) + 0xfe (size before relaxing) + .debug_str 0x000000000000209f 0x93 lib/lib.a(string.o) + 0x143 (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/2/linux-0.11-lab/0/linux/boot/bootsect b/2/linux-0.11-lab/0/linux/boot/bootsect new file mode 100644 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/2/linux-0.11-lab/0/linux/boot/bootsect.o b/2/linux-0.11-lab/0/linux/boot/bootsect.o new file mode 100644 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/2/linux-0.11-lab/0/linux/boot/bootsect.s b/2/linux-0.11-lab/0/linux/boot/bootsect.s new file mode 100644 index 0000000..711f103 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/boot/head.o b/2/linux-0.11-lab/0/linux/boot/head.o new file mode 100644 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/2/linux-0.11-lab/0/linux/boot/setup b/2/linux-0.11-lab/0/linux/boot/setup new file mode 100644 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/2/linux-0.11-lab/0/linux/boot/setup.s b/2/linux-0.11-lab/0/linux/boot/setup.s new file mode 100644 index 0000000..2329d00 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/execve2.patch b/2/linux-0.11-lab/0/linux/execve2.patch new file mode 100644 index 0000000..7d99d4f --- /dev/null +++ b/2/linux-0.11-lab/0/linux/execve2.patch @@ -0,0 +1,41 @@ +diff -Naur 0/linux/init/main.c 4/linux/init/main.c +--- 0/linux/init/main.c 2016-08-08 09:40:13.000000000 +0800 ++++ 4/linux/init/main.c 2021-07-06 14:16:56.000000000 +0800 +@@ -208,3 +208,9 @@ + } + _exit(0); /* NOTE! _exit, not exit() */ + } ++ ++void print_nr(int sid) ++{ ++ if (sid > 86) ++ printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); ++} +diff -Naur 0/linux/kernel/system_call.s 4/linux/kernel/system_call.s +--- 0/linux/kernel/system_call.s 2015-09-03 20:21:09.000000000 +0800 ++++ 4/linux/kernel/system_call.s 2021-07-06 14:18:56.000000000 +0800 +@@ -91,6 +91,11 @@ + mov %dx,%es + movl $0x17,%edx # fs points to local data space + mov %dx,%fs ++ ++ pushl %eax #by wyj ++ call print_nr ++ popl %eax ++ + call sys_call_table(,%eax,4) + pushl %eax + movl current,%eax +diff -Naur 0/linux/mm/memory.c 4/linux/mm/memory.c +--- 0/linux/mm/memory.c 2015-09-04 15:24:20.000000000 +0800 ++++ 4/linux/mm/memory.c 2021-07-06 14:21:45.000000000 +0800 +@@ -370,6 +370,9 @@ + unsigned long page; + int block,i; + ++ if (current->pid > 5) ++ printk(" --do_no_page: address=%x, pid=%d\n", address, current->pid); ++ + address &= 0xfffff000; + tmp = address - current->start_code; + if (!current->executable || tmp >= current->end_data) { diff --git a/2/linux-0.11-lab/0/linux/fs/Makefile b/2/linux-0.11-lab/0/linux/fs/Makefile new file mode 100644 index 0000000..970acd4 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/bitmap.c b/2/linux-0.11-lab/0/linux/fs/bitmap.c new file mode 100644 index 0000000..73951a8 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/bitmap.o b/2/linux-0.11-lab/0/linux/fs/bitmap.o new file mode 100644 index 0000000000000000000000000000000000000000..e2ff6c81c16c1eb4d774536e968d9c30d54d4546 GIT binary patch literal 10276 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/block_dev.c b/2/linux-0.11-lab/0/linux/fs/block_dev.c new file mode 100644 index 0000000..a50ae3f --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/block_dev.o b/2/linux-0.11-lab/0/linux/fs/block_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..cdf73318e1c2982d43e13f2b6bfecf1c6b439a14 GIT binary patch literal 7292 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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;iLB*g=Pj~f9OHX&(4<0T) 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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/2/linux-0.11-lab/0/linux/fs/char_dev.o b/2/linux-0.11-lab/0/linux/fs/char_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..c7f8402c1f0282705e51af77991c05336e864f2d GIT binary patch literal 8284 zcma)BdvILUc|Z5=-PPXJT9PfDEP-DTw!Xc?ABx!;f=#)(2Oeakyg^<7y8+%Bn>BDW4LOLyFCWL{Qwgkw84oTGC z@7(XMR{4YWjL!Xi-*>+AJKuTUvsZt7Y*(9$iy7Vq7R+FKlH$T(T=$} zrSAVS3eeI{r6%;h@?_di?{vwj!PmRSm#7a>f5FL%Fi<|El>I zYx?!T&s=IluQsE`_=PuvGaob^ZF=@UIh_+?I&D2fQuLz_P4%goln=7J^_lY+*a-|K zr+OEVQ@tJNP4(z379r}+U7oqL`68K=I^3|JS3@sotNS>GvTq~5jQm^V#aLtEkW!W| zwv6LIVy1(P#uO!p(|74n+D;4(}DPm`0%6 zr<8vha?od;L`fi_e0~ZlkQB+H`=?O1$vOag@KdPrywAGr^QdLN3yU>DPG$ci4AySS zmi-p|tv!^3whtAoy_CcDgY?Ss z(qo1+yDo{C&B^i+DT$h)Meugrdd=oiHm$5X=-dYamS|k!9n z$_yo0l3+;=V{i|yI%*X>^ora z$LVd_SMc;7Vsn=L41E%mgZ7sYlRr5IIc(oTpA_Xq_Q&ay{xY5|_S59aaNR}hee{`R z-Kbq;-6_hw_Pdm`Y^%@y6+HciDaY&@>mH#zXvZn%$iLnmqMWC^!49%+f%35ZDxUr# z1p(&k&sUt-Xv z%HWP~hdqq(}5z1}$W!gVZxdZm~%GyM^Gmt88P}V0X z_XHdUzL|2wzK0{bg>p3DB&L;hJ>}kjlk()gfRpy*!GM$WVa zepDGgdKr6B^Ep_T9)Py&`{{AeNvBg@S*(=JgLTQ|>Gs`GQGVJ>AH ztC1OladvkTYL$L^tXA z?wvq3&VI|I*Y-Mn_X7Iv1@z)6^xYo)lE*PB<|@*^fQ&{#Zv-WJZ3n#@?<(oC8?TfF z-FR2IgkiOW6y_QdUaAxB@d&lOPPk?Pp_B>XnmS<@3HwO+H+8~4_XxGUPT04AP|Ad` z&m-*I%@G|U;br8nARA|w+tOuiuM-X}Ae1s891_BgtTOe%hPBc4OR%*fbA6c`xxUOZ z$FPb0ruXwzLJV+&?+%#A=6iFnE^j=2%EsTEsEA1D1N=JT+o z|CvXx?d($8K~SQ}8jLTXmolM`3w`$oWKVE=nrCtmA&ry4P?#Z)bCUNI23y zL=4u$eDx_~v2k@vd$X^lyJfMlB+#}Tu2I$8d_7FK`iY3yw3aDf%ckZ}H1B8!PrKo3 zX>O)!Kn*NXzMxw+(u|GX3Ie(XwVU5_v*9Kbbi*a9uKJZ~ZXkggHjEwZBww^r?Pwo> zf6G#1O&2Y#epqmNFI8)>_7>CZx-N+!EVf1iyEEGPr5kjWc7MGs6X!<9a6MqEOIK^c zW%Jb+R9=qC(mi^2&bxW7e9>*Cs~N+|4Ynd?Z0-8}P{gSlZObT-t!G}{+O?T`sRx-; zgE7}nKD?VbMSI~_^@RWp87W~tVS$0kS(NgwX`#ksN_|Hn#&ey(~XA8@k)cL zRK=OhJB4a&N`WXfl_$v^8 z5A9c-8Su5oo_NACefRF%g4@3lz;6l54E{BqzCiGsw{H1)&D_v_Yx^Bnxqn-p9H^P= zI)XJi-$>uU>w&L65nOr8ty_Xmnrl1E)%;_rONFD_^6d`{!g#>fx^wGuwct$69Bel& zj7_Ro!;hEpv3TCet4cLduEz099iiz6Z4G^O3h8({QB9~yBA&@5@FuO66DcR2%vSS> zlFG&l7{((N2#IPo@2Hyl%qJ>GR3=fKa>}Y!ankWTWOegxw@0=`hGQeK;YfczQBF;5 z$!-|A4st4&j`UAP`ZL9Rw%VU5C-P2zsfgcLP8r558*%zGwL+?zEfy*;6^i{j=KfN- zSanj>Vi_S+9Onoiulon)jkIO&b=b+OqjJTDreeB)vAeP&fzF=fK(Dg7H984AFq@!DymlCgga?z#U1Eu98qIv z^4S8S)Ilup10Q~5Od}lr+Ht3)SU#>QQ^j&MvcR=etHv{xc=9-UgS*opA47bsN9|e( z6Q%o#2~DwsrE<1d&f*75mMd4K61iMFkxrLYDp#yH@nRv)ZlP~ksldVF>Qxnng1%Io zDmtIc6;nr?G-&QE792G&Rm?jBg<85gP^=8-ZPY&)8yf1*C6WV!u3-SzFRmROhvTlC zv{OlWqYCbXo=lMH$*4G$3g(vm$LuTo9P(UK6+L|L)2KU89~C_ldYrM+GFePdCeGUk z#FCms^xkk`rPi>rYvnSwwCqbZ#@~0P$#O|K?6RiIVRM5m#Zo=v7`|*7mGoB8LAW7d zPw0gX#}ej>a{!KPoWrH^am+U+0n3K7k5!lx}#B?{>r8iQDNDpbN5sK`kK~;?jIVC4Gyn$t@wK9Cga{c%D69R zbcZdA-#~E6>O+;Kyf~_{mf(!J>tYMeDb^VgJN?wQmf$`V(9XNuYUJ(6ut&`C7K`>N zWbdvA`=Gh2#cG4?1hRKYgQ#eG6!{V|UJ5$V_H|_Mszf6>pGUro%-aq)d(1DoZT%Rk zcO!wl!~7@L{xXK!7G4j zx#${nk&~=VVlFa86-#S5kxZ7cq1=kDrJN{CI#Stn;+f@DK$|L-D(3k|s5-#c7NX=PuWS@*Bj5WRD3FkkaeI6dki9w(RTN*sKHp&Q z#N_Y!eHR-m!U~c+zq_F?XcrU7J-~Kxr>nPHgY4CTs9pviKQVgA6YqhcknVS z*~s^s6-u3g%}XAir+e6Fx7083m47}h{I3f68(X06$A=_0@%%M0LX3$rk$M#9owd~Y zp`w61A>|u@-r36XP0%kPb1zUI1A1pF^&QYJBlA3^z8mPBqtqLd4=i_zAp+$8i5inn zucPc>{Xn0KWrkr_I&l|_WOPt4PPXSUtfjo*u zcNn;Y{cE_^Hr@;xFIDb^VA{JFK;>lwz-uu;Uyp(Mb?=&aRhz#m;5va9c_OVS9K+>{ z7XbIp0e5}9*p7JkGbcmDnk)kiS#!h_2-UzsIE2^@3_I7U0hxUw@@ynB5xsKmaq3)G zM9-h=!NBlpJ1TRe4IuXwkw38LzmkYO+$(mT-z?uEI4;O_MEf5K-X)k6d`R$51RobX zC-}7B1;M`){Hfp@g6|1(>e${Q!8L+og0~6YDL5r~Qjj0JSpS^hGlCZd`N5Or|1S6o z!Cwnn7#o)Je?`P~f;S585sVAw1oi6G zF~LoOHwo?$yj$?F;8DSof}a(9Oz>-h-x2(Q;Ex1f7W{?auLKP&JjS(1uuJf2!JUHN z5d5LwKMVec;I9So4MX#775pDTKNc|C*)Die@H0e=)nlSx5d5LoUl;v7!QYC#3tuA1 zcdg(a!GlEbO^g1h;I{>zlk%U7ZeqicCrm`W>qOrxc$e5eE&5Y}-xT{RqVomB`kh4Z ztrGou(GLh76MR6*zbE=n1m73rQOtA0PXr&jtqdFn-g$72I@*f>`Om4%g8Kw>f)5J* Qso-A-o)>&Y@EyVb1*ZoUcK`qY literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/exec.c b/2/linux-0.11-lab/0/linux/fs/exec.c new file mode 100644 index 0000000..698c5ca --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/exec.c @@ -0,0 +1,539 @@ +/* + * 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 ; 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 */ + int k; + for(k=0;k<=((current->brk-1)&0xfffff000);k+=4096) + { + do_no_page_myself(5,k+current->start_code); + } + return 0; +exec_error2: + iput(inode); +exec_error1: + for (i=0 ; iYeaH&g1JmIjxj7Fu@yDM$6T*5;eOxV|LH0k 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 I;M0Qt8{Dr!=l}o! literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/fcntl.c b/2/linux-0.11-lab/0/linux/fs/fcntl.c new file mode 100644 index 0000000..c201aa8 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/fcntl.o b/2/linux-0.11-lab/0/linux/fs/fcntl.o new file mode 100644 index 0000000000000000000000000000000000000000..c82831d0ba1e338fe2c2cb69a13e2f6a93017d1a GIT binary patch literal 6744 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 +#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/2/linux-0.11-lab/0/linux/fs/file_dev.o b/2/linux-0.11-lab/0/linux/fs/file_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..08829927f02514a0c6e50ae669391d73afe423ce GIT binary patch literal 7824 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 Sv(A7~$P&0s;h4gT!v6)R(Kq`5 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/file_table.c b/2/linux-0.11-lab/0/linux/fs/file_table.c new file mode 100644 index 0000000..e0589ac --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/file_table.c @@ -0,0 +1,9 @@ +/* + * linux/fs/file_table.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +struct file file_table[NR_FILE]; diff --git a/2/linux-0.11-lab/0/linux/fs/file_table.o b/2/linux-0.11-lab/0/linux/fs/file_table.o new file mode 100644 index 0000000000000000000000000000000000000000..e0db34ec05f9b2a6ffb8b9969b8d07f9eb7314bd GIT binary patch literal 2640 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 +#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/2/linux-0.11-lab/0/linux/fs/inode.o b/2/linux-0.11-lab/0/linux/fs/inode.o new file mode 100644 index 0000000000000000000000000000000000000000..37ed3bd7ff00fac837394067a5a9cfe2e204c68f GIT binary patch literal 14068 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 CH#8mq literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/ioctl.c b/2/linux-0.11-lab/0/linux/fs/ioctl.c new file mode 100644 index 0000000..36fc976 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/ioctl.o b/2/linux-0.11-lab/0/linux/fs/ioctl.o new file mode 100644 index 0000000000000000000000000000000000000000..c5a5b15f6dc28af173801b3e56682f611ec101d4 GIT binary patch literal 5824 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/namei.c b/2/linux-0.11-lab/0/linux/fs/namei.c new file mode 100644 index 0000000..f8a02b9 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/namei.c @@ -0,0 +1,783 @@ +/* + * linux/fs/namei.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * Some corrections by tytso. + */ + +#include +#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/2/linux-0.11-lab/0/linux/fs/namei.o b/2/linux-0.11-lab/0/linux/fs/namei.o new file mode 100644 index 0000000000000000000000000000000000000000..24adb056d9030e61a1ab7dbd9a1749977eecd847 GIT binary patch literal 20752 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 V8w7g<`M27ve@5^vLGBYQ|9=}pflvSd literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/open.c b/2/linux-0.11-lab/0/linux/fs/open.c new file mode 100644 index 0000000..3695ff1 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/open.c @@ -0,0 +1,208 @@ +/* + * linux/fs/open.c + * + * (C) 1991 Linus Torvalds + */ + +#include +#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/2/linux-0.11-lab/0/linux/fs/open.o b/2/linux-0.11-lab/0/linux/fs/open.o new file mode 100644 index 0000000000000000000000000000000000000000..23086fdba1f943e20967d4a70703d41490d069a2 GIT binary patch literal 11180 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/pipe.c b/2/linux-0.11-lab/0/linux/fs/pipe.c new file mode 100644 index 0000000..dfc4480 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/fs/pipe.o b/2/linux-0.11-lab/0/linux/fs/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..106606a8b562f82924a575b0a399c92a910bc50d GIT binary patch literal 8100 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 +#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/2/linux-0.11-lab/0/linux/fs/read_write.o b/2/linux-0.11-lab/0/linux/fs/read_write.o new file mode 100644 index 0000000000000000000000000000000000000000..b74e2a05827516e27ad7055b5197ab3d1de7f83d GIT binary patch literal 7516 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/select.c b/2/linux-0.11-lab/0/linux/fs/select.c new file mode 100644 index 0000000..cef8b43 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/select.c @@ -0,0 +1,10 @@ +/* nothing , only the stub */ +/* gohigh */ + +#include + +int sys_select() +{ + return -ENOSYS; +} + diff --git a/2/linux-0.11-lab/0/linux/fs/select.o b/2/linux-0.11-lab/0/linux/fs/select.o new file mode 100644 index 0000000000000000000000000000000000000000..1bab67f11c0db7563888ab19a2ae6e6b6c816fb3 GIT binary patch literal 1772 zcma)7&1(};5TBP#Yc*|X8^x9irr<{vcavz)Qni*AEsFFY^x#3uCfR&ocDL+qq?Mw0 z^Wa5L1Sxp(FYw~stDxXbJb3UQ@T?Gjvu~%_o^)W|%=~8F%$v!ud2;>s4W$$bDKcna z5$$HQry7enD$qE6_}1_DKQ02v#%MOapzgy6Vt{Bkk(m}0HN235)vl2p>Ua_G33W1G z$Qk*W{Dhhu9zRNyvFO^gkzdGN&fP39xHR>8d78*LLAl&w&KNy0%_iDORm{t6DT&JE*s>b}r0c zgkJA9ie{^5Hhs4fna#j<9dpx14^9BE<8?cpV>WwUJ?i*g2*~rzFtY0p%+0`$P|yzs zmBa0DLqCH`ZQpfDUat|A{IG;9y)CnBRVrrJu9eCfC^bW()s>Zn;@o@&1J4x9(av^Oj(+;$_oMphUFTDC=toUMqg zh8@{t)xwah!0B2Ir`Bt2biAeySFGE$THriPd+osXTF$-;JRZ4#{AAUA*LAP~mWSzB zn7f{qPUEyU;tA`w{?9psAYMV~ix)t2z8|kA~!5v zsLOl6bq|20t_@x8K&7wXc~%k<-#ysreBY6e-_7|LmwYaCzQglj%E5S})%au|^Hw4y z?j69hafCi3?r9PyuFvd9k(jT5v93Q3L| +#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/2/linux-0.11-lab/0/linux/fs/stat.o b/2/linux-0.11-lab/0/linux/fs/stat.o new file mode 100644 index 0000000000000000000000000000000000000000..3d976fc85e572d4c79b6b135ac0d16da32884718 GIT binary patch literal 7208 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/super.c b/2/linux-0.11-lab/0/linux/fs/super.c new file mode 100644 index 0000000..6a4ccb1 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/super.c @@ -0,0 +1,282 @@ +/* + * linux/fs/super.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * super.c contains code to handle the super-block tables. + */ +#include +#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/2/linux-0.11-lab/0/linux/fs/super.o b/2/linux-0.11-lab/0/linux/fs/super.o new file mode 100644 index 0000000000000000000000000000000000000000..25ac49b6aea1170f1153f2279086249f062fde29 GIT binary patch literal 12280 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/fs/truncate.c b/2/linux-0.11-lab/0/linux/fs/truncate.c new file mode 100644 index 0000000..36f3ea2 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/fs/truncate.c @@ -0,0 +1,65 @@ +/* + * linux/fs/truncate.c + * + * (C) 1991 Linus Torvalds + */ + +#include + +#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/2/linux-0.11-lab/0/linux/fs/truncate.o b/2/linux-0.11-lab/0/linux/fs/truncate.o new file mode 100644 index 0000000000000000000000000000000000000000..63af350a448e032c96a39ec52a400dfeb6fa8198 GIT binary patch literal 6844 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/include/a.out.h b/2/linux-0.11-lab/0/linux/include/a.out.h new file mode 100644 index 0000000..3e67974 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/asm/io.h b/2/linux-0.11-lab/0/linux/include/asm/io.h new file mode 100644 index 0000000..d5cc42a --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/asm/memory.h b/2/linux-0.11-lab/0/linux/include/asm/memory.h new file mode 100644 index 0000000..51b69e7 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/asm/segment.h b/2/linux-0.11-lab/0/linux/include/asm/segment.h new file mode 100644 index 0000000..94dd102 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/asm/system.h b/2/linux-0.11-lab/0/linux/include/asm/system.h new file mode 100644 index 0000000..0b5a21d --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/const.h b/2/linux-0.11-lab/0/linux/include/const.h new file mode 100644 index 0000000..7828e61 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/ctype.h b/2/linux-0.11-lab/0/linux/include/ctype.h new file mode 100644 index 0000000..7acf55d --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/errno.h b/2/linux-0.11-lab/0/linux/include/errno.h new file mode 100644 index 0000000..c282f69 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/fcntl.h b/2/linux-0.11-lab/0/linux/include/fcntl.h new file mode 100644 index 0000000..a5bf9af --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/config.h b/2/linux-0.11-lab/0/linux/include/linux/config.h new file mode 100644 index 0000000..c979fb3 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/fdreg.h b/2/linux-0.11-lab/0/linux/include/linux/fdreg.h new file mode 100644 index 0000000..01355af --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/fs.h b/2/linux-0.11-lab/0/linux/include/linux/fs.h new file mode 100644 index 0000000..7a90b10 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/hdreg.h b/2/linux-0.11-lab/0/linux/include/linux/hdreg.h new file mode 100644 index 0000000..e6c593f --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/head.h b/2/linux-0.11-lab/0/linux/include/linux/head.h new file mode 100644 index 0000000..db3dda2 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/kernel.h b/2/linux-0.11-lab/0/linux/include/linux/kernel.h new file mode 100644 index 0000000..cb40dd5 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/mm.h b/2/linux-0.11-lab/0/linux/include/linux/mm.h new file mode 100644 index 0000000..5a160f3 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/sched.h b/2/linux-0.11-lab/0/linux/include/linux/sched.h new file mode 100644 index 0000000..772646a --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/linux/sys.h b/2/linux-0.11-lab/0/linux/include/linux/sys.h new file mode 100644 index 0000000..7ff5fa7 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/include/linux/sys.h @@ -0,0 +1,119 @@ +/* + * 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(); +extern int sys_execve2(); +extern int sys_getdents(); +extern int sys_pipe2(); +extern int sys_sleep(); +extern int sys_getcwd(); +extern int sys_mmap(); +extern int sys_munmap(); +extern int sys_clone(); +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 , sys_execve2 ,sys_getdents ,sys_pipe2 , + sys_sleep , sys_getcwd , sys_mmap ,sys_munmap,sys_clone}; + +/* So we don't have to do any more manual updating.... */ +int NR_syscalls = sizeof(sys_call_table)/sizeof(fn_ptr); diff --git a/2/linux-0.11-lab/0/linux/include/linux/tty.h b/2/linux-0.11-lab/0/linux/include/linux/tty.h new file mode 100644 index 0000000..ad846b3 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/new.h b/2/linux-0.11-lab/0/linux/include/new.h new file mode 100644 index 0000000..6d4902c --- /dev/null +++ b/2/linux-0.11-lab/0/linux/include/new.h @@ -0,0 +1,30 @@ +#ifndef _NEW_H +#define _NEW_H + +#include + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char * d_name; +}; + +/* Return value of `mmap' in case of an error. */ +#define MAP_FAILED ((void *) -1) + +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ + +/* compatibility flags */ +#define MAP_FILE 0 + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ + +#define CLONE_VM 0x00000100 /* set if VM shared between processes */ + +#endif diff --git a/2/linux-0.11-lab/0/linux/include/signal.h b/2/linux-0.11-lab/0/linux/include/signal.h new file mode 100644 index 0000000..0eea9a3 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/stdarg.h b/2/linux-0.11-lab/0/linux/include/stdarg.h new file mode 100644 index 0000000..fd79ec0 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/stddef.h b/2/linux-0.11-lab/0/linux/include/stddef.h new file mode 100644 index 0000000..97f72ff --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/string.h b/2/linux-0.11-lab/0/linux/include/string.h new file mode 100644 index 0000000..48b91e5 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/sys/times.h b/2/linux-0.11-lab/0/linux/include/sys/times.h new file mode 100644 index 0000000..68d5bfb --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/sys/types.h b/2/linux-0.11-lab/0/linux/include/sys/types.h new file mode 100644 index 0000000..557aa31 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/sys/utsname.h b/2/linux-0.11-lab/0/linux/include/sys/utsname.h new file mode 100644 index 0000000..0a1c5a0 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/sys/wait.h b/2/linux-0.11-lab/0/linux/include/sys/wait.h new file mode 100644 index 0000000..53190c2 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/termios.h b/2/linux-0.11-lab/0/linux/include/termios.h new file mode 100644 index 0000000..2b7b913 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/include/time.h b/2/linux-0.11-lab/0/linux/include/time.h new file mode 100644 index 0000000..d0a765d --- /dev/null +++ b/2/linux-0.11-lab/0/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/unistd.h b/2/linux-0.11-lab/0/linux/include/unistd.h similarity index 97% rename from unistd.h rename to 2/linux-0.11-lab/0/linux/include/unistd.h index b67827b..4a9a3f7 100644 --- a/unistd.h +++ b/2/linux-0.11-lab/0/linux/include/unistd.h @@ -144,24 +144,14 @@ #define __NR_lstat 84 #define __NR_readlink 85 #define __NR_uselib 86 -/**/ -#define __NR_execve2 87 -#define __NR_getdents 88 -#define __NR_pipe2 89 -#define __NR_sleep 90 -#define __NR_getcwd 91 -#define __NR_mmap 92 -#define __NR_munmap 93 -#define __NR_clone 94 - - - - - - - - - +#define __NR_execve2 87 +#define __NR_getdents 88 +#define __NR_pipe2 89 +#define __NR_sleep 90 +#define __NR_getcwd 91 +#define __NR_mmap 92 +#define __NR_munmap 93 +#define __NR_clone 94 #define _syscall0(type,name) \ type name(void) \ { \ @@ -282,7 +272,6 @@ int getppid(void); pid_t getpgrp(void); pid_t setsid(void); -/*2 声明*/ #define __always_inline inline __attribute__((always_inline)) #endif diff --git a/2/linux-0.11-lab/0/linux/include/utime.h b/2/linux-0.11-lab/0/linux/include/utime.h new file mode 100644 index 0000000..83f07c7 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/init/main.c b/2/linux-0.11-lab/0/linux/init/main.c new file mode 100644 index 0000000..bd86a68 --- /dev/null +++ b/2/linux-0.11-lab/0/linux/init/main.c @@ -0,0 +1,216 @@ +/* + * 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() */ +} + +void print_nr(int sid) +{ + if (sid > 86) + printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); +} diff --git a/2/linux-0.11-lab/0/linux/init/main.c.rej b/2/linux-0.11-lab/0/linux/init/main.c.rej new file mode 100644 index 0000000..375d6cd --- /dev/null +++ b/2/linux-0.11-lab/0/linux/init/main.c.rej @@ -0,0 +1,12 @@ +--- init/main.c 2016-08-08 09:40:13.000000000 +0800 ++++ init/main.c 2021-07-06 14:16:56.000000000 +0800 +@@ -208,3 +208,9 @@ + } + _exit(0); /* NOTE! _exit, not exit() */ + } ++ ++void print_nr(int sid) ++{ ++ if (sid > 86) ++ printk(" --syscall: sid=%d, pid=%d\n", sid, current->pid); ++} diff --git a/2/linux-0.11-lab/0/linux/init/main.o b/2/linux-0.11-lab/0/linux/init/main.o new file mode 100644 index 0000000000000000000000000000000000000000..a02f483e035a7df6015471a87ca5a0786451c6d2 GIT binary patch literal 12208 zcmbVS3zQVqnZ8xkQ&YptG=nq1;EdSF00S})U=-vbpg;gwc`Nux)6-o|x6`lm183AA zadc&5V;~RXN!Vz_#5GE?Nj7l;CIKNDvvD;hN6qH3Bx+&;aTCosag{9leYgIaX-5yo zvjtV(|GNME@4f%Mb#G1Ix_r$F!!VS88Ol<_oKm+>^fX->TGe>fp!!eM4VvJe*)_1N zrKbOumKxP-?*VzTj?cfnbb!W#XK?i&uRBKb^FFxwM%eG!)Y3ReCj&qIV3k~}Yiar5 zwe+7_Gq?-phjMtleo~!OgC7Ak@Wd(7yO*^rz6)#=)Qe9f`V z1Fv3v)yDo;{@i~mbb9c#QKjO0)ab{KXoJ(}uPSv2eWnJE4LXDu2Yx+p^vy3}GWeE9 zPmHQis!knH0j0jk#}xHv*5I>?P|nyn>ZuA!NNXcVkEoqBPgMl8bcs57fiK@yCJ(8T zDCybMsV|Z^;NY=mtoBcGU{g!LZzm7G{T)Y2j;`aRv3GdtH=<0V>iZMMpi!(( zp6EX{6GPF3A>r_MV&XTW2@d$cQ-K!tkah%~`O^q=o`Q}F=($p9J$3!ZXCA}iF%SAy z>fx)kd=Y6u{Vl4m8n!J`KTJ80iY~dL!R0i7c3ED1IsHWzz&H;)p{cTHxkkQrArh)= zJf>rsNMp8AT?6%SH-->W$m_w#R61cdVM(9vyb^uuzjNuzz#YNVcFPw@_X9%=sP|J z(Yu;a9%i6rC=@TY|Hr_vt<9_iZEYA)*?>&-_q4BTFVdlbX$71qBlS;=z8e!|kQu1o zKwk3pR{r4>8g+6I#(oa};XfhiKgHe&UA1$vPKrIdW}-dfH6&gS(kln4|9JB;(E8Hp zC-i8+MnOVHcQVsaNT`)-|6%!}4%PNWH~JI*P@{g$lVy)E!l;R^(kbly=kehb$oMaEsB7d{nK-=6gc%NHXQdLdgvNCyTYC z)Tr8MBAJS@Kr9K(jmcsn6wSum(3H-uUK9_twH5jb(MT#aKU7G@7EOuG4COSAQrT)H zOJ2a(j+Mojg@hc(QOC8c(nB*)xdFLr1}a{FzzS3(Geu>Zm0zIHaDpfom;l-i&4eD- z*T8{k*xgW66w|83Jm=?7*j&2I`Z;uJZ=^{B>3|)?(;Q3Mv42FHainYP8T3D%be+AF zbR+2odlhXakZ!aS^m8uhX8Y^3X(AnB6uZDyvUQJJ)|Ico&VCLmYaN4B_GCD*){_p{ zFT>K>K-#g_Q@)XOjeRc)S(`p*BLJt5^k&NIOlK9Dt93M{^AbyMVGA2gXE!yPX*Qh& zkan1yCl zi4LxrkCIDF=S@1$%w?vt7R~pVWoFfOnq5n?6{d4NU2A5g=|t&GGpkMKPjqk{!&zfG zd&yi+W}WFAXBo|GGM(ljW(&&Df!17yK!-HjOy?0g_%JJtnN^qz%G$<$OPJ0*)I_LB zp$~3EY~3k@n=_qj8FiFQ(R9vd_r}QdqDNVe%f7zFbS`E+@vmTbc9~VFSW#JtBVe9G zJ%xg@Zdi+#{%fWh6*vL=>TB?L2gPePf;eNT+6#bAAi#D6BPviquPWFrQ~>2zq?!TF zhRtY}b5!jspyyRwKN$hp-+;dg-8f~x2zf=A)~5Y5o)z2ZFksu1M@T#Ny=Y5C_fpU` zc9Aww(zW)-=qGjoEQ9tYIIf5@Uqkk8+H7ap7JEC(CP=s1r${GR*Gzi>{og>k-F}O7 z59v<(SEN()KimEW=``s%_V4hl$dK-`A19q9eUbew(mB!>+fN&yKSFx0s=W|}>ne&I z0sFsbRAL3nev9-D(xx3|fg4E&>_u!qFU=jhlNI-^guDj*$!-kf(6Y+PDG=3ie$`cW z9-`+lcvQ~%0iMcM@K!lH4?1A4fuM2@Q^v8U(5CChc-E*onvS6yj_Ki?QGtI4)H*1f zvRW5o@Pkoi)pTaB3KmGuARP!6Nnc3X3C5E-Wz8gA6O2cZH*KWrg7IutS?#17KttX^ zy3t+*|5hj6H>+xjm}WXT>Q(J;(W0MObGT&Kb7|N`3uPZ7eG%zEuu$k!*2Sb9`}>s7 zC0zsgEM?6jU1uMs{1Va)kk3}ueA115#n-^;(Naw*=itud*&B z-5PYGK0Pz&#(cUn=yv;bSI{lM&tlrogBQ>wVRrMjzyrrv01vmq%IisKRrKSojg9}H`Y16FuJ9@G9qmYD*_&YGNXF=eR zvLICB6(<$cKLl5XewA3WA#OORd6Hv4$#Um1NHs1{-#|{ki>!4++D5IduR&0Teg|2p zAzhQFyNTuWd&}BAq?@31)q&gC{~)+VzJASpy=puiQSRxEPt-pv`#fn)mT*H8RTb%%3}>vjoY-YSDpJT8@c8;HfgInJ;guioR;2r%J2lO``gQuiE6PQmT2U zsJ`N>HhZcb)%-7_`hl;y%2VB-CcYpl9o^NQIH}b6t2r2npQB*~SQz^kR3R1E)Bl48 zwjwxVPa{MVeb(#pBDSlO*yn91&QB!9XD0fj*YQQ}1uwv@jC;8Pt%2cMa{G6}-Q;+> z2n9)VpK57Z&L}>|BsKS?&Pyue^DJZTOJL!;9Y#~G0ek+B*!>TG9=5%DAl8pU<=hz< zk9g*~sL-229QTJ{Jek!V{2koLxF;t1Vo89Qw0Q}ZDc$COtAXo@J}YUqO|1UpTYY~v zt$bFju2X6%v+0j$3@_u^X#`29Eg;W7%IJSq52IN$*nb<`OvbhoLa!aF6*^_SNUjCR z){IsdGyaHT6&Mu=-r!hub6P+EWz%2jGU^F8Wg}ru{TH z@FXOjPi^ow-@sH&LAreK_u2sYq?+D@2jk0L38rn+1GIR^vp_CYpqs-H0G=~<8! zU)Cg(tKvybE`)0xGl`CAZM6dzd^2=>T}=>;~fkrJ}X1Qh1=i(QYACd zR4L~A*pW(RO1(oI4vtEtBgssAltqfkwA-Fw9EE7Yje$hYC)|io@q#BQ_T^lXh_sO0 zo{6NSOfeS8Z};d@CRr%5m~K;rep=&=g~|*Vwi5!F@i*)%M)IpYJ&vDRzjcJ(nyn3% z(8`=q{{g_9UGKa({BNIAZ&j^+=FLe?zf*ek@O_65AAbD42b}F&_4V}Dt&^;~Z*{(4 zy{XJr;|i;aff&~9w}ue2ZJkz+&R)`QE^L5iwe{znhpbN<=48V;c=)h6xxspMr}Kif z-$2QOhn-gsI|m;xvAB(rzuf7BtcN_6H9BM!+7Fs7^;>nxma)#HN!Bwvoky*28BXXb zknNxzy?#;2oLp}PFr>LWj^uHrp+^AQ-A!+GqJlVP5@3yEyL7Swuau^K^OFo~; z$_Vmf4#zf|PvZQX4CAYklA*xpiF@`_3NsO1>}Gc4*yA0EY})O}lw!q>Y{8q@ZJq72 zX0@dv-5s4W)1#?u!3}3KVRjOFDp^EhQ6D=hnZf+M$>nrb1-1mjzF4G>v%26G(X-vD zY_!LXA*h?O884Z1Y1d03*hSD~=y1lQP^Oeqm#td65e4*+7TiLCYMr^^Odbml)+BZ^ z5(?CYwQDzpmo2|a;Y9BbY_y;U!5aZTC)pA3>E)e2cF_ce6eG_(*CU9|iR1Gb1~i8g z9mpICWlCune75LDi&?ZY97|#n>8a#RM6Xrs zb_SqhMmC`8WSE_-kTDq;;F;Poi2ei#DX>QieSzYa&UDG`& z-Yncb@iK1Opp07_qp2nk*o}7w<$Q_p;z>qb9&G3d2DH3OWaV<&uEFh}Zq(AC({ElL zZ2U;jS$Zs}KPIQ3_fIyyKfWw)$9)_(&oq#)v&NXH$*ccG8QMS{(A{e00mvH;rb3c|Pkg?2Par;|dlnJF-TYI4|jYS7o%zK#dsl1zN zFS@-&)lNz;zwO;PLAU3#9;3x>cWJw~uC~WC9qI1QWA1x}JV`#1*^Y%q418|5I94~; z*P?dS9?hoH%=GpQQn4Kw?WLyY)J=qS?xHy#_&Oh!+)-ffp)ZbQ`No7gUQM`hOc}c7 zO;hTAjL%p|Xv6X0R(!hf*jebS7n>QLTl|Z5yr$qT_xBPCh9ILqmi7HHr|8%BcR&2` zl#-9iY;<9iG7ZNVO!@xk>_e9Upb z3`q4$>|W>kL6qq@56bQ8@eMfynSc2@o+iudU55^+gN*g!yfaj98nj;qq?!YN%ya+p zb+zsHf_H~UVYD{;MuO@xVd(kkZ|5INVc2$sbtIedEj{n_w}p6`|BsmmtPiE ziS;62Zt!<4TY;o&gpUBZruzCgXb!2b2RU?EdL|9A@K!!@Y#%dz__DN@a-Nwvd|7Jr zFayfcy)i7ZbOx03b*e{LqzSZ!$_=aayxReuI$wVaX#br?``f^Orc8e)X#ZkfQ0HId zAHW@wdyIPH%t6rp`;7j+0p7o8f7oY$IIixK>5Bly3J;7^a>%jXp9t1C+Z z^3CA=_bB6?G(yi0hyF$T&Jp}YBlt^3@XJQz$w8PwOL&cT(`qA>IaC?*Mz; ze8x?M(>;18sU7-9zOn-wD;?fsBR(%s9Q|@0)t&0$dBbC(iTp5wzvX#S{V71K^&hxB zIuY|Qp33HOVygG_I||aU8*!d-RW|4HJeE^srz(9YQ8H;5?ocVYal>mPV7|bZNW3t&%(P4`x;^+5%%~Zrt4`HoGbD$5q@t5nzNPqq{u%@ z9{wL9&Qa=Xl%p+=34V_VzsIP@M(tT5>|Q2bgm(irpY%JK2)oOG^naz`HG*N{#Y*h} z((Y#RsP|4H+Vv^H&r^^34+!$_P_+LV^{D?bBI-XzME$=J{U~hg7{^2+UW{{zD7O%3 zUZV6xUccLbe9w{R`;7=U_&zM}y0Q4aN*;*+8o6KK_)a3CFj7Lx`EH@zBEe;Xs|2qS zyk0OZ*e7_0;6A~B7JOLnTY^UgpAr0};BN$97kpdL#@fiZ&Jmm_$TgmF{)v>xHJi9z z@WX<=g8J`o(BCKgqk`WN{Hfpx!M6qZD+&5-5S%2~F36t~P`^@evtYO2ErRz59uWLj z!S4#57S!tn{4M4@1YRL{wO~{*D|oZuoq~FOK)L&be?;&x!DE7)|MdS0K|SxmzbQO^ z-k|l>oS%@77v#^)$ae}Z6kI9D-yTrEO|T%iQ}8aqdjua4{Howj1?OO1($6}<>jV>m zy9DnQ{Gs4&oJS~kx8P3%e=Yd3;C~C&aDKtQS#X-*MS{x(*9%4j(}Eur{5TO~_^{v) z1pgptV8XJVN+RsW3D4gtl3y%%jbKS|uiztsPYV8;2!F2#|2IJ!+gJKKPq0;RArbZ~ zgpUb-m*8HJe^>Blf+q#v794}^F#U%F=L#+$)??ii+(1NqTSQ+HzF+VYM2z*Pg}-0; zFA4v3;lC~X6T-hJ{L4h-=v%@Eu=bI!BBI{0!k;VrRN*fa{$jzUf@=h?7VH+x5JR%A mVl&D8B-{UxAXNAv8-Dm8xK1!9xLfc+!Q+Bl_gL;N!T$q7)Nz6U literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/Makefile b/2/linux-0.11-lab/0/linux/kernel/Makefile new file mode 100644 index 0000000..29b8f8d --- /dev/null +++ b/2/linux-0.11-lab/0/linux/kernel/Makefile @@ -0,0 +1,83 @@ +# +# Makefile for the FREAX-kernel. +# +# 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 =-m elf_i386 -Ttext 0 -e startup_32 +CC =gcc -march=i386 +CFLAGS =-w -g -fomit-frame-pointer -finline-functions \ + -nostdinc -fno-stack-protector -mcld -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 = sched.o system_call.o traps.o asm.o fork.o \ + panic.o printk.o vsprintf.o sys.o exit.o \ + signal.o mktime.o + +kernel.o: $(OBJS) + $(LD) -r -o kernel.o $(OBJS) + sync + +clean: + rm -f core *.o *.a tmp_make keyboard.s + for i in *.c;do rm -f `basename $$i .c`.s;done + (cd chr_drv; make clean) + (cd blk_drv; make clean) + (cd math; make clean) + +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 + (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/2/linux-0.11-lab/0/linux/kernel/asm.o b/2/linux-0.11-lab/0/linux/kernel/asm.o new file mode 100644 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/2/linux-0.11-lab/0/linux/kernel/blk_drv/Makefile b/2/linux-0.11-lab/0/linux/kernel/blk_drv/Makefile new file mode 100644 index 0000000..1fb57f9 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/blk_drv/blk.h b/2/linux-0.11-lab/0/linux/kernel/blk_drv/blk.h new file mode 100644 index 0000000..7a69b71 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/blk_drv/blk_drv.a b/2/linux-0.11-lab/0/linux/kernel/blk_drv/blk_drv.a new file mode 100644 index 0000000000000000000000000000000000000000..029c613816f6aa08df75c2987a2ea966da7f90df GIT binary patch literal 52196 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.c b/2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.c new file mode 100644 index 0000000..b1a7f3a --- /dev/null +++ b/2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.c @@ -0,0 +1,463 @@ +/* + * linux/kernel/floppy.c + * + * (C) 1991 Linus Torvalds + */ + +/* + * 02.12.91 - Changed to static variables to indicate need for reset + * and recalibrate. This makes some things easier (output_byte reset + * checking etc), and means less interrupt jumping in case of errors, + * so the code is hopefully easier to understand. + */ + +/* + * This file is certainly a mess. I've tried my best to get it working, + * but I don't like programming floppies, and I have only one anyway. + * Urgel. I should check for more errors, and do more graceful error + * recovery. Seems there are problems with several drives. I've tried to + * correct them. No promises. + */ + +/* + * As with hd.c, all routines within this file can (and will) be called + * by interrupts, so extreme caution is needed. A hardware interrupt + * handler may not sleep, or a kernel panic will happen. Thus I cannot + * call "floppy-on" directly, but have to set a special timer interrupt + * etc. + * + * Also, I'm not certain this works on more than 1 floppy. Bugs may + * abund. + */ + +#include +#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/2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.o b/2/linux-0.11-lab/0/linux/kernel/blk_drv/floppy.o new file mode 100644 index 0000000000000000000000000000000000000000..b4871a5df233fa5926607b6a5d161d3d293fb7e5 GIT binary patch literal 16608 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 Z75swW*93X)pgzwT#192CL2G{m{}&|+x&Z(H literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.c b/2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.c new file mode 100644 index 0000000..c0e908f --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.o b/2/linux-0.11-lab/0/linux/kernel/blk_drv/hd.o new file mode 100644 index 0000000000000000000000000000000000000000..5ac5783d7fdc4d39f17d41386cc27f187ee31410 GIT binary patch literal 15516 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/blk_drv/ll_rw_blk.c b/2/linux-0.11-lab/0/linux/kernel/blk_drv/ll_rw_blk.c new file mode 100644 index 0000000..f57d998 --- /dev/null +++ b/2/linux-0.11-lab/0/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 ; 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 J#}pn@_ + +#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/2/linux-0.11-lab/0/linux/kernel/blk_drv/ramdisk.o b/2/linux-0.11-lab/0/linux/kernel/blk_drv/ramdisk.o new file mode 100644 index 0000000000000000000000000000000000000000..1abb642d433cbe4b629bcf8510bd6c4e6d3dfec6 GIT binary patch literal 10660 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 b+;7nC^MV#o2hVR1BG*wO_cTQARfzus7wvEC literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/chr_drv/Makefile b/2/linux-0.11-lab/0/linux/kernel/chr_drv/Makefile new file mode 100644 index 0000000..9d4d8d1 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/chr_drv/chr_drv.a b/2/linux-0.11-lab/0/linux/kernel/chr_drv/chr_drv.a new file mode 100644 index 0000000000000000000000000000000000000000..8f9e7e9e6efb5f34c78d20517de1327d95899608 GIT binary patch literal 68886 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/chr_drv/console.c b/2/linux-0.11-lab/0/linux/kernel/chr_drv/console.c new file mode 100644 index 0000000..a12ffbf --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/chr_drv/console.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/console.o new file mode 100644 index 0000000000000000000000000000000000000000..201b995c8b2cfcd0b623e4c53db4d36891325e2e GIT binary patch literal 20892 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 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.2.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.2.o new file mode 100644 index 0000000000000000000000000000000000000000..031174bedf6e5d505616ece4312873277e2a897e GIT binary patch literal 6024 zcmeI#e@vA39S88wa~u>bD0IWd5iG3IN(IWPxG|4bR1~PJf@9^R^fvbklw!D>pTL?RpQ+*Mn* zGU;48w;s8AWVm>EqS<*&@?`N8oR_q?$>S<71X zqpQhU;>c|B>|}qn{cv?^^rDvZp)vE_uF)a;tZgVgQf5p+v(a!e&zk68+i!oIV{VD0 z$qveBBu~6MYUVcNcSdg;yG52o2Y7R&Lo%_2xmI$m;#$r11+F_NiwEVgc?!jaWqm1K-D*hd(S5D({u2 zo>`smUelLS`%*>SH(d2qFYbJ!H;u}7ZQZuLvigM`U;FX_+P}MD%QrWFy~g?6^Pe}s zb8!Rkt)*2&Z!|XbzI6@kYn>>G%03Hi{=n zKXUF_qjl!{-1=kwC2jvN*YEN04?E`X9^#lGKA#Ef{{#35JIW98gVZwKZ#~y-aaHE~ zpK@!PTu5U{h;Lu z-jVMJ@d9TQ`L6iWBS;w8CMAn&iV>NADwp!>m>c9c*@q{~-y%e^TuaWsKBFwh_X^U* z{$vG_O`o@4M%+HqhxAu00g5$0k>AgYOi%*W(9Ev7UddzABgmu5aDbK|L?%*VdOk+hj*KDN>d z4HbHly*F2dR&##u{1sz`erfR-h1PQ19G91JET4sDQD_SX1y;&ES8?o%%Xe`s%Y|7K zYT!U#>1I(#R%Cgdm_?yh4&*0q7RBgGmJTcLKhzg9$6;@gp3|tHUe`^>ZLg zhglRl!ol*z3!u=qIUiemZWVf$b9vR6MKR_oONo`A=0KJgD?h`5EFD&Uj)S(i`~v5{ ziR=FZ&c7A6{a2jJC!kpr`Yi|Y8EEBluJ6R8h?$s}}N;$FGszVT5{zB>r%_uT9zzgsdDvtEV$;3}Fnn zr^Vgv@flqh?X97p-%lNSfLirXI2aPvQb=tH1~rLg6Q;u%qTn94Y-;0qklNvO8v!>O z${*|}rxNgVk})GA;t3migYK~EZ=;T2he`oohaM)cPnC0T33@_ax35D}Lm|CWBi>Wf zdg2<4Yhzx?aC@-Z9o9S=-;Z3b@^9qRP=3!gehIjcx4?k7j_5t)XW=j4NAUOXk8le9 z72bvkJf@7h1ZKcISOhn~=V2Xegzc~k?t@Wy6w1GtHeR%*kyr6UD&xNh8{jMORj9$Y z;CJ9ppu8KUpNsGkybQ0vYw!jfhm&vy&cS(j3ogJrP~k;F#!ZANFb!tFOt=DO!(5mL z^I;)$z!F#r%V0UIfK{*t*1~$|f=$o^Rp^5O*adai1AE~?7=`_C03LV2lHVebifi=3d>+QtbkRp2G+uQ=z>kq16AmQ0oVm~*aLgvK^TSoZ~z{K z$KY{z0-l7Y;2=B=&%m?rJiGu$;269JFTu<33cLnyz;QSUXW$&1hqvGYyaN^f<}&U- zOo3@I17^Y%FdOE=JeUs)p#zq{QdkDdVFj#$HLw=eLl" +# 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/2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.S b/2/linux-0.11-lab/0/linux/kernel/chr_drv/keyboard.S new file mode 100644 index 0000000..25210b4 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/chr_drv/rs_io.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/rs_io.o new file mode 100644 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/2/linux-0.11-lab/0/linux/kernel/chr_drv/serial.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/serial.o new file mode 100644 index 0000000000000000000000000000000000000000..08791804f7d2c1e2d886e733b271b9853a625921 GIT binary patch literal 6748 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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/2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_io.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_io.o new file mode 100644 index 0000000000000000000000000000000000000000..649bc7813ba9c2ba657f367e157600043549baf1 GIT binary patch literal 22500 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 NtP8XgR +#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/2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_ioctl.o b/2/linux-0.11-lab/0/linux/kernel/chr_drv/tty_ioctl.o new file mode 100644 index 0000000000000000000000000000000000000000..6d9237dada723dc47381236cfebe028c99834d58 GIT binary patch literal 10644 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 tv&ImRdz$Ank>@Uv=PB`k#z!>r+@k!X# +#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/2/linux-0.11-lab/0/linux/kernel/exit.o b/2/linux-0.11-lab/0/linux/kernel/exit.o new file mode 100644 index 0000000000000000000000000000000000000000..cbe7c24cbc0eaa9d0ea78c184eef47914af32877 GIT binary patch literal 11160 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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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 z 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 F{{yjBU?%_o literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/math/Makefile b/2/linux-0.11-lab/0/linux/kernel/math/Makefile new file mode 100644 index 0000000..b35d488 --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/math/math.a b/2/linux-0.11-lab/0/linux/kernel/math/math.a new file mode 100644 index 0000000000000000000000000000000000000000..af6a92de910dce7d4fe836fdf979dc43c23015b1 GIT binary patch literal 6624 zcma)AZH!!189w*U?AdAOW4F88?KZ7ps#DoQcXoC=Y?sonr3+_s@?(S?u zq9;4|dESrnp7*@x+;i{U4cjfZRNc99G`+lyO^jbMu{A$7o=>N9%G7yHr?*Um{zq2| zAx!+L{M9YLTCnTwn&sOf5L~zEY8vRX&Czsc{IOgP!56O+d5k%cp9ls_A6@ymD`u`V z3W#x^Z#r=DuhXafOzZTKjDLD2 zGk^NQ%n5j(z9(}EP+9OZn=1=PGQ*XHnM|g#a4?guEKFzCS56+!q4}B?iIcBPAHMbMo9`&wy)XI$ALeux zT{_ohTY6(IKfi5bZgPHQ61HoxZs}m%oMt24uLBFTF zg@`g45jCF19x(31CBw~two0#&8SQ=_q8aUa7!ZkeISpT!X7?u8O(QlCLGRaSNpDte z-S;bldhLZ-k-iHPGH@?pxrpz)oY|2Nm+8;(;sAoZ5RupY4N1ud;Uo7m zTOp57aXood7T_swAdkr}Q-6RwA(^>67?;RD`2_im)c2anlN3J5vt}I zaZy-rCWoL4ENL@Ubmz2?F}ZSD7&cQar!3^B7Wi#db$Amn} zx>e2Ob+lNt)KG&vky~*GHf769E-*lef^Q~&MYl4Ac{ADOI5um2+)Or^L1i75=Y*N6 zm3<+rV-Q}$IG!iuZ7-tFyCycypWxraftXqE0g#yJ+6q3|earhC>o*A7t&$Y-A}G2G z^fu-FxON}qa8bDiqjg*4G5In27pK4zaw~mGAl}9pt9uY2AG%c~rJJ@I2jP(&50zxET_t zC(GFN3WS;*{toQ%5?5~%cZrC5 z037;J@*(*bTxE{o*NYyixSVS7`bF1!$n$l%g}0`Bn~r&U2)P}4c?o$m?s+*OC&*)R ziu$eO3Fya!oFwm+S5ki|`2h6eLT)1;ikI9iLS9C`K5jGd?c{0s6Z-EU&%|wOUdWx~ z!*RP5^38F(9P(V;E`~fGw>`w!MgK|Y!FQ8yhu#r#ihMWvf?rNP4ZVcMCfH4 zz`pr3v;#LoTK$v(dmp>~L3O^n1q-EEA9D_+#2^>K><{|& z!gEO)805l)wjqqLB&{Dr(aZt0@6Q~;aErpBK~y%h9315Oo2%bZX>A_FQkbiQPW$_~ z9YRxn5KChY2BsOrL$AT0*Y-8vKvm2k7Q#H!Tyq~$OARq}8wzZ0d=JVre#RqfBk-0B zJUZ6?2_wiak_uy$u`$&jkEGV6RvCS=cMW=FL_EF|DjaQ^#<2AVMI^N?ep!59Kkn0h zBa({8DH;%Ea?v&!$34B;xNt4?u`WUH6+H+@vU0V!a4qg;xW|G}bWf;YU16|fN3bsJ zf(~bhJ%+KbpRs#4AoeJ_ugW49cD``!zJAVO_s~}^SHt&pEv9ASso9@j9G2q1$5nEx zv&OEqVSu3fLqYdJbk}Lpe+|0p0#F>viu3znSQK~3ZP(iEP~fCNP4Pnw)s+{%MuhFR zAf|W$wnr_mE|zP&W8QMja%r^YG}`k*c=l}FZur?M zgLc07WlK!LKi0B67?Gss%r>kVICf9fw#r~g+ACFUO)GR%^XO7@>i^i8(Wn{e&6<;g zCu7gQ5Sxw7n&bVk9Zvt~nb;1~z;ry{a{U6Xr8!Zyy%MO~F8RW4lnZ6cw}fXEDm4pd zjPF_{yHIrey44a+p@ID8JP^xw>b7VH*Sh7+i3(m(ZCA8CyIkOm;N;o%oIphiC975| zxV8^nz1hb5rL$#nD~eERHp=vK?y?24!8b{**_g$9tuHF@EZZ=)oR%%Dn&sAo%{QQm z&Ws_#yqlFu0ol*nrM7PsYqlt2W(DSoum!J$If!zWkY33wWenmnvDYU zM6!-nNowOn!4bvLH>r1ROyY(70w=Qr^Vtp5afsa8&p%%(>w&AQ`{R9vfWkF=WD zLADEJqdB5>`AExc`gY03r!LmSaeZz#ESJhSD9GX>s{wHXs9lZaMJ7&xiy`U-r@{4w z(X~AU!!#YelT<17Z3KJOYLsg*2lux6#;%0DgNS!pjxXG1(--2ZJ$tsLhi@$6&S(dd z92svbY3#FO`D`w~DbV7Gn93iD>i`ju0Gw>QtkRk6SU7ik&oP&ZclM z3`3mMdOn6}yU(0TB~C{6r1qO{rV>+UQ?aR6>B~>`GJfGxitZxo9joKE0{U)%)sVS% zE$iF!zR0R$BU{A7G3z!1fyT03Y|moil_p#iw~9peQS?0~UE zw$!Ziz!cdA)-j9i5Ugv^$F3IC!mDimugeAS;*pLw71i>%c0K`UV_S#c3dMrUJ@~di z1d7L<>d$i*k7B_uVD`Zwt=bh~04;~&#gOU$zx;CWVV~eBg?B>;H$V;>$7SPx9>Um^ zABOM@Ub4a#+PMCm^LPvM;1>ty!5W0~*b5%^0TrJ>r&5O^q$N?3)k&YXgcSS!8~{m za~`ZuSeI4c9chc-Bi^^63tKpD=a{s;jzIgNzkQTDN1z;4W7C&slew&twBs$ZqeT|)%0L-WE4<_oSynmr=gKd&h*1A` zSyV(+1r|m4vl2@!f~@#P7=EVoA-_#aX5}63531RF;yn9K$l;mE{`=0epZ~1ud>D4V z{_)kJ;m?Vd)o@CSPw$S0NbN%&+Zd~epMe{B7HA^DhL%0b*hD|q@-Mah4a$8&{7&Qh zL~NFSYm8vQDf4VFaDyd?C^PpXk^kZ(V%rJ>n|%Wj_w2CNk80eZaatqm!hSp#h}?Tb zl|N9O13-2E0`JxKGa4V&__D@7YW%ate`-|uqkj+Q0bHl?LXBHA?$&s%#+xxW-c&AJq6YjZbO(p~hD + +#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/2/linux-0.11-lab/0/linux/kernel/math/math_emulate.o b/2/linux-0.11-lab/0/linux/kernel/math/math_emulate.o new file mode 100644 index 0000000000000000000000000000000000000000..144cd503e12416d76b8c526ae983c6644f246c33 GIT binary patch literal 6460 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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/2/linux-0.11-lab/0/linux/kernel/mktime.o b/2/linux-0.11-lab/0/linux/kernel/mktime.o new file mode 100644 index 0000000000000000000000000000000000000000..6bec513fa96b422f0b693aebe63f8644d5f0acbb GIT binary patch literal 2868 zcma)8U1%It6h3!mHraGH+f8=c=BLKwv}hC4A7V?5rNx&**q=#u>F#XY zowZFZ?aC4~gg(?CL=Y+nA}CVu#UGTk`p^f#3W`2S@kJj5?Sl~LLp|S}dy`3D^uXNn zopbK_x#!HC-K$4W9uq>4CP5~xOGN1o-!dlI5GARH+JDBEkED~!v>AUNLX2 z8m#g+ixuVdh{IiRhhsO?y>b*@~d;6{CI6TwL+OuT;{}*7JgVpXjye zhyR&F$D8H@ppt7zKToiH3$?Cgp0*y@i6iSUy1;1r+xRzrTjkpNb%_Z&mx<{L2-4Tcpc8_9-;CSD$rYniP0}pr&nY^&jBX-9U5i>Rz>k+*j@ogL>O_9jc ztm1Yggc*)R4n__|M1tGUO=b+jRN_E{L#T~mq7GXe?)Pnv_fI7dYP|35XZqpQ86q?6 zdl`M)w6P6h7mF$;teZA-@+tO;2r-p_dvqsFC9<53w)114Xf;(JJx1UPKL+9U3GpD- z&8xhuXrgUr%Wk34EILHh^Io~?*af&qRPt|eNX9mY#bIuj==h=|ocP5!mk94t;?Hfv zP8fR<;V*BTFf5MVbQ|S4*D0njIjDwBY2VsoW?wJZh9L zIo`s&L)lWT>SWz!(aY8vSq|U4m>IE0M>CaNK0D$ovVJ6aJQbyiW76@-$%Cn(v-zg$ zHT~mco@h#G^vdX%Ju)`zYx!EB`%L1}X%d&iVlZl1ukob#6_9g=P0n^QmNX|sOx|O= zu~7ALd9oW`-RC8Z>Q2S>oQodW#hjNTJKt!K4Q0{EH|J)`?re=s66f;yy7N-dnycsB zIlfZ?2lQ1ta1OEywQAMjIomF`)#icuZT5Yf(u^Dps{VhpgSYWJ1L!v-4U zr%NJ#IkSmx5W`-6um^pCjE@0i|5g*VSQuehQ%Zro%&}kZyQvc?yB6gwQaUi~OKT&` z8X`xqzH?mPXRJegA%1jyWwCxnj!MsWSK*U*x zyf~lE%lCaly!SZXJnJ;+csW)Cj@ErRB=h)0P-IpH5`W;|MEspm- zfFhkYm=mTW9Q<$Q{9z{kfspagcjOGl8{?)u#yU+po|ZKa>MgqeQ0u`r{=0%4%mCRU z%m##c;Qv^VO!)?`YfO^A@oNfGPIygZZyn9onG{_&GBV|f*HtE=qw8c+w|obo!Cmgf z#MVCj{x8GEZ!poDyjO79_znmz4;clQf%$-MQM@0Vhrbh?n?0oTS;Y@4enRmV6fY=V xQ~YJcUse1K#rdC<%=f9{Ux9PJ-<2HWqoAII;yb`~-CR800qmbpJjL8#`CmPqonrt1 literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/panic.c b/2/linux-0.11-lab/0/linux/kernel/panic.c new file mode 100644 index 0000000..7d8a06b --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/panic.o b/2/linux-0.11-lab/0/linux/kernel/panic.o new file mode 100644 index 0000000000000000000000000000000000000000..8c9e7191b1c2d678c3dc637c3db2a206b7de8cbe GIT binary patch literal 5420 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 +#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/2/linux-0.11-lab/0/linux/kernel/printk.o b/2/linux-0.11-lab/0/linux/kernel/printk.o new file mode 100644 index 0000000000000000000000000000000000000000..9955ac0a44f36d5a107fbcc8c5e4265cc6e7169b GIT binary patch literal 2420 zcma)7&u<$=6n?Y2PMkP#>V!~7iON=TO8|N8fK^I?l9E6awTeWWB2W?0+Fsk+*z2&n z4oOwukb;OJkSYNZfw zp1=Qncz6gozxPTZKem5j?9P=I>#s+aorCnXu{(&(?;OltyUUjUpdX-*mSD(biEp5I zCw6`z=2{OxGs>8C;|yj)3>+{sQeR0n_$pZHCro1UeauW8EIwsvpwS6o_z+OLO@rwT zwj4ht#rBX(BF|ph?G_CiDc1{8aJ1ScCk3AvO)iWv+IL$#fe z>NDe242^i#Lj08-#Vl_R4o6s4$@OaOUfm(u@X@GstHvQgShxMA)ru}wN@mw5#mY|l zH$9X7;-Z#9mZg=e=7L$V&RP|-*s=Xu>uL9~vuA*7?YdcPn#D%99uUia4yS853@VlW?3%fqGyI#}md4b#XoVv+ph!q92X|J{2 zAf&*(;e^{84wYKnj#Kh_^{~_pO32*XDweIexnkR{mdcT$wC?zx(~fd-s-wNuTDBic zL`w?`=girw)t(pjqJ0$~?MZ3w&AEzIt~?ZJ3Exyi;>KkXH`8Kz#4z4PLrtjpIGE%S zT*#((w1sS0yO>R1xSN&Vg%xafLc2;<5c&~sDdanCD|EI(vg&qdlT{4@vRGMns=el# z>ovMCNo-fEzO$LM+P>{IoqGbf(JBBn$f|Wa9S04tJoMSZ2}XU7(m1U(c~;T-|IhpY zocJRjh@JV(NnSm+F->C(Nfb@r;zFB%;~4D2eSwPj3uZa`{)pZNPLj&^2$bxv{Px)? zdUP1c+{}4BDu(5KjGr0Aq-^{SCD->Wl5auB>q}v%_00pT7(luX;d2HtDcfbp3bQGP zFUVvNld`QqPS#z8a11)G%llJx9bgp$NOQ>d5`&nO&4!%JSBJoPINvaa%J&*D$MC+H zc9HLw2+EmlJZ{EZ`Mr#WKP)|>N%`?PF;=vr4klJ8+sBX@%LfJg7W|%yeVC~u%rA{M#Bakk4 z+*j$u9qp4&qemY6EstYGlYO(ipC|q$_a9XLiAJw0Z3YrFC=9pPUiaP5A^Bclj|IeQ zDEm0LfP9{1900!~0^8#i3tU(}U*=q&`4n?po|DXRSf^wC6EUBU`BKa;#r#F)hzn!+ X>zIGf9Q9>gOne8}Zz1L;xCZ$jnX(S- literal 0 HcmV?d00001 diff --git a/2/linux-0.11-lab/0/linux/kernel/sched.c b/2/linux-0.11-lab/0/linux/kernel/sched.c new file mode 100644 index 0000000..15d839b --- /dev/null +++ b/2/linux-0.11-lab/0/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/2/linux-0.11-lab/0/linux/kernel/sched.o b/2/linux-0.11-lab/0/linux/kernel/sched.o new file mode 100644 index 0000000000000000000000000000000000000000..725b9fd4491fb4a6def8533390d7a4721b953df5 GIT binary patch literal 23040 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