From 21dd0e1a51171466400358c8b918d5f50ff53023 Mon Sep 17 00:00:00 2001 From: winPond Date: Sat, 6 Jul 2019 10:38:48 +0800 Subject: [PATCH] LAB 4 IS DONE. --- lab | 1 - lab/LAB4.si4project/Backup/dumbfork(162).c | 80 ++ lab/LAB4.si4project/Backup/dumbfork(7443).c | 80 ++ lab/LAB4.si4project/Backup/dumbfork(8040).c | 89 ++ lab/LAB4.si4project/Backup/entry(6508).S | 35 + lab/LAB4.si4project/Backup/env(1818).c | 569 ++++++++ lab/LAB4.si4project/Backup/env(4388).h | 70 + lab/LAB4.si4project/Backup/env(572).c | 572 ++++++++ lab/LAB4.si4project/Backup/fork(3728).c | 90 ++ lab/LAB4.si4project/Backup/ipc(963).c | 56 + lab/LAB4.si4project/Backup/pfentry(173).S | 82 ++ lab/LAB4.si4project/Backup/pgfault(4647).c | 37 + lab/LAB4.si4project/Backup/picirq(7101).c | 86 ++ lab/LAB4.si4project/Backup/pmap(6520).c | 1260 +++++++++++++++++ lab/LAB4.si4project/Backup/sched(4329).c | 84 ++ lab/LAB4.si4project/Backup/sched(5719).c | 99 ++ lab/LAB4.si4project/Backup/sched(6307).c | 99 ++ lab/LAB4.si4project/Backup/syscall(1135).c | 378 +++++ lab/LAB4.si4project/Backup/syscall(1286).c | 383 +++++ lab/LAB4.si4project/Backup/syscall(2799).c | 301 ++++ lab/LAB4.si4project/Backup/syscall(5045).h | 22 + lab/LAB4.si4project/Backup/syscall(7459).c | 384 +++++ lab/LAB4.si4project/Backup/trap(1475).c | 402 ++++++ lab/LAB4.si4project/Backup/trap(2812).c | 375 +++++ lab/LAB4.si4project/Backup/trap(359).c | 401 ++++++ lab/LAB4.si4project/Backup/trap(6309).c | 384 +++++ lab/LAB4.si4project/Backup/trapentry(2731).S | 100 ++ lab/LAB4.si4project/Backup/trapentry(7165).S | 100 ++ lab/LAB4.si4project/LAB4.SearchResults | 4 + lab/LAB4.si4project/LAB4.bookmarks.xml | 7 + lab/LAB4.si4project/LAB4.sip_sym | Bin 0 -> 224252 bytes lab/LAB4.si4project/LAB4.sip_xab | Bin 0 -> 49152 bytes lab/LAB4.si4project/LAB4.sip_xad | Bin 0 -> 808 bytes lab/LAB4.si4project/LAB4.sip_xc | Bin 0 -> 186720 bytes lab/LAB4.si4project/LAB4.sip_xf | Bin 0 -> 186720 bytes lab/LAB4.si4project/LAB4.sip_xm | Bin 0 -> 368 bytes lab/LAB4.si4project/LAB4.sip_xr | Bin 0 -> 186720 bytes lab/LAB4.si4project/LAB4.sip_xsb | Bin 0 -> 28672 bytes lab/LAB4.si4project/LAB4.sip_xsd | Bin 0 -> 608 bytes lab/LAB4.si4project/LAB4.siproj | Bin 0 -> 30688 bytes lab/LAB4.si4project/LAB4.siproj_settings.xml | 22 + lab/LAB4.si4project/LAB4.siwork | Bin 0 -> 104457 bytes lab/LAB4.si4project/LAB4.snippets.xml | 7 + .../cache/parse/boot_main.c.sisc | Bin 0 -> 7018 bytes .../cache/parse/fs_test.c.sisc | Bin 0 -> 2180 bytes .../cache/parse/gradelib.py.sisc | Bin 0 -> 57765 bytes .../cache/parse/inc_assert.h.sisc | Bin 0 -> 4137 bytes .../cache/parse/inc_elf.h.sisc | Bin 0 -> 6217 bytes .../cache/parse/inc_env.h.sisc | Bin 0 -> 6541 bytes .../cache/parse/inc_error.h.sisc | Bin 0 -> 2191 bytes .../cache/parse/inc_kbdreg.h.sisc | Bin 0 -> 7606 bytes .../cache/parse/inc_lib.h.sisc | Bin 0 -> 22686 bytes .../cache/parse/inc_memlayout.h.sisc | Bin 0 -> 5854 bytes .../cache/parse/inc_mmu.h.sisc | Bin 0 -> 22408 bytes .../cache/parse/inc_stab.h.sisc | Bin 0 -> 4524 bytes .../cache/parse/inc_stdarg.h.sisc | Bin 0 -> 2442 bytes .../cache/parse/inc_stdio.h.sisc | Bin 0 -> 13099 bytes .../cache/parse/inc_string.h.sisc | Bin 0 -> 19591 bytes .../cache/parse/inc_syscall.h.sisc | Bin 0 -> 2790 bytes .../cache/parse/inc_trap.h.sisc | Bin 0 -> 7702 bytes .../cache/parse/inc_types.h.sisc | Bin 0 -> 5952 bytes .../cache/parse/inc_x86.h.sisc | Bin 0 -> 29351 bytes .../cache/parse/kern_console.c.sisc | Bin 0 -> 23232 bytes .../cache/parse/kern_console.h.sisc | Bin 0 -> 3681 bytes .../cache/parse/kern_cpu.h.sisc | Bin 0 -> 6385 bytes .../cache/parse/kern_entrypgdir.c.sisc | Bin 0 -> 5558 bytes .../cache/parse/kern_env.c.sisc | Bin 0 -> 20903 bytes .../cache/parse/kern_env.h.sisc | Bin 0 -> 9277 bytes .../cache/parse/kern_init.c.sisc | Bin 0 -> 8486 bytes .../cache/parse/kern_kclock.c.sisc | Bin 0 -> 2820 bytes .../cache/parse/kern_kclock.h.sisc | Bin 0 -> 4158 bytes .../cache/parse/kern_kdebug.c.sisc | Bin 0 -> 10643 bytes .../cache/parse/kern_kdebug.h.sisc | Bin 0 -> 3159 bytes .../cache/parse/kern_lapic.c.sisc | Bin 0 -> 10218 bytes .../cache/parse/kern_monitor.c.sisc | Bin 0 -> 10831 bytes .../cache/parse/kern_monitor.h.sisc | Bin 0 -> 6180 bytes .../cache/parse/kern_mpconfig.c.sisc | Bin 0 -> 15692 bytes .../cache/parse/kern_picirq.c.sisc | Bin 0 -> 2940 bytes .../cache/parse/kern_picirq.h.sisc | Bin 0 -> 3515 bytes .../cache/parse/kern_pmap.c.sisc | Bin 0 -> 51924 bytes .../cache/parse/kern_pmap.h.sisc | Bin 0 -> 21284 bytes .../cache/parse/kern_printf.c.sisc | Bin 0 -> 4214 bytes .../cache/parse/kern_sched.c.sisc | Bin 0 -> 5531 bytes .../cache/parse/kern_sched.h.sisc | Bin 0 -> 1887 bytes .../cache/parse/kern_spinlock.c.sisc | Bin 0 -> 8508 bytes .../cache/parse/kern_spinlock.h.sisc | Bin 0 -> 5818 bytes .../cache/parse/kern_syscall.c.sisc | Bin 0 -> 23722 bytes .../cache/parse/kern_syscall.h.sisc | Bin 0 -> 3963 bytes .../cache/parse/kern_trap.c.sisc | Bin 0 -> 21438 bytes .../cache/parse/kern_trap.h.sisc | Bin 0 -> 5324 bytes .../cache/parse/lib_console.c.sisc | Bin 0 -> 2320 bytes .../cache/parse/lib_exit.c.sisc | Bin 0 -> 1302 bytes .../cache/parse/lib_fork.c.sisc | Bin 0 -> 7469 bytes .../cache/parse/lib_ipc.c.sisc | Bin 0 -> 6523 bytes .../cache/parse/lib_libmain.c.sisc | Bin 0 -> 3197 bytes .../cache/parse/lib_panic.c.sisc | Bin 0 -> 2435 bytes .../cache/parse/lib_pgfault.c.sisc | Bin 0 -> 2857 bytes .../cache/parse/lib_printf.c.sisc | Bin 0 -> 5213 bytes .../cache/parse/lib_printfmt.c.sisc | Bin 0 -> 21856 bytes .../cache/parse/lib_readline.c.sisc | Bin 0 -> 3646 bytes .../cache/parse/lib_string.c.sisc | Bin 0 -> 27516 bytes .../cache/parse/lib_syscall.c.sisc | Bin 0 -> 15683 bytes .../cache/parse/user_badsegment.c.sisc | Bin 0 -> 1962 bytes .../cache/parse/user_breakpoint.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_buggyhello.c.sisc | Bin 0 -> 1962 bytes .../cache/parse/user_buggyhello2.c.sisc | Bin 0 -> 2060 bytes .../cache/parse/user_divzero.c.sisc | Bin 0 -> 2059 bytes .../cache/parse/user_dumbfork.c.sisc | Bin 0 -> 5801 bytes .../cache/parse/user_evilhello.c.sisc | Bin 0 -> 1966 bytes .../cache/parse/user_fairness.c.sisc | Bin 0 -> 2983 bytes .../cache/parse/user_faultalloc.c.sisc | Bin 0 -> 2869 bytes .../cache/parse/user_faultallocbad.c.sisc | Bin 0 -> 2869 bytes .../cache/parse/user_faultbadhandler.c.sisc | Bin 0 -> 1974 bytes .../cache/parse/user_faultdie.c.sisc | Bin 0 -> 2851 bytes .../cache/parse/user_faultevilhandler.c.sisc | Bin 0 -> 1962 bytes .../cache/parse/user_faultnostack.c.sisc | Bin 0 -> 2303 bytes .../cache/parse/user_faultread.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_faultreadkernel.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_faultregs.c.sisc | Bin 0 -> 7457 bytes .../cache/parse/user_faultwrite.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_faultwritekernel.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_forktree.c.sisc | Bin 0 -> 4847 bytes .../cache/parse/user_hello.c.sisc | Bin 0 -> 1954 bytes .../cache/parse/user_idle.c.sisc | Bin 0 -> 2362 bytes .../cache/parse/user_pingpong.c.sisc | Bin 0 -> 2739 bytes .../cache/parse/user_pingpongs.c.sisc | Bin 0 -> 2844 bytes .../cache/parse/user_primes.c.sisc | Bin 0 -> 3355 bytes .../cache/parse/user_sendpage.c.sisc | Bin 0 -> 2805 bytes .../cache/parse/user_softint.c.sisc | Bin 0 -> 1958 bytes .../cache/parse/user_spin.c.sisc | Bin 0 -> 2401 bytes .../cache/parse/user_stresssched.c.sisc | Bin 0 -> 3048 bytes .../cache/parse/user_testbss.c.sisc | Bin 0 -> 2299 bytes .../cache/parse/user_yield.c.sisc | Bin 0 -> 2340 bytes lab/gradelib.py | 547 +++++++ lab/mergedep.pl | 86 ++ lab/mitlab4.si4project/mitlab4.sip_sym | Bin 0 -> 224432 bytes lab/mitlab4.si4project/mitlab4.sip_xab | Bin 0 -> 49152 bytes lab/mitlab4.si4project/mitlab4.sip_xad | Bin 0 -> 808 bytes lab/mitlab4.si4project/mitlab4.sip_xc | Bin 0 -> 186720 bytes lab/mitlab4.si4project/mitlab4.sip_xf | Bin 0 -> 186720 bytes lab/mitlab4.si4project/mitlab4.sip_xm | Bin 0 -> 368 bytes lab/mitlab4.si4project/mitlab4.sip_xr | Bin 0 -> 186720 bytes lab/mitlab4.si4project/mitlab4.sip_xsb | Bin 0 -> 28672 bytes lab/mitlab4.si4project/mitlab4.sip_xsd | Bin 0 -> 608 bytes lab/mitlab4.si4project/mitlab4.siproj | Bin 0 -> 30688 bytes lab/mitlab4.si4project/mitlab4.snippets.xml | 7 + 146 files changed, 7298 insertions(+), 1 deletion(-) delete mode 160000 lab create mode 100644 lab/LAB4.si4project/Backup/dumbfork(162).c create mode 100644 lab/LAB4.si4project/Backup/dumbfork(7443).c create mode 100644 lab/LAB4.si4project/Backup/dumbfork(8040).c create mode 100644 lab/LAB4.si4project/Backup/entry(6508).S create mode 100644 lab/LAB4.si4project/Backup/env(1818).c create mode 100644 lab/LAB4.si4project/Backup/env(4388).h create mode 100644 lab/LAB4.si4project/Backup/env(572).c create mode 100644 lab/LAB4.si4project/Backup/fork(3728).c create mode 100644 lab/LAB4.si4project/Backup/ipc(963).c create mode 100644 lab/LAB4.si4project/Backup/pfentry(173).S create mode 100644 lab/LAB4.si4project/Backup/pgfault(4647).c create mode 100644 lab/LAB4.si4project/Backup/picirq(7101).c create mode 100644 lab/LAB4.si4project/Backup/pmap(6520).c create mode 100644 lab/LAB4.si4project/Backup/sched(4329).c create mode 100644 lab/LAB4.si4project/Backup/sched(5719).c create mode 100644 lab/LAB4.si4project/Backup/sched(6307).c create mode 100644 lab/LAB4.si4project/Backup/syscall(1135).c create mode 100644 lab/LAB4.si4project/Backup/syscall(1286).c create mode 100644 lab/LAB4.si4project/Backup/syscall(2799).c create mode 100644 lab/LAB4.si4project/Backup/syscall(5045).h create mode 100644 lab/LAB4.si4project/Backup/syscall(7459).c create mode 100644 lab/LAB4.si4project/Backup/trap(1475).c create mode 100644 lab/LAB4.si4project/Backup/trap(2812).c create mode 100644 lab/LAB4.si4project/Backup/trap(359).c create mode 100644 lab/LAB4.si4project/Backup/trap(6309).c create mode 100644 lab/LAB4.si4project/Backup/trapentry(2731).S create mode 100644 lab/LAB4.si4project/Backup/trapentry(7165).S create mode 100644 lab/LAB4.si4project/LAB4.SearchResults create mode 100644 lab/LAB4.si4project/LAB4.bookmarks.xml create mode 100644 lab/LAB4.si4project/LAB4.sip_sym create mode 100644 lab/LAB4.si4project/LAB4.sip_xab create mode 100644 lab/LAB4.si4project/LAB4.sip_xad create mode 100644 lab/LAB4.si4project/LAB4.sip_xc create mode 100644 lab/LAB4.si4project/LAB4.sip_xf create mode 100644 lab/LAB4.si4project/LAB4.sip_xm create mode 100644 lab/LAB4.si4project/LAB4.sip_xr create mode 100644 lab/LAB4.si4project/LAB4.sip_xsb create mode 100644 lab/LAB4.si4project/LAB4.sip_xsd create mode 100644 lab/LAB4.si4project/LAB4.siproj create mode 100644 lab/LAB4.si4project/LAB4.siproj_settings.xml create mode 100644 lab/LAB4.si4project/LAB4.siwork create mode 100644 lab/LAB4.si4project/LAB4.snippets.xml create mode 100644 lab/LAB4.si4project/cache/parse/boot_main.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/fs_test.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/gradelib.py.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_assert.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_elf.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_env.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_error.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_kbdreg.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_lib.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_memlayout.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_mmu.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_stab.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_stdarg.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_stdio.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_string.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_syscall.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_trap.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_types.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/inc_x86.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_console.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_console.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_cpu.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_entrypgdir.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_env.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_env.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_init.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_kclock.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_kclock.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_kdebug.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_kdebug.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_lapic.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_monitor.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_monitor.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_mpconfig.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_picirq.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_picirq.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_pmap.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_pmap.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_printf.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_sched.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_sched.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_spinlock.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_spinlock.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_syscall.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_syscall.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_trap.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/kern_trap.h.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_console.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_exit.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_fork.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_ipc.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_libmain.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_panic.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_pgfault.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_printf.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_printfmt.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_readline.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_string.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/lib_syscall.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_badsegment.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_breakpoint.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_buggyhello.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_buggyhello2.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_divzero.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_dumbfork.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_evilhello.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_fairness.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultalloc.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultallocbad.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultbadhandler.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultdie.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultevilhandler.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultnostack.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultread.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultreadkernel.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultregs.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultwrite.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_faultwritekernel.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_forktree.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_hello.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_idle.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_pingpong.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_pingpongs.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_primes.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_sendpage.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_softint.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_spin.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_stresssched.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_testbss.c.sisc create mode 100644 lab/LAB4.si4project/cache/parse/user_yield.c.sisc create mode 100644 lab/gradelib.py create mode 100644 lab/mergedep.pl create mode 100644 lab/mitlab4.si4project/mitlab4.sip_sym create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xab create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xad create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xc create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xf create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xm create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xr create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xsb create mode 100644 lab/mitlab4.si4project/mitlab4.sip_xsd create mode 100644 lab/mitlab4.si4project/mitlab4.siproj create mode 100644 lab/mitlab4.si4project/mitlab4.snippets.xml diff --git a/lab b/lab deleted file mode 160000 index da14b2e..0000000 --- a/lab +++ /dev/null @@ -1 +0,0 @@ -Subproject commit da14b2e50ce4907bf9aea5895f8c1ec1110e979d diff --git a/lab/LAB4.si4project/Backup/dumbfork(162).c b/lab/LAB4.si4project/Backup/dumbfork(162).c new file mode 100644 index 0000000..e5e433c --- /dev/null +++ b/lab/LAB4.si4project/Backup/dumbfork(162).c @@ -0,0 +1,80 @@ +// Ping-pong a counter between two processes. +// Only need to start one of these -- splits into two, crudely. + +#include +#include + +envid_t dumbfork(void); + +void +umain(int argc, char **argv) +{ + envid_t who; + int i; + + // fork a child process + who = dumbfork(); + + // print a message and yield to the other a few times + for (i = 0; i < (who ? 10 : 20); i++) { + cprintf("%d: I am the %s!\n", i, who ? "parent" : "child"); + sys_yield(); + } +} + +void +duppage(envid_t dstenv, void *addr) +{ + int r; + + // This is NOT what you should do in your fork. + if ((r = sys_page_alloc(dstenv, addr, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_alloc: %e", r); + if ((r = sys_page_map(dstenv, addr, 0, UTEMP, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_map: %e", r); + memmove(UTEMP, addr, PGSIZE); + if ((r = sys_page_unmap(0, UTEMP)) < 0) + panic("sys_page_unmap: %e", r); +} + +envid_t +dumbfork(void) +{ + envid_t envid; + uint8_t *addr; + int r; + extern unsigned char end[]; + + // Allocate a new child environment. + // The kernel will initialize it with a copy of our register state, + // so that the child will appear to have called sys_exofork() too - + // except that in the child, this "fake" call to sys_exofork() + // will return 0 instead of the envid of the child. + envid = sys_exofork(); + if (envid < 0) + panic("sys_exofork: %e", envid); + if (envid == 0) { + // We're the child. + // The copied value of the global variable 'thisenv' + // is no longer valid (it refers to the parent!). + // Fix it and return 0. + thisenv = &envs[ENVX(sys_getenvid())]; + return 0; + } + + // We're the parent. + // Eagerly copy our entire address space into the child. + // This is NOT what you should do in your fork implementation. + for (addr = (uint8_t*) UTEXT; addr < end; addr += PGSIZE) + duppage(envid, addr); + + // Also copy the stack we are currently running on. + duppage(envid, ROUNDDOWN(&addr, PGSIZE)); + + // Start the child environment running + if ((r = sys_env_set_status(envid, ENV_RUNNABLE)) < 0) + panic("sys_env_set_status: %e", r); + + return envid; +} + diff --git a/lab/LAB4.si4project/Backup/dumbfork(7443).c b/lab/LAB4.si4project/Backup/dumbfork(7443).c new file mode 100644 index 0000000..e5e433c --- /dev/null +++ b/lab/LAB4.si4project/Backup/dumbfork(7443).c @@ -0,0 +1,80 @@ +// Ping-pong a counter between two processes. +// Only need to start one of these -- splits into two, crudely. + +#include +#include + +envid_t dumbfork(void); + +void +umain(int argc, char **argv) +{ + envid_t who; + int i; + + // fork a child process + who = dumbfork(); + + // print a message and yield to the other a few times + for (i = 0; i < (who ? 10 : 20); i++) { + cprintf("%d: I am the %s!\n", i, who ? "parent" : "child"); + sys_yield(); + } +} + +void +duppage(envid_t dstenv, void *addr) +{ + int r; + + // This is NOT what you should do in your fork. + if ((r = sys_page_alloc(dstenv, addr, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_alloc: %e", r); + if ((r = sys_page_map(dstenv, addr, 0, UTEMP, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_map: %e", r); + memmove(UTEMP, addr, PGSIZE); + if ((r = sys_page_unmap(0, UTEMP)) < 0) + panic("sys_page_unmap: %e", r); +} + +envid_t +dumbfork(void) +{ + envid_t envid; + uint8_t *addr; + int r; + extern unsigned char end[]; + + // Allocate a new child environment. + // The kernel will initialize it with a copy of our register state, + // so that the child will appear to have called sys_exofork() too - + // except that in the child, this "fake" call to sys_exofork() + // will return 0 instead of the envid of the child. + envid = sys_exofork(); + if (envid < 0) + panic("sys_exofork: %e", envid); + if (envid == 0) { + // We're the child. + // The copied value of the global variable 'thisenv' + // is no longer valid (it refers to the parent!). + // Fix it and return 0. + thisenv = &envs[ENVX(sys_getenvid())]; + return 0; + } + + // We're the parent. + // Eagerly copy our entire address space into the child. + // This is NOT what you should do in your fork implementation. + for (addr = (uint8_t*) UTEXT; addr < end; addr += PGSIZE) + duppage(envid, addr); + + // Also copy the stack we are currently running on. + duppage(envid, ROUNDDOWN(&addr, PGSIZE)); + + // Start the child environment running + if ((r = sys_env_set_status(envid, ENV_RUNNABLE)) < 0) + panic("sys_env_set_status: %e", r); + + return envid; +} + diff --git a/lab/LAB4.si4project/Backup/dumbfork(8040).c b/lab/LAB4.si4project/Backup/dumbfork(8040).c new file mode 100644 index 0000000..281f4bf --- /dev/null +++ b/lab/LAB4.si4project/Backup/dumbfork(8040).c @@ -0,0 +1,89 @@ +// Ping-pong a counter between two processes. +// Only need to start one of these -- splits into two, crudely. + +#include +#include + +envid_t dumbfork(void); + +void +umain(int argc, char **argv) +{ + envid_t who; + int i; + + // fork a child process + who = dumbfork(); + + // print a message and yield to the other a few times + for (i = 0; i < (who ? 10 : 20); i++) { + cprintf("%d: I am the %s!\n", i, who ? "parent" : "child"); + sys_yield(); + } +} + +void +duppage(envid_t dstenv, void *addr) +{ + int r; + + // This is NOT what you should do in your fork. + if ((r = sys_page_alloc(dstenv, addr, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_alloc: %e", r); + // dstenv 的 addr 映射到 envs[0]的UTEMP, + if ((r = sys_page_map(dstenv, addr, 0, UTEMP, PTE_P|PTE_U|PTE_W)) < 0) + panic("sys_page_map: %e", r); + + memmove(UTEMP, addr, PGSIZE); + if ((r = sys_page_unmap(0, UTEMP)) < 0) + panic("sys_page_unmap: %e", r); +} + +envid_t +dumbfork(void) +{ + envid_t envid; + uint8_t *addr; + int r; + extern unsigned char end[]; + + // Allocate a new child environment. + // The kernel will initialize it with a copy of our register state, + // so that the child will appear to have called sys_exofork() too - + // except that in the child, this "fake" call to sys_exofork() + // will return 0 instead of the envid of the child. + envid = sys_exofork(); + cprintf("envid: %d\n",envid); + if (envid < 0) + panic("sys_exofork: %e", envid); + if (envid == 0) { + // We're the child. + // The copied value of the global variable 'thisenv' + // is no longer valid (it refers to the parent!). + // Fix it and return 0. + // "child, sysgetenvid() : 1 + // cprintf("child, sysgetenvid() :%d\n", ENVX(sys_getenvid())); + thisenv = &envs[ENVX(sys_getenvid())]; + return 0; + } + + // We're the parent. + // Eagerly copy our entire address space into the child. + // This is NOT what you should do in your fork implementation. + for (addr = (uint8_t*) UTEXT; addr < end; addr += PGSIZE) { + // copying addr :00800000 + // copying addr :00801000 + // copying addr :00802000 + cprintf("copying addr :%08x\n", (uint32_t)addr); + duppage(envid, addr); + } + // Also copy the stack we are currently running on. + duppage(envid, ROUNDDOWN(&addr, PGSIZE)); + + // Start the child environment running + if ((r = sys_env_set_status(envid, ENV_RUNNABLE)) < 0) + panic("sys_env_set_status: %e", r); + + return envid; +} + diff --git a/lab/LAB4.si4project/Backup/entry(6508).S b/lab/LAB4.si4project/Backup/entry(6508).S new file mode 100644 index 0000000..222d16c --- /dev/null +++ b/lab/LAB4.si4project/Backup/entry(6508).S @@ -0,0 +1,35 @@ +#include +#include + +.data +// Define the global symbols 'envs', 'pages', 'uvpt', and 'uvpd' +// so that they can be used in C as if they were ordinary global arrays. + .globl envs + .set envs, UENVS + .globl pages + .set pages, UPAGES + .globl uvpt + .set uvpt, UVPT + .globl uvpd + .set uvpd, (UVPT+(UVPT>>12)*4) + + +// Entrypoint - this is where the kernel (or our parent environment) +// starts us running when we are initially loaded into a new environment. +.text +.globl _start +_start: + // See if we were started with arguments on the stack + cmpl $USTACKTOP, %esp + jne args_exist + + // If not, push dummy argc/argv arguments. + // This happens when we are loaded by the kernel, + // because the kernel does not know about passing arguments. + pushl $0 + pushl $0 + +args_exist: + call libmain +1: jmp 1b + diff --git a/lab/LAB4.si4project/Backup/env(1818).c b/lab/LAB4.si4project/Backup/env(1818).c new file mode 100644 index 0000000..746327b --- /dev/null +++ b/lab/LAB4.si4project/Backup/env(1818).c @@ -0,0 +1,569 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +struct Env *envs = NULL; // All environments +static struct Env *env_free_list; // Free environment list + // (linked by Env->env_link) + +#define ENVGENSHIFT 12 // >= LOGNENV + +// Global descriptor table. +// +// Set up global descriptor table (GDT) with separate segments for +// kernel mode and user mode. Segments serve many purposes on the x86. +// We don't use any of their memory-mapping capabilities, but we need +// them to switch privilege levels. +// +// The kernel and user segments are identical except for the DPL. +// To load the SS register, the CPL must equal the DPL. Thus, +// we must duplicate the segments for the user and the kernel. +// +// In particular, the last argument to the SEG macro used in the +// definition of gdt specifies the Descriptor Privilege Level (DPL) +// of that descriptor: 0 for kernel and 3 for user. +// +struct Segdesc gdt[NCPU + 5] = +{ + // 0x0 - unused (always faults -- for trapping NULL far pointers) + SEG_NULL, + + // 0x8 - kernel code segment + [GD_KT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 0), + + // 0x10 - kernel data segment + [GD_KD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 0), + + // 0x18 - user code segment + [GD_UT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 3), + + // 0x20 - user data segment + [GD_UD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 3), + + // Per-CPU TSS descriptors (starting from GD_TSS0) are initialized + // in trap_init_percpu() + [GD_TSS0 >> 3] = SEG_NULL +}; + +struct Pseudodesc gdt_pd = { + sizeof(gdt) - 1, (unsigned long) gdt +}; + +// +// Converts an envid to an env pointer. +// If checkperm is set, the specified environment must be either the +// current environment or an immediate child of the current environment. +// +// RETURNS +// 0 on success, -E_BAD_ENV on error. +// On success, sets *env_store to the environment. +// On error, sets *env_store to NULL. +// +int +envid2env(envid_t envid, struct Env **env_store, bool checkperm) +{ + struct Env *e; + + // If envid is zero, return the current environment. + if (envid == 0) { + *env_store = curenv; + return 0; + } + + // Look up the Env structure via the index part of the envid, + // then check the env_id field in that struct Env + // to ensure that the envid is not stale + // (i.e., does not refer to a _previous_ environment + // that used the same slot in the envs[] array). + e = &envs[ENVX(envid)]; + if (e->env_status == ENV_FREE || e->env_id != envid) { + *env_store = 0; + return -E_BAD_ENV; + } + + // Check that the calling environment has legitimate permission + // to manipulate the specified environment. + // If checkperm is set, the specified environment + // must be either the current environment + // or an immediate child of the current environment. + if (checkperm && e != curenv && e->env_parent_id != curenv->env_id) { + *env_store = 0; + return -E_BAD_ENV; + } + + *env_store = e; + return 0; +} + +// Mark all environments in 'envs' as free, set their env_ids to 0, +// and insert them into the env_free_list. +// Make sure the environments are in the free list in the same order +// they are in the envs array (i.e., so that the first call to +// env_alloc() returns envs[0]). +// +void +env_init(void) +{ + // Set up envs array + // LAB 3: Your code here. + int i; + // 确保最小的env在最前端 + for (i = NENV-1; i >= 0; --i) { + envs[i].env_id = 0; + + envs[i].env_link = env_free_list; + env_free_list = &envs[i]; + } + + // Per-CPU part of the initialization + env_init_percpu(); +} + +// Load GDT and segment descriptors. +void +env_init_percpu(void) +{ + lgdt(&gdt_pd); + // The kernel never uses GS or FS, so we leave those set to + // the user data segment. + asm volatile("movw %%ax,%%gs" : : "a" (GD_UD|3)); + asm volatile("movw %%ax,%%fs" : : "a" (GD_UD|3)); + // The kernel does use ES, DS, and SS. We'll change between + // the kernel and user data segments as needed. + asm volatile("movw %%ax,%%es" : : "a" (GD_KD)); + asm volatile("movw %%ax,%%ds" : : "a" (GD_KD)); + asm volatile("movw %%ax,%%ss" : : "a" (GD_KD)); + // Load the kernel text segment into CS. + asm volatile("ljmp %0,$1f\n 1:\n" : : "i" (GD_KT)); + // For good measure, clear the local descriptor table (LDT), + // since we don't use it. + lldt(0); +} + +// +// Initialize the kernel virtual memory layout for environment e. +// Allocate a page directory, set e->env_pgdir accordingly, +// and initialize the kernel portion of the new environment's address space. +// Do NOT (yet) map anything into the user portion +// of the environment's virtual address space. +// +// Returns 0 on success, < 0 on error. Errors include: +// -E_NO_MEM if page directory or table could not be allocated. +// 这里又为每个环境分配一个页目录,有点晕了。 +static int +env_setup_vm(struct Env *e) +{ + int i; + struct PageInfo *p = NULL; + + // Allocate a page for the page directory + if (!(p = page_alloc(ALLOC_ZERO))) + return -E_NO_MEM; + + // Now, set e->env_pgdir and initialize the page directory. + // + // Hint: + // - The VA space of all envs is identical above UTOP + // (except at UVPT, which we've set below). + // See inc/memlayout.h for permissions and layout. + // Can you use kern_pgdir as a template? Hint: Yes. + // (Make sure you got the permissions right in Lab 2.) + // - The initial VA below UTOP is empty. + // - You do not need to make any more calls to page_alloc. + // - Note: In general, pp_ref is not maintained for + // physical pages mapped only above UTOP, but env_pgdir + // is an exception -- you need to increment env_pgdir's + // pp_ref for env_free to work correctly. + // - The functions in kern/pmap.h are handy. + + + // LAB 3: Your code here. + // 申请一个页表存用户环境的页目录 + + e->env_pgdir = page2kva(p); + // why ?因为在UTOP之上都是一样的,所以可以直接把kern_pgdir的内容全部拷贝过来 + + memcpy(e->env_pgdir, kern_pgdir, PGSIZE); + p->pp_ref++; + // UVPT maps the env's own page table read-only. + // Permissions: kernel R, user R + // 但是唯独UVPT这个地方是不一样的,因为要放的是自己的页表目录 + e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_P | PTE_U; + + return 0; +} + +// +// Allocates and initializes a new environment. +// On success, the new environment is stored in *newenv_store. +// +// Returns 0 on success, < 0 on failure. Errors include: +// -E_NO_FREE_ENV if all NENV environments are allocated +// -E_NO_MEM on memory exhaustion +// +int +env_alloc(struct Env **newenv_store, envid_t parent_id) +{ + int32_t generation; + int r; + struct Env *e; + + if (!(e = env_free_list)) + return -E_NO_FREE_ENV; + + // Allocate and set up the page directory for this environment. + if ((r = env_setup_vm(e)) < 0) + return r; + + // Generate an env_id for this environment. + generation = (e->env_id + (1 << ENVGENSHIFT)) & ~(NENV - 1); + if (generation <= 0) // Don't create a negative env_id. + generation = 1 << ENVGENSHIFT; + e->env_id = generation | (e - envs); + + // Set the basic status variables. + e->env_parent_id = parent_id; + e->env_type = ENV_TYPE_USER; + e->env_status = ENV_RUNNABLE; + e->env_runs = 0; + + // Clear out all the saved register state, + // to prevent the register values + // of a prior environment inhabiting this Env structure + // from "leaking" into our new environment. + memset(&e->env_tf, 0, sizeof(e->env_tf)); + + // Set up appropriate initial values for the segment registers. + // GD_UD is the user data segment selector in the GDT, and + // GD_UT is the user text segment selector (see inc/memlayout.h). + // The low 2 bits of each segment register contains the + // Requestor Privilege Level (RPL); 3 means user mode. When + // we switch privilege levels, the hardware does various + // checks involving the RPL and the Descriptor Privilege Level + // (DPL) stored in the descriptors themselves. + e->env_tf.tf_ds = GD_UD | 3; + e->env_tf.tf_es = GD_UD | 3; + e->env_tf.tf_ss = GD_UD | 3; + e->env_tf.tf_esp = USTACKTOP; + e->env_tf.tf_cs = GD_UT | 3; + // You will set e->env_tf.tf_eip later. + + // Enable interrupts while in user mode. + // LAB 4: Your code here. + + // Clear the page fault handler until user installs one. + e->env_pgfault_upcall = 0; + + // Also clear the IPC receiving flag. + e->env_ipc_recving = 0; + + // commit the allocation + env_free_list = e->env_link; + *newenv_store = e; + + cprintf("[%08x] new env %08x\n", curenv ? curenv->env_id : 0, e->env_id); + return 0; +} + +// +// Allocate len bytes of physical memory for environment env, +// and map it at virtual address va in the environment's address space. +// Does not zero or otherwise initialize the mapped pages in any way. +// Pages should be writable by user and kernel. +// Panic if any allocation attempt fails. +// +static void +region_alloc(struct Env *e, void *va, size_t len) +{ + // LAB 3: Your code here. + // (But only if you need it for load_icode.) + // + struct PageInfo *pp; + size_t i; + size_t pgs = ROUNDUP(len, PGSIZE)/PGSIZE; + size_t pva = ROUNDDOWN((size_t)va, PGSIZE); + + + for(i=0; i < pgs; i++) { + if (!(pp = page_alloc(ALLOC_ZERO))) { + int ex = -E_NO_MEM; + panic("region_alloc: %e", ex); + } + page_insert(e->env_pgdir, pp, (void *)pva, PTE_U|PTE_W|PTE_P); + pva += PGSIZE; + + } + // Hint: It is easier to use region_alloc if the caller can pass + // 'va' and 'len' values that are not page-aligned. + // You should round va down, and round (va + len) up. + // (Watch out for corner-cases!) +} + +// +// Set up the initial program binary, stack, and processor flags +// for a user process. +// This function is ONLY called during kernel initialization, +// before running the first user-mode environment. +// +// This function loads all loadable segments from the ELF binary image +// into the environment's user memory, starting at the appropriate +// virtual addresses indicated in the ELF program header. +// At the same time it clears to zero any portions of these segments +// that are marked in the program header as being mapped +// but not actually present in the ELF file - i.e., the program's bss section. +// +// All this is very similar to what our boot loader does, except the boot +// loader also needs to read the code from disk. Take a look at +// boot/main.c to get ideas. +// +// Finally, this function maps one page for the program's initial stack. +// +// load_icode panics if it encounters problems. +// - How might load_icode fail? What might be wrong with the given input? +// +static void +load_icode(struct Env *e, uint8_t *binary) +{ + // Hints: + // Load each program segment into virtual memory + // at the address specified in the ELF segment header. + // You should only load segments with ph->p_type == ELF_PROG_LOAD. + // Each segment's virtual address can be found in ph->p_va + // and its size in memory can be found in ph->p_memsz. + // The ph->p_filesz bytes from the ELF binary, starting at + // 'binary + ph->p_offset', should be copied to virtual address + // ph->p_va. Any remaining memory bytes should be cleared to zero. + // (The ELF header should have ph->p_filesz <= ph->p_memsz.) + // Use functions from the previous lab to allocate and map pages. + // + // All page protection bits should be user read/write for now. + // ELF segments are not necessarily page-aligned, but you can + // assume for this function that no two segments will touch + // the same virtual page. + // + // You may find a function like region_alloc useful. + // + // Loading the segments is much simpler if you can move data + // directly into the virtual addresses stored in the ELF binary. + // So which page directory should be in force during + // this function? + // + // You must also do something with the program's entry point, + // to make sure that the environment starts executing there. + // What? (See env_run() and env_pop_tf() below.) + + // LAB 3: Your code here. + // 怎么得到program的ELF地址? 就是bianry + struct Proghdr *ph, *eph; + struct Elf *elfhdr = (struct Elf *)binary; + + // is this a valid ELF? + if (elfhdr->e_magic != ELF_MAGIC) + panic("elf header's magic is not correct\n"); + + // 所有程序段 + ph = (struct Proghdr *)((uint8_t *)elfhdr + elfhdr->e_phoff); + eph = ph + elfhdr->e_phnum; + // 转换到用户页目录,用户空间映射 + lcr3(PADDR(e->env_pgdir)); + + for(; ph < eph; ph++) { + + if (ph->p_type != ELF_PROG_LOAD) + continue; + if (ph->p_filesz > ph->p_memsz) + panic("file size is great than memmory size\n"); + + region_alloc(e, (void *)ph->p_va, ph->p_memsz); + memcpy((void *)ph->p_va, binary + ph->p_offset, ph->p_filesz); + // clear bss section + memset((void *)ph->p_va + ph->p_filesz, 0, (ph->p_memsz - ph->p_filesz)); + + } + e->env_tf.tf_eip = elfhdr->e_entry; + // Now map one page for the program's initial stack + // at virtual address USTACKTOP - PGSIZE. + + // LAB 3: Your code here. + + // map the user stack + region_alloc(e, (void *)USTACKTOP-PGSIZE, PGSIZE); + lcr3(PADDR(kern_pgdir)); +} + +// +// Allocates a new env with env_alloc, loads the named elf +// binary into it with load_icode, and sets its env_type. +// This function is ONLY called during kernel initialization, +// before running the first user-mode environment. +// The new env's parent ID is set to 0. +// +void +env_create(uint8_t *binary, enum EnvType type) +{ + // LAB 3: Your code here. + struct Env *newenv; + int ret = 0; + if ((ret = env_alloc(&newenv, 0)) < 0) { + panic("env_create: %e\n", ret); + } + newenv->env_type = type; + load_icode(newenv, binary); + +} + +// +// Frees env e and all memory it uses. +// +void +env_free(struct Env *e) +{ + pte_t *pt; + uint32_t pdeno, pteno; + physaddr_t pa; + + // If freeing the current environment, switch to kern_pgdir + // before freeing the page directory, just in case the page + // gets reused. + if (e == curenv) + lcr3(PADDR(kern_pgdir)); + + // Note the environment's demise. + cprintf("[%08x] free env %08x\n", curenv ? curenv->env_id : 0, e->env_id); + + // Flush all mapped pages in the user portion of the address space + static_assert(UTOP % PTSIZE == 0); + for (pdeno = 0; pdeno < PDX(UTOP); pdeno++) { + + // only look at mapped page tables + if (!(e->env_pgdir[pdeno] & PTE_P)) + continue; + + // find the pa and va of the page table + pa = PTE_ADDR(e->env_pgdir[pdeno]); + pt = (pte_t*) KADDR(pa); + + // unmap all PTEs in this page table + for (pteno = 0; pteno <= PTX(~0); pteno++) { + if (pt[pteno] & PTE_P) + page_remove(e->env_pgdir, PGADDR(pdeno, pteno, 0)); + } + + // free the page table itself + e->env_pgdir[pdeno] = 0; + page_decref(pa2page(pa)); + } + + // free the page directory + pa = PADDR(e->env_pgdir); + e->env_pgdir = 0; + page_decref(pa2page(pa)); + + // return the environment to the free list + e->env_status = ENV_FREE; + e->env_link = env_free_list; + env_free_list = e; +} + +// +// Frees environment e. +// If e was the current env, then runs a new environment (and does not return +// to the caller). +// +void +env_destroy(struct Env *e) +{ + // If e is currently running on other CPUs, we change its state to + // ENV_DYING. A zombie environment will be freed the next time + // it traps to the kernel. + if (e->env_status == ENV_RUNNING && curenv != e) { + e->env_status = ENV_DYING; + return; + } + + env_free(e); + + if (curenv == e) { + curenv = NULL; + sched_yield(); + } +} + + +// +// Restores the register values in the Trapframe with the 'iret' instruction. +// This exits the kernel and starts executing some environment's code. +// +// This function does not return. +// +void +env_pop_tf(struct Trapframe *tf) +{ + // Record the CPU we are running on for user-space debugging + curenv->env_cpunum = cpunum(); + + asm volatile( + "\tmovl %0,%%esp\n" + "\tpopal\n" + "\tpopl %%es\n" + "\tpopl %%ds\n" + "\taddl $0x8,%%esp\n" /* skip tf_trapno and tf_errcode */ + "\tiret\n" + : : "g" (tf) : "memory"); + panic("iret failed"); /* mostly to placate the compiler */ +} + +// +// Context switch from curenv to env e. +// Note: if this is the first call to env_run, curenv is NULL. +// +// This function does not return. +// +void +env_run(struct Env *e) +{ + // Step 1: If this is a context switch (a new environment is running): + // 1. Set the current environment (if any) back to + // ENV_RUNNABLE if it is ENV_RUNNING (think about + // what other states it can be in), + // 2. Set 'curenv' to the new environment, + // 3. Set its status to ENV_RUNNING, + // 4. Update its 'env_runs' counter, + // 5. Use lcr3() to switch to its address space. + // Step 2: Use env_pop_tf() to restore the environment's + // registers and drop into user mode in the + // environment. + + // Hint: This function loads the new environment's state from + // e->env_tf. Go back through the code you wrote above + // and make sure you have set the relevant parts of + // e->env_tf to sensible values. + + // LAB 3: Your code here. + if (curenv && curenv->env_status == ENV_RUNNING) { + curenv->env_status = ENV_RUNNABLE; + } + curenv = e; + curenv->env_status = ENV_RUNNING; + curenv->env_runs++; + lcr3(PADDR(curenv->env_pgdir)); + // 将当前进程的trapframe通过弹栈的形式,切换当前的运行环境 + env_pop_tf(&(curenv->env_tf)); + + unlock_kernel(); + // panic("env_run not yet implemented"); +} + diff --git a/lab/LAB4.si4project/Backup/env(4388).h b/lab/LAB4.si4project/Backup/env(4388).h new file mode 100644 index 0000000..b04f1a3 --- /dev/null +++ b/lab/LAB4.si4project/Backup/env(4388).h @@ -0,0 +1,70 @@ +/* See COPYRIGHT for copyright information. */ + +#ifndef JOS_INC_ENV_H +#define JOS_INC_ENV_H + +#include +#include +#include + +typedef int32_t envid_t; + +// An environment ID 'envid_t' has three parts: +// +// +1+---------------21-----------------+--------10--------+ +// |0| Uniqueifier | Environment | +// | | | Index | +// +------------------------------------+------------------+ +// \--- ENVX(eid) --/ +// +// The environment index ENVX(eid) equals the environment's index in the +// 'envs[]' array. The uniqueifier distinguishes environments that were +// created at different times, but share the same environment index. +// +// All real environments are greater than 0 (so the sign bit is zero). +// envid_ts less than 0 signify errors. The envid_t == 0 is special, and +// stands for the current environment. + +#define LOG2NENV 10 +#define NENV (1 << LOG2NENV) +#define ENVX(envid) ((envid) & (NENV - 1)) + +// Values of env_status in struct Env +enum { + ENV_FREE = 0, + ENV_DYING, + ENV_RUNNABLE, + ENV_RUNNING, + ENV_NOT_RUNNABLE +}; + +// Special environment types +enum EnvType { + ENV_TYPE_USER = 0, +}; + +struct Env { + struct Trapframe env_tf; // Saved registers + struct Env *env_link; // Next free Env + envid_t env_id; // Unique environment identifier + envid_t env_parent_id; // env_id of this env's parent + enum EnvType env_type; // Indicates special system environments + unsigned env_status; // Status of the environment + uint32_t env_runs; // Number of times environment has run + int env_cpunum; // The CPU that the env is running on + + // Address space + pde_t *env_pgdir; // Kernel virtual address of page dir + + // Exception handling + void *env_pgfault_upcall; // Page fault upcall entry point + + // Lab 4 IPC + bool env_ipc_recving; // Env is blocked receiving + void *env_ipc_dstva; // VA at which to map received page + uint32_t env_ipc_value; // Data value sent to us + envid_t env_ipc_from; // envid of the sender + int env_ipc_perm; // Perm of page mapping received +}; + +#endif // !JOS_INC_ENV_H diff --git a/lab/LAB4.si4project/Backup/env(572).c b/lab/LAB4.si4project/Backup/env(572).c new file mode 100644 index 0000000..7396b21 --- /dev/null +++ b/lab/LAB4.si4project/Backup/env(572).c @@ -0,0 +1,572 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +struct Env *envs = NULL; // All environments +static struct Env *env_free_list; // Free environment list + // (linked by Env->env_link) + +#define ENVGENSHIFT 12 // >= LOGNENV + +// Global descriptor table. +// +// Set up global descriptor table (GDT) with separate segments for +// kernel mode and user mode. Segments serve many purposes on the x86. +// We don't use any of their memory-mapping capabilities, but we need +// them to switch privilege levels. +// +// The kernel and user segments are identical except for the DPL. +// To load the SS register, the CPL must equal the DPL. Thus, +// we must duplicate the segments for the user and the kernel. +// +// In particular, the last argument to the SEG macro used in the +// definition of gdt specifies the Descriptor Privilege Level (DPL) +// of that descriptor: 0 for kernel and 3 for user. +// +struct Segdesc gdt[NCPU + 5] = +{ + // 0x0 - unused (always faults -- for trapping NULL far pointers) + SEG_NULL, + + // 0x8 - kernel code segment + [GD_KT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 0), + + // 0x10 - kernel data segment + [GD_KD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 0), + + // 0x18 - user code segment + [GD_UT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 3), + + // 0x20 - user data segment + [GD_UD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 3), + + // Per-CPU TSS descriptors (starting from GD_TSS0) are initialized + // in trap_init_percpu() + [GD_TSS0 >> 3] = SEG_NULL +}; + +struct Pseudodesc gdt_pd = { + sizeof(gdt) - 1, (unsigned long) gdt +}; + +// +// Converts an envid to an env pointer. +// If checkperm is set, the specified environment must be either the +// current environment or an immediate child of the current environment. +// +// RETURNS +// 0 on success, -E_BAD_ENV on error. +// On success, sets *env_store to the environment. +// On error, sets *env_store to NULL. +// +int +envid2env(envid_t envid, struct Env **env_store, bool checkperm) +{ + struct Env *e; + + // If envid is zero, return the current environment. + if (envid == 0) { + *env_store = curenv; + return 0; + } + + // Look up the Env structure via the index part of the envid, + // then check the env_id field in that struct Env + // to ensure that the envid is not stale + // (i.e., does not refer to a _previous_ environment + // that used the same slot in the envs[] array). + e = &envs[ENVX(envid)]; + if (e->env_status == ENV_FREE || e->env_id != envid) { + *env_store = 0; + return -E_BAD_ENV; + } + + // Check that the calling environment has legitimate permission + // to manipulate the specified environment. + // If checkperm is set, the specified environment + // must be either the current environment + // or an immediate child of the current environment. + if (checkperm && e != curenv && e->env_parent_id != curenv->env_id) { + *env_store = 0; + return -E_BAD_ENV; + } + + *env_store = e; + return 0; +} + +// Mark all environments in 'envs' as free, set their env_ids to 0, +// and insert them into the env_free_list. +// Make sure the environments are in the free list in the same order +// they are in the envs array (i.e., so that the first call to +// env_alloc() returns envs[0]). +// +void +env_init(void) +{ + // Set up envs array + // LAB 3: Your code here. + int i; + // 确保最小的env在最前端 + for (i = NENV-1; i >= 0; --i) { + envs[i].env_id = 0; + + envs[i].env_link = env_free_list; + env_free_list = &envs[i]; + } + + // Per-CPU part of the initialization + env_init_percpu(); +} + +// Load GDT and segment descriptors. +void +env_init_percpu(void) +{ + lgdt(&gdt_pd); + // The kernel never uses GS or FS, so we leave those set to + // the user data segment. + asm volatile("movw %%ax,%%gs" : : "a" (GD_UD|3)); + asm volatile("movw %%ax,%%fs" : : "a" (GD_UD|3)); + // The kernel does use ES, DS, and SS. We'll change between + // the kernel and user data segments as needed. + asm volatile("movw %%ax,%%es" : : "a" (GD_KD)); + asm volatile("movw %%ax,%%ds" : : "a" (GD_KD)); + asm volatile("movw %%ax,%%ss" : : "a" (GD_KD)); + // Load the kernel text segment into CS. + asm volatile("ljmp %0,$1f\n 1:\n" : : "i" (GD_KT)); + // For good measure, clear the local descriptor table (LDT), + // since we don't use it. + lldt(0); +} + +// +// Initialize the kernel virtual memory layout for environment e. +// Allocate a page directory, set e->env_pgdir accordingly, +// and initialize the kernel portion of the new environment's address space. +// Do NOT (yet) map anything into the user portion +// of the environment's virtual address space. +// +// Returns 0 on success, < 0 on error. Errors include: +// -E_NO_MEM if page directory or table could not be allocated. +// 这里又为每个环境分配一个页目录,有点晕了。 +static int +env_setup_vm(struct Env *e) +{ + int i; + struct PageInfo *p = NULL; + + // Allocate a page for the page directory + if (!(p = page_alloc(ALLOC_ZERO))) + return -E_NO_MEM; + + // Now, set e->env_pgdir and initialize the page directory. + // + // Hint: + // - The VA space of all envs is identical above UTOP + // (except at UVPT, which we've set below). + // See inc/memlayout.h for permissions and layout. + // Can you use kern_pgdir as a template? Hint: Yes. + // (Make sure you got the permissions right in Lab 2.) + // - The initial VA below UTOP is empty. + // - You do not need to make any more calls to page_alloc. + // - Note: In general, pp_ref is not maintained for + // physical pages mapped only above UTOP, but env_pgdir + // is an exception -- you need to increment env_pgdir's + // pp_ref for env_free to work correctly. + // - The functions in kern/pmap.h are handy. + + + // LAB 3: Your code here. + // 申请一个页表存用户环境的页目录 + + e->env_pgdir = page2kva(p); + // why ?因为在UTOP之上都是一样的,所以可以直接把kern_pgdir的内容全部拷贝过来 + + memcpy(e->env_pgdir, kern_pgdir, PGSIZE); + p->pp_ref++; + // UVPT maps the env's own page table read-only. + // Permissions: kernel R, user R + // 但是唯独UVPT这个地方是不一样的,因为要放的是自己的页表目录 + e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_P | PTE_U; + + return 0; +} + +// +// Allocates and initializes a new environment. +// On success, the new environment is stored in *newenv_store. +// +// Returns 0 on success, < 0 on failure. Errors include: +// -E_NO_FREE_ENV if all NENV environments are allocated +// -E_NO_MEM on memory exhaustion +// +int +env_alloc(struct Env **newenv_store, envid_t parent_id) +{ + int32_t generation; + int r; + struct Env *e; + + if (!(e = env_free_list)) + return -E_NO_FREE_ENV; + + // Allocate and set up the page directory for this environment. + if ((r = env_setup_vm(e)) < 0) + return r; + + // Generate an env_id for this environment. + generation = (e->env_id + (1 << ENVGENSHIFT)) & ~(NENV - 1); + if (generation <= 0) // Don't create a negative env_id. + generation = 1 << ENVGENSHIFT; + e->env_id = generation | (e - envs); + + // Set the basic status variables. + e->env_parent_id = parent_id; + e->env_type = ENV_TYPE_USER; + e->env_status = ENV_RUNNABLE; + e->env_runs = 0; + + // Clear out all the saved register state, + // to prevent the register values + // of a prior environment inhabiting this Env structure + // from "leaking" into our new environment. + memset(&e->env_tf, 0, sizeof(e->env_tf)); + + // Set up appropriate initial values for the segment registers. + // GD_UD is the user data segment selector in the GDT, and + // GD_UT is the user text segment selector (see inc/memlayout.h). + // The low 2 bits of each segment register contains the + // Requestor Privilege Level (RPL); 3 means user mode. When + // we switch privilege levels, the hardware does various + // checks involving the RPL and the Descriptor Privilege Level + // (DPL) stored in the descriptors themselves. + e->env_tf.tf_ds = GD_UD | 3; + e->env_tf.tf_es = GD_UD | 3; + e->env_tf.tf_ss = GD_UD | 3; + e->env_tf.tf_esp = USTACKTOP; + e->env_tf.tf_cs = GD_UT | 3; + // You will set e->env_tf.tf_eip later. + + // Enable interrupts while in user mode. + // LAB 4: Your code here. + + // Clear the page fault handler until user installs one. + e->env_pgfault_upcall = 0; + + // Also clear the IPC receiving flag. + e->env_ipc_recving = 0; + + // commit the allocation + env_free_list = e->env_link; + *newenv_store = e; + + cprintf("[%08x] new env %08x\n", curenv ? curenv->env_id : 0, e->env_id); + return 0; +} + +// +// Allocate len bytes of physical memory for environment env, +// and map it at virtual address va in the environment's address space. +// Does not zero or otherwise initialize the mapped pages in any way. +// Pages should be writable by user and kernel. +// Panic if any allocation attempt fails. +// +static void +region_alloc(struct Env *e, void *va, size_t len) +{ + // LAB 3: Your code here. + // (But only if you need it for load_icode.) + // + struct PageInfo *pp; + size_t i; + size_t pgs = ROUNDUP(len, PGSIZE)/PGSIZE; + size_t pva = ROUNDDOWN((size_t)va, PGSIZE); + + + for(i=0; i < pgs; i++) { + if (!(pp = page_alloc(ALLOC_ZERO))) { + int ex = -E_NO_MEM; + panic("region_alloc: %e", ex); + } + page_insert(e->env_pgdir, pp, (void *)pva, PTE_U|PTE_W|PTE_P); + pva += PGSIZE; + + } + // Hint: It is easier to use region_alloc if the caller can pass + // 'va' and 'len' values that are not page-aligned. + // You should round va down, and round (va + len) up. + // (Watch out for corner-cases!) +} + +// +// Set up the initial program binary, stack, and processor flags +// for a user process. +// This function is ONLY called during kernel initialization, +// before running the first user-mode environment. +// +// This function loads all loadable segments from the ELF binary image +// into the environment's user memory, starting at the appropriate +// virtual addresses indicated in the ELF program header. +// At the same time it clears to zero any portions of these segments +// that are marked in the program header as being mapped +// but not actually present in the ELF file - i.e., the program's bss section. +// +// All this is very similar to what our boot loader does, except the boot +// loader also needs to read the code from disk. Take a look at +// boot/main.c to get ideas. +// +// Finally, this function maps one page for the program's initial stack. +// +// load_icode panics if it encounters problems. +// - How might load_icode fail? What might be wrong with the given input? +// +static void +load_icode(struct Env *e, uint8_t *binary) +{ + // Hints: + // Load each program segment into virtual memory + // at the address specified in the ELF segment header. + // You should only load segments with ph->p_type == ELF_PROG_LOAD. + // Each segment's virtual address can be found in ph->p_va + // and its size in memory can be found in ph->p_memsz. + // The ph->p_filesz bytes from the ELF binary, starting at + // 'binary + ph->p_offset', should be copied to virtual address + // ph->p_va. Any remaining memory bytes should be cleared to zero. + // (The ELF header should have ph->p_filesz <= ph->p_memsz.) + // Use functions from the previous lab to allocate and map pages. + // + // All page protection bits should be user read/write for now. + // ELF segments are not necessarily page-aligned, but you can + // assume for this function that no two segments will touch + // the same virtual page. + // + // You may find a function like region_alloc useful. + // + // Loading the segments is much simpler if you can move data + // directly into the virtual addresses stored in the ELF binary. + // So which page directory should be in force during + // this function? + // + // You must also do something with the program's entry point, + // to make sure that the environment starts executing there. + // What? (See env_run() and env_pop_tf() below.) + + // LAB 3: Your code here. + // 怎么得到program的ELF地址? 就是bianry + struct Proghdr *ph, *eph; + struct Elf *elfhdr = (struct Elf *)binary; + + // is this a valid ELF? + if (elfhdr->e_magic != ELF_MAGIC) + panic("elf header's magic is not correct\n"); + + // 所有程序段 + ph = (struct Proghdr *)((uint8_t *)elfhdr + elfhdr->e_phoff); + eph = ph + elfhdr->e_phnum; + // 转换到用户页目录,用户空间映射 + lcr3(PADDR(e->env_pgdir)); + + for(; ph < eph; ph++) { + + if (ph->p_type != ELF_PROG_LOAD) + continue; + if (ph->p_filesz > ph->p_memsz) + panic("file size is great than memmory size\n"); + + region_alloc(e, (void *)ph->p_va, ph->p_memsz); + memcpy((void *)ph->p_va, binary + ph->p_offset, ph->p_filesz); + // clear bss section + memset((void *)ph->p_va + ph->p_filesz, 0, (ph->p_memsz - ph->p_filesz)); + + } + e->env_tf.tf_eip = elfhdr->e_entry; + // Now map one page for the program's initial stack + // at virtual address USTACKTOP - PGSIZE. + + // LAB 3: Your code here. + + // map the user stack + region_alloc(e, (void *)USTACKTOP-PGSIZE, PGSIZE); + lcr3(PADDR(kern_pgdir)); +} + +// +// Allocates a new env with env_alloc, loads the named elf +// binary into it with load_icode, and sets its env_type. +// This function is ONLY called during kernel initialization, +// before running the first user-mode environment. +// The new env's parent ID is set to 0. +// +void +env_create(uint8_t *binary, enum EnvType type) +{ + // LAB 3: Your code here. + struct Env *newenv; + int ret = 0; + if ((ret = env_alloc(&newenv, 0)) < 0) { + panic("env_create: %e\n", ret); + } + newenv->env_type = type; + load_icode(newenv, binary); + +} + +// +// Frees env e and all memory it uses. +// +void +env_free(struct Env *e) +{ + pte_t *pt; + uint32_t pdeno, pteno; + physaddr_t pa; + + // If freeing the current environment, switch to kern_pgdir + // before freeing the page directory, just in case the page + // gets reused. + if (e == curenv) + lcr3(PADDR(kern_pgdir)); + + // Note the environment's demise. + cprintf("[%08x] free env %08x\n", curenv ? curenv->env_id : 0, e->env_id); + + // Flush all mapped pages in the user portion of the address space + static_assert(UTOP % PTSIZE == 0); + for (pdeno = 0; pdeno < PDX(UTOP); pdeno++) { + + // only look at mapped page tables + if (!(e->env_pgdir[pdeno] & PTE_P)) + continue; + + // find the pa and va of the page table + pa = PTE_ADDR(e->env_pgdir[pdeno]); + pt = (pte_t*) KADDR(pa); + + // unmap all PTEs in this page table + for (pteno = 0; pteno <= PTX(~0); pteno++) { + if (pt[pteno] & PTE_P) + page_remove(e->env_pgdir, PGADDR(pdeno, pteno, 0)); + } + + // free the page table itself + e->env_pgdir[pdeno] = 0; + page_decref(pa2page(pa)); + } + + // free the page directory + pa = PADDR(e->env_pgdir); + e->env_pgdir = 0; + page_decref(pa2page(pa)); + + // return the environment to the free list + e->env_status = ENV_FREE; + e->env_link = env_free_list; + env_free_list = e; +} + +// +// Frees environment e. +// If e was the current env, then runs a new environment (and does not return +// to the caller). +// +void +env_destroy(struct Env *e) +{ + // If e is currently running on other CPUs, we change its state to + // ENV_DYING. A zombie environment will be freed the next time + // it traps to the kernel. + if (e->env_status == ENV_RUNNING && curenv != e) { + e->env_status = ENV_DYING; + return; + } + + env_free(e); + + if (curenv == e) { + curenv = NULL; + sched_yield(); + } +} + + +// +// Restores the register values in the Trapframe with the 'iret' instruction. +// This exits the kernel and starts executing some environment's code. +// +// This function does not return. +// +void +env_pop_tf(struct Trapframe *tf) +{ + // Record the CPU we are running on for user-space debugging + curenv->env_cpunum = cpunum(); + + asm volatile( + "\tmovl %0,%%esp\n" + "\tpopal\n" + "\tpopl %%es\n" + "\tpopl %%ds\n" + "\taddl $0x8,%%esp\n" /* skip tf_trapno and tf_errcode */ + "\tiret\n" + : : "g" (tf) : "memory"); + panic("iret failed"); /* mostly to placate the compiler */ +} + +// +// Context switch from curenv to env e. +// Note: if this is the first call to env_run, curenv is NULL. +// +// This function does not return. +// +void +env_run(struct Env *e) +{ + // Step 1: If this is a context switch (a new environment is running): + // 1. Set the current environment (if any) back to + // ENV_RUNNABLE if it is ENV_RUNNING (think about + // what other states it can be in), + // 2. Set 'curenv' to the new environment, + // 3. Set its status to ENV_RUNNING, + // 4. Update its 'env_runs' counter, + // 5. Use lcr3() to switch to its address space. + // Step 2: Use env_pop_tf() to restore the environment's + // registers and drop into user mode in the + // environment. + + // Hint: This function loads the new environment's state from + // e->env_tf. Go back through the code you wrote above + // and make sure you have set the relevant parts of + // e->env_tf to sensible values. + + // LAB 3: Your code here. + if (curenv && curenv->env_status == ENV_RUNNING) { + curenv->env_status = ENV_RUNNABLE; + } + curenv = e; + curenv->env_status = ENV_RUNNING; + curenv->env_runs++; + lcr3(PADDR(curenv->env_pgdir)); + + unlock_kernel(); + // iret退出内核, 回到用户环境执行, + // 在load_icode() 中 env_tf保存了可执行文件的eip等信息 + env_pop_tf(&(curenv->env_tf)); + + + // panic("env_run not yet implemented"); +} + diff --git a/lab/LAB4.si4project/Backup/fork(3728).c b/lab/LAB4.si4project/Backup/fork(3728).c new file mode 100644 index 0000000..61264da --- /dev/null +++ b/lab/LAB4.si4project/Backup/fork(3728).c @@ -0,0 +1,90 @@ +// implement fork from user space + +#include +#include + +// PTE_COW marks copy-on-write page table entries. +// It is one of the bits explicitly allocated to user processes (PTE_AVAIL). +#define PTE_COW 0x800 + +// +// Custom page fault handler - if faulting page is copy-on-write, +// map in our own private writable copy. +// +static void +pgfault(struct UTrapframe *utf) +{ + void *addr = (void *) utf->utf_fault_va; + uint32_t err = utf->utf_err; + int r; + + // Check that the faulting access was (1) a write, and (2) to a + // copy-on-write page. If not, panic. + // Hint: + // Use the read-only page table mappings at uvpt + // (see ). + + // LAB 4: Your code here. + + // Allocate a new page, map it at a temporary location (PFTEMP), + // copy the data from the old page to the new page, then move the new + // page to the old page's address. + // Hint: + // You should make three system calls. + + // LAB 4: Your code here. + + panic("pgfault not implemented"); +} + +// +// Map our virtual page pn (address pn*PGSIZE) into the target envid +// at the same virtual address. If the page is writable or copy-on-write, +// the new mapping must be created copy-on-write, and then our mapping must be +// marked copy-on-write as well. (Exercise: Why do we need to mark ours +// copy-on-write again if it was already copy-on-write at the beginning of +// this function?) +// +// Returns: 0 on success, < 0 on error. +// It is also OK to panic on error. +// +static int +duppage(envid_t envid, unsigned pn) +{ + int r; + + // LAB 4: Your code here. + panic("duppage not implemented"); + return 0; +} + +// +// User-level fork with copy-on-write. +// Set up our page fault handler appropriately. +// Create a child. +// Copy our address space and page fault handler setup to the child. +// Then mark the child as runnable and return. +// +// Returns: child's envid to the parent, 0 to the child, < 0 on error. +// It is also OK to panic on error. +// +// Hint: +// Use uvpd, uvpt, and duppage. +// Remember to fix "thisenv" in the child process. +// Neither user exception stack should ever be marked copy-on-write, +// so you must allocate a new page for the child's user exception stack. +// +envid_t +fork(void) +{ + // LAB 4: Your code here. + panic("fork not implemented"); +} + +// Challenge! +int +sfork(void) +{ + panic("sfork not implemented"); + return -E_INVAL; +} diff --git a/lab/LAB4.si4project/Backup/ipc(963).c b/lab/LAB4.si4project/Backup/ipc(963).c new file mode 100644 index 0000000..2e222b9 --- /dev/null +++ b/lab/LAB4.si4project/Backup/ipc(963).c @@ -0,0 +1,56 @@ +// User-level IPC library routines + +#include + +// Receive a value via IPC and return it. +// If 'pg' is nonnull, then any page sent by the sender will be mapped at +// that address. +// If 'from_env_store' is nonnull, then store the IPC sender's envid in +// *from_env_store. +// If 'perm_store' is nonnull, then store the IPC sender's page permission +// in *perm_store (this is nonzero iff a page was successfully +// transferred to 'pg'). +// If the system call fails, then store 0 in *fromenv and *perm (if +// they're nonnull) and return the error. +// Otherwise, return the value sent by the sender +// +// Hint: +// Use 'thisenv' to discover the value and who sent it. +// If 'pg' is null, pass sys_ipc_recv a value that it will understand +// as meaning "no page". (Zero is not the right value, since that's +// a perfectly valid place to map a page.) +int32_t +ipc_recv(envid_t *from_env_store, void *pg, int *perm_store) +{ + // LAB 4: Your code here. + panic("ipc_recv not implemented"); + return 0; +} + +// Send 'val' (and 'pg' with 'perm', if 'pg' is nonnull) to 'toenv'. +// This function keeps trying until it succeeds. +// It should panic() on any error other than -E_IPC_NOT_RECV. +// +// Hint: +// Use sys_yield() to be CPU-friendly. +// If 'pg' is null, pass sys_ipc_try_send a value that it will understand +// as meaning "no page". (Zero is not the right value.) +void +ipc_send(envid_t to_env, uint32_t val, void *pg, int perm) +{ + // LAB 4: Your code here. + panic("ipc_send not implemented"); +} + +// Find the first environment of the given type. We'll use this to +// find special environments. +// Returns 0 if no such environment exists. +envid_t +ipc_find_env(enum EnvType type) +{ + int i; + for (i = 0; i < NENV; i++) + if (envs[i].env_type == type) + return envs[i].env_id; + return 0; +} diff --git a/lab/LAB4.si4project/Backup/pfentry(173).S b/lab/LAB4.si4project/Backup/pfentry(173).S new file mode 100644 index 0000000..f40aeeb --- /dev/null +++ b/lab/LAB4.si4project/Backup/pfentry(173).S @@ -0,0 +1,82 @@ +#include +#include + +// Page fault upcall entrypoint. + +// This is where we ask the kernel to redirect us to whenever we cause +// a page fault in user space (see the call to sys_set_pgfault_handler +// in pgfault.c). +// +// When a page fault actually occurs, the kernel switches our ESP to +// point to the user exception stack if we're not already on the user +// exception stack, and then it pushes a UTrapframe onto our user +// exception stack: +// +// trap-time esp +// trap-time eflags +// trap-time eip +// utf_regs.reg_eax +// ... +// utf_regs.reg_esi +// utf_regs.reg_edi +// utf_err (error code) +// utf_fault_va <-- %esp +// +// If this is a recursive fault, the kernel will reserve for us a +// blank word above the trap-time esp for scratch work when we unwind +// the recursive call. +// +// We then have call up to the appropriate page fault handler in C +// code, pointed to by the global variable '_pgfault_handler'. + +.text +.globl _pgfault_upcall +_pgfault_upcall: + // Call the C page fault handler. + pushl %esp // function argument: pointer to UTF + movl _pgfault_handler, %eax + call *%eax + addl $4, %esp // pop function argument + + // Now the C page fault handler has returned and you must return + // to the trap time state. + // Push trap-time %eip onto the trap-time stack. + // + // Explanation: + // We must prepare the trap-time stack for our eventual return to + // re-execute the instruction that faulted. + // Unfortunately, we can't return directly from the exception stack: + // We can't call 'jmp', since that requires that we load the address + // into a register, and all registers must have their trap-time + // values after the return. + // We can't call 'ret' from the exception stack either, since if we + // did, %esp would have the wrong value. + // So instead, we push the trap-time %eip onto the *trap-time* stack! + // Below we'll switch to that stack and call 'ret', which will + // restore %eip to its pre-fault value. + // + // In the case of a recursive fault on the exception stack, + // note that the word we're pushing now will fit in the + // blank word that the kernel reserved for us. + // + // Throughout the remaining code, think carefully about what + // registers are available for intermediate calculations. You + // may find that you have to rearrange your code in non-obvious + // ways as registers become unavailable as scratch space. + // + // LAB 4: Your code here. + + // Restore the trap-time registers. After you do this, you + // can no longer modify any general-purpose registers. + // LAB 4: Your code here. + + // Restore eflags from the stack. After you do this, you can + // no longer use arithmetic operations or anything else that + // modifies eflags. + // LAB 4: Your code here. + + // Switch back to the adjusted trap-time stack. + // LAB 4: Your code here. + + // Return to re-execute the instruction that faulted. + // LAB 4: Your code here. diff --git a/lab/LAB4.si4project/Backup/pgfault(4647).c b/lab/LAB4.si4project/Backup/pgfault(4647).c new file mode 100644 index 0000000..a975518 --- /dev/null +++ b/lab/LAB4.si4project/Backup/pgfault(4647).c @@ -0,0 +1,37 @@ +// User-level page fault handler support. +// Rather than register the C page fault handler directly with the +// kernel as the page fault handler, we register the assembly language +// wrapper in pfentry.S, which in turns calls the registered C +// function. + +#include + + +// Assembly language pgfault entrypoint defined in lib/pfentry.S. +extern void _pgfault_upcall(void); + +// Pointer to currently installed C-language pgfault handler. +void (*_pgfault_handler)(struct UTrapframe *utf); + +// +// Set the page fault handler function. +// If there isn't one yet, _pgfault_handler will be 0. +// The first time we register a handler, we need to +// allocate an exception stack (one page of memory with its top +// at UXSTACKTOP), and tell the kernel to call the assembly-language +// _pgfault_upcall routine when a page fault occurs. +// +void +set_pgfault_handler(void (*handler)(struct UTrapframe *utf)) +{ + int r; + + if (_pgfault_handler == 0) { + // First time through! + // LAB 4: Your code here. + panic("set_pgfault_handler not implemented"); + } + + // Save handler pointer for assembly to call. + _pgfault_handler = handler; +} diff --git a/lab/LAB4.si4project/Backup/picirq(7101).c b/lab/LAB4.si4project/Backup/picirq(7101).c new file mode 100644 index 0000000..8cb3e62 --- /dev/null +++ b/lab/LAB4.si4project/Backup/picirq(7101).c @@ -0,0 +1,86 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include + +#include + + +// Current IRQ mask. +// Initial IRQ mask has interrupt 2 enabled (for slave 8259A). +uint16_t irq_mask_8259A = 0xFFFF & ~(1<> 8)); + cprintf("enabled interrupts:"); + for (i = 0; i < 16; i++) + if (~mask & (1< +#include +#include +#include +#include + +#include +#include +#include +#include + +// These variables are set by i386_detect_memory() +size_t npages; // Amount of physical memory (in pages) +static size_t npages_basemem; // Amount of base memory (in pages) + +// These variables are set in mem_init() +pde_t *kern_pgdir; // Kernel's initial page directory +struct PageInfo *pages; // Physical page state array +static struct PageInfo *page_free_list; // Free list of physical pages + + +// -------------------------------------------------------------- +// Detect machine's physical memory setup. +// -------------------------------------------------------------- + +static int +nvram_read(int r) +{ + return mc146818_read(r) | (mc146818_read(r + 1) << 8); +} + +static void +i386_detect_memory(void) +{ + size_t basemem, extmem, ext16mem, totalmem; + + // Use CMOS calls to measure available base & extended memory. + // (CMOS calls return results in kilobytes.) + basemem = nvram_read(NVRAM_BASELO); + extmem = nvram_read(NVRAM_EXTLO); + ext16mem = nvram_read(NVRAM_EXT16LO) * 64; + + // Calculate the number of physical pages available in both base + // and extended memory. + if (ext16mem) + totalmem = 16 * 1024 + ext16mem; + else if (extmem) + totalmem = 1 * 1024 + extmem; + else + totalmem = basemem; + + npages = totalmem / (PGSIZE / 1024); + npages_basemem = basemem / (PGSIZE / 1024); + + cprintf("Physical memory: %uK available, base = %uK, extended = %uK\n", + totalmem, basemem, totalmem - basemem); +} + + +// -------------------------------------------------------------- +// Set up memory mappings above UTOP. +// -------------------------------------------------------------- + +static void mem_init_mp(void); +static void boot_map_region(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa, int perm); +static void check_page_free_list(bool only_low_memory); +static void check_page_alloc(void); +static void check_kern_pgdir(void); +static physaddr_t check_va2pa(pde_t *pgdir, uintptr_t va); +static void check_page(void); +static void check_page_installed_pgdir(void); + +// This simple physical memory allocator is used only while JOS is setting +// up its virtual memory system. page_alloc() is the real allocator. +// +// If n>0, allocates enough pages of contiguous physical memory to hold 'n' +// bytes. Doesn't initialize the memory. Returns a kernel virtual address. +// +// If n==0, returns the address of the next free page without allocating +// anything. +// +// If we're out of memory, boot_alloc should panic. +// This function may ONLY be used during initialization, +// before the page_free_list list has been set up. +static void * +boot_alloc(uint32_t n) +{ + static char *nextfree; // virtual address of next byte of free memory + char *result; + + // Initialize nextfree if this is the first time. + // 'end' is a magic symbol automatically generated by the linker, + // which points to the end of the kernel's bss segment: + // the first virtual address that the linker did *not* assign + // to any kernel code or global variables. + if (!nextfree) { + extern char end[]; + nextfree = ROUNDUP((char *) end, PGSIZE); + } + + // Allocate a chunk large enough to hold 'n' bytes, then update + // nextfree. Make sure nextfree is kept aligned + // to a multiple of PGSIZE. + // + // LAB 2: Your code here. + result = nextfree; + nextfree = ROUNDUP(nextfree+n, PGSIZE); + + return result; +} + +// Set up a two-level page table: +// kern_pgdir is its linear (virtual) address of the root +// +// This function only sets up the kernel part of the address space +// (ie. addresses >= UTOP). The user part of the address space +// will be set up later. +// +// From UTOP to ULIM, the user is allowed to read but not write. +// Above ULIM the user cannot read or write. +void +mem_init(void) +{ + uint32_t cr0; + size_t n; + + // Find out how much memory the machine has (npages & npages_basemem). + i386_detect_memory(); + + // Remove this line when you're ready to test this function. + //panic("mem_init: This function is not finished\n"); + + ////////////////////////////////////////////////////////////////////// + // create initial page directory. + kern_pgdir = (pde_t *) boot_alloc(PGSIZE); + memset(kern_pgdir, 0, PGSIZE); + + ////////////////////////////////////////////////////////////////////// + // Recursively insert PD in itself as a page table, to form + // a virtual page table at virtual address UVPT. + // (For now, you don't have understand the greater purpose of the + // following line.) + + // Permissions: kernel R, user R + kern_pgdir[PDX(UVPT)] = PADDR(kern_pgdir) | PTE_U | PTE_P; + + ////////////////////////////////////////////////////////////////////// + // Allocate an array of npages 'struct PageInfo's and store it in 'pages'. + // The kernel uses this array to keep track of physical pages: for + // each physical page, there is a corresponding struct PageInfo in this + // array. 'npages' is the number of physical pages in memory. Use memset + // to initialize all fields of each struct PageInfo to 0. + // Your code goes here: + pages = (struct PageInfo*)boot_alloc(sizeof(struct PageInfo)*npages); + memset(pages, 0, sizeof(struct PageInfo)*npages); + + ////////////////////////////////////////////////////////////////////// + // Make 'envs' point to an array of size 'NENV' of 'struct Env'. + // LAB 3: Your code here. + envs = (struct Env*)boot_alloc(sizeof(struct Env)*NENV); + memset(envs, 0, sizeof(struct Env)*NENV); + ////////////////////////////////////////////////////////////////////// + // Now that we've allocated the initial kernel data structures, we set + // up the list of free physical pages. Once we've done so, all further + // memory management will go through the page_* functions. In + // particular, we can now map memory using boot_map_region + // or page_insert + page_init(); + + check_page_free_list(1); + check_page_alloc(); + check_page(); + + ////////////////////////////////////////////////////////////////////// + // Now we set up virtual memory + + ////////////////////////////////////////////////////////////////////// + // Map 'pages' read-only by the user at linear address UPAGES + // Permissions: + // - the new image at UPAGES -- kernel R, user R + // (ie. perm = PTE_U | PTE_P) + // - pages itself -- kernel RW, user NONE + // Your code goes here: + // 要求把pages结构体所在的页面和虚拟地址UPAGES相互映射。 + // 这里只要计算出pages结构体的大小,就可以进行映射了。 + // 说实话,之前注释有点没看懂。以为要实现虚存对pages指向的物理页的映射 + boot_map_region(kern_pgdir, + UPAGES, + ROUNDUP((sizeof(struct PageInfo)*npages), PGSIZE), + PADDR(pages), + PTE_U ); + ////////////////////////////////////////////////////////////////////// + // Map the 'envs' array read-only by the user at linear address UENVS + // (ie. perm = PTE_U | PTE_P). + // Permissions: + // - the new image at UENVS -- kernel R, user R + // - envs itself -- kernel RW, user NONE + // LAB 3: Your code here. + boot_map_region(kern_pgdir, + UENVS, + ROUNDUP((sizeof(struct Env)*NENV), PGSIZE), + PADDR(envs), + PTE_U); + ////////////////////////////////////////////////////////////////////// + // Use the physical memory that 'bootstack' refers to as the kernel + // stack. The kernel stack grows down from virtual address KSTACKTOP. + // We consider the entire range from [KSTACKTOP-PTSIZE, KSTACKTOP) + // to be the kernel stack, but break this into two pieces: + // * [KSTACKTOP-KSTKSIZE, KSTACKTOP) -- backed by physical memory + // * [KSTACKTOP-PTSIZE, KSTACKTOP-KSTKSIZE) -- not backed; so if + // the kernel overflows its stack, it will fault rather than + // overwrite memory. Known as a "guard page". + // Permissions: kernel RW, user NONE + // Your code goes here: + // extern char bootstacktop[], bootstack[]; + boot_map_region(kern_pgdir, + KSTACKTOP-KSTKSIZE, + KSTKSIZE, + PADDR(bootstack), + PTE_W ); + ////////////////////////////////////////////////////////////////////// + // Map all of physical memory at KERNBASE. + // Ie. the VA range [KERNBASE, 2^32) should map to + // the PA range [0, 2^32 - KERNBASE) + // We might not have 2^32 - KERNBASE bytes of physical memory, but + // we just set up the mapping anyway. + // Permissions: kernel RW, user NONE + // Your code goes here: + uint32_t kern_size = ROUNDUP((0xFFFFFFFF-KERNBASE), PGSIZE); + // cprintf("size: %d pages:%d\n", kern_size, kern_size/PGSIZE); + boot_map_region(kern_pgdir, + (uintptr_t) KERNBASE, + kern_size, + (physaddr_t)0, + PTE_W ); + + // Initialize the SMP-related parts of the memory map + // 这部分与上面的stack映射有点重复吧。 + mem_init_mp(); + + + // Check that the initial page directory has been set up correctly. + check_kern_pgdir(); + + // Switch from the minimal entry page directory to the full kern_pgdir + // page table we just created. Our instruction pointer should be + // somewhere between KERNBASE and KERNBASE+4MB right now, which is + // mapped the same way by both page tables. + // + // If the machine reboots at this point, you've probably set up your + // kern_pgdir wrong. + lcr3(PADDR(kern_pgdir)); + + check_page_free_list(0); + + // entry.S set the really important flags in cr0 (including enabling + // paging). Here we configure the rest of the flags that we care about. + cr0 = rcr0(); + cr0 |= CR0_PE|CR0_PG|CR0_AM|CR0_WP|CR0_NE|CR0_MP; + cr0 &= ~(CR0_TS|CR0_EM); + lcr0(cr0); + + // Some more checks, only possible after kern_pgdir is installed. + check_page_installed_pgdir(); +} + +// Modify mappings in kern_pgdir to support SMP +// - Map the per-CPU stacks in the region [KSTACKTOP-PTSIZE, KSTACKTOP) +// +static void +mem_init_mp(void) +{ + // Map per-CPU stacks starting at KSTACKTOP, for up to 'NCPU' CPUs. + // + // For CPU i, use the physical memory that 'percpu_kstacks[i]' refers + // to as its kernel stack. CPU i's kernel stack grows down from virtual + // address kstacktop_i = KSTACKTOP - i * (KSTKSIZE + KSTKGAP), and is + // divided into two pieces, just like the single stack you set up in + // mem_init: + // * [kstacktop_i - KSTKSIZE, kstacktop_i) + // -- backed by physical memory + // * [kstacktop_i - (KSTKSIZE + KSTKGAP), kstacktop_i - KSTKSIZE) + // -- not backed; so if the kernel overflows its stack, + // it will fault rather than overwrite another CPU's stack. + // Known as a "guard page". + // Permissions: kernel RW, user NONE + // + // LAB 4: Your code here: + size_t i; + size_t kstacktop_i; + for(i = 0; i < NCPU; i++) { + kstacktop_i = KSTACKTOP - i * (KSTKSIZE + KSTKGAP); + boot_map_region(kern_pgdir, + kstacktop_i - KSTKSIZE, + KSTKSIZE, + PADDR(&percpu_kstacks[i]), + PTE_W ); + + } +} + +// -------------------------------------------------------------- +// Tracking of physical pages. +// The 'pages' array has one 'struct PageInfo' entry per physical page. +// Pages are reference counted, and free pages are kept on a linked list. +// -------------------------------------------------------------- + +// +// Initialize page structure and memory free list. +// After this is done, NEVER use boot_alloc again. ONLY use the page +// allocator functions below to allocate and deallocate physical +// memory via the page_free_list. +// +void +page_init(void) +{ + // LAB 4: + // Change your code to mark the physical page at MPENTRY_PADDR + // as in use + + // The example code here marks all physical pages as free. + // However this is not truly the case. What memory is free? + // 1) Mark physical page 0 as in use. + // This way we preserve the real-mode IDT and BIOS structures + // in case we ever need them. (Currently we don't, but...) + // 2) The rest of base memory, [PGSIZE, npages_basemem * PGSIZE) + // is free. + // 3) Then comes the IO hole [IOPHYSMEM, EXTPHYSMEM), which must + // never be allocated. + // 4) Then extended memory [EXTPHYSMEM, ...). + // Some of it is in use, some is free. Where is the kernel + // in physical memory? Which pages are already in use for + // page tables and other data structures? + // + // Change the code to reflect this. + // NB: DO NOT actually touch the physical memory corresponding to + // free pages! + + // 1.mark page 0 as in use + // 这样我们就可以保留实模式IDT和BIOS结构,以备不时之需。 + pages[0].pp_ref = 1; + + // 2. + size_t i; + for (i = 1; i < MPENTRY_PADDR/PGSIZE; i++) { + pages[i].pp_ref = 0; + pages[i].pp_link = page_free_list; + page_free_list = &pages[i]; + } + // cprintf("npage_basemem: %d\n", npages_basemem); npage_basemem:160 + // boot APs entry code + extern unsigned char mpentry_start[], mpentry_end[]; + size_t size = mpentry_end - mpentry_start; + size = ROUNDUP(size, PGSIZE); + for(;i<(MPENTRY_PADDR+size)/PGSIZE; i++) { + pages[i].pp_ref = 1; + } + + for (; i < npages_basemem; i++) { + pages[i].pp_ref = 0; + pages[i].pp_link = page_free_list; + page_free_list = &pages[i]; + } + + // 3.[IOPHYSMEM, EXTPHYSMEM) + // mark I/O hole + for (;ipp_link; + pp->pp_link = NULL; + + //page2kva 返回值 KernelBase + 物理页号<pp_ref reaches 0.) +// +void +page_free(struct PageInfo *pp) +{ + // Fill this function in + // Hint: You may want to panic if pp->pp_ref is nonzero or + // pp->pp_link is not NULL. + if(pp->pp_link || pp->pp_ref) { + panic("pp->pp_ref is nonzero or pp->pp_link is not NULL\n"); + } + pp->pp_link = page_free_list; + page_free_list = pp; +} + +// +// Decrement the reference count on a page, +// freeing it if there are no more refs. +// +void +page_decref(struct PageInfo* pp) +{ + if (--pp->pp_ref == 0) + page_free(pp); +} + +// Given 'pgdir', a pointer to a page directory, pgdir_walk returns +// a pointer to the page table entry (PTE) for linear address 'va'. +// This requires walking the two-level page table structure. +// +// The relevant page table page might not exist yet. +// If this is true, and create == false, then pgdir_walk returns NULL. +// Otherwise, pgdir_walk allocates a new page table page with page_alloc. +// - If the allocation fails, pgdir_walk returns NULL. +// - Otherwise, the new page's reference count is incremented, +// the page is cleared, +// and pgdir_walk returns a pointer into the new page table page. +// +// Hint 1: you can turn a PageInfo * into the physical address of the +// page it refers to with page2pa() from kern/pmap.h. +// +// Hint 2: the x86 MMU checks permission bits in both the page directory +// and the page table, so it's safe to leave permissions in the page +// directory more permissive than strictly necessary. +// +// Hint 3: look at inc/mmu.h for useful macros that manipulate page +// table and page directory entries. +// +pte_t * +pgdir_walk(pde_t *pgdir, const void *va, int create) +{ + // Fill this function in + uint32_t pdx = PDX(va); // 页目录项索引 + uint32_t ptx = PTX(va); // 页表项索引 + pte_t *pde; // 页目录项指针 + pte_t *pte; // 页表项指针 + struct PageInfo *pp; + + pde = &pgdir[pdx]; //获取页目录项 + + if (*pde & PTE_P) { + // 二级页表有效 + // PTE_ADDR得到物理地址,KADDR转为虚拟地址 + pte = (KADDR(PTE_ADDR(*pde))); + } + else { + + // 二级页表不存在, + if (!create) { + return NULL; + } + // 获取一页的内存,创建一个新的页表,来存放页表项 + if(!(pp = page_alloc(ALLOC_ZERO))) { + return NULL; + } + pte = (pte_t *)page2kva(pp); + pp->pp_ref++; + *pde = PADDR(pte) | (PTE_P | PTE_W | PTE_U); // 设置页目录项 + } + // 返回页表项的虚拟地址 + return &pte[ptx]; +} + +// +// Map [va, va+size) of virtual address space to physical [pa, pa+size) +// in the page table rooted at pgdir. Size is a multiple of PGSIZE, and +// va and pa are both page-aligned. +// Use permission bits perm|PTE_P for the entries. +// +// This function is only intended to set up the ``static'' mappings +// above UTOP. As such, it should *not* change the pp_ref field on the +// mapped pages. +// +// Hint: the TA solution uses pgdir_walk +static void +boot_map_region(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa, int perm) +{ + size_t pgs = size / PGSIZE; + if (size % PGSIZE != 0) { + pgs++; + } //计算总共有多少页 + for (int i = 0; i < pgs; i++) { + // 其实可以使用page_insert实现 + pte_t *pte = pgdir_walk(pgdir, (void *)va, 1);//获取va对应的PTE的地址 + if (pte == NULL) { + panic("boot_map_region(): out of memory\n"); + } + *pte = pa | PTE_P | perm; //修改va对应的PTE的值 + pa += PGSIZE; //更新pa和va,进行下一轮循环 + va += PGSIZE; + } +} + + +// +// Map the physical page 'pp' at virtual address 'va'. +// The permissions (the low 12 bits) of the page table entry +// should be set to 'perm|PTE_P'. +// +// Requirements +// - If there is already a page mapped at 'va', it should be page_remove()d. +// - If necessary, on demand, a page table should be allocated and inserted +// into 'pgdir'. // create +// - pp->pp_ref should be incremented if the insertion succeeds. +// - The TLB must be invalidated if a page was formerly present at 'va'. +// +// Corner-case hint: Make sure to consider what happens when the same +// pp is re-inserted at the same virtual address in the same pgdir. +// However, try not to distinguish this case in your code, as this +// frequently leads to subtle bugs; there's an elegant way to handle +// everything in one code path. +// +// RETURNS: +// 0 on success +// -E_NO_MEM, if page table couldn't be allocated +// +// Hint: The TA solution is implemented using pgdir_walk, page_remove, +// and page2pa. +// +int +page_insert(pde_t *pgdir, struct PageInfo *pp, void *va, int perm) +{ + // Fill this function in + pte_t *pte = pgdir_walk(pgdir, va, 1); + + if (!pte) { + + return -E_NO_MEM; + } + + if (*pte & PTE_P) { + if (PTE_ADDR(*pte) == page2pa(pp)) { + + // 插入的是同一个页面,只需要修改权限等即可 + pp->pp_ref--; + } + else { + + page_remove(pgdir, va); + } + + } + + pp->pp_ref++; + *pte = page2pa(pp)| perm | PTE_P; + + return 0; +} + +// +// Return the page mapped at virtual address 'va'. +// If pte_store is not zero, then we store in it the address +// of the pte for this page. This is used by page_remove and +// can be used to verify page permissions for syscall arguments, +// but should not be used by most callers. +// +// Return NULL if there is no page mapped at va. +// +// Hint: the TA solution uses pgdir_walk and pa2page. +// +struct PageInfo * +page_lookup(pde_t *pgdir, void *va, pte_t **pte_store) +{ + // Fill this function in + pte_t *pte = pgdir_walk(pgdir, va, 0); + if (!pte) { + + return NULL; + } + if (pte_store) { + *pte_store = pte; // 通过指针的指针返回指针给调用者 + } + + // 难道不用考虑页表项是否存在 + + if (*pte & PTE_P) { + + return (pa2page(PTE_ADDR(*pte))); + } + + return NULL; + + //return pa2page(PTE_ADDR(*pte)); +} + +// +// Unmaps the physical page at virtual address 'va'. +// If there is no physical page at that address, silently does nothing. +// +// Details: +// - The ref count on the physical page should decrement. +// - The physical page should be freed if the refcount reaches 0. +// - The pg table entry corresponding to 'va' should be set to 0. +// (if such a PTE exists) +// - The TLB must be invalidated if you remove an entry from +// the page table. +// +// Hint: The TA solution is implemented using page_lookup, +// tlb_invalidate, and page_decref. +// + +void +page_remove(pde_t *pgdir, void *va) +{ + // Fill this function in + // 二级指针有点晕 + pte_t *pte; + pte_t **pte_store = &pte; + + struct PageInfo *pi = page_lookup(pgdir, va, pte_store); + if (!pi) { + return ; + } + + page_decref(pi); // 减引用 + + **pte_store = 0; // 取消映射 + tlb_invalidate(pgdir, va); + + +} + +// +// Invalidate a TLB entry, but only if the page tables being +// edited are the ones currently in use by the processor. +// +void +tlb_invalidate(pde_t *pgdir, void *va) +{ + // Flush the entry only if we're modifying the current address space. + if (!curenv || curenv->env_pgdir == pgdir) + invlpg(va); +} + +// +// Reserve size bytes in the MMIO region and map [pa,pa+size) at this +// location. Return the base of the reserved region. size does *not* +// have to be multiple of PGSIZE. +// +void * +mmio_map_region(physaddr_t pa, size_t size) +{ + // Where to start the next region. Initially, this is the + // beginning of the MMIO region. Because this is static, its + // value will be preserved between calls to mmio_map_region + // (just like nextfree in boot_alloc). + static uintptr_t base = MMIOBASE; + + // Reserve size bytes of virtual memory starting at base and + // map physical pages [pa,pa+size) to virtual addresses + // [base,base+size). Since this is device memory and not + // regular DRAM, you'll have to tell the CPU that it isn't + // safe to cache access to this memory. Luckily, the page + // tables provide bits for this purpose; simply create the + // mapping with PTE_PCD|PTE_PWT (cache-disable and + // write-through) in addition to PTE_W. (If you're interested + // in more details on this, see section 10.5 of IA32 volume + // 3A.) + // + // Be sure to round size up to a multiple of PGSIZE and to + // handle if this reservation would overflow MMIOLIM (it's + // okay to simply panic if this happens). + // + // Hint: The staff solution uses boot_map_region. + // + // Your code here: + // ret -> MMIOBASE 暂存 + void *ret = (void *)base; + size = ROUNDUP(size, PGSIZE); + if (base + size > MMIOLIM || base + size < base) { + panic("mmio_map_region reservation overflow\n"); + } + + boot_map_region(kern_pgdir, base, size, pa, PTE_W|PTE_PCD|PTE_PWT); + // 为什么需要加以下操作? base 为static! + base += size; + return ret; +} + +static uintptr_t user_mem_check_addr; + +// +// Check that an environment is allowed to access the range of memory +// [va, va+len) with permissions 'perm | PTE_P'. +// Normally 'perm' will contain PTE_U at least, but this is not required. +// 'va' and 'len' need not be page-aligned; you must test every page that +// contains any of that range. You will test either 'len/PGSIZE', +// 'len/PGSIZE + 1', or 'len/PGSIZE + 2' pages. +// +// A user program can access a virtual address if (1) the address is below +// ULIM, and (2) the page table gives it permission. These are exactly +// the tests you should implement here. +// +// If there is an error, set the 'user_mem_check_addr' variable to the first +// erroneous virtual address. +// +// Returns 0 if the user program can access this range of addresses, +// and -E_FAULT otherwise. +// +/* +int +user_mem_check(struct Env *env, const void *va, size_t len, int perm) +{ + // LAB 3: Your code here. + + size_t vae = ROUNDUP((size_t)(va+len), PGSIZE); + size_t vas = ROUNDDOWN((size_t)va, PGSIZE); + + + pte_t * pte; + + for (; vas < vae; vas += PGSIZE ) { + pte = pgdir_walk(env->env_pgdir, (void *)vas, 0); + if(!( vas < ULIM && pte==NULL && (*pte & perm))) { + if (vas < (size_t)va) + { + user_mem_check_addr = (uintptr_t)va; + } + else + { + user_mem_check_addr = (uintptr_t)vas; + } + return -E_FAULT; + } + } + return 0; +} +*/ +int +user_mem_check(struct Env *env, const void *va, size_t len, int perm) +{ + // LAB 3: Your code here. + uint32_t start = (uint32_t)ROUNDDOWN((char *)va, PGSIZE); + uint32_t end = (uint32_t)ROUNDUP((char *)va+len, PGSIZE); + for(; start < end; start += PGSIZE) { + pte_t *pte = pgdir_walk(env->env_pgdir, (void*)start, 0); + if((start >= ULIM) || (pte == NULL) || !(*pte & PTE_P) || ((*pte & perm) != perm)) { + user_mem_check_addr = (start < (uint32_t)va ? (uint32_t)va : start); + return -E_FAULT; + } + } + return 0; +} + + +// +// Checks that environment 'env' is allowed to access the range +// of memory [va, va+len) with permissions 'perm | PTE_U | PTE_P'. +// If it can, then the function simply returns. +// If it cannot, 'env' is destroyed and, if env is the current +// environment, this function will not return. +// +void +user_mem_assert(struct Env *env, const void *va, size_t len, int perm) +{ + if (user_mem_check(env, va, len, perm | PTE_U) < 0) { + cprintf("[%08x] user_mem_check assertion failure for " + "va %08x\n", env->env_id, user_mem_check_addr); + env_destroy(env); // may not return + } +} + + +// -------------------------------------------------------------- +// Checking functions. +// -------------------------------------------------------------- + +// +// Check that the pages on the page_free_list are reasonable. +// +static void +check_page_free_list(bool only_low_memory) +{ + struct PageInfo *pp; + unsigned pdx_limit = only_low_memory ? 1 : NPDENTRIES; + int nfree_basemem = 0, nfree_extmem = 0; + char *first_free_page; + + if (!page_free_list) + panic("'page_free_list' is a null pointer!"); + + if (only_low_memory) { + // Move pages with lower addresses first in the free + // list, since entry_pgdir does not map all pages. + struct PageInfo *pp1, *pp2; + struct PageInfo **tp[2] = { &pp1, &pp2 }; + for (pp = page_free_list; pp; pp = pp->pp_link) { + int pagetype = PDX(page2pa(pp)) >= pdx_limit; + *tp[pagetype] = pp; + tp[pagetype] = &pp->pp_link; + } + *tp[1] = 0; + *tp[0] = pp2; + page_free_list = pp1; + } + + // if there's a page that shouldn't be on the free list, + // try to make sure it eventually causes trouble. + for (pp = page_free_list; pp; pp = pp->pp_link) + if (PDX(page2pa(pp)) < pdx_limit) + memset(page2kva(pp), 0x97, 128); + + first_free_page = (char *) boot_alloc(0); + for (pp = page_free_list; pp; pp = pp->pp_link) { + // check that we didn't corrupt the free list itself + assert(pp >= pages); + assert(pp < pages + npages); + assert(((char *) pp - (char *) pages) % sizeof(*pp) == 0); + + // check a few pages that shouldn't be on the free list + assert(page2pa(pp) != 0); + assert(page2pa(pp) != IOPHYSMEM); + assert(page2pa(pp) != EXTPHYSMEM - PGSIZE); + assert(page2pa(pp) != EXTPHYSMEM); + assert(page2pa(pp) < EXTPHYSMEM || (char *) page2kva(pp) >= first_free_page); + // (new test for lab 4) + assert(page2pa(pp) != MPENTRY_PADDR); + + if (page2pa(pp) < EXTPHYSMEM) + ++nfree_basemem; + else + ++nfree_extmem; + } + + assert(nfree_basemem > 0); + assert(nfree_extmem > 0); + + cprintf("check_page_free_list() succeeded!\n"); +} + +// +// Check the physical page allocator (page_alloc(), page_free(), +// and page_init()). +// +static void +check_page_alloc(void) +{ + struct PageInfo *pp, *pp0, *pp1, *pp2; + int nfree; + struct PageInfo *fl; + char *c; + int i; + + if (!pages) + panic("'pages' is a null pointer!"); + + // check number of free pages + for (pp = page_free_list, nfree = 0; pp; pp = pp->pp_link) + ++nfree; + + // should be able to allocate three pages + pp0 = pp1 = pp2 = 0; + assert((pp0 = page_alloc(0))); + assert((pp1 = page_alloc(0))); + assert((pp2 = page_alloc(0))); + + assert(pp0); + assert(pp1 && pp1 != pp0); + assert(pp2 && pp2 != pp1 && pp2 != pp0); + assert(page2pa(pp0) < npages*PGSIZE); + assert(page2pa(pp1) < npages*PGSIZE); + assert(page2pa(pp2) < npages*PGSIZE); + + // temporarily steal the rest of the free pages + fl = page_free_list; + page_free_list = 0; + + // should be no free memory + assert(!page_alloc(0)); + + // free and re-allocate? + page_free(pp0); + page_free(pp1); + page_free(pp2); + pp0 = pp1 = pp2 = 0; + assert((pp0 = page_alloc(0))); + assert((pp1 = page_alloc(0))); + assert((pp2 = page_alloc(0))); + assert(pp0); + assert(pp1 && pp1 != pp0); + assert(pp2 && pp2 != pp1 && pp2 != pp0); + assert(!page_alloc(0)); + + // test flags + memset(page2kva(pp0), 1, PGSIZE); + page_free(pp0); + assert((pp = page_alloc(ALLOC_ZERO))); + assert(pp && pp0 == pp); + c = page2kva(pp); + for (i = 0; i < PGSIZE; i++) + assert(c[i] == 0); + + // give free list back + page_free_list = fl; + + // free the pages we took + page_free(pp0); + page_free(pp1); + page_free(pp2); + + // number of free pages should be the same + for (pp = page_free_list; pp; pp = pp->pp_link) + --nfree; + assert(nfree == 0); + + cprintf("check_page_alloc() succeeded!\n"); +} + +// +// Checks that the kernel part of virtual address space +// has been set up roughly correctly (by mem_init()). +// +// This function doesn't test every corner case, +// but it is a pretty good sanity check. +// + +static void +check_kern_pgdir(void) +{ + uint32_t i, n; + pde_t *pgdir; + + pgdir = kern_pgdir; + + // check pages array + n = ROUNDUP(npages*sizeof(struct PageInfo), PGSIZE); + for (i = 0; i < n; i += PGSIZE) + assert(check_va2pa(pgdir, UPAGES + i) == PADDR(pages) + i); + + // check envs array (new test for lab 3) + n = ROUNDUP(NENV*sizeof(struct Env), PGSIZE); + for (i = 0; i < n; i += PGSIZE) + assert(check_va2pa(pgdir, UENVS + i) == PADDR(envs) + i); + + // check phys mem + for (i = 0; i < npages * PGSIZE; i += PGSIZE) + assert(check_va2pa(pgdir, KERNBASE + i) == i); + + // check kernel stack + // (updated in lab 4 to check per-CPU kernel stacks) + for (n = 0; n < NCPU; n++) { + uint32_t base = KSTACKTOP - (KSTKSIZE + KSTKGAP) * (n + 1); + for (i = 0; i < KSTKSIZE; i += PGSIZE) + assert(check_va2pa(pgdir, base + KSTKGAP + i) + == PADDR(percpu_kstacks[n]) + i); + for (i = 0; i < KSTKGAP; i += PGSIZE) + assert(check_va2pa(pgdir, base + i) == ~0); + } + + // check PDE permissions + for (i = 0; i < NPDENTRIES; i++) { + switch (i) { + case PDX(UVPT): + case PDX(KSTACKTOP-1): + case PDX(UPAGES): + case PDX(UENVS): + case PDX(MMIOBASE): + assert(pgdir[i] & PTE_P); + break; + default: + if (i >= PDX(KERNBASE)) { + assert(pgdir[i] & PTE_P); + assert(pgdir[i] & PTE_W); + } else + assert(pgdir[i] == 0); + break; + } + } + cprintf("check_kern_pgdir() succeeded!\n"); +} + +// This function returns the physical address of the page containing 'va', +// defined by the page directory 'pgdir'. The hardware normally performs +// this functionality for us! We define our own version to help check +// the check_kern_pgdir() function; it shouldn't be used elsewhere. + +static physaddr_t +check_va2pa(pde_t *pgdir, uintptr_t va) +{ + pte_t *p; + + pgdir = &pgdir[PDX(va)]; + if (!(*pgdir & PTE_P)) + return ~0; + p = (pte_t*) KADDR(PTE_ADDR(*pgdir)); + if (!(p[PTX(va)] & PTE_P)) + return ~0; + return PTE_ADDR(p[PTX(va)]); +} + + +// check page_insert, page_remove, &c +static void +check_page(void) +{ + struct PageInfo *pp, *pp0, *pp1, *pp2; + struct PageInfo *fl; + pte_t *ptep, *ptep1; + void *va; + uintptr_t mm1, mm2; + int i; + extern pde_t entry_pgdir[]; + + // should be able to allocate three pages + pp0 = pp1 = pp2 = 0; + assert((pp0 = page_alloc(0))); + assert((pp1 = page_alloc(0))); + assert((pp2 = page_alloc(0))); + + assert(pp0); + assert(pp1 && pp1 != pp0); + assert(pp2 && pp2 != pp1 && pp2 != pp0); + + // temporarily steal the rest of the free pages + fl = page_free_list; + page_free_list = 0; + + // should be no free memory + assert(!page_alloc(0)); + + // there is no page allocated at address 0 + assert(page_lookup(kern_pgdir, (void *) 0x0, &ptep) == NULL); + + // there is no free memory, so we can't allocate a page table + assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) < 0); + + // free pp0 and try again: pp0 should be used for page table + page_free(pp0); + assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) == 0); + assert(PTE_ADDR(kern_pgdir[0]) == page2pa(pp0)); + assert(check_va2pa(kern_pgdir, 0x0) == page2pa(pp1)); + assert(pp1->pp_ref == 1); + assert(pp0->pp_ref == 1); + + // should be able to map pp2 at PGSIZE because pp0 is already allocated for page table + assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W) == 0); + assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2)); + assert(pp2->pp_ref == 1); + + // should be no free memory + assert(!page_alloc(0)); + + // should be able to map pp2 at PGSIZE because it's already there + assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W) == 0); + assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2)); + assert(pp2->pp_ref == 1); + + // pp2 should NOT be on the free list + // could happen in ref counts are handled sloppily in page_insert + assert(!page_alloc(0)); + + // check that pgdir_walk returns a pointer to the pte + ptep = (pte_t *) KADDR(PTE_ADDR(kern_pgdir[PDX(PGSIZE)])); + assert(pgdir_walk(kern_pgdir, (void*)PGSIZE, 0) == ptep+PTX(PGSIZE)); + + // should be able to change permissions too. + assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W|PTE_U) == 0); + assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2)); + assert(pp2->pp_ref == 1); + assert(*pgdir_walk(kern_pgdir, (void*) PGSIZE, 0) & PTE_U); + assert(kern_pgdir[0] & PTE_U); + + // should be able to remap with fewer permissions + assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W) == 0); + assert(*pgdir_walk(kern_pgdir, (void*) PGSIZE, 0) & PTE_W); + assert(!(*pgdir_walk(kern_pgdir, (void*) PGSIZE, 0) & PTE_U)); + + // should not be able to map at PTSIZE because need free page for page table + assert(page_insert(kern_pgdir, pp0, (void*) PTSIZE, PTE_W) < 0); + + // insert pp1 at PGSIZE (replacing pp2) + assert(page_insert(kern_pgdir, pp1, (void*) PGSIZE, PTE_W) == 0); + assert(!(*pgdir_walk(kern_pgdir, (void*) PGSIZE, 0) & PTE_U)); + + // should have pp1 at both 0 and PGSIZE, pp2 nowhere, ... + assert(check_va2pa(kern_pgdir, 0) == page2pa(pp1)); + assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp1)); + // ... and ref counts should reflect this + assert(pp1->pp_ref == 2); + assert(pp2->pp_ref == 0); + + // pp2 should be returned by page_alloc + assert((pp = page_alloc(0)) && pp == pp2); + + // unmapping pp1 at 0 should keep pp1 at PGSIZE + page_remove(kern_pgdir, 0x0); + assert(check_va2pa(kern_pgdir, 0x0) == ~0); + assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp1)); + assert(pp1->pp_ref == 1); + assert(pp2->pp_ref == 0); + + // test re-inserting pp1 at PGSIZE + assert(page_insert(kern_pgdir, pp1, (void*) PGSIZE, 0) == 0); + assert(pp1->pp_ref); + assert(pp1->pp_link == NULL); + + // unmapping pp1 at PGSIZE should free it + page_remove(kern_pgdir, (void*) PGSIZE); + assert(check_va2pa(kern_pgdir, 0x0) == ~0); + assert(check_va2pa(kern_pgdir, PGSIZE) == ~0); + assert(pp1->pp_ref == 0); + assert(pp2->pp_ref == 0); + + // so it should be returned by page_alloc + assert((pp = page_alloc(0)) && pp == pp1); + + // should be no free memory + assert(!page_alloc(0)); + + // forcibly take pp0 back + assert(PTE_ADDR(kern_pgdir[0]) == page2pa(pp0)); + kern_pgdir[0] = 0; + assert(pp0->pp_ref == 1); + pp0->pp_ref = 0; + + // check pointer arithmetic in pgdir_walk + page_free(pp0); + va = (void*)(PGSIZE * NPDENTRIES + PGSIZE); + ptep = pgdir_walk(kern_pgdir, va, 1); + ptep1 = (pte_t *) KADDR(PTE_ADDR(kern_pgdir[PDX(va)])); + assert(ptep == ptep1 + PTX(va)); + kern_pgdir[PDX(va)] = 0; + pp0->pp_ref = 0; + + // check that new page tables get cleared + memset(page2kva(pp0), 0xFF, PGSIZE); + page_free(pp0); + pgdir_walk(kern_pgdir, 0x0, 1); + ptep = (pte_t *) page2kva(pp0); + for(i=0; ipp_ref = 0; + + // give free list back + page_free_list = fl; + + // free the pages we took + page_free(pp0); + page_free(pp1); + page_free(pp2); + + // test mmio_map_region + mm1 = (uintptr_t) mmio_map_region(0, 4097); + mm2 = (uintptr_t) mmio_map_region(0, 4096); + // check that they're in the right region + assert(mm1 >= MMIOBASE && mm1 + 8192 < MMIOLIM); + assert(mm2 >= MMIOBASE && mm2 + 8192 < MMIOLIM); + // check that they're page-aligned + assert(mm1 % PGSIZE == 0 && mm2 % PGSIZE == 0); + // check that they don't overlap + assert(mm1 + 8192 <= mm2); + // check page mappings + assert(check_va2pa(kern_pgdir, mm1) == 0); + assert(check_va2pa(kern_pgdir, mm1+PGSIZE) == PGSIZE); + assert(check_va2pa(kern_pgdir, mm2) == 0); + assert(check_va2pa(kern_pgdir, mm2+PGSIZE) == ~0); + // check permissions + assert(*pgdir_walk(kern_pgdir, (void*) mm1, 0) & (PTE_W|PTE_PWT|PTE_PCD)); + assert(!(*pgdir_walk(kern_pgdir, (void*) mm1, 0) & PTE_U)); + // clear the mappings + *pgdir_walk(kern_pgdir, (void*) mm1, 0) = 0; + *pgdir_walk(kern_pgdir, (void*) mm1 + PGSIZE, 0) = 0; + *pgdir_walk(kern_pgdir, (void*) mm2, 0) = 0; + + cprintf("check_page() succeeded!\n"); +} + +// check page_insert, page_remove, &c, with an installed kern_pgdir +static void +check_page_installed_pgdir(void) +{ + struct PageInfo *pp, *pp0, *pp1, *pp2; + struct PageInfo *fl; + pte_t *ptep, *ptep1; + uintptr_t va; + int i; + + // check that we can read and write installed pages + pp1 = pp2 = 0; + assert((pp0 = page_alloc(0))); + assert((pp1 = page_alloc(0))); + assert((pp2 = page_alloc(0))); + page_free(pp0); + memset(page2kva(pp1), 1, PGSIZE); + memset(page2kva(pp2), 2, PGSIZE); + page_insert(kern_pgdir, pp1, (void*) PGSIZE, PTE_W); + assert(pp1->pp_ref == 1); + assert(*(uint32_t *)PGSIZE == 0x01010101U); + page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W); + assert(*(uint32_t *)PGSIZE == 0x02020202U); + assert(pp2->pp_ref == 1); + assert(pp1->pp_ref == 0); + *(uint32_t *)PGSIZE = 0x03030303U; + assert(*(uint32_t *)page2kva(pp2) == 0x03030303U); + page_remove(kern_pgdir, (void*) PGSIZE); + assert(pp2->pp_ref == 0); + + // forcibly take pp0 back + assert(PTE_ADDR(kern_pgdir[0]) == page2pa(pp0)); + kern_pgdir[0] = 0; + assert(pp0->pp_ref == 1); + pp0->pp_ref = 0; + + // free the pages we took + page_free(pp0); + + cprintf("check_page_installed_pgdir() succeeded!\n"); +} diff --git a/lab/LAB4.si4project/Backup/sched(4329).c b/lab/LAB4.si4project/Backup/sched(4329).c new file mode 100644 index 0000000..f595bb1 --- /dev/null +++ b/lab/LAB4.si4project/Backup/sched(4329).c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include + +void sched_halt(void); + +// Choose a user environment to run and run it. +void +sched_yield(void) +{ + struct Env *idle; + + // Implement simple round-robin scheduling. + // + // Search through 'envs' for an ENV_RUNNABLE environment in + // circular fashion starting just after the env this CPU was + // last running. Switch to the first such environment found. + // + // If no envs are runnable, but the environment previously + // running on this CPU is still ENV_RUNNING, it's okay to + // choose that environment. + // + // Never choose an environment that's currently running on + // another CPU (env_status == ENV_RUNNING). If there are + // no runnable environments, simply drop through to the code + // below to halt the cpu. + + // LAB 4: Your code here. + + // sched_halt never returns + sched_halt(); +} + +// Halt this CPU when there is nothing to do. Wait until the +// timer interrupt wakes it up. This function never returns. +// +void +sched_halt(void) +{ + int i; + + // For debugging and testing purposes, if there are no runnable + // environments in the system, then drop into the kernel monitor. + for (i = 0; i < NENV; i++) { + if ((envs[i].env_status == ENV_RUNNABLE || + envs[i].env_status == ENV_RUNNING || + envs[i].env_status == ENV_DYING)) + break; + } + if (i == NENV) { + cprintf("No runnable environments in the system!\n"); + while (1) + monitor(NULL); + } + + // Mark that no environment is running on this CPU + curenv = NULL; + lcr3(PADDR(kern_pgdir)); + + // Mark that this CPU is in the HALT state, so that when + // timer interupts come in, we know we should re-acquire the + // big kernel lock + xchg(&thiscpu->cpu_status, CPU_HALTED); + + // Release the big kernel lock as if we were "leaving" the kernel + unlock_kernel(); + + // Reset stack pointer, enable interrupts and then halt. + asm volatile ( + "movl $0, %%ebp\n" + "movl %0, %%esp\n" + "pushl $0\n" + "pushl $0\n" + // Uncomment the following line after completing exercise 13 + //"sti\n" + "1:\n" + "hlt\n" + "jmp 1b\n" + : : "a" (thiscpu->cpu_ts.ts_esp0)); +} + diff --git a/lab/LAB4.si4project/Backup/sched(5719).c b/lab/LAB4.si4project/Backup/sched(5719).c new file mode 100644 index 0000000..04e9617 --- /dev/null +++ b/lab/LAB4.si4project/Backup/sched(5719).c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include + +void sched_halt(void); + +// Choose a user environment to run and run it. +void +sched_yield(void) +{ + struct Env *idle; + + // Implement simple round-robin scheduling. + // + // Search through 'envs' for an ENV_RUNNABLE environment in + // circular fashion starting just after the env this CPU was + // last running. Switch to the first such environment found. + // + // If no envs are runnable, but the environment previously + // running on this CPU is still ENV_RUNNING, it's okay to + // choose that environment. + // + // Never choose an environment that's currently running on + // another CPU (env_status == ENV_RUNNING). If there are + // no runnable environments, simply drop through to the code + // below to halt the cpu. + + // LAB 4: Your code here. + + idle = curenv; + int start_envid = idle ? ENVX(idle->env_id)+1 : 0; + + for (int i = 0; i < NENV; i++) { + int j = (start_envid + i) % NENV; + if (envs[j].env_status == ENV_RUNNABLE) { + env_run(&envs[j]); + } + } + + if (idle && idle->env_status == ENV_RUNNING) { + env_run(idle); + } + + // sched_halt never returns + sched_halt(); + +} + +// Halt this CPU when there is nothing to do. Wait until the +// timer interrupt wakes it up. This function never returns. +// +void +sched_halt(void) +{ + int i; + + // For debugging and testing purposes, if there are no runnable + // environments in the system, then drop into the kernel monitor. + for (i = 0; i < NENV; i++) { + if ((envs[i].env_status == ENV_RUNNABLE || + envs[i].env_status == ENV_RUNNING || + envs[i].env_status == ENV_DYING)) + break; + } + if (i == NENV) { + cprintf("No runnable environments in the system!\n"); + while (1) + monitor(NULL); + } + + // Mark that no environment is running on this CPU + curenv = NULL; + lcr3(PADDR(kern_pgdir)); + + // Mark that this CPU is in the HALT state, so that when + // timer interupts come in, we know we should re-acquire the + // big kernel lock + xchg(&thiscpu->cpu_status, CPU_HALTED); + + // Release the big kernel lock as if we were "leaving" the kernel + unlock_kernel(); + + // Reset stack pointer, enable interrupts and then halt. + asm volatile ( + "movl $0, %%ebp\n" + "movl %0, %%esp\n" + "pushl $0\n" + "pushl $0\n" + // Uncomment the following line after completing exercise 13 + //"sti\n" + "1:\n" + "hlt\n" + "jmp 1b\n" + : : "a" (thiscpu->cpu_ts.ts_esp0)); +} + diff --git a/lab/LAB4.si4project/Backup/sched(6307).c b/lab/LAB4.si4project/Backup/sched(6307).c new file mode 100644 index 0000000..04e9617 --- /dev/null +++ b/lab/LAB4.si4project/Backup/sched(6307).c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include + +void sched_halt(void); + +// Choose a user environment to run and run it. +void +sched_yield(void) +{ + struct Env *idle; + + // Implement simple round-robin scheduling. + // + // Search through 'envs' for an ENV_RUNNABLE environment in + // circular fashion starting just after the env this CPU was + // last running. Switch to the first such environment found. + // + // If no envs are runnable, but the environment previously + // running on this CPU is still ENV_RUNNING, it's okay to + // choose that environment. + // + // Never choose an environment that's currently running on + // another CPU (env_status == ENV_RUNNING). If there are + // no runnable environments, simply drop through to the code + // below to halt the cpu. + + // LAB 4: Your code here. + + idle = curenv; + int start_envid = idle ? ENVX(idle->env_id)+1 : 0; + + for (int i = 0; i < NENV; i++) { + int j = (start_envid + i) % NENV; + if (envs[j].env_status == ENV_RUNNABLE) { + env_run(&envs[j]); + } + } + + if (idle && idle->env_status == ENV_RUNNING) { + env_run(idle); + } + + // sched_halt never returns + sched_halt(); + +} + +// Halt this CPU when there is nothing to do. Wait until the +// timer interrupt wakes it up. This function never returns. +// +void +sched_halt(void) +{ + int i; + + // For debugging and testing purposes, if there are no runnable + // environments in the system, then drop into the kernel monitor. + for (i = 0; i < NENV; i++) { + if ((envs[i].env_status == ENV_RUNNABLE || + envs[i].env_status == ENV_RUNNING || + envs[i].env_status == ENV_DYING)) + break; + } + if (i == NENV) { + cprintf("No runnable environments in the system!\n"); + while (1) + monitor(NULL); + } + + // Mark that no environment is running on this CPU + curenv = NULL; + lcr3(PADDR(kern_pgdir)); + + // Mark that this CPU is in the HALT state, so that when + // timer interupts come in, we know we should re-acquire the + // big kernel lock + xchg(&thiscpu->cpu_status, CPU_HALTED); + + // Release the big kernel lock as if we were "leaving" the kernel + unlock_kernel(); + + // Reset stack pointer, enable interrupts and then halt. + asm volatile ( + "movl $0, %%ebp\n" + "movl %0, %%esp\n" + "pushl $0\n" + "pushl $0\n" + // Uncomment the following line after completing exercise 13 + //"sti\n" + "1:\n" + "hlt\n" + "jmp 1b\n" + : : "a" (thiscpu->cpu_ts.ts_esp0)); +} + diff --git a/lab/LAB4.si4project/Backup/syscall(1135).c b/lab/LAB4.si4project/Backup/syscall(1135).c new file mode 100644 index 0000000..055deef --- /dev/null +++ b/lab/LAB4.si4project/Backup/syscall(1135).c @@ -0,0 +1,378 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Print a string to the system console. +// The string is exactly 'len' characters long. +// Destroys the environment on memory errors. +static void +sys_cputs(const char *s, size_t len) +{ + // Check that the user has permission to read memory [s, s+len). + // Destroy the environment if not. + + // LAB 3: Your code here. + user_mem_assert(curenv, (const void *) s, len, 0); + // Print the string supplied by the user. + cprintf("%.*s", len, s); +} + +// Read a character from the system console without blocking. +// Returns the character, or 0 if there is no input waiting. +static int +sys_cgetc(void) +{ + return cons_getc(); +} + +// Returns the current environment's envid. +static envid_t +sys_getenvid(void) +{ + return curenv->env_id; +} + +// Destroy a given environment (possibly the currently running environment). +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_destroy(envid_t envid) +{ + int r; + struct Env *e; + + if ((r = envid2env(envid, &e, 1)) < 0) + return r; + if (e == curenv) + cprintf("[%08x] exiting gracefully\n", curenv->env_id); + else + cprintf("[%08x] destroying %08x\n", curenv->env_id, e->env_id); + env_destroy(e); + return 0; +} + +// Deschedule current environment and pick a different one to run. +static void +sys_yield(void) +{ + sched_yield(); +} + + +// Allocate a new environment. +// Returns envid of new environment, or < 0 on error. Errors are: +// -E_NO_FREE_ENV if no free environment is available. +// -E_NO_MEM on memory exhaustion. +static envid_t +sys_exofork(void) +{ + // Create the new environment with env_alloc(), from kern/env.c. + // It should be left as env_alloc created it, except that + // status is set to ENV_NOT_RUNNABLE, and the register set is copied + // from the current environment -- but tweaked so sys_exofork + // will appear to return 0. + // LAB 4: Your code here. + struct Env *newenv; + int32_t ret; + if ((ret = env_alloc(&newenv, sys_getenvid())) < 0) { + // 两个函数的返回值是一样的 + return ret; + } + newenv->env_status = ENV_NOT_RUNNABLE; + newenv->env_tf = curenv->env_tf; + // newenv的返回值为0, 实现子进程返回0值 + newenv->env_tf.tf_regs.reg_eax = 0; + // 返回值存放在eax中 + return newenv->env_id; + + // panic("sys_exofork not implemented"); +} + +// Set envid's env_status to status, which must be ENV_RUNNABLE +// or ENV_NOT_RUNNABLE. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if status is not a valid status for an environment. +static int +sys_env_set_status(envid_t envid, int status) +{ + // Hint: Use the 'envid2env' function from kern/env.c to translate an + // envid to a struct Env. + // You should set envid2env's third argument to 1, which will + // check whether the current environment has permission to set + // envid's status. + + // LAB 4: Your code here. + struct Env *e; + if (envid2env(envid, &e, 1)) return -E_BAD_ENV; + + if (status != ENV_NOT_RUNNABLE && status != ENV_RUNNABLE) + return -E_INVAL; + + e->env_status = status; + return 0; +} + +// Set the page fault upcall for 'envid' by modifying the corresponding struct +// Env's 'env_pgfault_upcall' field. When 'envid' causes a page fault, the +// kernel will push a fault record onto the exception stack, then branch to +// 'func'. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_set_pgfault_upcall(envid_t envid, void *func) +{ + // LAB 4: Your code here. + + + panic("sys_env_set_pgfault_upcall not implemented"); +} + +// Allocate a page of memory and map it at 'va' with permission +// 'perm' in the address space of 'envid'. +// The page's contents are set to 0. +// If a page is already mapped at 'va', that page is unmapped as a +// side effect. +// +// perm -- PTE_U | PTE_P must be set, PTE_AVAIL | PTE_W may or may not be set, +// but no other bits may be set. See PTE_SYSCALL in inc/mmu.h. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +// -E_INVAL if perm is inappropriate (see above). +// -E_NO_MEM if there's no memory to allocate the new page, +// or to allocate any necessary page tables. +static int +sys_page_alloc(envid_t envid, void *va, int perm) +{ + // Hint: This function is a wrapper around page_alloc() and + // page_insert() from kern/pmap.c. + // Most of the new code you write should be to check the + // parameters for correctness. + // If page_insert() fails, remember to free the page you + // allocated! + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + + if((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + if ((perm & PTE_U) == 0 || (perm & PTE_P) == 0) + return -E_INVAL; + if (perm & ~PTE_SYSCALL) + return -E_INVAL; + + struct PageInfo *pp = page_alloc(ALLOC_ZERO); + if(!pp) + return -E_NO_MEM; + + if (page_insert(env->env_pgdir, pp, va, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_alloc not implemented"); +} + +// Map the page of memory at 'srcva' in srcenvid's address space +// at 'dstva' in dstenvid's address space with permission 'perm'. +// Perm has the same restrictions as in sys_page_alloc, except +// that it also must not grant write access to a read-only +// page. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if srcenvid and/or dstenvid doesn't currently exist, +// or the caller doesn't have permission to change one of them. +// -E_INVAL if srcva >= UTOP or srcva is not page-aligned, +// or dstva >= UTOP or dstva is not page-aligned. +// -E_INVAL is srcva is not mapped in srcenvid's address space. +// -E_INVAL if perm is inappropriate (see sys_page_alloc). +// -E_INVAL if (perm & PTE_W), but srcva is read-only in srcenvid's +// address space. +// -E_NO_MEM if there's no memory to allocate any necessary page tables. +static int +sys_page_map(envid_t srcenvid, void *srcva, + envid_t dstenvid, void *dstva, int perm) +{ + // Hint: This function is a wrapper around page_lookup() and + // page_insert() from kern/pmap.c. + // Again, most of the new code you write should be to check the + // parameters for correctness. + // Use the third argument to page_lookup() to + // check the current permissions on the page. + + // LAB 4: Your code here. + int ret = 0; + struct Env *srcenv, *dstenv; + struct PageInfo *srcpp, *dstpp; + pte_t *pte; + if ((envid2env(srcenvid, &srcenv, 1) < 0 )|| ( envid2env(dstenvid, &dstenv, 1) < 0)) + return -E_BAD_ENV; + if ((uintptr_t)srcva >= UTOP || PGOFF(srcva) || (uintptr_t)dstva >= UTOP || PGOFF(dstva)) + return -E_INVAL; + if ( (perm & PTE_U) == 0 || (perm & PTE_P) == 0 || (perm & ~PTE_SYSCALL)) + return -E_INVAL; + if (!(srcpp = page_lookup(srcenv->env_pgdir, srcva, &pte))) + return -E_INVAL; + if ((perm & PTE_W) && ((*pte & PTE_W) == 0)) + return -E_INVAL; + if (page_insert(dstenv->env_pgdir, srcpp, dstva, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_map not implemented"); +} + +// Unmap the page of memory at 'va' in the address space of 'envid'. +// If no page is mapped, the function silently succeeds. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +static int +sys_page_unmap(envid_t envid, void *va) +{ + // Hint: This function is a wrapper around page_remove(). + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + if ((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + page_remove(env->env_pgdir, va); + return 0; + // panic("sys_page_unmap not implemented"); +} + +// Try to send 'value' to the target env 'envid'. +// If srcva < UTOP, then also send page currently mapped at 'srcva', +// so that receiver gets a duplicate mapping of the same page. +// +// The send fails with a return value of -E_IPC_NOT_RECV if the +// target is not blocked, waiting for an IPC. +// +// The send also can fail for the other reasons listed below. +// +// Otherwise, the send succeeds, and the target's ipc fields are +// updated as follows: +// env_ipc_recving is set to 0 to block future sends; +// env_ipc_from is set to the sending envid; +// env_ipc_value is set to the 'value' parameter; +// env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise. +// The target environment is marked runnable again, returning 0 +// from the paused sys_ipc_recv system call. (Hint: does the +// sys_ipc_recv function ever actually return?) +// +// If the sender wants to send a page but the receiver isn't asking for one, +// then no page mapping is transferred, but no error occurs. +// The ipc only happens when no errors occur. +// +// Returns 0 on success, < 0 on error. +// Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist. +// (No need to check permissions.) +// -E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv, +// or another environment managed to send first. +// -E_INVAL if srcva < UTOP but srcva is not page-aligned. +// -E_INVAL if srcva < UTOP and perm is inappropriate +// (see sys_page_alloc). +// -E_INVAL if srcva < UTOP but srcva is not mapped in the caller's +// address space. +// -E_INVAL if (perm & PTE_W), but srcva is read-only in the +// current environment's address space. +// -E_NO_MEM if there's not enough memory to map srcva in envid's +// address space. +static int +sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm) +{ + // LAB 4: Your code here. + panic("sys_ipc_try_send not implemented"); +} + +// Block until a value is ready. Record that you want to receive +// using the env_ipc_recving and env_ipc_dstva fields of struct Env, +// mark yourself not runnable, and then give up the CPU. +// +// If 'dstva' is < UTOP, then you are willing to receive a page of data. +// 'dstva' is the virtual address at which the sent page should be mapped. +// +// This function only returns on error, but the system call will eventually +// return 0 on success. +// Return < 0 on error. Errors are: +// -E_INVAL if dstva < UTOP but dstva is not page-aligned. +static int +sys_ipc_recv(void *dstva) +{ + // LAB 4: Your code here. + panic("sys_ipc_recv not implemented"); + return 0; +} + +// Dispatches to the correct kernel function, passing the arguments. +int32_t +syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) +{ + // Call the function corresponding to the 'syscallno' parameter. + // Return any appropriate return value. + // LAB 3: Your code here. + switch (syscallno) { + case SYS_cputs: + sys_cputs((const char*)a1, a2); + break; + case SYS_cgetc: + return sys_cgetc(); + case SYS_getenvid: + ret = sys_getenvid(); + break; + case SYS_env_destroy: + return sys_env_destroy(a1); + case SYS_yield: + sys_yield(); + break; + case SYS_page_alloc: + return sys_page_alloc((envid_t)a1, (void * )a2, (int )a3); + + case SYS_page_map: + return sys_page_map((envid_t) a1, (void *) a2, (envid_t) a3, (void *) a4, (int) a5); + + case SYS_page_unmap: + return sys_page_unmap((envid_t) a1, (void *) a2); + + case SYS_exofork: + return sys_exofork(); + + case SYS_env_set_status: + return sys_env_set_status((envid_t) a1, (int) a2); + case NSYSCALLS: + return -E_INVAL; + + default: + return -E_INVAL; + } +} + diff --git a/lab/LAB4.si4project/Backup/syscall(1286).c b/lab/LAB4.si4project/Backup/syscall(1286).c new file mode 100644 index 0000000..6ee15ee --- /dev/null +++ b/lab/LAB4.si4project/Backup/syscall(1286).c @@ -0,0 +1,383 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Print a string to the system console. +// The string is exactly 'len' characters long. +// Destroys the environment on memory errors. +static void +sys_cputs(const char *s, size_t len) +{ + // Check that the user has permission to read memory [s, s+len). + // Destroy the environment if not. + + // LAB 3: Your code here. + user_mem_assert(curenv, (const void *) s, len, 0); + // Print the string supplied by the user. + cprintf("%.*s", len, s); +} + +// Read a character from the system console without blocking. +// Returns the character, or 0 if there is no input waiting. +static int +sys_cgetc(void) +{ + return cons_getc(); +} + +// Returns the current environment's envid. +static envid_t +sys_getenvid(void) +{ + return curenv->env_id; +} + +// Destroy a given environment (possibly the currently running environment). +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_destroy(envid_t envid) +{ + int r; + struct Env *e; + + if ((r = envid2env(envid, &e, 1)) < 0) + return r; + if (e == curenv) + cprintf("[%08x] exiting gracefully\n", curenv->env_id); + else + cprintf("[%08x] destroying %08x\n", curenv->env_id, e->env_id); + env_destroy(e); + return 0; +} + +// Deschedule current environment and pick a different one to run. +static void +sys_yield(void) +{ + sched_yield(); +} + + +// Allocate a new environment. +// Returns envid of new environment, or < 0 on error. Errors are: +// -E_NO_FREE_ENV if no free environment is available. +// -E_NO_MEM on memory exhaustion. +static envid_t +sys_exofork(void) +{ + // Create the new environment with env_alloc(), from kern/env.c. + // It should be left as env_alloc created it, except that + // status is set to ENV_NOT_RUNNABLE, and the register set is copied + // from the current environment -- but tweaked so sys_exofork + // will appear to return 0. + // LAB 4: Your code here. + struct Env *newenv; + int32_t ret; + if ((ret = env_alloc(&newenv, sys_getenvid())) < 0) { + // 两个函数的返回值是一样的 + return ret; + } + newenv->env_status = ENV_NOT_RUNNABLE; + newenv->env_tf = curenv->env_tf; + // newenv的返回值为0, 实现子进程返回0值 + newenv->env_tf.tf_regs.reg_eax = 0; + // 返回值存放在eax中 + return newenv->env_id; + + // panic("sys_exofork not implemented"); +} + +// Set envid's env_status to status, which must be ENV_RUNNABLE +// or ENV_NOT_RUNNABLE. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if status is not a valid status for an environment. +static int +sys_env_set_status(envid_t envid, int status) +{ + // Hint: Use the 'envid2env' function from kern/env.c to translate an + // envid to a struct Env. + // You should set envid2env's third argument to 1, which will + // check whether the current environment has permission to set + // envid's status. + + // LAB 4: Your code here. + struct Env *e; + if (envid2env(envid, &e, 1)) return -E_BAD_ENV; + + if (status != ENV_NOT_RUNNABLE && status != ENV_RUNNABLE) + return -E_INVAL; + + e->env_status = status; + return 0; +} + +// Set the page fault upcall for 'envid' by modifying the corresponding struct +// Env's 'env_pgfault_upcall' field. When 'envid' causes a page fault, the +// kernel will push a fault record onto the exception stack, then branch to +// 'func'. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_set_pgfault_upcall(envid_t envid, void *func) +{ + // LAB 4: Your code here. + struct Env *e; + if (envid2env(envid, &e, 1)) + return -E_BAD_ENV; + + e->env_pgfault_upcall = func; + return 0; + // panic("sys_env_set_pgfault_upcall not implemented"); +} + +// Allocate a page of memory and map it at 'va' with permission +// 'perm' in the address space of 'envid'. +// The page's contents are set to 0. +// If a page is already mapped at 'va', that page is unmapped as a +// side effect. +// +// perm -- PTE_U | PTE_P must be set, PTE_AVAIL | PTE_W may or may not be set, +// but no other bits may be set. See PTE_SYSCALL in inc/mmu.h. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +// -E_INVAL if perm is inappropriate (see above). +// -E_NO_MEM if there's no memory to allocate the new page, +// or to allocate any necessary page tables. +static int +sys_page_alloc(envid_t envid, void *va, int perm) +{ + // Hint: This function is a wrapper around page_alloc() and + // page_insert() from kern/pmap.c. + // Most of the new code you write should be to check the + // parameters for correctness. + // If page_insert() fails, remember to free the page you + // allocated! + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + + if((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + if ((perm & PTE_U) == 0 || (perm & PTE_P) == 0) + return -E_INVAL; + if (perm & ~PTE_SYSCALL) + return -E_INVAL; + + struct PageInfo *pp = page_alloc(ALLOC_ZERO); + if(!pp) + return -E_NO_MEM; + + if (page_insert(env->env_pgdir, pp, va, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_alloc not implemented"); +} + +// Map the page of memory at 'srcva' in srcenvid's address space +// at 'dstva' in dstenvid's address space with permission 'perm'. +// Perm has the same restrictions as in sys_page_alloc, except +// that it also must not grant write access to a read-only +// page. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if srcenvid and/or dstenvid doesn't currently exist, +// or the caller doesn't have permission to change one of them. +// -E_INVAL if srcva >= UTOP or srcva is not page-aligned, +// or dstva >= UTOP or dstva is not page-aligned. +// -E_INVAL is srcva is not mapped in srcenvid's address space. +// -E_INVAL if perm is inappropriate (see sys_page_alloc). +// -E_INVAL if (perm & PTE_W), but srcva is read-only in srcenvid's +// address space. +// -E_NO_MEM if there's no memory to allocate any necessary page tables. +static int +sys_page_map(envid_t srcenvid, void *srcva, + envid_t dstenvid, void *dstva, int perm) +{ + // Hint: This function is a wrapper around page_lookup() and + // page_insert() from kern/pmap.c. + // Again, most of the new code you write should be to check the + // parameters for correctness. + // Use the third argument to page_lookup() to + // check the current permissions on the page. + + // LAB 4: Your code here. + int ret = 0; + struct Env *srcenv, *dstenv; + struct PageInfo *srcpp, *dstpp; + pte_t *pte; + if ((envid2env(srcenvid, &srcenv, 1) < 0 )|| ( envid2env(dstenvid, &dstenv, 1) < 0)) + return -E_BAD_ENV; + if ((uintptr_t)srcva >= UTOP || PGOFF(srcva) || (uintptr_t)dstva >= UTOP || PGOFF(dstva)) + return -E_INVAL; + if ( (perm & PTE_U) == 0 || (perm & PTE_P) == 0 || (perm & ~PTE_SYSCALL)) + return -E_INVAL; + if (!(srcpp = page_lookup(srcenv->env_pgdir, srcva, &pte))) + return -E_INVAL; + if ((perm & PTE_W) && ((*pte & PTE_W) == 0)) + return -E_INVAL; + if (page_insert(dstenv->env_pgdir, srcpp, dstva, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_map not implemented"); +} + +// Unmap the page of memory at 'va' in the address space of 'envid'. +// If no page is mapped, the function silently succeeds. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +static int +sys_page_unmap(envid_t envid, void *va) +{ + // Hint: This function is a wrapper around page_remove(). + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + if ((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + page_remove(env->env_pgdir, va); + return 0; + // panic("sys_page_unmap not implemented"); +} + +// Try to send 'value' to the target env 'envid'. +// If srcva < UTOP, then also send page currently mapped at 'srcva', +// so that receiver gets a duplicate mapping of the same page. +// +// The send fails with a return value of -E_IPC_NOT_RECV if the +// target is not blocked, waiting for an IPC. +// +// The send also can fail for the other reasons listed below. +// +// Otherwise, the send succeeds, and the target's ipc fields are +// updated as follows: +// env_ipc_recving is set to 0 to block future sends; +// env_ipc_from is set to the sending envid; +// env_ipc_value is set to the 'value' parameter; +// env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise. +// The target environment is marked runnable again, returning 0 +// from the paused sys_ipc_recv system call. (Hint: does the +// sys_ipc_recv function ever actually return?) +// +// If the sender wants to send a page but the receiver isn't asking for one, +// then no page mapping is transferred, but no error occurs. +// The ipc only happens when no errors occur. +// +// Returns 0 on success, < 0 on error. +// Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist. +// (No need to check permissions.) +// -E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv, +// or another environment managed to send first. +// -E_INVAL if srcva < UTOP but srcva is not page-aligned. +// -E_INVAL if srcva < UTOP and perm is inappropriate +// (see sys_page_alloc). +// -E_INVAL if srcva < UTOP but srcva is not mapped in the caller's +// address space. +// -E_INVAL if (perm & PTE_W), but srcva is read-only in the +// current environment's address space. +// -E_NO_MEM if there's not enough memory to map srcva in envid's +// address space. +static int +sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm) +{ + // LAB 4: Your code here. + panic("sys_ipc_try_send not implemented"); +} + +// Block until a value is ready. Record that you want to receive +// using the env_ipc_recving and env_ipc_dstva fields of struct Env, +// mark yourself not runnable, and then give up the CPU. +// +// If 'dstva' is < UTOP, then you are willing to receive a page of data. +// 'dstva' is the virtual address at which the sent page should be mapped. +// +// This function only returns on error, but the system call will eventually +// return 0 on success. +// Return < 0 on error. Errors are: +// -E_INVAL if dstva < UTOP but dstva is not page-aligned. +static int +sys_ipc_recv(void *dstva) +{ + // LAB 4: Your code here. + panic("sys_ipc_recv not implemented"); + return 0; +} + +// Dispatches to the correct kernel function, passing the arguments. +int32_t +syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) +{ + // Call the function corresponding to the 'syscallno' parameter. + // Return any appropriate return value. + // LAB 3: Your code here. + switch (syscallno) { + case SYS_cputs: + sys_cputs((const char*)a1, a2); + break; + case SYS_cgetc: + return sys_cgetc(); + case SYS_getenvid: + return sys_getenvid(); + case SYS_env_destroy: + return sys_env_destroy(a1); + case SYS_yield: + sys_yield(); + break; + case SYS_page_alloc: + return sys_page_alloc((envid_t)a1, (void * )a2, (int )a3); + case SYS_env_set_pgfault_upcall: + return sys_env_set_pgfault_upcall((envid_t) a1, (void *) a2); + case SYS_page_map: + return sys_page_map((envid_t) a1, (void *) a2, (envid_t) a3, (void *) a4, (int) a5); + + case SYS_page_unmap: + return sys_page_unmap((envid_t) a1, (void *) a2); + + case SYS_exofork: + return sys_exofork(); + + case SYS_env_set_status: + return sys_env_set_status((envid_t) a1, (int) a2); + case NSYSCALLS: + return -E_INVAL; + + default: + return -E_INVAL; + } + return 0; +} + diff --git a/lab/LAB4.si4project/Backup/syscall(2799).c b/lab/LAB4.si4project/Backup/syscall(2799).c new file mode 100644 index 0000000..406b1df --- /dev/null +++ b/lab/LAB4.si4project/Backup/syscall(2799).c @@ -0,0 +1,301 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Print a string to the system console. +// The string is exactly 'len' characters long. +// Destroys the environment on memory errors. +static void +sys_cputs(const char *s, size_t len) +{ + // Check that the user has permission to read memory [s, s+len). + // Destroy the environment if not. + + // LAB 3: Your code here. + user_mem_assert(curenv, (const void *) s, len, 0); + // Print the string supplied by the user. + cprintf("%.*s", len, s); +} + +// Read a character from the system console without blocking. +// Returns the character, or 0 if there is no input waiting. +static int +sys_cgetc(void) +{ + return cons_getc(); +} + +// Returns the current environment's envid. +static envid_t +sys_getenvid(void) +{ + return curenv->env_id; +} + +// Destroy a given environment (possibly the currently running environment). +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_destroy(envid_t envid) +{ + int r; + struct Env *e; + + if ((r = envid2env(envid, &e, 1)) < 0) + return r; + if (e == curenv) + cprintf("[%08x] exiting gracefully\n", curenv->env_id); + else + cprintf("[%08x] destroying %08x\n", curenv->env_id, e->env_id); + env_destroy(e); + return 0; +} + +// Deschedule current environment and pick a different one to run. +static void +sys_yield(void) +{ + sched_yield(); +} + +// Allocate a new environment. +// Returns envid of new environment, or < 0 on error. Errors are: +// -E_NO_FREE_ENV if no free environment is available. +// -E_NO_MEM on memory exhaustion. +static envid_t +sys_exofork(void) +{ + // Create the new environment with env_alloc(), from kern/env.c. + // It should be left as env_alloc created it, except that + // status is set to ENV_NOT_RUNNABLE, and the register set is copied + // from the current environment -- but tweaked so sys_exofork + // will appear to return 0. + + // LAB 4: Your code here. + panic("sys_exofork not implemented"); +} + +// Set envid's env_status to status, which must be ENV_RUNNABLE +// or ENV_NOT_RUNNABLE. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if status is not a valid status for an environment. +static int +sys_env_set_status(envid_t envid, int status) +{ + // Hint: Use the 'envid2env' function from kern/env.c to translate an + // envid to a struct Env. + // You should set envid2env's third argument to 1, which will + // check whether the current environment has permission to set + // envid's status. + + // LAB 4: Your code here. + panic("sys_env_set_status not implemented"); +} + +// Set the page fault upcall for 'envid' by modifying the corresponding struct +// Env's 'env_pgfault_upcall' field. When 'envid' causes a page fault, the +// kernel will push a fault record onto the exception stack, then branch to +// 'func'. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_set_pgfault_upcall(envid_t envid, void *func) +{ + // LAB 4: Your code here. + panic("sys_env_set_pgfault_upcall not implemented"); +} + +// Allocate a page of memory and map it at 'va' with permission +// 'perm' in the address space of 'envid'. +// The page's contents are set to 0. +// If a page is already mapped at 'va', that page is unmapped as a +// side effect. +// +// perm -- PTE_U | PTE_P must be set, PTE_AVAIL | PTE_W may or may not be set, +// but no other bits may be set. See PTE_SYSCALL in inc/mmu.h. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +// -E_INVAL if perm is inappropriate (see above). +// -E_NO_MEM if there's no memory to allocate the new page, +// or to allocate any necessary page tables. +static int +sys_page_alloc(envid_t envid, void *va, int perm) +{ + // Hint: This function is a wrapper around page_alloc() and + // page_insert() from kern/pmap.c. + // Most of the new code you write should be to check the + // parameters for correctness. + // If page_insert() fails, remember to free the page you + // allocated! + + // LAB 4: Your code here. + panic("sys_page_alloc not implemented"); +} + +// Map the page of memory at 'srcva' in srcenvid's address space +// at 'dstva' in dstenvid's address space with permission 'perm'. +// Perm has the same restrictions as in sys_page_alloc, except +// that it also must not grant write access to a read-only +// page. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if srcenvid and/or dstenvid doesn't currently exist, +// or the caller doesn't have permission to change one of them. +// -E_INVAL if srcva >= UTOP or srcva is not page-aligned, +// or dstva >= UTOP or dstva is not page-aligned. +// -E_INVAL is srcva is not mapped in srcenvid's address space. +// -E_INVAL if perm is inappropriate (see sys_page_alloc). +// -E_INVAL if (perm & PTE_W), but srcva is read-only in srcenvid's +// address space. +// -E_NO_MEM if there's no memory to allocate any necessary page tables. +static int +sys_page_map(envid_t srcenvid, void *srcva, + envid_t dstenvid, void *dstva, int perm) +{ + // Hint: This function is a wrapper around page_lookup() and + // page_insert() from kern/pmap.c. + // Again, most of the new code you write should be to check the + // parameters for correctness. + // Use the third argument to page_lookup() to + // check the current permissions on the page. + + // LAB 4: Your code here. + panic("sys_page_map not implemented"); +} + +// Unmap the page of memory at 'va' in the address space of 'envid'. +// If no page is mapped, the function silently succeeds. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +static int +sys_page_unmap(envid_t envid, void *va) +{ + // Hint: This function is a wrapper around page_remove(). + + // LAB 4: Your code here. + panic("sys_page_unmap not implemented"); +} + +// Try to send 'value' to the target env 'envid'. +// If srcva < UTOP, then also send page currently mapped at 'srcva', +// so that receiver gets a duplicate mapping of the same page. +// +// The send fails with a return value of -E_IPC_NOT_RECV if the +// target is not blocked, waiting for an IPC. +// +// The send also can fail for the other reasons listed below. +// +// Otherwise, the send succeeds, and the target's ipc fields are +// updated as follows: +// env_ipc_recving is set to 0 to block future sends; +// env_ipc_from is set to the sending envid; +// env_ipc_value is set to the 'value' parameter; +// env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise. +// The target environment is marked runnable again, returning 0 +// from the paused sys_ipc_recv system call. (Hint: does the +// sys_ipc_recv function ever actually return?) +// +// If the sender wants to send a page but the receiver isn't asking for one, +// then no page mapping is transferred, but no error occurs. +// The ipc only happens when no errors occur. +// +// Returns 0 on success, < 0 on error. +// Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist. +// (No need to check permissions.) +// -E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv, +// or another environment managed to send first. +// -E_INVAL if srcva < UTOP but srcva is not page-aligned. +// -E_INVAL if srcva < UTOP and perm is inappropriate +// (see sys_page_alloc). +// -E_INVAL if srcva < UTOP but srcva is not mapped in the caller's +// address space. +// -E_INVAL if (perm & PTE_W), but srcva is read-only in the +// current environment's address space. +// -E_NO_MEM if there's not enough memory to map srcva in envid's +// address space. +static int +sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm) +{ + // LAB 4: Your code here. + panic("sys_ipc_try_send not implemented"); +} + +// Block until a value is ready. Record that you want to receive +// using the env_ipc_recving and env_ipc_dstva fields of struct Env, +// mark yourself not runnable, and then give up the CPU. +// +// If 'dstva' is < UTOP, then you are willing to receive a page of data. +// 'dstva' is the virtual address at which the sent page should be mapped. +// +// This function only returns on error, but the system call will eventually +// return 0 on success. +// Return < 0 on error. Errors are: +// -E_INVAL if dstva < UTOP but dstva is not page-aligned. +static int +sys_ipc_recv(void *dstva) +{ + // LAB 4: Your code here. + panic("sys_ipc_recv not implemented"); + return 0; +} + +// Dispatches to the correct kernel function, passing the arguments. +int32_t +syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) +{ + // Call the function corresponding to the 'syscallno' parameter. + // Return any appropriate return value. + // LAB 3: Your code here. + + + // panic("syscall not implemented"); + + int ret = 0; + switch (syscallno) { + case SYS_cputs: + sys_cputs((const char*)a1, a2); + break; + case SYS_cgetc: + ret = sys_cgetc(); + + break; + case SYS_getenvid: + ret = sys_getenvid(); + break; + case SYS_env_destroy: + sys_env_destroy(a1); + break; + case NSYSCALLS: + return -E_INVAL; + + default: + return -E_INVAL; + } + + return ret; +} + diff --git a/lab/LAB4.si4project/Backup/syscall(5045).h b/lab/LAB4.si4project/Backup/syscall(5045).h new file mode 100644 index 0000000..71b3512 --- /dev/null +++ b/lab/LAB4.si4project/Backup/syscall(5045).h @@ -0,0 +1,22 @@ +#ifndef JOS_INC_SYSCALL_H +#define JOS_INC_SYSCALL_H + +/* system call numbers */ +enum { + SYS_cputs = 0, + SYS_cgetc, + SYS_getenvid, + SYS_env_destroy, + SYS_page_alloc, + SYS_page_map, + SYS_page_unmap, + SYS_exofork, + SYS_env_set_status, + SYS_env_set_pgfault_upcall, + SYS_yield, + SYS_ipc_try_send, + SYS_ipc_recv, + NSYSCALLS +}; + +#endif /* !JOS_INC_SYSCALL_H */ diff --git a/lab/LAB4.si4project/Backup/syscall(7459).c b/lab/LAB4.si4project/Backup/syscall(7459).c new file mode 100644 index 0000000..4b2925a --- /dev/null +++ b/lab/LAB4.si4project/Backup/syscall(7459).c @@ -0,0 +1,384 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Print a string to the system console. +// The string is exactly 'len' characters long. +// Destroys the environment on memory errors. +static void +sys_cputs(const char *s, size_t len) +{ + // Check that the user has permission to read memory [s, s+len). + // Destroy the environment if not. + + // LAB 3: Your code here. + user_mem_assert(curenv, (const void *) s, len, 0); + // Print the string supplied by the user. + cprintf("%.*s", len, s); +} + +// Read a character from the system console without blocking. +// Returns the character, or 0 if there is no input waiting. +static int +sys_cgetc(void) +{ + return cons_getc(); +} + +// Returns the current environment's envid. +static envid_t +sys_getenvid(void) +{ + return curenv->env_id; +} + +// Destroy a given environment (possibly the currently running environment). +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_destroy(envid_t envid) +{ + int r; + struct Env *e; + + if ((r = envid2env(envid, &e, 1)) < 0) + return r; + if (e == curenv) + cprintf("[%08x] exiting gracefully\n", curenv->env_id); + else + cprintf("[%08x] destroying %08x\n", curenv->env_id, e->env_id); + env_destroy(e); + return 0; +} + +// Deschedule current environment and pick a different one to run. +static void +sys_yield(void) +{ + sched_yield(); +} + + +// Allocate a new environment. +// Returns envid of new environment, or < 0 on error. Errors are: +// -E_NO_FREE_ENV if no free environment is available. +// -E_NO_MEM on memory exhaustion. +static envid_t +sys_exofork(void) +{ + // Create the new environment with env_alloc(), from kern/env.c. + // It should be left as env_alloc created it, except that + // status is set to ENV_NOT_RUNNABLE, and the register set is copied + // from the current environment -- but tweaked so sys_exofork + // will appear to return 0. + // LAB 4: Your code here. + struct Env *newenv; + int32_t ret; + if ((ret = env_alloc(&newenv, sys_getenvid())) < 0) { + // 两个函数的返回值是一样的 + return ret; + } + newenv->env_status = ENV_NOT_RUNNABLE; + newenv->env_tf = curenv->env_tf; + // newenv的返回值为0, 实现子进程返回0值 + newenv->env_tf.tf_regs.reg_eax = 0; + + // 返回值存放在eax中 + return newenv->env_id; + + // panic("sys_exofork not implemented"); +} + +// Set envid's env_status to status, which must be ENV_RUNNABLE +// or ENV_NOT_RUNNABLE. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if status is not a valid status for an environment. +static int +sys_env_set_status(envid_t envid, int status) +{ + // Hint: Use the 'envid2env' function from kern/env.c to translate an + // envid to a struct Env. + // You should set envid2env's third argument to 1, which will + // check whether the current environment has permission to set + // envid's status. + + // LAB 4: Your code here. + struct Env *e; + if (envid2env(envid, &e, 1)) return -E_BAD_ENV; + + if (status != ENV_NOT_RUNNABLE && status != ENV_RUNNABLE) + return -E_INVAL; + + e->env_status = status; + return 0; +} + +// Set the page fault upcall for 'envid' by modifying the corresponding struct +// Env's 'env_pgfault_upcall' field. When 'envid' causes a page fault, the +// kernel will push a fault record onto the exception stack, then branch to +// 'func'. +// +// Returns 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +static int +sys_env_set_pgfault_upcall(envid_t envid, void *func) +{ + // LAB 4: Your code here. + struct Env *e; + if (envid2env(envid, &e, 1)) + return -E_BAD_ENV; + // cprintf("set pgfault upcall\n"); + e->env_pgfault_upcall = func; + return 0; + // panic("sys_env_set_pgfault_upcall not implemented"); +} + +// Allocate a page of memory and map it at 'va' with permission +// 'perm' in the address space of 'envid'. +// The page's contents are set to 0. +// If a page is already mapped at 'va', that page is unmapped as a +// side effect. +// +// perm -- PTE_U | PTE_P must be set, PTE_AVAIL | PTE_W may or may not be set, +// but no other bits may be set. See PTE_SYSCALL in inc/mmu.h. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +// -E_INVAL if perm is inappropriate (see above). +// -E_NO_MEM if there's no memory to allocate the new page, +// or to allocate any necessary page tables. +static int +sys_page_alloc(envid_t envid, void *va, int perm) +{ + // Hint: This function is a wrapper around page_alloc() and + // page_insert() from kern/pmap.c. + // Most of the new code you write should be to check the + // parameters for correctness. + // If page_insert() fails, remember to free the page you + // allocated! + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + + if((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + if ((perm & PTE_U) == 0 || (perm & PTE_P) == 0) + return -E_INVAL; + if (perm & ~PTE_SYSCALL) + return -E_INVAL; + + struct PageInfo *pp = page_alloc(ALLOC_ZERO); + if(!pp) + return -E_NO_MEM; + + if (page_insert(env->env_pgdir, pp, va, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_alloc not implemented"); +} + +// Map the page of memory at 'srcva' in srcenvid's address space +// at 'dstva' in dstenvid's address space with permission 'perm'. +// Perm has the same restrictions as in sys_page_alloc, except +// that it also must not grant write access to a read-only +// page. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if srcenvid and/or dstenvid doesn't currently exist, +// or the caller doesn't have permission to change one of them. +// -E_INVAL if srcva >= UTOP or srcva is not page-aligned, +// or dstva >= UTOP or dstva is not page-aligned. +// -E_INVAL is srcva is not mapped in srcenvid's address space. +// -E_INVAL if perm is inappropriate (see sys_page_alloc). +// -E_INVAL if (perm & PTE_W), but srcva is read-only in srcenvid's +// address space. +// -E_NO_MEM if there's no memory to allocate any necessary page tables. +static int +sys_page_map(envid_t srcenvid, void *srcva, + envid_t dstenvid, void *dstva, int perm) +{ + // Hint: This function is a wrapper around page_lookup() and + // page_insert() from kern/pmap.c. + // Again, most of the new code you write should be to check the + // parameters for correctness. + // Use the third argument to page_lookup() to + // check the current permissions on the page. + + // LAB 4: Your code here. + int ret = 0; + struct Env *srcenv, *dstenv; + struct PageInfo *srcpp, *dstpp; + pte_t *pte; + if ((envid2env(srcenvid, &srcenv, 1) < 0 )|| ( envid2env(dstenvid, &dstenv, 1) < 0)) + return -E_BAD_ENV; + if ((uintptr_t)srcva >= UTOP || PGOFF(srcva) || (uintptr_t)dstva >= UTOP || PGOFF(dstva)) + return -E_INVAL; + if ( (perm & PTE_U) == 0 || (perm & PTE_P) == 0 || (perm & ~PTE_SYSCALL)) + return -E_INVAL; + if (!(srcpp = page_lookup(srcenv->env_pgdir, srcva, &pte))) + return -E_INVAL; + if ((perm & PTE_W) && ((*pte & PTE_W) == 0)) + return -E_INVAL; + if (page_insert(dstenv->env_pgdir, srcpp, dstva, perm) < 0) + return -E_NO_MEM; + + return 0; + // panic("sys_page_map not implemented"); +} + +// Unmap the page of memory at 'va' in the address space of 'envid'. +// If no page is mapped, the function silently succeeds. +// +// Return 0 on success, < 0 on error. Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist, +// or the caller doesn't have permission to change envid. +// -E_INVAL if va >= UTOP, or va is not page-aligned. +static int +sys_page_unmap(envid_t envid, void *va) +{ + // Hint: This function is a wrapper around page_remove(). + + // LAB 4: Your code here. + int ret = 0; + struct Env *env; + + if ((ret = envid2env(envid, &env, 1)) < 0) + return -E_BAD_ENV; + if ((uintptr_t)va >= UTOP || PGOFF(va)) + return -E_INVAL; + page_remove(env->env_pgdir, va); + return 0; + // panic("sys_page_unmap not implemented"); +} + +// Try to send 'value' to the target env 'envid'. +// If srcva < UTOP, then also send page currently mapped at 'srcva', +// so that receiver gets a duplicate mapping of the same page. +// +// The send fails with a return value of -E_IPC_NOT_RECV if the +// target is not blocked, waiting for an IPC. +// +// The send also can fail for the other reasons listed below. +// +// Otherwise, the send succeeds, and the target's ipc fields are +// updated as follows: +// env_ipc_recving is set to 0 to block future sends; +// env_ipc_from is set to the sending envid; +// env_ipc_value is set to the 'value' parameter; +// env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise. +// The target environment is marked runnable again, returning 0 +// from the paused sys_ipc_recv system call. (Hint: does the +// sys_ipc_recv function ever actually return?) +// +// If the sender wants to send a page but the receiver isn't asking for one, +// then no page mapping is transferred, but no error occurs. +// The ipc only happens when no errors occur. +// +// Returns 0 on success, < 0 on error. +// Errors are: +// -E_BAD_ENV if environment envid doesn't currently exist. +// (No need to check permissions.) +// -E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv, +// or another environment managed to send first. +// -E_INVAL if srcva < UTOP but srcva is not page-aligned. +// -E_INVAL if srcva < UTOP and perm is inappropriate +// (see sys_page_alloc). +// -E_INVAL if srcva < UTOP but srcva is not mapped in the caller's +// address space. +// -E_INVAL if (perm & PTE_W), but srcva is read-only in the +// current environment's address space. +// -E_NO_MEM if there's not enough memory to map srcva in envid's +// address space. +static int +sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm) +{ + // LAB 4: Your code here. + panic("sys_ipc_try_send not implemented"); +} + +// Block until a value is ready. Record that you want to receive +// using the env_ipc_recving and env_ipc_dstva fields of struct Env, +// mark yourself not runnable, and then give up the CPU. +// +// If 'dstva' is < UTOP, then you are willing to receive a page of data. +// 'dstva' is the virtual address at which the sent page should be mapped. +// +// This function only returns on error, but the system call will eventually +// return 0 on success. +// Return < 0 on error. Errors are: +// -E_INVAL if dstva < UTOP but dstva is not page-aligned. +static int +sys_ipc_recv(void *dstva) +{ + // LAB 4: Your code here. + panic("sys_ipc_recv not implemented"); + return 0; +} + +// Dispatches to the correct kernel function, passing the arguments. +int32_t +syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) +{ + // Call the function corresponding to the 'syscallno' parameter. + // Return any appropriate return value. + // LAB 3: Your code here. + switch (syscallno) { + case SYS_cputs: + sys_cputs((const char*)a1, a2); + break; + case SYS_cgetc: + return sys_cgetc(); + case SYS_getenvid: + return sys_getenvid(); + case SYS_env_destroy: + return sys_env_destroy(a1); + case SYS_yield: + sys_yield(); + break; + case SYS_page_alloc: + return sys_page_alloc((envid_t)a1, (void * )a2, (int )a3); + case SYS_env_set_pgfault_upcall: + return sys_env_set_pgfault_upcall((envid_t) a1, (void *) a2); + case SYS_page_map: + return sys_page_map((envid_t) a1, (void *) a2, (envid_t) a3, (void *) a4, (int) a5); + + case SYS_page_unmap: + return sys_page_unmap((envid_t) a1, (void *) a2); + + case SYS_exofork: + return sys_exofork(); + + case SYS_env_set_status: + return sys_env_set_status((envid_t) a1, (int) a2); + case NSYSCALLS: + return -E_INVAL; + + default: + return -E_INVAL; + } + return 0; +} + diff --git a/lab/LAB4.si4project/Backup/trap(1475).c b/lab/LAB4.si4project/Backup/trap(1475).c new file mode 100644 index 0000000..b80f42b --- /dev/null +++ b/lab/LAB4.si4project/Backup/trap(1475).c @@ -0,0 +1,402 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct Taskstate ts; + +/* For debugging, so print_trapframe can distinguish between printing + * a saved trapframe and printing the current trapframe and print some + * additional information in the latter case. + */ +static struct Trapframe *last_tf; + +/* Interrupt descriptor table. (Must be built at run time because + * shifted function addresses can't be represented in relocation records.) + */ +struct Gatedesc idt[256] = { { 0 } }; +struct Pseudodesc idt_pd = { + sizeof(idt) - 1, (uint32_t) idt +}; + + +static const char *trapname(int trapno) +{ + static const char * const excnames[] = { + "Divide error", + "Debug", + "Non-Maskable Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode", + "Device Not Available", + "Double Fault", + "Coprocessor Segment Overrun", + "Invalid TSS", + "Segment Not Present", + "Stack Fault", + "General Protection", + "Page Fault", + "(unknown trap)", + "x87 FPU Floating-Point Error", + "Alignment Check", + "Machine-Check", + "SIMD Floating-Point Exception" + }; + + if (trapno < ARRAY_SIZE(excnames)) + return excnames[trapno]; + if (trapno == T_SYSCALL) + return "System call"; + if (trapno >= IRQ_OFFSET && trapno < IRQ_OFFSET + 16) + return "Hardware Interrupt"; + return "(unknown trap)"; +} + +// You will also need to modify trap_init() to initialize the idt to +// point to each of these entry points defined in trapentry.S; +// the SETGATE macro will be helpful here +void +trap_init(void) +{ + + extern struct Segdesc gdt[]; + void divide_handler(); + void debug_handler(); + void nmi_handler(); + void brkpt_handler(); + void oflow_handler(); + void bound_handler(); + void device_handler(); + void illop_handler(); + void tss_handler(); + void segnp_handler(); + void stack_handler(); + void gpflt_handler(); + void pgflt_handler(); + void fperr_handler(); + void align_handler(); + void mchk_handler(); + void simderr_handler(); + void syscall_handler(); + void dblflt_handler(); + + // LAB 3: Your code here. + // GD_KT 全局描述符, kernel text + SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_handler, 0); + SETGATE(idt[T_DEBUG], 0, GD_KT, debug_handler, 0); + SETGATE(idt[T_NMI], 0, GD_KT, nmi_handler, 0); + SETGATE(idt[T_BRKPT], 0, GD_KT, brkpt_handler, 3); + SETGATE(idt[T_OFLOW], 0, GD_KT, oflow_handler, 0); + SETGATE(idt[T_BOUND], 0, GD_KT, bound_handler, 0); + SETGATE(idt[T_DEVICE], 0, GD_KT, device_handler, 0); + SETGATE(idt[T_ILLOP], 0, GD_KT, illop_handler, 0); + SETGATE(idt[T_DBLFLT], 0, GD_KT, dblflt_handler, 0); + SETGATE(idt[T_TSS], 0, GD_KT, tss_handler, 0); + SETGATE(idt[T_SEGNP], 0, GD_KT, segnp_handler, 0); + SETGATE(idt[T_STACK], 0, GD_KT, stack_handler, 0); + SETGATE(idt[T_GPFLT], 0, GD_KT, gpflt_handler, 0); + SETGATE(idt[T_PGFLT], 0, GD_KT, pgflt_handler, 0); + SETGATE(idt[T_FPERR], 0, GD_KT, fperr_handler, 0); + SETGATE(idt[T_ALIGN], 0, GD_KT, align_handler, 0); + SETGATE(idt[T_MCHK], 0, GD_KT, mchk_handler, 0); + SETGATE(idt[T_SIMDERR], 0, GD_KT, simderr_handler, 0); + SETGATE(idt[T_SYSCALL], 0, GD_KT, syscall_handler, 3); + + // Per-CPU setup + trap_init_percpu(); +} + +// Initialize and load the per-CPU TSS and IDT +void +trap_init_percpu(void) +{ + // The example code here sets up the Task State Segment (TSS) and + // the TSS descriptor for CPU 0. But it is incorrect if we are + // running on other CPUs because each CPU has its own kernel stack. + // Fix the code so that it works for all CPUs. + // + // Hints: + // - The macro "thiscpu" always refers to the current CPU's + // struct CpuInfo; + // - The ID of the current CPU is given by cpunum() or + // thiscpu->cpu_id; + // - Use "thiscpu->cpu_ts" as the TSS for the current CPU, + // rather than the global "ts" variable; + // - Use gdt[(GD_TSS0 >> 3) + i] for CPU i's TSS descriptor; + // - You mapped the per-CPU kernel stacks in mem_init_mp() + // - Initialize cpu_ts.ts_iomb to prevent unauthorized environments + // from doing IO (0 is not the correct value!) + // + // ltr sets a 'busy' flag in the TSS selector, so if you + // accidentally load the same TSS on more than one CPU, you'll + // get a triple fault. If you set up an individual CPU's TSS + // wrong, you may not get a fault until you try to return from + // user space on that CPU. + // + // LAB 4: Your code here: + thiscpu->cpu_ts.ts_esp0 = KSTACKTOP - cpunum() * (KSTKGAP + KSTKSIZE); + thiscpu->cpu_ts.ts_ss0 = GD_KD; + + // Initialize the TSS slot of the gdt. + gdt[(GD_TSS0 >> 3) + cpunum()] = SEG16(STS_T32A, (uint32_t) (&thiscpu->cpu_ts), sizeof(struct Taskstate) - 1, 0); + gdt[(GD_TSS0 >> 3) + cpunum()].sd_s = 0; + + // Load the TSS selector (like other segment selectors, the + // bottom three bits are special; we leave them 0) + ltr(GD_TSS0 + sizeof(struct Segdesc) * cpunum()); + + // Load the IDT + lidt(&idt_pd); +} + +void +print_trapframe(struct Trapframe *tf) +{ + cprintf("TRAP frame at %p from CPU %d\n", tf, cpunum()); + print_regs(&tf->tf_regs); + cprintf(" es 0x----%04x\n", tf->tf_es); + cprintf(" ds 0x----%04x\n", tf->tf_ds); + cprintf(" trap 0x%08x %s\n", tf->tf_trapno, trapname(tf->tf_trapno)); + // If this trap was a page fault that just happened + // (so %cr2 is meaningful), print the faulting linear address. + if (tf == last_tf && tf->tf_trapno == T_PGFLT) + cprintf(" cr2 0x%08x\n", rcr2()); + cprintf(" err 0x%08x", tf->tf_err); + // For page faults, print decoded fault error code: + // U/K=fault occurred in user/kernel mode + // W/R=a write/read caused the fault + // PR=a protection violation caused the fault (NP=page not present). + if (tf->tf_trapno == T_PGFLT) + cprintf(" [%s, %s, %s]\n", + tf->tf_err & 4 ? "user" : "kernel", + tf->tf_err & 2 ? "write" : "read", + tf->tf_err & 1 ? "protection" : "not-present"); + else + cprintf("\n"); + cprintf(" eip 0x%08x\n", tf->tf_eip); + cprintf(" cs 0x----%04x\n", tf->tf_cs); + cprintf(" flag 0x%08x\n", tf->tf_eflags); + if ((tf->tf_cs & 3) != 0) { + cprintf(" esp 0x%08x\n", tf->tf_esp); + cprintf(" ss 0x----%04x\n", tf->tf_ss); + } +} + +void +print_regs(struct PushRegs *regs) +{ + cprintf(" edi 0x%08x\n", regs->reg_edi); + cprintf(" esi 0x%08x\n", regs->reg_esi); + cprintf(" ebp 0x%08x\n", regs->reg_ebp); + cprintf(" oesp 0x%08x\n", regs->reg_oesp); + cprintf(" ebx 0x%08x\n", regs->reg_ebx); + cprintf(" edx 0x%08x\n", regs->reg_edx); + cprintf(" ecx 0x%08x\n", regs->reg_ecx); + cprintf(" eax 0x%08x\n", regs->reg_eax); +} + +static void +trap_dispatch(struct Trapframe *tf) +{ + // Handle processor exceptions. + // LAB 3: Your code here. + switch(tf->tf_trapno) { + case T_PGFLT: + page_fault_handler(tf); + break; + case T_BRKPT: + monitor(tf); + break; + case T_SYSCALL: + + tf->tf_regs.reg_eax = syscall(tf->tf_regs.reg_eax, + tf->tf_regs.reg_edx, + tf->tf_regs.reg_ecx, + tf->tf_regs.reg_ebx, + tf->tf_regs.reg_edi, + tf->tf_regs.reg_esi); + break; + default: + // Unexpected trap: The user process or the kernel has a bug. + print_trapframe(tf); + if (tf->tf_cs == GD_KT) + panic("unhandled trap in kernel"); + else { + env_destroy(curenv); + return; + } + break; + + } + + // Handle clock interrupts. Don't forget to acknowledge the + // interrupt using lapic_eoi() before calling the scheduler! + // LAB 4: Your code here. + + +} + +void +trap(struct Trapframe *tf) +{ + // The environment may have set DF and some versions + // of GCC rely on DF being clear + asm volatile("cld" ::: "cc"); + + // Halt the CPU if some other CPU has called panic() + extern char *panicstr; + if (panicstr) + asm volatile("hlt"); + + // Re-acqurie the big kernel lock if we were halted in + // sched_yield() + if (xchg(&thiscpu->cpu_status, CPU_STARTED) == CPU_HALTED) + lock_kernel(); + // Check that interrupts are disabled. If this assertion + // fails, DO NOT be tempted to fix it by inserting a "cli" in + // the interrupt path. + assert(!(read_eflags() & FL_IF)); + + if ((tf->tf_cs & 3) == 3) { + // Trapped from user mode. + // Acquire the big kernel lock before doing any + // serious kernel work. + // LAB 4: Your code here. + lock_kernel(); + assert(curenv); + + // Garbage collect if current enviroment is a zombie + if (curenv->env_status == ENV_DYING) { + env_free(curenv); + curenv = NULL; + sched_yield(); + } + + // Copy trap frame (which is currently on the stack) + // into 'curenv->env_tf', so that running the environment + // will restart at the trap point. + curenv->env_tf = *tf; + // The trapframe on the stack should be ignored from here on. + tf = &curenv->env_tf; + } + + // Record that tf is the last real trapframe so + // print_trapframe can print some additional information. + last_tf = tf; + + // Dispatch based on what type of trap occurred + trap_dispatch(tf); + + // If we made it to this point, then no other environment was + // scheduled, so we should return to the current environment + // if doing so makes sense. + if (curenv && curenv->env_status == ENV_RUNNING) + env_run(curenv); + else + sched_yield(); +} + + +void +page_fault_handler(struct Trapframe *tf) +{ + uint32_t fault_va; + + // Read processor's CR2 register to find the faulting address + fault_va = rcr2(); + + // Handle kernel-mode page faults. + + // LAB 3: Your code here. + + // 怎么判断是内核模式, CPL位 + + if(tf->tf_cs && 3 == 0) { + panic("page_fault in kernel mode, fault address %d\n", fault_va); + } + + // We've already handled kernel-mode exceptions, so if we get here, + // the page fault happened in user mode. + + + // Call the environment's page fault upcall, if one exists. Set up a + // page fault stack frame on the user exception stack (below + // UXSTACKTOP), then branch to curenv->env_pgfault_upcall. + // + // The page fault upcall might cause another page fault, in which case + // we branch to the page fault upcall recursively, pushing another + // page fault stack frame on top of the user exception stack. + // + // It is convenient for our code which returns from a page fault + // (lib/pfentry.S) to have one word of scratch space at the top of the + // trap-time stack; it allows us to more easily restore the eip/esp. In + // the non-recursive case, we don't have to worry about this because + // the top of the regular user stack is free. In the recursive case, + // this means we have to leave an extra word between the current top of + // the exception stack and the new stack frame because the exception + // stack _is_ the trap-time stack. + // + // If there's no page fault upcall, the environment didn't allocate a + // page for its exception stack or can't write to it, or the exception + // stack overflows, then destroy the environment that caused the fault. + // Note that the grade script assumes you will first check for the page + // fault upcall and print the "user fault va" message below if there is + // none. The remaining three checks can be combined into a single test. + // + // Hints: + // user_mem_assert() and env_run() are useful here. + // To change what the user environment runs, modify 'curenv->env_tf' + // (the 'tf' variable points at 'curenv->env_tf'). + + // LAB 4: Your code here. + struct UTrapframe *utf; + // cprintf("I'M in page_fault_handler [%08x] user fault va %08x \n",curenv->env_id, fault_va); + if (curenv->env_pgfault_upcall) { + + if (tf->tf_esp >= UXSTACKTOP-PGSIZE && tf->tf_esp < UXSTACKTOP) { + // 异常模式下陷入 + utf = (struct UTrapframe *)(tf->tf_esp - sizeof(struct UTrapframe) - 4); + + } + else { + // 非异常模式下陷入 + utf = (struct UTrapframe *)(UXSTACKTOP - sizeof(struct UTrapframe)); + } + // 检查异常栈是否溢出 + user_mem_assert(curenv, (const void *) utf, sizeof(struct UTrapframe), PTE_P|PTE_W); + + utf->utf_fault_va = fault_va; + utf->utf_err = tf->tf_trapno; + utf->utf_regs = tf->tf_regs; + utf->utf_eflags = tf->tf_eflags; + // 保存陷入时现场,用于返回 + utf->utf_eip = tf->tf_eip; + utf->utf_esp = tf->tf_esp; + // 再次转向执行 + curenv->env_tf.tf_eip = (uint32_t) curenv->env_pgfault_upcall; + // 异常栈 + curenv->env_tf.tf_esp = (uint32_t) utf; + env_run(curenv); + } + else { + // Destroy the environment that caused the fault. + cprintf("[%08x] user fault va %08x ip %08x\n", + curenv->env_id, fault_va, tf->tf_eip); + print_trapframe(tf); + env_destroy(curenv); + } +} + diff --git a/lab/LAB4.si4project/Backup/trap(2812).c b/lab/LAB4.si4project/Backup/trap(2812).c new file mode 100644 index 0000000..d9a201f --- /dev/null +++ b/lab/LAB4.si4project/Backup/trap(2812).c @@ -0,0 +1,375 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct Taskstate ts; + +/* For debugging, so print_trapframe can distinguish between printing + * a saved trapframe and printing the current trapframe and print some + * additional information in the latter case. + */ +static struct Trapframe *last_tf; + +/* Interrupt descriptor table. (Must be built at run time because + * shifted function addresses can't be represented in relocation records.) + */ +struct Gatedesc idt[256] = { { 0 } }; +struct Pseudodesc idt_pd = { + sizeof(idt) - 1, (uint32_t) idt +}; + + +static const char *trapname(int trapno) +{ + static const char * const excnames[] = { + "Divide error", + "Debug", + "Non-Maskable Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode", + "Device Not Available", + "Double Fault", + "Coprocessor Segment Overrun", + "Invalid TSS", + "Segment Not Present", + "Stack Fault", + "General Protection", + "Page Fault", + "(unknown trap)", + "x87 FPU Floating-Point Error", + "Alignment Check", + "Machine-Check", + "SIMD Floating-Point Exception" + }; + + if (trapno < ARRAY_SIZE(excnames)) + return excnames[trapno]; + if (trapno == T_SYSCALL) + return "System call"; + if (trapno >= IRQ_OFFSET && trapno < IRQ_OFFSET + 16) + return "Hardware Interrupt"; + return "(unknown trap)"; +} + +// You will also need to modify trap_init() to initialize the idt to +// point to each of these entry points defined in trapentry.S; +// the SETGATE macro will be helpful here +void +trap_init(void) +{ + + extern struct Segdesc gdt[]; + void divide_handler(); + void debug_handler(); + void nmi_handler(); + void brkpt_handler(); + void oflow_handler(); + void bound_handler(); + void device_handler(); + void illop_handler(); + void tss_handler(); + void segnp_handler(); + void stack_handler(); + void gpflt_handler(); + void pgflt_handler(); + void fperr_handler(); + void align_handler(); + void mchk_handler(); + void simderr_handler(); + void syscall_handler(); + void dblflt_handler(); + + // LAB 3: Your code here. + // GD_KT 全局描述符, kernel text + SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_handler, 0); + SETGATE(idt[T_DEBUG], 0, GD_KT, debug_handler, 0); + SETGATE(idt[T_NMI], 0, GD_KT, nmi_handler, 0); + SETGATE(idt[T_BRKPT], 0, GD_KT, brkpt_handler, 3); + SETGATE(idt[T_OFLOW], 0, GD_KT, oflow_handler, 0); + SETGATE(idt[T_BOUND], 0, GD_KT, bound_handler, 0); + SETGATE(idt[T_DEVICE], 0, GD_KT, device_handler, 0); + SETGATE(idt[T_ILLOP], 0, GD_KT, illop_handler, 0); + SETGATE(idt[T_DBLFLT], 0, GD_KT, dblflt_handler, 0); + SETGATE(idt[T_TSS], 0, GD_KT, tss_handler, 0); + SETGATE(idt[T_SEGNP], 0, GD_KT, segnp_handler, 0); + SETGATE(idt[T_STACK], 0, GD_KT, stack_handler, 0); + SETGATE(idt[T_GPFLT], 0, GD_KT, gpflt_handler, 0); + SETGATE(idt[T_PGFLT], 0, GD_KT, pgflt_handler, 0); + SETGATE(idt[T_FPERR], 0, GD_KT, fperr_handler, 0); + SETGATE(idt[T_ALIGN], 0, GD_KT, align_handler, 0); + SETGATE(idt[T_MCHK], 0, GD_KT, mchk_handler, 0); + SETGATE(idt[T_SIMDERR], 0, GD_KT, simderr_handler, 0); + SETGATE(idt[T_SYSCALL], 0, GD_KT, syscall_handler, 3); + + // Per-CPU setup + trap_init_percpu(); +} + +// Initialize and load the per-CPU TSS and IDT +void +trap_init_percpu(void) +{ + // The example code here sets up the Task State Segment (TSS) and + // the TSS descriptor for CPU 0. But it is incorrect if we are + // running on other CPUs because each CPU has its own kernel stack. + // Fix the code so that it works for all CPUs. + // + // Hints: + // - The macro "thiscpu" always refers to the current CPU's + // struct CpuInfo; + // - The ID of the current CPU is given by cpunum() or + // thiscpu->cpu_id; + // - Use "thiscpu->cpu_ts" as the TSS for the current CPU, + // rather than the global "ts" variable; + // - Use gdt[(GD_TSS0 >> 3) + i] for CPU i's TSS descriptor; + // - You mapped the per-CPU kernel stacks in mem_init_mp() + // - Initialize cpu_ts.ts_iomb to prevent unauthorized environments + // from doing IO (0 is not the correct value!) + // + // ltr sets a 'busy' flag in the TSS selector, so if you + // accidentally load the same TSS on more than one CPU, you'll + // get a triple fault. If you set up an individual CPU's TSS + // wrong, you may not get a fault until you try to return from + // user space on that CPU. + // + // LAB 4: Your code here: + thiscpu->cpu_ts.ts_esp0 = KSTACKTOP - cpunum() * (KSTKGAP + KSTKSIZE); + thiscpu->cpu_ts.ts_ss0 = GD_KD; + + // Initialize the TSS slot of the gdt. + gdt[(GD_TSS0 >> 3) + cpunum()] = SEG16(STS_T32A, (uint32_t) (&thiscpu->cpu_ts), sizeof(struct Taskstate) - 1, 0); + gdt[(GD_TSS0 >> 3) + cpunum()].sd_s = 0; + + // Load the TSS selector (like other segment selectors, the + // bottom three bits are special; we leave them 0) + ltr(GD_TSS0 + sizeof(struct Segdesc) * cpunum()); + + // Load the IDT + lidt(&idt_pd); +} + +void +print_trapframe(struct Trapframe *tf) +{ + cprintf("TRAP frame at %p from CPU %d\n", tf, cpunum()); + print_regs(&tf->tf_regs); + cprintf(" es 0x----%04x\n", tf->tf_es); + cprintf(" ds 0x----%04x\n", tf->tf_ds); + cprintf(" trap 0x%08x %s\n", tf->tf_trapno, trapname(tf->tf_trapno)); + // If this trap was a page fault that just happened + // (so %cr2 is meaningful), print the faulting linear address. + if (tf == last_tf && tf->tf_trapno == T_PGFLT) + cprintf(" cr2 0x%08x\n", rcr2()); + cprintf(" err 0x%08x", tf->tf_err); + // For page faults, print decoded fault error code: + // U/K=fault occurred in user/kernel mode + // W/R=a write/read caused the fault + // PR=a protection violation caused the fault (NP=page not present). + if (tf->tf_trapno == T_PGFLT) + cprintf(" [%s, %s, %s]\n", + tf->tf_err & 4 ? "user" : "kernel", + tf->tf_err & 2 ? "write" : "read", + tf->tf_err & 1 ? "protection" : "not-present"); + else + cprintf("\n"); + cprintf(" eip 0x%08x\n", tf->tf_eip); + cprintf(" cs 0x----%04x\n", tf->tf_cs); + cprintf(" flag 0x%08x\n", tf->tf_eflags); + if ((tf->tf_cs & 3) != 0) { + cprintf(" esp 0x%08x\n", tf->tf_esp); + cprintf(" ss 0x----%04x\n", tf->tf_ss); + } +} + +void +print_regs(struct PushRegs *regs) +{ + cprintf(" edi 0x%08x\n", regs->reg_edi); + cprintf(" esi 0x%08x\n", regs->reg_esi); + cprintf(" ebp 0x%08x\n", regs->reg_ebp); + cprintf(" oesp 0x%08x\n", regs->reg_oesp); + cprintf(" ebx 0x%08x\n", regs->reg_ebx); + cprintf(" edx 0x%08x\n", regs->reg_edx); + cprintf(" ecx 0x%08x\n", regs->reg_ecx); + cprintf(" eax 0x%08x\n", regs->reg_eax); +} + +static void +trap_dispatch(struct Trapframe *tf) +{ + // Handle processor exceptions. + // LAB 3: Your code here. + switch(tf->tf_trapno) { + case T_PGFLT: + page_fault_handler(tf); + break; + case T_BRKPT: + monitor(tf); + break; + case T_SYSCALL: + + tf->tf_regs.reg_eax = syscall(tf->tf_regs.reg_eax, + tf->tf_regs.reg_edx, + tf->tf_regs.reg_ecx, + tf->tf_regs.reg_ebx, + tf->tf_regs.reg_edi, + tf->tf_regs.reg_esi); + break; + default: + // Unexpected trap: The user process or the kernel has a bug. + print_trapframe(tf); + if (tf->tf_cs == GD_KT) + panic("unhandled trap in kernel"); + else { + env_destroy(curenv); + return; + } + break; + + } + + // Handle clock interrupts. Don't forget to acknowledge the + // interrupt using lapic_eoi() before calling the scheduler! + // LAB 4: Your code here. + + +} + +void +trap(struct Trapframe *tf) +{ + // The environment may have set DF and some versions + // of GCC rely on DF being clear + asm volatile("cld" ::: "cc"); + + // Halt the CPU if some other CPU has called panic() + extern char *panicstr; + if (panicstr) + asm volatile("hlt"); + + // Re-acqurie the big kernel lock if we were halted in + // sched_yield() + if (xchg(&thiscpu->cpu_status, CPU_STARTED) == CPU_HALTED) + lock_kernel(); + // Check that interrupts are disabled. If this assertion + // fails, DO NOT be tempted to fix it by inserting a "cli" in + // the interrupt path. + assert(!(read_eflags() & FL_IF)); + + if ((tf->tf_cs & 3) == 3) { + // Trapped from user mode. + // Acquire the big kernel lock before doing any + // serious kernel work. + // LAB 4: Your code here. + lock_kernel(); + assert(curenv); + + // Garbage collect if current enviroment is a zombie + if (curenv->env_status == ENV_DYING) { + env_free(curenv); + curenv = NULL; + sched_yield(); + } + + // Copy trap frame (which is currently on the stack) + // into 'curenv->env_tf', so that running the environment + // will restart at the trap point. + curenv->env_tf = *tf; + // The trapframe on the stack should be ignored from here on. + tf = &curenv->env_tf; + } + + // Record that tf is the last real trapframe so + // print_trapframe can print some additional information. + last_tf = tf; + + // Dispatch based on what type of trap occurred + trap_dispatch(tf); + + // If we made it to this point, then no other environment was + // scheduled, so we should return to the current environment + // if doing so makes sense. + if (curenv && curenv->env_status == ENV_RUNNING) + env_run(curenv); + else + sched_yield(); +} + + +void +page_fault_handler(struct Trapframe *tf) +{ + uint32_t fault_va; + + // Read processor's CR2 register to find the faulting address + fault_va = rcr2(); + + // Handle kernel-mode page faults. + + // LAB 3: Your code here. + + // 怎么判断是内核模式, CPL位 + + if(tf->tf_cs && 3 == 0) { + panic("page_fault in kernel mode, fault address %d\n", fault_va); + } + + // We've already handled kernel-mode exceptions, so if we get here, + // the page fault happened in user mode. + + + // Call the environment's page fault upcall, if one exists. Set up a + // page fault stack frame on the user exception stack (below + // UXSTACKTOP), then branch to curenv->env_pgfault_upcall. + // + // The page fault upcall might cause another page fault, in which case + // we branch to the page fault upcall recursively, pushing another + // page fault stack frame on top of the user exception stack. + // + // It is convenient for our code which returns from a page fault + // (lib/pfentry.S) to have one word of scratch space at the top of the + // trap-time stack; it allows us to more easily restore the eip/esp. In + // the non-recursive case, we don't have to worry about this because + // the top of the regular user stack is free. In the recursive case, + // this means we have to leave an extra word between the current top of + // the exception stack and the new stack frame because the exception + // stack _is_ the trap-time stack. + // + // If there's no page fault upcall, the environment didn't allocate a + // page for its exception stack or can't write to it, or the exception + // stack overflows, then destroy the environment that caused the fault. + // Note that the grade script assumes you will first check for the page + // fault upcall and print the "user fault va" message below if there is + // none. The remaining three checks can be combined into a single test. + // + // Hints: + // user_mem_assert() and env_run() are useful here. + // To change what the user environment runs, modify 'curenv->env_tf' + // (the 'tf' variable points at 'curenv->env_tf'). + + // LAB 4: Your code here. + + + // user_mem_assert(curenv, (const void *) fault_va, PGSIZE, 0); + + // Destroy the environment that caused the fault. + cprintf("[%08x] user fault va %08x ip %08x\n", + curenv->env_id, fault_va, tf->tf_eip); + print_trapframe(tf); + env_destroy(curenv); +} + diff --git a/lab/LAB4.si4project/Backup/trap(359).c b/lab/LAB4.si4project/Backup/trap(359).c new file mode 100644 index 0000000..2621500 --- /dev/null +++ b/lab/LAB4.si4project/Backup/trap(359).c @@ -0,0 +1,401 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct Taskstate ts; + +/* For debugging, so print_trapframe can distinguish between printing + * a saved trapframe and printing the current trapframe and print some + * additional information in the latter case. + */ +static struct Trapframe *last_tf; + +/* Interrupt descriptor table. (Must be built at run time because + * shifted function addresses can't be represented in relocation records.) + */ +struct Gatedesc idt[256] = { { 0 } }; +struct Pseudodesc idt_pd = { + sizeof(idt) - 1, (uint32_t) idt +}; + + +static const char *trapname(int trapno) +{ + static const char * const excnames[] = { + "Divide error", + "Debug", + "Non-Maskable Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode", + "Device Not Available", + "Double Fault", + "Coprocessor Segment Overrun", + "Invalid TSS", + "Segment Not Present", + "Stack Fault", + "General Protection", + "Page Fault", + "(unknown trap)", + "x87 FPU Floating-Point Error", + "Alignment Check", + "Machine-Check", + "SIMD Floating-Point Exception" + }; + + if (trapno < ARRAY_SIZE(excnames)) + return excnames[trapno]; + if (trapno == T_SYSCALL) + return "System call"; + if (trapno >= IRQ_OFFSET && trapno < IRQ_OFFSET + 16) + return "Hardware Interrupt"; + return "(unknown trap)"; +} + +// You will also need to modify trap_init() to initialize the idt to +// point to each of these entry points defined in trapentry.S; +// the SETGATE macro will be helpful here +void +trap_init(void) +{ + + extern struct Segdesc gdt[]; + void divide_handler(); + void debug_handler(); + void nmi_handler(); + void brkpt_handler(); + void oflow_handler(); + void bound_handler(); + void device_handler(); + void illop_handler(); + void tss_handler(); + void segnp_handler(); + void stack_handler(); + void gpflt_handler(); + void pgflt_handler(); + void fperr_handler(); + void align_handler(); + void mchk_handler(); + void simderr_handler(); + void syscall_handler(); + void dblflt_handler(); + + // LAB 3: Your code here. + // GD_KT 全局描述符, kernel text + SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_handler, 0); + SETGATE(idt[T_DEBUG], 0, GD_KT, debug_handler, 0); + SETGATE(idt[T_NMI], 0, GD_KT, nmi_handler, 0); + SETGATE(idt[T_BRKPT], 0, GD_KT, brkpt_handler, 3); + SETGATE(idt[T_OFLOW], 0, GD_KT, oflow_handler, 0); + SETGATE(idt[T_BOUND], 0, GD_KT, bound_handler, 0); + SETGATE(idt[T_DEVICE], 0, GD_KT, device_handler, 0); + SETGATE(idt[T_ILLOP], 0, GD_KT, illop_handler, 0); + SETGATE(idt[T_DBLFLT], 0, GD_KT, dblflt_handler, 0); + SETGATE(idt[T_TSS], 0, GD_KT, tss_handler, 0); + SETGATE(idt[T_SEGNP], 0, GD_KT, segnp_handler, 0); + SETGATE(idt[T_STACK], 0, GD_KT, stack_handler, 0); + SETGATE(idt[T_GPFLT], 0, GD_KT, gpflt_handler, 0); + SETGATE(idt[T_PGFLT], 0, GD_KT, pgflt_handler, 0); + SETGATE(idt[T_FPERR], 0, GD_KT, fperr_handler, 0); + SETGATE(idt[T_ALIGN], 0, GD_KT, align_handler, 0); + SETGATE(idt[T_MCHK], 0, GD_KT, mchk_handler, 0); + SETGATE(idt[T_SIMDERR], 0, GD_KT, simderr_handler, 0); + SETGATE(idt[T_SYSCALL], 0, GD_KT, syscall_handler, 3); + + // Per-CPU setup + trap_init_percpu(); +} + +// Initialize and load the per-CPU TSS and IDT +void +trap_init_percpu(void) +{ + // The example code here sets up the Task State Segment (TSS) and + // the TSS descriptor for CPU 0. But it is incorrect if we are + // running on other CPUs because each CPU has its own kernel stack. + // Fix the code so that it works for all CPUs. + // + // Hints: + // - The macro "thiscpu" always refers to the current CPU's + // struct CpuInfo; + // - The ID of the current CPU is given by cpunum() or + // thiscpu->cpu_id; + // - Use "thiscpu->cpu_ts" as the TSS for the current CPU, + // rather than the global "ts" variable; + // - Use gdt[(GD_TSS0 >> 3) + i] for CPU i's TSS descriptor; + // - You mapped the per-CPU kernel stacks in mem_init_mp() + // - Initialize cpu_ts.ts_iomb to prevent unauthorized environments + // from doing IO (0 is not the correct value!) + // + // ltr sets a 'busy' flag in the TSS selector, so if you + // accidentally load the same TSS on more than one CPU, you'll + // get a triple fault. If you set up an individual CPU's TSS + // wrong, you may not get a fault until you try to return from + // user space on that CPU. + // + // LAB 4: Your code here: + thiscpu->cpu_ts.ts_esp0 = KSTACKTOP - cpunum() * (KSTKGAP + KSTKSIZE); + thiscpu->cpu_ts.ts_ss0 = GD_KD; + + // Initialize the TSS slot of the gdt. + gdt[(GD_TSS0 >> 3) + cpunum()] = SEG16(STS_T32A, (uint32_t) (&thiscpu->cpu_ts), sizeof(struct Taskstate) - 1, 0); + gdt[(GD_TSS0 >> 3) + cpunum()].sd_s = 0; + + // Load the TSS selector (like other segment selectors, the + // bottom three bits are special; we leave them 0) + ltr(GD_TSS0 + sizeof(struct Segdesc) * cpunum()); + + // Load the IDT + lidt(&idt_pd); +} + +void +print_trapframe(struct Trapframe *tf) +{ + cprintf("TRAP frame at %p from CPU %d\n", tf, cpunum()); + print_regs(&tf->tf_regs); + cprintf(" es 0x----%04x\n", tf->tf_es); + cprintf(" ds 0x----%04x\n", tf->tf_ds); + cprintf(" trap 0x%08x %s\n", tf->tf_trapno, trapname(tf->tf_trapno)); + // If this trap was a page fault that just happened + // (so %cr2 is meaningful), print the faulting linear address. + if (tf == last_tf && tf->tf_trapno == T_PGFLT) + cprintf(" cr2 0x%08x\n", rcr2()); + cprintf(" err 0x%08x", tf->tf_err); + // For page faults, print decoded fault error code: + // U/K=fault occurred in user/kernel mode + // W/R=a write/read caused the fault + // PR=a protection violation caused the fault (NP=page not present). + if (tf->tf_trapno == T_PGFLT) + cprintf(" [%s, %s, %s]\n", + tf->tf_err & 4 ? "user" : "kernel", + tf->tf_err & 2 ? "write" : "read", + tf->tf_err & 1 ? "protection" : "not-present"); + else + cprintf("\n"); + cprintf(" eip 0x%08x\n", tf->tf_eip); + cprintf(" cs 0x----%04x\n", tf->tf_cs); + cprintf(" flag 0x%08x\n", tf->tf_eflags); + if ((tf->tf_cs & 3) != 0) { + cprintf(" esp 0x%08x\n", tf->tf_esp); + cprintf(" ss 0x----%04x\n", tf->tf_ss); + } +} + +void +print_regs(struct PushRegs *regs) +{ + cprintf(" edi 0x%08x\n", regs->reg_edi); + cprintf(" esi 0x%08x\n", regs->reg_esi); + cprintf(" ebp 0x%08x\n", regs->reg_ebp); + cprintf(" oesp 0x%08x\n", regs->reg_oesp); + cprintf(" ebx 0x%08x\n", regs->reg_ebx); + cprintf(" edx 0x%08x\n", regs->reg_edx); + cprintf(" ecx 0x%08x\n", regs->reg_ecx); + cprintf(" eax 0x%08x\n", regs->reg_eax); +} + +static void +trap_dispatch(struct Trapframe *tf) +{ + // Handle processor exceptions. + // LAB 3: Your code here. + switch(tf->tf_trapno) { + case T_PGFLT: + page_fault_handler(tf); + break; + case T_BRKPT: + monitor(tf); + break; + case T_SYSCALL: + + tf->tf_regs.reg_eax = syscall(tf->tf_regs.reg_eax, + tf->tf_regs.reg_edx, + tf->tf_regs.reg_ecx, + tf->tf_regs.reg_ebx, + tf->tf_regs.reg_edi, + tf->tf_regs.reg_esi); + break; + default: + // Unexpected trap: The user process or the kernel has a bug. + print_trapframe(tf); + if (tf->tf_cs == GD_KT) + panic("unhandled trap in kernel"); + else { + env_destroy(curenv); + return; + } + break; + + } + + // Handle clock interrupts. Don't forget to acknowledge the + // interrupt using lapic_eoi() before calling the scheduler! + // LAB 4: Your code here. + + +} + +void +trap(struct Trapframe *tf) +{ + // The environment may have set DF and some versions + // of GCC rely on DF being clear + asm volatile("cld" ::: "cc"); + + // Halt the CPU if some other CPU has called panic() + extern char *panicstr; + if (panicstr) + asm volatile("hlt"); + + // Re-acqurie the big kernel lock if we were halted in + // sched_yield() + if (xchg(&thiscpu->cpu_status, CPU_STARTED) == CPU_HALTED) + lock_kernel(); + // Check that interrupts are disabled. If this assertion + // fails, DO NOT be tempted to fix it by inserting a "cli" in + // the interrupt path. + assert(!(read_eflags() & FL_IF)); + + if ((tf->tf_cs & 3) == 3) { + // Trapped from user mode. + // Acquire the big kernel lock before doing any + // serious kernel work. + // LAB 4: Your code here. + lock_kernel(); + assert(curenv); + + // Garbage collect if current enviroment is a zombie + if (curenv->env_status == ENV_DYING) { + env_free(curenv); + curenv = NULL; + sched_yield(); + } + + // Copy trap frame (which is currently on the stack) + // into 'curenv->env_tf', so that running the environment + // will restart at the trap point. + curenv->env_tf = *tf; + // The trapframe on the stack should be ignored from here on. + tf = &curenv->env_tf; + } + + // Record that tf is the last real trapframe so + // print_trapframe can print some additional information. + last_tf = tf; + + // Dispatch based on what type of trap occurred + trap_dispatch(tf); + + // If we made it to this point, then no other environment was + // scheduled, so we should return to the current environment + // if doing so makes sense. + if (curenv && curenv->env_status == ENV_RUNNING) + env_run(curenv); + else + sched_yield(); +} + + +void +page_fault_handler(struct Trapframe *tf) +{ + uint32_t fault_va; + + // Read processor's CR2 register to find the faulting address + fault_va = rcr2(); + + // Handle kernel-mode page faults. + + // LAB 3: Your code here. + + // 怎么判断是内核模式, CPL位 + + if(tf->tf_cs && 3 == 0) { + panic("page_fault in kernel mode, fault address %d\n", fault_va); + } + + // We've already handled kernel-mode exceptions, so if we get here, + // the page fault happened in user mode. + + + // Call the environment's page fault upcall, if one exists. Set up a + // page fault stack frame on the user exception stack (below + // UXSTACKTOP), then branch to curenv->env_pgfault_upcall. + // + // The page fault upcall might cause another page fault, in which case + // we branch to the page fault upcall recursively, pushing another + // page fault stack frame on top of the user exception stack. + // + // It is convenient for our code which returns from a page fault + // (lib/pfentry.S) to have one word of scratch space at the top of the + // trap-time stack; it allows us to more easily restore the eip/esp. In + // the non-recursive case, we don't have to worry about this because + // the top of the regular user stack is free. In the recursive case, + // this means we have to leave an extra word between the current top of + // the exception stack and the new stack frame because the exception + // stack _is_ the trap-time stack. + // + // If there's no page fault upcall, the environment didn't allocate a + // page for its exception stack or can't write to it, or the exception + // stack overflows, then destroy the environment that caused the fault. + // Note that the grade script assumes you will first check for the page + // fault upcall and print the "user fault va" message below if there is + // none. The remaining three checks can be combined into a single test. + // + // Hints: + // user_mem_assert() and env_run() are useful here. + // To change what the user environment runs, modify 'curenv->env_tf' + // (the 'tf' variable points at 'curenv->env_tf'). + + // LAB 4: Your code here. + struct UTrapframe *utf; + + if (curenv->env_pgfault_upcall) { + + if (tf->tf_esp >= UXSTACKTOP-PGSIZE && tf->tf_esp < UXSTACKTOP) { + // 异常模式下陷入 + utf = (struct UTrapframe *)(tf->tf_esp - sizeof(struct UTrapframe) - 4); + + } + else { + // 非异常模式下陷入 + utf = (struct UTrapframe *)(UXSTACKTOP - sizeof(struct UTrapframe) - 4); + } + // 检查异常栈是否溢出 + user_mem_assert(curenv, (const void *) utf, sizeof(struct UTrapframe), PTE_U|PTE_W); + + utf->utf_fault_va = fault_va; + utf->utf_err = tf->tf_trapno; + utf->utf_regs = tf->tf_regs; + utf->utf_eflags = tf->tf_eflags; + // 保存上次陷入时现场,用于返回 + utf->utf_eip = tf->tf_eip; + utf->utf_esp = tf->tf_esp; + // 再次转向执行 + tf->tf_eip = (uint32_t) curenv->env_pgfault_upcall; + tf->tf_esp = (uint32_t) utf; + env_run(curenv); + } + + + // Destroy the environment that caused the fault. + cprintf("[%08x] user fault va %08x ip %08x\n", + curenv->env_id, fault_va, tf->tf_eip); + print_trapframe(tf); + env_destroy(curenv); +} + diff --git a/lab/LAB4.si4project/Backup/trap(6309).c b/lab/LAB4.si4project/Backup/trap(6309).c new file mode 100644 index 0000000..e814e98 --- /dev/null +++ b/lab/LAB4.si4project/Backup/trap(6309).c @@ -0,0 +1,384 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct Taskstate ts; + +/* For debugging, so print_trapframe can distinguish between printing + * a saved trapframe and printing the current trapframe and print some + * additional information in the latter case. + */ +static struct Trapframe *last_tf; + +/* Interrupt descriptor table. (Must be built at run time because + * shifted function addresses can't be represented in relocation records.) + */ +struct Gatedesc idt[256] = { { 0 } }; +struct Pseudodesc idt_pd = { + sizeof(idt) - 1, (uint32_t) idt +}; + + +static const char *trapname(int trapno) +{ + static const char * const excnames[] = { + "Divide error", + "Debug", + "Non-Maskable Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode", + "Device Not Available", + "Double Fault", + "Coprocessor Segment Overrun", + "Invalid TSS", + "Segment Not Present", + "Stack Fault", + "General Protection", + "Page Fault", + "(unknown trap)", + "x87 FPU Floating-Point Error", + "Alignment Check", + "Machine-Check", + "SIMD Floating-Point Exception" + }; + + if (trapno < ARRAY_SIZE(excnames)) + return excnames[trapno]; + if (trapno == T_SYSCALL) + return "System call"; + if (trapno >= IRQ_OFFSET && trapno < IRQ_OFFSET + 16) + return "Hardware Interrupt"; + return "(unknown trap)"; +} + +// You will also need to modify trap_init() to initialize the idt to +// point to each of these entry points defined in trapentry.S; +// the SETGATE macro will be helpful here +void +trap_init(void) +{ + + extern struct Segdesc gdt[]; + void divide_handler(); + void debug_handler(); + void nmi_handler(); + void brkpt_handler(); + void oflow_handler(); + void bound_handler(); + void device_handler(); + void illop_handler(); + void tss_handler(); + void segnp_handler(); + void stack_handler(); + void gpflt_handler(); + void pgflt_handler(); + void fperr_handler(); + void align_handler(); + void mchk_handler(); + void simderr_handler(); + void syscall_handler(); + void dblflt_handler(); + + // LAB 3: Your code here. + // GD_KT 全局描述符, kernel text + SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_handler, 0); + SETGATE(idt[T_DEBUG], 0, GD_KT, debug_handler, 0); + SETGATE(idt[T_NMI], 0, GD_KT, nmi_handler, 0); + SETGATE(idt[T_BRKPT], 0, GD_KT, brkpt_handler, 3); + SETGATE(idt[T_OFLOW], 0, GD_KT, oflow_handler, 0); + SETGATE(idt[T_BOUND], 0, GD_KT, bound_handler, 0); + SETGATE(idt[T_DEVICE], 0, GD_KT, device_handler, 0); + SETGATE(idt[T_ILLOP], 0, GD_KT, illop_handler, 0); + SETGATE(idt[T_DBLFLT], 0, GD_KT, dblflt_handler, 0); + SETGATE(idt[T_TSS], 0, GD_KT, tss_handler, 0); + SETGATE(idt[T_SEGNP], 0, GD_KT, segnp_handler, 0); + SETGATE(idt[T_STACK], 0, GD_KT, stack_handler, 0); + SETGATE(idt[T_GPFLT], 0, GD_KT, gpflt_handler, 0); + SETGATE(idt[T_PGFLT], 0, GD_KT, pgflt_handler, 0); + SETGATE(idt[T_FPERR], 0, GD_KT, fperr_handler, 0); + SETGATE(idt[T_ALIGN], 0, GD_KT, align_handler, 0); + SETGATE(idt[T_MCHK], 0, GD_KT, mchk_handler, 0); + SETGATE(idt[T_SIMDERR], 0, GD_KT, simderr_handler, 0); + SETGATE(idt[T_SYSCALL], 0, GD_KT, syscall_handler, 3); + + // Per-CPU setup + trap_init_percpu(); +} + +// Initialize and load the per-CPU TSS and IDT +void +trap_init_percpu(void) +{ + // The example code here sets up the Task State Segment (TSS) and + // the TSS descriptor for CPU 0. But it is incorrect if we are + // running on other CPUs because each CPU has its own kernel stack. + // Fix the code so that it works for all CPUs. + // + // Hints: + // - The macro "thiscpu" always refers to the current CPU's + // struct CpuInfo; + // - The ID of the current CPU is given by cpunum() or + // thiscpu->cpu_id; + // - Use "thiscpu->cpu_ts" as the TSS for the current CPU, + // rather than the global "ts" variable; + // - Use gdt[(GD_TSS0 >> 3) + i] for CPU i's TSS descriptor; + // - You mapped the per-CPU kernel stacks in mem_init_mp() + // - Initialize cpu_ts.ts_iomb to prevent unauthorized environments + // from doing IO (0 is not the correct value!) + // + // ltr sets a 'busy' flag in the TSS selector, so if you + // accidentally load the same TSS on more than one CPU, you'll + // get a triple fault. If you set up an individual CPU's TSS + // wrong, you may not get a fault until you try to return from + // user space on that CPU. + // + // LAB 4: Your code here: + thiscpu->cpu_ts.ts_esp0 = KSTACKTOP - cpunum() * (KSTKGAP + KSTKSIZE); + thiscpu->cpu_ts.ts_ss0 = GD_KD; + + // Initialize the TSS slot of the gdt. + gdt[(GD_TSS0 >> 3) + cpunum()] = SEG16(STS_T32A, (uint32_t) (&thiscpu->cpu_ts), sizeof(struct Taskstate) - 1, 0); + gdt[(GD_TSS0 >> 3) + cpunum()].sd_s = 0; + + // Load the TSS selector (like other segment selectors, the + // bottom three bits are special; we leave them 0) + ltr(GD_TSS0 + sizeof(struct Segdesc) * cpunum()); + + // Load the IDT + lidt(&idt_pd); +} + +void +print_trapframe(struct Trapframe *tf) +{ + cprintf("TRAP frame at %p from CPU %d\n", tf, cpunum()); + print_regs(&tf->tf_regs); + cprintf(" es 0x----%04x\n", tf->tf_es); + cprintf(" ds 0x----%04x\n", tf->tf_ds); + cprintf(" trap 0x%08x %s\n", tf->tf_trapno, trapname(tf->tf_trapno)); + // If this trap was a page fault that just happened + // (so %cr2 is meaningful), print the faulting linear address. + if (tf == last_tf && tf->tf_trapno == T_PGFLT) + cprintf(" cr2 0x%08x\n", rcr2()); + cprintf(" err 0x%08x", tf->tf_err); + // For page faults, print decoded fault error code: + // U/K=fault occurred in user/kernel mode + // W/R=a write/read caused the fault + // PR=a protection violation caused the fault (NP=page not present). + if (tf->tf_trapno == T_PGFLT) + cprintf(" [%s, %s, %s]\n", + tf->tf_err & 4 ? "user" : "kernel", + tf->tf_err & 2 ? "write" : "read", + tf->tf_err & 1 ? "protection" : "not-present"); + else + cprintf("\n"); + cprintf(" eip 0x%08x\n", tf->tf_eip); + cprintf(" cs 0x----%04x\n", tf->tf_cs); + cprintf(" flag 0x%08x\n", tf->tf_eflags); + if ((tf->tf_cs & 3) != 0) { + cprintf(" esp 0x%08x\n", tf->tf_esp); + cprintf(" ss 0x----%04x\n", tf->tf_ss); + } +} + +void +print_regs(struct PushRegs *regs) +{ + cprintf(" edi 0x%08x\n", regs->reg_edi); + cprintf(" esi 0x%08x\n", regs->reg_esi); + cprintf(" ebp 0x%08x\n", regs->reg_ebp); + cprintf(" oesp 0x%08x\n", regs->reg_oesp); + cprintf(" ebx 0x%08x\n", regs->reg_ebx); + cprintf(" edx 0x%08x\n", regs->reg_edx); + cprintf(" ecx 0x%08x\n", regs->reg_ecx); + cprintf(" eax 0x%08x\n", regs->reg_eax); +} + +static void +trap_dispatch(struct Trapframe *tf) +{ + // Handle processor exceptions. + // LAB 3: Your code here. + switch(tf->tf_trapno) { + case T_PGFLT: + page_fault_handler(tf); + break; + case T_BRKPT: + monitor(tf); + break; + case T_SYSCALL: + + tf->tf_regs.reg_eax = syscall(tf->tf_regs.reg_eax, + tf->tf_regs.reg_edx, + tf->tf_regs.reg_ecx, + tf->tf_regs.reg_ebx, + tf->tf_regs.reg_edi, + tf->tf_regs.reg_esi); + break; + default: + // Unexpected trap: The user process or the kernel has a bug. + print_trapframe(tf); + if (tf->tf_cs == GD_KT) + panic("unhandled trap in kernel"); + else { + env_destroy(curenv); + return; + } + break; + + } + + // Handle clock interrupts. Don't forget to acknowledge the + // interrupt using lapic_eoi() before calling the scheduler! + // LAB 4: Your code here. + + // Unexpected trap: The user process or the kernel has a bug. + print_trapframe(tf); + if (tf->tf_cs == GD_KT) + panic("unhandled trap in kernel"); + else { + env_destroy(curenv); + return; + + } + +} + +void +trap(struct Trapframe *tf) +{ + // The environment may have set DF and some versions + // of GCC rely on DF being clear + asm volatile("cld" ::: "cc"); + + // Halt the CPU if some other CPU has called panic() + extern char *panicstr; + if (panicstr) + asm volatile("hlt"); + + // Re-acqurie the big kernel lock if we were halted in + // sched_yield() + if (xchg(&thiscpu->cpu_status, CPU_STARTED) == CPU_HALTED) + lock_kernel(); + // Check that interrupts are disabled. If this assertion + // fails, DO NOT be tempted to fix it by inserting a "cli" in + // the interrupt path. + assert(!(read_eflags() & FL_IF)); + + if ((tf->tf_cs & 3) == 3) { + // Trapped from user mode. + // Acquire the big kernel lock before doing any + // serious kernel work. + // LAB 4: Your code here. + lock_kernel(); + assert(curenv); + + // Garbage collect if current enviroment is a zombie + if (curenv->env_status == ENV_DYING) { + env_free(curenv); + curenv = NULL; + sched_yield(); + } + + // Copy trap frame (which is currently on the stack) + // into 'curenv->env_tf', so that running the environment + // will restart at the trap point. + curenv->env_tf = *tf; + // The trapframe on the stack should be ignored from here on. + tf = &curenv->env_tf; + } + + // Record that tf is the last real trapframe so + // print_trapframe can print some additional information. + last_tf = tf; + + // Dispatch based on what type of trap occurred + trap_dispatch(tf); + + // If we made it to this point, then no other environment was + // scheduled, so we should return to the current environment + // if doing so makes sense. + if (curenv && curenv->env_status == ENV_RUNNING) + env_run(curenv); + else + sched_yield(); +} + + +void +page_fault_handler(struct Trapframe *tf) +{ + uint32_t fault_va; + + // Read processor's CR2 register to find the faulting address + fault_va = rcr2(); + + // Handle kernel-mode page faults. + + // LAB 3: Your code here. + + // 怎么判断是内核模式, CPL位 + + if(tf->tf_cs && 3 == 0) { + panic("page_fault in kernel mode, fault address %d\n", fault_va); + } + + // We've already handled kernel-mode exceptions, so if we get here, + // the page fault happened in user mode. + + + // Call the environment's page fault upcall, if one exists. Set up a + // page fault stack frame on the user exception stack (below + // UXSTACKTOP), then branch to curenv->env_pgfault_upcall. + // + // The page fault upcall might cause another page fault, in which case + // we branch to the page fault upcall recursively, pushing another + // page fault stack frame on top of the user exception stack. + // + // It is convenient for our code which returns from a page fault + // (lib/pfentry.S) to have one word of scratch space at the top of the + // trap-time stack; it allows us to more easily restore the eip/esp. In + // the non-recursive case, we don't have to worry about this because + // the top of the regular user stack is free. In the recursive case, + // this means we have to leave an extra word between the current top of + // the exception stack and the new stack frame because the exception + // stack _is_ the trap-time stack. + // + // If there's no page fault upcall, the environment didn't allocate a + // page for its exception stack or can't write to it, or the exception + // stack overflows, then destroy the environment that caused the fault. + // Note that the grade script assumes you will first check for the page + // fault upcall and print the "user fault va" message below if there is + // none. The remaining three checks can be combined into a single test. + // + // Hints: + // user_mem_assert() and env_run() are useful here. + // To change what the user environment runs, modify 'curenv->env_tf' + // (the 'tf' variable points at 'curenv->env_tf'). + + // LAB 4: Your code here. + + + // user_mem_assert(curenv, (const void *) fault_va, PGSIZE, 0); + + // Destroy the environment that caused the fault. + cprintf("[%08x] user fault va %08x ip %08x\n", + curenv->env_id, fault_va, tf->tf_eip); + print_trapframe(tf); + env_destroy(curenv); +} + diff --git a/lab/LAB4.si4project/Backup/trapentry(2731).S b/lab/LAB4.si4project/Backup/trapentry(2731).S new file mode 100644 index 0000000..7487913 --- /dev/null +++ b/lab/LAB4.si4project/Backup/trapentry(2731).S @@ -0,0 +1,100 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include + +#include + + +################################################################### +# exceptions/interrupts +################################################################### + +/* TRAPHANDLER defines a globally-visible function for handling a trap. + * It pushes a trap number onto the stack, then jumps to _alltraps. + * Use TRAPHANDLER for traps where the CPU automatically pushes an error code. + * + * You shouldn't call a TRAPHANDLER function from C, but you may + * need to _declare_ one in C (for instance, to get a function pointer + * during IDT setup). You can declare the function with + * void NAME(); + * where NAME is the argument passed to TRAPHANDLER. + */ +#define TRAPHANDLER(name, num) \ + .globl name; /* define global symbol for 'name' */ \ + .type name, @function; /* symbol type is function */ \ + .align 2; /* align function definition */ \ + name: /* function starts here */ \ + pushl $(num); \ + jmp _alltraps + +/* Use TRAPHANDLER_NOEC for traps where the CPU doesn't push an error code. + * It pushes a 0 in place of the error code, so the trap frame has the same + * format in either case. + + * tarp handler no error code + */ + +#define TRAPHANDLER_NOEC(name, num) \ + .globl name; \ + .type name, @function; \ + .align 2; \ + name: \ + pushl $0; \ + pushl $(num); \ + jmp _alltraps + +.text + +/* + * 我们知道哪些trap是有错误代码的? https://wiki.osdev.org/Exceptions + * Lab 3: Your code here for generating entry points for the different traps. + */ +TRAPHANDLER_NOEC(divide_handler, T_DIVIDE); +TRAPHANDLER_NOEC(debug_handler, T_DEBUG); +TRAPHANDLER_NOEC(nmi_handler, T_NMI); +TRAPHANDLER_NOEC(brkpt_handler, T_BRKPT); +TRAPHANDLER_NOEC(oflow_handler, T_OFLOW); +TRAPHANDLER_NOEC(bound_handler, T_BOUND); +TRAPHANDLER_NOEC(illop_handler, T_ILLOP); +TRAPHANDLER_NOEC(device_handler, T_DEVICE); +TRAPHANDLER(dblflt_handler, T_DBLFLT); +TRAPHANDLER(tss_handler, T_TSS); +TRAPHANDLER(segnp_handler, T_SEGNP); +TRAPHANDLER(stack_handler, T_STACK); +TRAPHANDLER(gpflt_handler, T_GPFLT); +TRAPHANDLER(pgflt_handler, T_PGFLT); +TRAPHANDLER_NOEC(fperr_handler, T_FPERR); +TRAPHANDLER(align_handler, T_ALIGN); +TRAPHANDLER_NOEC(mchk_handler, T_MCHK); +TRAPHANDLER_NOEC(simderr_handler, T_SIMDERR); +TRAPHANDLER_NOEC(syscall_handler, T_SYSCALL); + +/* +Your _alltraps should: + 1. push values to make the stack look like a struct Trapframe + 2. load GD_KD into %ds and %es + 3. pushl %esp to pass a pointer to the Trapframe as an argument to trap() + 4. call trap (can trap ever return?) +*/ + +/* + * Lab 3: Your code here for _alltraps + *what is padding ? 填充 pushl %ds;小端模式,是指数据的高字节保存在内存的高地址中 + */ +.globl _alltraps +_alltraps: + + pushl %ds; + pushl %es; + pushal; + + movw $GD_KD, %ax; + movw %ax, %ds; + movw %ax, %es; + + /*push esp, trap 能自己读esp, 我有点觉得是赋值*/ + pushl %esp; + call trap + \ No newline at end of file diff --git a/lab/LAB4.si4project/Backup/trapentry(7165).S b/lab/LAB4.si4project/Backup/trapentry(7165).S new file mode 100644 index 0000000..7487913 --- /dev/null +++ b/lab/LAB4.si4project/Backup/trapentry(7165).S @@ -0,0 +1,100 @@ +/* See COPYRIGHT for copyright information. */ + +#include +#include +#include + +#include + + +################################################################### +# exceptions/interrupts +################################################################### + +/* TRAPHANDLER defines a globally-visible function for handling a trap. + * It pushes a trap number onto the stack, then jumps to _alltraps. + * Use TRAPHANDLER for traps where the CPU automatically pushes an error code. + * + * You shouldn't call a TRAPHANDLER function from C, but you may + * need to _declare_ one in C (for instance, to get a function pointer + * during IDT setup). You can declare the function with + * void NAME(); + * where NAME is the argument passed to TRAPHANDLER. + */ +#define TRAPHANDLER(name, num) \ + .globl name; /* define global symbol for 'name' */ \ + .type name, @function; /* symbol type is function */ \ + .align 2; /* align function definition */ \ + name: /* function starts here */ \ + pushl $(num); \ + jmp _alltraps + +/* Use TRAPHANDLER_NOEC for traps where the CPU doesn't push an error code. + * It pushes a 0 in place of the error code, so the trap frame has the same + * format in either case. + + * tarp handler no error code + */ + +#define TRAPHANDLER_NOEC(name, num) \ + .globl name; \ + .type name, @function; \ + .align 2; \ + name: \ + pushl $0; \ + pushl $(num); \ + jmp _alltraps + +.text + +/* + * 我们知道哪些trap是有错误代码的? https://wiki.osdev.org/Exceptions + * Lab 3: Your code here for generating entry points for the different traps. + */ +TRAPHANDLER_NOEC(divide_handler, T_DIVIDE); +TRAPHANDLER_NOEC(debug_handler, T_DEBUG); +TRAPHANDLER_NOEC(nmi_handler, T_NMI); +TRAPHANDLER_NOEC(brkpt_handler, T_BRKPT); +TRAPHANDLER_NOEC(oflow_handler, T_OFLOW); +TRAPHANDLER_NOEC(bound_handler, T_BOUND); +TRAPHANDLER_NOEC(illop_handler, T_ILLOP); +TRAPHANDLER_NOEC(device_handler, T_DEVICE); +TRAPHANDLER(dblflt_handler, T_DBLFLT); +TRAPHANDLER(tss_handler, T_TSS); +TRAPHANDLER(segnp_handler, T_SEGNP); +TRAPHANDLER(stack_handler, T_STACK); +TRAPHANDLER(gpflt_handler, T_GPFLT); +TRAPHANDLER(pgflt_handler, T_PGFLT); +TRAPHANDLER_NOEC(fperr_handler, T_FPERR); +TRAPHANDLER(align_handler, T_ALIGN); +TRAPHANDLER_NOEC(mchk_handler, T_MCHK); +TRAPHANDLER_NOEC(simderr_handler, T_SIMDERR); +TRAPHANDLER_NOEC(syscall_handler, T_SYSCALL); + +/* +Your _alltraps should: + 1. push values to make the stack look like a struct Trapframe + 2. load GD_KD into %ds and %es + 3. pushl %esp to pass a pointer to the Trapframe as an argument to trap() + 4. call trap (can trap ever return?) +*/ + +/* + * Lab 3: Your code here for _alltraps + *what is padding ? 填充 pushl %ds;小端模式,是指数据的高字节保存在内存的高地址中 + */ +.globl _alltraps +_alltraps: + + pushl %ds; + pushl %es; + pushal; + + movw $GD_KD, %ax; + movw %ax, %ds; + movw %ax, %es; + + /*push esp, trap 能自己读esp, 我有点觉得是赋值*/ + pushl %esp; + call trap + \ No newline at end of file diff --git a/lab/LAB4.si4project/LAB4.SearchResults b/lab/LAB4.si4project/LAB4.SearchResults new file mode 100644 index 0000000..d4dfec4 --- /dev/null +++ b/lab/LAB4.si4project/LAB4.SearchResults @@ -0,0 +1,4 @@ +---- sched_halt Matches (3 in 1 files) ---- +sched.c (kern) line 8 : void sched_halt(void); +sched_yield in sched.c (kern) : sched_halt(); +sched.c (kern) line 56 : sched_halt(void) diff --git a/lab/LAB4.si4project/LAB4.bookmarks.xml b/lab/LAB4.si4project/LAB4.bookmarks.xml new file mode 100644 index 0000000..c8b9cb1 --- /dev/null +++ b/lab/LAB4.si4project/LAB4.bookmarks.xml @@ -0,0 +1,7 @@ + + + + diff --git a/lab/LAB4.si4project/LAB4.sip_sym b/lab/LAB4.si4project/LAB4.sip_sym new file mode 100644 index 0000000000000000000000000000000000000000..7d59ad9faa902f7fb5cb6ea2f2e37421d320fc92 GIT binary patch literal 224252 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.sip_xab b/lab/LAB4.si4project/LAB4.sip_xab new file mode 100644 index 0000000000000000000000000000000000000000..c0212123830c016f15fa27d4479deb0d5fa600df GIT binary patch literal 49152 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 IrlGz49|gBNW&i*H literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.sip_xc b/lab/LAB4.si4project/LAB4.sip_xc new file mode 100644 index 0000000000000000000000000000000000000000..1656324e1f0be4c3907352db3883b150799c2daf GIT binary patch literal 186720 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.sip_xf b/lab/LAB4.si4project/LAB4.sip_xf new file mode 100644 index 0000000000000000000000000000000000000000..09e8462cac1c466af94444449317c1091cf526cd GIT binary patch literal 186720 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.sip_xm b/lab/LAB4.si4project/LAB4.sip_xm new file mode 100644 index 0000000000000000000000000000000000000000..2b014e02cabeaa8c66cd26d4e70ad43adcc1edc4 GIT binary patch literal 368 zcmWl|hc-e1007V@J2H|;DGebbGb@oTSy7_@|Br6>oI4T(!Id?yy)ov#i^i>c>!?dE zJ7&Uh?>z9{2OoX%*%uqW+VstLKRoo)VZUs-;*k?3O}T2?jFTQa5Vq=+Yi7-PV#T}# vzx{FDqHQ-k^~`fO-Lm75zjiIT?X(eR{PV(Dcf54YT|@r6=e%X3F4(gV3-}OQ literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.sip_xr b/lab/LAB4.si4project/LAB4.sip_xr new file mode 100644 index 0000000000000000000000000000000000000000..0eb429b4f69d3a403a704ece3ada5ea6e3507b88 GIT binary patch literal 186720 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 Sjq5NE#~Oss92I#%J{a literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.siproj_settings.xml b/lab/LAB4.si4project/LAB4.siproj_settings.xml new file mode 100644 index 0000000..ca84b35 --- /dev/null +++ b/lab/LAB4.si4project/LAB4.siproj_settings.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/lab/LAB4.si4project/LAB4.siwork b/lab/LAB4.si4project/LAB4.siwork new file mode 100644 index 0000000000000000000000000000000000000000..9e1dd082823106844aa15cc3a3beeb5c09bf25c1 GIT binary patch literal 104457 zcmeHw4Rlq-x%Q?Y9(Do-sx=nWAgBQ$=9dI)C4m6Zi--_4Vl+89IU$Gq9di;0{vh=S zqN1XrhWbafz2;l?YiVmW+IqFW#@qIm_S&!MwYBM8_p{ih1{B(~w(>pC?3r`soE(yq z6W6!8HuJ8$d1uc%GkfNpefBf&?Afy?dMvBlvL>AdwhRdilrE{f?2__DSw*=;m5tt- zs!&UNtIr=|IJa_j$+G;cP#{0p+Oo;-YZJ#Vv)hR6Zw%B_27%Qy z0>%Qy0xq|}?aN@~UBx?uz!Cr7kat7o^FypJNiB=(gG zscS6jAKNYK$Y#s>5{AMPcUe{@3d?|=Bjb87Nk1>kS2~tm3ugISA$c4C^IVM2MEpGP zMF{IqXMb zTyPU2P?7np3`p0hW7_7`Z9*NTKN&`t4xjT5==E~$yuz|xy4JE%k2!X%LfJVO>t0xg z^r+YXj#YX;I${aAerRoiQm&Qq3Mtn~xn9b0DX*0BDk-m)vI3I*e~pwI zq`X$jN-3|C@_H$&AP*G|+BNdnCuOaaektpu+$d!|Wail^o`95_AS=2D>;|cCl(LEO z=$~dOTciw1d4rU#kcJYsKtGbs!i|QuU54s*^e+rP4OMS&aJf5KeorlD~yz_BU05Ijq!sJ?7gO7RP4 zq;Tv?;`2ApmMJODk@KIrQZQh~;&@6Y>K1@GXT&jBs0R@8|)&bP7c96#!$bd(%Z>cqISz|6;SrcTtI38v)OQzw;=aU758MBQvKo&;MQ zqv}N69B>+#<5r!hn+vAoSXL*-oeQSq_*N&zoe!qum{%vp%?7g_90%(}T?TkEm}6s| zs5=Kt9mmT$QC9>$4a_mLPSo*wA#q%-ldj{KRwq>^{XdR#b)t^fJg*6keRZPlvta5t z9@a_E7du8)`KBTR{Yssv<8{V9qOYkFb)4sAH2qJVbRB(Aov14TpADv8suOiQA0>TN zofxNVP5)IV>K213>C@`OIQ||eZ;7K@DRtY9qdOh?eQ|Uwa}t=oqE0-IDwF=BPSmlU z>?8V=I#HJ^Bj{)9L>;d&5`9mdc+Xu6W?e{Wxaami;M`;PBV#8{c3}0al=_<{i~H^j zq?rp|1TF(_0CWDHQ{Fql?clxO=fJOke+vE`_yh1sDDQOeJn%)}%fL5+cY&V-KMQ^s zd^@-bd;_>1d=cs5Qz%&$Dlb5-Cx72xets4`Vxo(hO%EIj)KDu&oB60?&;AWH={>Kv^BTYOaqBNn!nZtt-l*Ao&$0HiobYwcP=b>7GXu@O%C@aRe<-WoDargd z7I2pZ67@4zEYDtM{7iTCy=hGZQ;03qFv!DT&OMhx9(d^LFW(PbxdQ`$kLEv_`i=9P z@Qm@|N`t?(xzgXf*}w{{Y{-okNEBC=<>wa~Tyf(SaALQK?j)H`r0}yKv;TZ?|>dpQ8^F#OQ$hN69Mo$rLd&P1T39VY>Bf#yJ)o8OReY-IkQ zm=;JB;BpJ{OAWxCnAgaO&}tpvUMs|8@lDgB0IqCnG{Dg&I*1)8n3aK|2QpJ^SwT-xmU_PKCd9>$hM1{#Pz^!aMxVS(3&r z?ne-;^EbD(Zp~V+*Vu%O1>9kQL~*NdnVC>@M~|CU9M1x3LNUF6rac6v&qE^aRNOEe zx2RK-h84e?Y1jXDW)!yd;J6;;#Nt-}g@ZO11byfEX#%(YfzB9wPH5YLmzn*Dt zzyB=ZZ;3?s$JY+jc`AU7L!IwMou_NlpuN9o(C%xD;3V^?^Q0qB2UwNI<^CPNnQ8Y< zJ8UzZp0*e9R?iHvNQAE!@I{SI#O?p|hax{0lW=9epm2aQret--UYzYfhto2?Q?LwN z0YolaG88U_rH2a`9;k+z5B9Pb4%&H;lW!joEBUug^H{xi_Mi0-CQBLqoF7V1(i5aD zHJd60X!D=HG0Pija!NG+jRo9cfkXj&Wp0jHap{gOH?2611r(4T1Yq}q^$F6BKm9XZ+oFGiJ{e>kf%}yt7`~jFY2@4Q#6mIpsJk##qGu@-( z)@yNai+RGh^?kTw&qo%d&?W2p9-PAa&J+tN#YyBpbsi6}u?YF}^9;es>Nr{2vj2-9nIo`L3;t@fqjz%U~j;y_#eKvN4(m{@S!RwK}kEBH7zY| zl}+A2vq5aflIFkLERZ;0ugG`ffW>Y7Y1)r(5Wya1;WpsfRGupt^i)meyhqza_( z1UpC0{~;XrfR&?JjcDRlXV#$2eNqlISpv6mfOTu`c}n0G!v*8TEq!vdu@+}CWGvt= z3nY$Pr3Sa$)%B(|F&0p`)dSq>`(`w5Rkw_cTj|J?3D%4Byofk(EN*pQJZR5H!k1f) zy~8&jzK>k}f8Qr?i{bo_1-F`l=G6ziH%!<~7DybomggCN%S}CR+7fF4g1FmIt_vKCTL<$7?RiMpKIbEWTNzj@Gv)oQVrxl;H(&3RGQN32 zP8OQ?_4NKQVfR>I47inRaLYaYZdx+j0t&b4pU1;9;Ej%32kS@nx9WjeWxzVU)H0Oe ziGy1Q&L6Zhk+AE%zX{xW3Hv}lwbSvp7=HUYr<9~|OUx5C1$`~eb%BlM8JFHCChQIi zB#v7p2DjYN<)#(Kv4Fy@qKjwQnZPa`w>)?wAzn81eCr_6mx1*(oj9%l$NF2la|dmH zE8yg-h6HZy#HS73o#x;c!*6^nxYg*z-d+Z@^bRp$*H|EN+*+Jt{4LjXyJ<*_1qe6_ zw=yr9Wp^x?9QDb#;yCk!%oD~fVBOm9MlYo7L|pbg&O%CJS2faeUB>=pgEl{Q^VJ<6 z2;AyKA#Y?oE}m~O{KJn0w|v2N^Qiz>*^nD8kT`A?8r*W@1z_3~wt&K|p2AsnIizIuPH@wfC2aZxzY`*vPV;R*iY+9Fr(B<-S0*)$~y3lN*g+(ty< zR(C#jKz@8ml)tq-=0!5*;fF@KL&+h&5vGwUPx)dMi)Pt}t~w+zjY;{L+0Fv&ynM#r zL|pilF9IAlCm~a#DpZfeo=2QF=~y_^?Zy@=*?5~ST>>gkhEInIVj9KXddDdgA0L(R zYAY3`D|E7nJnH<^sd}h}bg|OkbDT;}bdo#JxPIwq;@vZ05M_@^c{zFIJYZ#TP#_M( zCN8+2maA&0;yYQ?OU{li{M7AMaAwggyW;j4_%4F;;$7HQrHEktmX5?>#LE64tG(`pgk9IN7j2{ z;IbI@*>Ts?Vqp%$UM2*MbKtTy=c9WQ%nd-8n^hZa`Q=9$B5>?D=m;XZsn~s4>(A_{1@|) z5^wp=HwC~k9PmO38lPhpYz;K|LuLt&V@vbjT^2|j;8qxbb63}!*2Gvq0bC{kt^%wB z+}ceeJ7)EBFnKsP+A-@o59NRrZtcVQh+BuA9I(%Z?A`gcz^(tl@}aw0GVZwoD^Ihq z3T88Ki{O|vZizS4+giP5PcT@~os{T(dwD^TE8iGMwEcyPSCksZ%$>gh)2iri=5@@T zW$)V={ife*f#JAC2TM6$J;1E~9p{866srJwWx&4lvO{6qsz!R^R{tXdHdn3A?R`t& zmKSNgv$sETAr^2j{4?MdDQVo|0uD8ySnrf&{u>Lp$pVSv)^dYeZt8f`mSGl9{#Flg zs|@}VAVd)TrGqyN$1N%qZgnA#=bUJNs{&>8Azt}g)ksg=8hU!bJ`?ix-~LMARs$Y> zy>r{H5`GJv;jQxFRnoX67I4(IH`Ua&v^JQTLYUf+%PcSk+;ZicjxOs?)0}ZwK;c#q z@a7;eNXM<+jU(e$I?`9f;8q!qhrqG8)%C=H&2y!#=o7fL2wvKUOS;7KEr!pobsCX0 zZqeVuA`bJ8*ElW)ll7n40*T|+vSntT@SnOXP36XEfiP~RPqj0@lp2Lw`$qA%GQXH= zcR!OFo+o5gJSd|K@d~&45%(IF-DmF^u=!Qe6<`0kz^xzQ?ePcwFF*Joo^QQeU|Chw zmc<42N#mAyzNID#&B{ZV(sh*ReS2kLcA*>Z+ljWnaPeY;TduqMO@p{`hGKK9T zq2qd$s^jP~p!3Di?La>KS+#L=JEhJaN7pHJb#ZieN!`Xcy1St}1?Q_DLDv{Z=SMz# z7{Y3bqx%eWq|I@3YoX&cu_ca9<-0YGj<%kLeB0ybRKCx}(XB#046m%);^?l0ZX$HI z$I-E#r$To}9Np#6apRpkwa9$C;^>w_$9moy zM^_9Tv)&g+w+;%PZ+9G>%J)DVU5U*1U>qHR|*Ah5s${vt&sV;;^=ryaO0-Eadax*=i}&9T^@_0D?^#Qbv_IVsyO6mx0xDoiyCz>+>dyyXBk6^8tAG$>*i?S}7i0i}WiNg1HM8^KAgP zgLi^=gP#Mx0{$uZci<1eC!vfC@I3HE;LE^V=Wqk~cJRaCXTdLle+2$6ct7|_@GkI; z;Ce9omi?3qJ{>#_{CAZ92XG(whv4VIPlNY@w}JWmi5|)o;HBWXVBVie;f3uCpe!eb zSF%v?=PUxkHcTTj@E`Bu;)q=@0=!m5Korh20{j>dwqzg`EYk1?F9N&^i2!e#BEb8Z z2#9`SE?Qm0d{PDY8x=A5DuEN=6)$2=R{`EnMa&s0Kx7p$>_QO`xXx4X;hc!!>Jkwk z+=xJi3d~l4b5vlC3ect^@wqC%{isC@_ZSm_Ocj`?0`pbi0u@-G0=&RPt}GRR2kXRS zt3Zwlbus*=A4*WtzOZ=qc$v4s zU)Sp0=#*vt8wuHlg*S7k?^n*nw76>C};{`Giq zi)&i=>YITrSlN&pEs!{FEi$;}#tXo-Nmzh@qj1YJb*kOD%8J^QuiRCnPPNnS9sZTO;>QPUPHz5k>W>9(-GsTjAME*>z%7O!uM<@o=R97W7atX< z4fxGF1dcV$e>YiR47gQf{4F>2ylG3U1r%=8Pr+JDJKEpMj`Pko^DEryMf!U9X?mGM zz^x&~>Hby)<^gx_9kBUy?t9)h1a4i3$9adpb7jx}#k+3|zcgOl;wF&hwKu&hOxR@> zNF28cT)7t2W!-6-Ge!$=9Rr!`J``^Coix=hzU5C*^MsiV(f$_PB8%%TxHjeUVyOuN zlBnwdQ-13>IxbWBK^)yK#GeH2jiY-2@htO=IJyTB&$|439Nis==R%qHqR55=S>5@x=O}7#-_SEOii82gU)J|8<5K2Q=ci7s2HAnh-DSbT>m%4C44(%z30UA)mpg82E+w+( z^@=eHSM=t8?IH0jli^G2S&eb5krB@_{mpHyTeH?XMVbG`09|!K z=UFBTP;y^#i^Jo?0k5@=6vI>zJC+AvJ-J@il15Y z4EBBLLA)2ZLQEU!UANUG%ks0<`@OBc`gQ&gR>Opl;RGV5=@}J8^a0KR6cN0{?PsxXQTvoydUKc^|TE}`8qTYBa}Z>{KAZs{ojtP z?W~0^4dv`BnUX@xV)=^Id3GaD+WpRX_~eV}c5lTKC~#W4v(F6kD8CFrL3|1S`f8^< z=2OIUd~saqm{$?g6@ryculsh?bGxiNUtnk553p{_oI3EiDBmep`v^?R%gJBQ1D+5E zi^KuXfP*6LWZ`HaN&P5l`%5$UwA0E3v-m@Z%Z6zfmjz~3=anw0yzG+lMOj6;MU{=- znyOGsd#leMVmP6e zmAM$LIB?&9&20%tp<>+Y-B0jCh0d}J4R&W>My0^^m zFn@TB4>Rc*`%v*>;4>33<7{vz;`;B8`2ue>6r4d``^5p9I|Xgs_Od|YA%xdV`MN-2 zhEHq2KhQ{?{)nRsv8#=E8^*sm&{*$nu5I+Un(1W6s^-5NERZ-7uP{jLh7LDvh_V2^ zYem)25LfnnVZi2AbThAeQQ%4sQ0kEb`vtBr{Hc!*S8BYq23BBdLoTyG;-m>hlmk*^9|Vfgfq4_Ca6jV(UosleEV zTxEg8ab>abS6tQerZKS=P&0aE@2A>5m_6iV8i|+_jCl*v(L|n1Rv^9SX!Mtq>Jirg zW`0sNGW{Dk^XwE4XZ-&1w=WCaS`V!H`I`?cfBw8*OkntbjTg80h5@+A8)!C|1w$Kh zodw2#TgD%9UGJL)0Vc%PQTPZ+;a0~Xe7Ub=a@1~Vo=uS_P_!B`jVoJ70r52mC(QrU z@%azsrWhU1$8)L0Al-*k?foA*50bb#ly94N0XH-6Ix~e2n@Hg&Q{lJI9UP2!aK#s- zcsN7&$C>{skZ?LqbJmt`2oH|o=f;bK&J!nmzrC&1Z}wjky<+~k%L0ib;Ua^C?&^Be z8qESkEro>X@1@!qIq6Xz+)z_A5;80EC`20?OtmY3po}LG#p-cf-+Q_z7PtClr+8AJ zzclZQ0=F($fVG={+$r9*WB8Bb#Vzi4-PF`>w!3Ce7;>Wp634BAT=PWBjaPtald^!q zt+IFVJ@!9E&pf7UYY0_(N`+hXNM8ZG({&zTStsIRajWS36b}=gRrs{Ptyl0xzMt&x z68;v$bNE;dl=KQefm{BjM(@^^_BMlFjy27HH(4NY+{!n&<))4|ZHcnLWE?5n$~*|X zX_@Y!KSd($^oNG~Tg;uhKJI1N`3F2jTj&YnRzKnhNeAbpc(~ZT_UR`C zZe`|J)?ioWe_nxi(0_w3wBAtV_-jeyR^+>QKAgso3oVf7eLJ@(+m(AMCffeOqTFob zZ@KUXV45T>K>tVKR#|td9SlZ4F?+3bIBu;*9)(+d#Jc~T9`?6x#B-{y-@^yXnHk2d z-uxqWXVzdi%^Kt<@54LQA1RQ;ajIm_H8L?(eDFr8=f|NSrYB`OV$A=G7k^;)-aQbm z7vDE0H=}>s9e8?9~BkpP9@&E*b)9y7ZAKjTe!UkJA#G^Re=oTtK$=Yk* zZw}l2k3{Ts8_FWTiR(UBtCzCZH0a1YEuXkk>iKaPMakBy=l6&0?u#S#qW#G`P_O@y zZRUx1&65{O=6#HN5Hg9LABTeGO3C|IBKHZIJS+|zK5QR2KT@yb_2cu%!Fqi`vVPs` z`BlM8M@rUS2R}S)_dOWtM|Iu*9`;(P*=rrn!Ft6bJ%6k|S$kQN-?#ZqaaGbI@MrO7=kVO){EP&yPbv zXG)oDy~-XsVwWwB)JyfFx_`;yMV(kLUe9E%njw?){7#JXO$dgQ?Z={RN9==nk$S0e z*WvowuU%iP6PfocGCN+4C*tK_3_U5?dL4KI_SzS@zMRr5OVum3AJu(=E0EMGqqMb&FIj>-Httii1J%a7fu}5fYMFx6guUFFijF1rZBK$=1tr-BEk{{K)m?lr|iY`yxiT*f33#pZyH{lPADN`*cVZ&8OtxO>F|Es zjymyX5L>U4QJE=V)=7;g;^jXiE0}D(vOE52XU>b%YczY!!}-WGurjiqUsgxdnc-yX zb!g6C?R`rk^|}pZk<~aS)?NkB>5M~5&(CAhY)2$rug>eQ#^O$S>pfl>Uj~ z{df~}WD-l+1;yss?37)WE^m$B?So>Et_kDZ&1H`;*XBld`r_Q&ACV1hJ)kXC(@uJvp!^! zp5KXy{7=?i8E+o3E4m}s7sn^$*m0r4A>t&Nb(;ld-Sqr86tqdoWb3u|lSl3BJ&}6R zR^-@uOjWO&Q4!9sk|@Y}e#Vow$TZ2;t2*u+lhR&8#I%IcqYGBPtu#z-~ci{q2pHwW8JT3b?Dx^AMcHSZG( z7fxz~^aQ;d{kaXBy_2rIYHfK6k5J{1zqM@|-?OV?i?MaIui=#Np*KWz3M*CXM?+e+ zP7QH)>Gno{RlT>d%@#)@sP3V>Pmy|_O|^^DXFBh2WMG~X*K|5;J%qj|cVe<99k|Nh z?j6wWhm6&gApP~=w>6yyzx{py#74xGL$@K0j&t@4!Mrc3GF84}#6ODjeM8f!x=ezO z_54E|-E!#Gg5%ZYDAG>>u>BUY1MS)a`8EbCH=~|cAzRhQ zJO&s~Z~Q>qpZ^cqpN)`nkogYEC4!i-! zb#P99j*}H4-%k+!5&HTgFejT|huDj70L*$6Fdn=Y>Do|!6Y@O4d|=k`A#fgae?{Ie zpv(qvE_fpvQULxCc6bB47hDU@2Gi%-3*CRPv0yc?kvZZoF0w(nZwwiDZ^=q9LrqId zTcxudL^f(hx?uDwv0nbhtj1cpK&0#u^R(1#a`umx`MjYf+L^TAco{o3FIpIEuW1bU zDnnaCKHTuKd|6JOMx3EZ?Y?nr4AW zHe71C@_Y*uIA16jXvThC4GH{ww9^G@ap8>N2kO{i)GpP&yP$pnqqZfIhbNIAlO45B zBe{UbS-vr($ABcOo&#di{Nq_TQhu;C(A-v+z|Sm_r77rZX|4-wOyEZl$)xTX^sXvJA?1(w3l=>%e3$kjC$E*4U}k+Q-ci9Irdtz* zHZ5CtkB`JIQ)kQ-@C90L$nsqvn|9uaO{4JxLF@v_fu0=Tg-5a;tRy{%kt<7@D!C7F z#c!N0#;F)!3KFgrMv-E=dkrK;n}T|fxbO4wb3{l`4@ElSDmEOm58;ge1^zDhIq+lP z`@o+Aw}S)VO7Lp%XTWp7Gr-4C%b$Y>!LNbo?tB5f8@vt7VZIOiHE(igEzJkd1d}-ZOPaBhQf!T zz>WTvI$<)TaQw|QnO65MPmyu9aICAgcpDqS$%MaIwb`2+^oGlIoX&7ACkan|wJc~| zeM@^|ZAOhh!&}qn&uDAOz}JB?g2CJjZ(GLNRqHR=umVb-7Y#vdc19qS;caa7duz8s zV&H%wWNilSCGfj9B0CESpWJbXQ{|aX4zgw&{nA&lCKl!|3SSBUimGtJE7z{OeAW7l zu=4U{m#z;N>L|lHf_~U+TUrBc{%P`jQ&^^m;YCRDFeX&f+7LcddDYrgD_56?3vUo+ z4VTd94F-JP+S=ALoC2&C44L=EW!=vyhPZPoRN?vPF%h&FPw-|72yNURD_FLTfU-d z`Q=xCQs#=8wK!Eq$If2Nknzzo7vTm+W-wSlCRqKXEAaE}Z=NnHc{U@tr(aZGk7L;mI$tiQNsxVhKcv^SVo^w;5mki zLi|(`9j}R#2uCHc>p`S1pzI4QqiTJ#3D3Fh7icNlB KTjlW2?fyTW98vQC literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/LAB4.snippets.xml b/lab/LAB4.si4project/LAB4.snippets.xml new file mode 100644 index 0000000..a337f1d --- /dev/null +++ b/lab/LAB4.si4project/LAB4.snippets.xml @@ -0,0 +1,7 @@ + + + + diff --git a/lab/LAB4.si4project/cache/parse/boot_main.c.sisc b/lab/LAB4.si4project/cache/parse/boot_main.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..b53887613d7da1c6c2383776d797afadc9874c5e GIT binary patch literal 7018 zcmeI0Pi)jh6vwyQ7M2PY1xXdumAa-#z(&N>P#RRIH4;P$N&Ocn-7UMZ|3Zs2_^+ag zm=Hxp<)Dd)Ar@mI7ZWbV7|=BFf(HyS9ys=7JT}p|en0b@w>!J7Ep4bV#+ST(GjC?z zynpj%e%rVp7TX<*Rjm=m;<4C{x>)SeS8<0wiGrtpxwIJG=?iC;Kr3Va!+*sC#QtXC zav5||_>r*2W0fc{{$6YCxsg4!w2v$J=Y{9QJNx^V1U!Shhn*ikn5Y($u8k?R99-vV zg(&-2F4@{}ji2hs8VR^Vi_)Gsto8;i{!#R(#>T||S#+N$vP)oTk;mBeC4;4U=JU%6 zqv*CQ*Vol^D4j_*t8ve8)BW*m%Rce3$M$j5??HR2J;W}+^m}A_y0yn1&1V1G{VGTO z9<*`1j_%(=K3@zCauV&^9^T#l=u_L;)giD+A&}(93#L7lV2m}$=Zo7Sc)_;qt!-O( zp)WCC?dL&n6XFZnj4knfk=U^lDZ*cXN%|hlbfyP0T|-JxXK1~j3cXv1VA>{FO$TGg zQ#I&ikk2o)rgP}RNbms^W+dfD9}zW~cX?h&8s13N*nxnL!qru)+!Xdp?Cg~++ zp)gK-%nd~ui{M*?+dYr1Ov#3K%001A*~NK`G9XlVk$By1Bo^xtMJ`4h@Vt&X2^n_T z8(S%Ds}znpIpD;Vm4)-cX$NL9*5)yneXcgLUn&Bln!iKz4^c75M26dcoO9E#h7AXd?341geJ>Zc&hh}I}OI0UZi;{l2e%($nMa3 zVx%{+tDjJOO0pVndYR0O0O=LEXZ5QUv5i6`Hw!TZOO2;nzF_#c(!3~xbEF&F0}_{Z z_a97d8pt+FTamSEaRVwo95&?Lp&(&P=?Oswpi*#Tvz$RX8)Zxp7mjc_6#4 zWngb_rg!kjI<@0*Y$~&<6acj@Hj_|yqjzF!B7%v%Qd*b!-d)LKPt0Jez2Re88Cd+xpLhFUZ$au*> zI=$~8sjY0eb`#N<(ueb!%La{or^n{{$s_c3=CEmz|qQMx-={19` z+#@T5@Myue%&_@k3YM=6b!t%7wY^;WrtXkVpD63tgEuut9Aw>m9W%QMy0r&jG;Avf z%iW;=32mJ66AY(>#ttjHCSLLPv#c8tW@T)4#gsEa%0@uoMn_>@4;gk5lV zs>68&88E;g!=q}0=C3impc~fTL{j`)!Bm~Ae&y@S``1eDY~{>GkD2DqG(Icc$Q5!3 zuzaFICzLA}H?MTLVsrRH3Fp+QdNgj0=A;lHXp4yZ-RRq!J=F`=eJ0Z7I~;&#)%aD% YiGJ)0B@^&?2?ObfxV3hb@mXx}7pocX00000 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/fs_test.c.sisc b/lab/LAB4.si4project/cache/parse/fs_test.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..bb1775d8ce3e524548b78df4c7301d66a11fb282 GIT binary patch literal 2180 zcmeH{F;7%M5XYDE^vrp1CJ@xvD6v2rEsUW6iJH)9&`4#Wf#cvJV8S~Mm4($=3mr5j zMEwA^7RJIv3mXUp-@-<#_5a(q^WNQgf!Go!`QOaW%+Act%)4tRoO|e8@v`6w&h6{G z^RW=HD-O2zcPi+%zkKM2A9MfdsC0nYpA&}kpmkwWI4+chq5z%Un5vF_nyDi1_Bl79 zJ=t5Au5|{tjC`c&ty?Eiax|l^1k!p1Qkam(cFFFx--)h)z0`$ol4?KJUS%q=~y&0iRoaCL3$Mq%;hob=Rgc><3)kbC8jIwS9gGnpL2 z9XXQbYGY+VX&%Xh89;%@G{}di$sdaUfTbC!Cxyk4X{nedlkJauT%54&IvsnG_f}Xe zb2(Yi=7hVYc;mJ>@rWD7AN9sYUscL^6edy9mR%2K^rd?8xH+FRySMM_o2hE+bGm(R zmEfoF3*GmNW%7-#Rm$9f;Jvml81-Y@#~EL%=dkU&t3m~zSJuV&6Rn#m=Z zX+OwQriD@vxD#Qsc(4Dp*6YdeUnkQ+WLFOIIWjhSWvgsGWneA7#0Te@f9NMR^F_vI PPd+~;QXl&==)2J$!rhr& literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/gradelib.py.sisc b/lab/LAB4.si4project/cache/parse/gradelib.py.sisc new file mode 100644 index 0000000000000000000000000000000000000000..0d64c45ba5b898955da9439fce0e632020babe31 GIT binary patch literal 57765 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 W7eK!m2ZBpIa-VMu$L9r1z5ffKNT)CW literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_assert.h.sisc b/lab/LAB4.si4project/cache/parse/inc_assert.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..4d487768d6ef9577aedb21a6f834e7a59317d120 GIT binary patch literal 4137 zcmeH~yKhuS6vl^T?JSO+HE$9?xe_UighC1m3S@~OEGGpC7?cPJZ5FSsT`5{3dt(+P z9_h9K;sgp8X_0`66p>s834u{k2C5X4{0Z)EzTezAyLYb*HbJ^ zq}REV&gJ)tUCz0^MdzOWmh=2f62ATS(|&ZfAKo26u6O^_e6*ns&@|;)=9}vn^S9fdN)Ysv17etd((Tu zQZGIfz#%REOR^j$o(N>Oct*O0@6GC=;w9poz|RNO&lsOE0r#tIoIPft%wHBN`E8zmtxgR_jYu%oxK$uRlB z9vE8bIyt2^_xwudXkYB6&svyj>khbfHvClgmC^A6`}vu3wF;or22eTxxlL?_&_zjO zXyn|To7s-YfR0zoQ-ERtusuNzNg61+$gQK>JiYjF6`*WRmuJThy6tC@@{p#AxFFp( ze-0Ojh^r>uiIhj`uG^m9kga2k9h`?&Di3Q2)&jE(A|cDF%CalbB!6F77BZL(cIfIz zaWQ<_EZEkSk>cPVonUd=oL`Gzt+GhSs{Pu*;&@kO2{u&L4&FiO=6X8^kFMj|UCV=K z{c2L?{f&wI*9Q-fpQT&#O2icJKiBC;;ij+y+G#r4C;8`YJ%Pz1UJI zTH#)_UR+c!&i)>HG4(a3v~Rl?En6mKvYo-#?!|1d^9pP}6YP*~nfs4A!4f3<)+$)5 zEE2M6zj3flRrX-GWq8+A#CMc{=MRScLzyogryR0_$2fhR@f&)REA^Q6lTaQTyylU5 zrF7{c{Z3Qbhd5?;LcTc7Y*|MY>5E44@vul2q;siANvnMT-c}D=q=>>}+JFkK{F znqD0#O|c~~u^W*AW1G*1$);-D-1Y$_O;OIKQ@WQ9U$QpmZDJ2HyFB{ll literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_elf.h.sisc b/lab/LAB4.si4project/cache/parse/inc_elf.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..57c8451609101b0e84f955ac25f84d6237bac050 GIT binary patch literal 6217 zcmeI0&u>&!6vvTwrv;N>{ibF7$se(cSa=x$m8sH*X$ox;38U^xSvex!-f{ zIp^N{I{VjqUe@#0?h|`0o;P=&=iUCU#qn>F@YUaMcc8oa^Ou{DYrOyIzmfrJzg^s| z1$`?1T)bJ#^I9>~^IoQNL)VUW#&_0v-dC-jcm8swbNH{9HlQ;KB06(*V8cc!d9-(G zEk|1-d5GTf`qK#$95lLpIam z(;DLwhMZIYreh)63JnyGB?vav-VyVrSC38jBV&jCq0x*#{JJ!(&{pGQgw8k(UFsSI zL0fH%eH*Ap2ab#!KCUM;EJtbgwuy7mQbSK_`TS>kgJNF`V_sCPzo#l!8O!`S5)xBXD$S z;PDL`1Tu~Y@XZEJp%0B@C*F_}|1U&FPDTzGr#YziBVBZFG&3y1z2;!z)Y0s~A>cV8 zUW|;KjNlok!J{*}JA8Ir@azHnzZ}^+8NoAN89s4-h0%}slVgKJnVb+hBV+`-7K+RI z>ce-9$?p!8`b+Y=ONH`uzR=rnNKWVlHR=~b1EFwE`ZdN`(g_`56a;mbI9Z=BPnQb4 z#Eo~`@kQNMOFiLjbwJ0_uPWks>Hhe;tsNKFKB=ENgu`t`U&K#)Jv!pO5q@wBt#n&$ zm*Gj-eJ_VU>abXcW6^^2zlgU;w^spwATDWqNAhdE_hpxr#GJ*l+mM|0ah=_wQag&r z-gJuQ{khysX=+@Sa^=oC4hnjkEe|eZbV*#PY7_*V?IDqeb$LHOTcD^s(SJmXBx|6W zZh6#XQT@dWl{^eS3YRZ0E?fYY0@0-4A`RDcN!-SWnH>_PYR&tV;(Wn< z22dgn25^yvYq})v3h`DAmm0B`!9^Ob>5{nh)?#xt#ao!o%~U5NJT@Y@NNZrzC2<>j zg4KrPT2>8Qtd=h3*{KwWz6BV$O-vF^mju?U8U+EfLjrgs30CRArg&B`u)%@BMw(8; z8r641YBDOt^4oL7Op!@xkZx_Kg8c&E>dXJceA&Dif zOQxgopszOyF|Dt-qmyky+v~qN2aB|AV!9-(OllMaiEUExby!sMi?7K9KRd+4izI)< zYr5rutvVsj+KPWJ2Po>DVnC4wYPuvSt1}9MCeTWb6mX(EAO;j^DKK3UlvNm|q@Ylm z%~vmGWkJ#(6a$O|h{>i)0_#_FX{WL=Tf-cE-8RLdNHi+cI}z|PU7U7i-NEpZM#v$ zcsuLSQT<#BeXt&ArR~-xM?VR)R}&nl=1`ry zy<&io7O?4(z%r>(TEMyK=>@*sDE4DwaFJXa1ZBGAaqA~83vW}v;R$5huTNT#kruJ( zlE@$!rA2I)G#hB27+j>`nl6b;=8V#CXG`U?w*4NLA-G7xHC+-n>R1PzhFdBZ=1=J@ zIeJ12E>geSx(u6cd0ak8LLxsM$}p94dz)(t&?jTETVu*+x+HjGzcD)`z}p2LeGIV; zfP&+7VY=~v#<1mgNk25+y7G#<$-|%b^s_KogzxhI#rBgnYTb>;Hr(a?rD5Pbv1`;Pe#7coBwLJx<++3k+TPseos0u6NI AssI20 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_env.h.sisc b/lab/LAB4.si4project/cache/parse/inc_env.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..0ecbd520e46fd07ca1e4a664139324673a1c4ee5 GIT binary patch literal 6541 zcmeI0O>9(E6vrQ>KnL1_2tuPKgQ5uXQLB>r5yRKemSCx+Adu=fv{RVaPAAiuNr)k7 zB0+;OAyF45F3JKEcWjJC6T^aq8xl4c7vRUjF_A%)EIW20x+;!b#4Y zbI-l^f6hJk+@{z?))d*yN~wzC&LYD3O-?$GU$ z0rtK_yi5yvSNwtaZZYjSg5u$GIfi%AQ|68+OPI=(o4NiCG)j z^4ZmxO3Nc~p*}Hwtd=%N-zlCWu16>3_u@Rqc}D|^lJ5(!N0Wb+JfuL+NdH5;LVc?= zcCE%;5YWp3*fq6xXzb@2dq_6?m~T%msoGl9Cx{wiX=ZTUHd8%}wq1MnCj0ugClmeq zlf8%4Cr6F~@yL?_Iy#Y>-- z^km=#{nlP=Cw!b`wO;b6oScjah$7H_d*sQ$3Hq&_sI&qi*p3<}6X}WZ)UnB8L7s-x zOLDxr38Zc!&jU6&t(2qGS>(DFqraR5>1-)8nk?+oNYZg{FvF9<3ef9qbuiQuuFD9Y zSV7C~Jw09h+UFP4z~y~@pDzPoZ1sSxBADX3B-ST@n+=qS_Xi!G3_#K8Bj+&Gd86F! zZM@%{4XQv7kOES;O3Xx)VZBxMFwti;D+N^f&cQ@tzeX$+KOkm;$*>*;=3p4PuI;wJ zXEA_x9PI1wIjA9v#1D!=Ga1$!BUgJ#ZY#)x`}+I0ZrhzWfI+-k44}!dUY)K1qUv6; zbA;v-;EN1gfxo0Scf&(s@JxpFD0XdCQ0P8^y#(z3Jwr9Yb9u!5G0wx1fK!TbF(kc; zqISdJUrS{tv&nR}IB}e7aj|%v7)+C4JsN!VA|x@@7Qwd>{LsOHL~`HW#2_b}u-1xM z@}pvq8ELla8Frl0Zn-_&o^`?#+0u|M!vW2|OT0nM_=Ff-ZXUCRtFF`ev7LS>w>j40 zxsn;U*?E0Y3cFqp%ANWCH1D{#yfmma1tp6gZ* z9De6{FGX~<=ie^J9%=Gd%O?b@y(HW9&}yk>5ZJ`%Cyz`O`Zue!PnC5-BSw>9U1zf9 zyw|R_(V675Q>nJc16pBk@S*pL(sV)xDks~e8&_g@WRE#(=(cL+n#Y0e7$x9QI3)bo z9zQ0%OI#V~jjsOWm9BGY{-g;X3Vg2OI3>MT`irtJkn@WgvqrWK$u9^-l$PX3(cCDe zCXg$|VH@#>iP&dOmA$&IbEHbi!Wb_oo483#I+1*%0c*A>thy>R>jhQGCC4+_SBaOr zbczW8Nv;4kTVvo^S3oJ58Kr307E%o?@*Xj;W@`)^DH`IoUtHvbvD4rwXY;af+B#%gz&+14)4Z zZMG;h5Jq)l&KI*reWDJCgM+d;E62CftHNUo^&m`j%3>lWhz2^2A#Eefr!3eEbw z@^y$Y7qf>=a z3UvCniAfZa2bAc|_K(m@sqtc(uUihzb}<`_wA`32ie8)k>Q@-KX|>#pm{cnpQ%_pEC{h2wIPfety-yuH( z>~uyyY|@UWhoA2o+Pty5t9y7nbvQXSS_isqXgzIxg|D^hQ{dJD6H=nxg4RmZ_Vs3@l1Q9kkkuA}@L!k_iBEFrt$!}Sw zx}k34GOhfbnNTjMmkna-wnJR6PU&w%tJTSC26H)sX?1HgNgEDI)!Fj8{yzKe2ObuW zru94RG&TDY{eR`Z;x{@b+WwDXZu0U;ZXwGvk7ZmrocZ*ImqYSQANdWBxqhM?Yx%?< jWBa&MV<25G-v2Vt*YhKy4zNS^(BdGDLA1sf-nc&j-{KX} literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_error.h.sisc b/lab/LAB4.si4project/cache/parse/inc_error.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..ebc864de3def5d9bd1de1dec2bf9372e5b56b8ce GIT binary patch literal 2191 zcmeHHyKYo55H(AlB%1{#gjcf#5~QP`50{OvSd@L}?n5g;GKlO-DY&GeLLmhW4IL$v z5#j@os1OAW9}q+V^!x#xImf=U*W83HC=o{*&3J5|v1i7Zztk^$EK9ApI-dI5O}DML7(f)LMkRKES;WnE?;-m$m6NJ8fO7$928YhlgICl8mB5douexc6pFzUYqODhSAMF zYVK;wf|5;iXisM5?L5dltC5v{wAq7=)=&!&a)}P@A}{9z*1EQFLw9p+nl01N4JMj} z;%06T9oj`=7DjMHqCp%dT1z^3A+{zNMThoe_Cx82quyrsHn?~pbe!WAO6olJEhjx*kSru5zT6xevjbyZ9){ytosZKgC$>DazJZKU+O`%`-LCmZH}l;Su4{OS&EH-G!1ljvL0oA&>b0p|Yg z@?CwQ8}jeS3;9@nOpg8In+K;~*m`n{`0RZteg54k{Yhfq z`Z7P4{`IbucGcF}PU*Vh-=9h8dy4-lpY5ddV|iPQ@5+Dh)|9&Pef9gd^cD5pm2aO+ z=?n6w?oFwGHl+=H{@28RUGHzmUsL=;wcpYgc~A-as{Hz$DLpLzhQ|1W{4a|Cp!V04 zt?TlA`M30aZk^I~=_}GN>;9`s%1`y(o|iwM_rKKp-zafkl%J8G()+XO`wNZdvigui z95WRww=r4z=p{Rx+r>g(-iIS#lS78At`EPrED=Mt~y<~!^0ZNi<6 z!7{A;p{9-{j<5_X+hP%5iy_!ND!N*-97`Nwm$MLH`v+hdl`7uM)Um`7HqS6Ogrlvd z6a%+vVVIdZmN>%Z`Q?VN7{(W7W5A3{tI^EV!Nj)-E{0SYBg++T>R{sa;5^}VHCUB( zhZDFAOv}&A)VahFcR9fUw}El0TGcbuew~!Stw&5uaeh!_lPdFl6Rl zk6SZSCljwH2Sc8gRRx&I*F)dT)WO6N_;8V|E@ut7axk<1j+$GmgK4`h@K|8>HKzXo z2b(&WI9eXdBW~W2MrDa?I4(#1VV>DHyOdZrD@{75AVVGj%p`#9q!xP%UCx zwE(B&-Y>^Y9ZnpKPbmc zolP9En>`P9Q08JEDsu|%L$GD0jwg=r&0`jPQ05eimH8zRD7k$(X6kg}h)!F!#iB_Q zQ+*eUXgupr%5$KpxDR_@Q%4g==qAey{C}Yz0ZqX@2&AgK9gr?YTpNJwhLusbh&FY(Bx!e|62wt3nU7_T{PVuKViqC>>>{&L)o7e8p@5 zyPw&db*Qh8duLN;6R&48$F-5>6TQyk^J&!@PS~O-uTRt$YjrYh5jj7#xn*^W5_#b3 z95@B`NqWjm9Zq~(@Sek|>WAf@l4GV0CteRfx)wF^?uDTafK)Zr`?wr4bu{sM^wFvo zx-*{fAftMpkYlFKC0@_nw)=Qt8n>CoLGy4wr?w}#C^L07am2O*fc1__TkKxVCLb)1 zPkUceXA?*4J@1RGta4v6lr>A^vviV~I+r-&T1S6bERL2n$G~z@PAQJZ^v`yCSH$jHb5rPj({3+Q698reLG08@LF=r)bYd-o)dbu z)onyMIkaS0cWv)%>TKeOOIxE!>m z-3}WG3$Ku4rcNi0==WLA`ek*OQc{%jX+9RS`bxjS)ZxVI;YU}c;Db?7c8A4G_p|yA zoNelC;)vap2Wg>4ZKOp%t2^_2Ze{6p{i3OZi6iiGzIXi2|NhFU=B1AE!=fx$Jx|G> z_AaIlCywBpbF&3?QrWs37HlP-k@vi>siTP_G^gBbD_cpgUCmpa9$PD0M&CP{I+r-& zE)RKS607;>8Gc(2VY6uroNelC;)uQHeUV^ER`Y{aw?C^&w!ri9p&T=HHt~9PGpiJc z{)$n}+xi`B8DYa1$uUzW6G!CbOa~dMCevaxEGcU?jIkUubvALt=5U)WC~H-pevZAM z9&8uc?(pES9$p_@-t#`lV$mGeNXMC%uD$%?)oXi)|H97SG}tsMImUa8&!7!G`WgB2 zbxEJmoM`!s&8siJ_|mmKzTd7p&Dpp$J0FD~^NZi+zdJWuq)WDuo9nl4zTRdAHZ0%F p1(xUJPQ_nWzJEQq-wuAv3D>d`)8{KU4o;sd>OOjFMjwo__zzxZ0W<&r literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_lib.h.sisc b/lab/LAB4.si4project/cache/parse/inc_lib.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..314f201d1bac5a8d4ac13551bd4689878aa3ef0a GIT binary patch literal 22686 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 N@jHU_jS)KAe*h}0mc;-7 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_mmu.h.sisc b/lab/LAB4.si4project/cache/parse/inc_mmu.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..b0c1e717f742c259d4789e5fb214e2176cd7d413 GIT binary patch literal 22408 zcmeI4dz@WWb;l1O&&dn&AmM#OGCZV^OcFwPGfXDQKpvCKO)?;OnPetmLI_hPP!y`r z@`zenEVNLIEmW}q{D2>kPh&wvi-@-U^dVwO)lynptgW`CwOA~-zwbV4%{}*=J#%F& z{Lv4~&zj#pYp?S?`*rp?_vYfF@kvrnlCdYrlQBth)P^Ma#^YmxKQF}}_|`Y35PRV1 z2dAP3CvV&Tml0s@50}qUhwhT!E8i)2tqyOcUkn7bMB@g-NpSF2!E# zoleZHYSw*!>%`d#a_DthTEVU~JxI!Rd@cF8*>fy4$c2-W3Ilai!eEjeF$uk?P! zzBe&R)=x>2A1L;UVvkHslGk6L#*hu3MKKdk|Im&%t)57VH0L3MZOoSSuj z-l6`zFd<34sq!t-KU4lmDxaeAUyM^9RDXlCS^j06yIVd{oTHWZVO?*tCio%wMRSwn zC-UWreGC=E*Vr8OacTt0A2l6+OZ zLv?ec&#C?tu`bc6x^!?!su~B6si}#YUT4`kuU0i-X6i;V^}_XCm5z07m9=X(RaS3Q zL<5uPqQQb1oicR45()e6Y}R_HS+%MmGJ`&@bJe;{Ydclqs3gZq{4px!JazT0%}rdz zty<;m)F>U?xuP4UhCi8~hEp{ru{`tThRkv|y{G-h8#AaeDd(Bbez>`*)-vwLLhskF zT-l{FnGrn!f(11yWv4o6@6CBCXQxKa_|8?WD^_gWqN3Jk@^fiTs)i*7wsvBg#MHV~ ztF@T}+qAB8Mf8xbCF?#8kTYl%iy_HtF0?Rc)r@QM`7EvFqmIm0r88klkn%x&*hyyeR6l}@OFBxhP$P@__gQEN*!b|Z_r1*)D% z$yr7XYE;TGDvQT0+SW}h-5K(;EiI@~DL1C(mo6i)r3`nb{2b#3H7@1Raobif3bW+r z8aJqMDL3ZkH%Ya(73ysHc}5LtRLU`G!x>xAr8D*3k(@8b&gYL&DaWYwGgi2LHMU(e zR*(3kRgMKUEae!MyT>iM5LRtgwO$&Mc1sItRLU`G{XJIOBDi@cbuzGqxIB z$!a+k)X0=$JCSiMgsEMzRGVJXM3OuSok5Zc4jvZNgFSWv@Kj$wUW zkRQda3sW{v)$C|kP{UG=VH>t~OPI3bbUG^-3u;)(F>Gz_hiPqVn6mjgo!c1;YFNrK zY)G^}@j=+a_$`q0ZiWRltiP{iTSrc9qaCKTZDEIORw`Qr7SynmW36pCWu2>-mgD7@ z$g!Y?r5wW&b1S^yv~65k>1+${c_%38ot7BXxRhhu+TO(|#-%(e?&h`a>{Waq*(S$=8kcg6%Nv|q;X%A|O{Hxm z)KlfXmKM~glw;HxmW#xwoq@VgwSATu)ToqW)R~rx#Hg)-x=6L#Eis?F!Vzs=dN8gBq3cXsG2tU81x5jT+Rblw;JxEEkEjwIfiM zs&=Pk1~n?>7=epE~5rDD&-ipegvl2nd#Rw zQ*;+}tnXY?S=-um5s$3XI2ong61;R&quySXELsdv7ruOmkm)UcFeSY9^W;@I%T zMXPdt!SaF{mU0X`-y4 z`>M*iO>5S4>R_e(Lup-d2P*Jbi*Xun%$$Vn`_<+qy60B-a$Df7s$3<%%aVeM35PN| z&FWn0nX^3{t~m7DoLrj3XS3#WPN=ZCM6&t^5x{+|0Vaus+3!nwX!4N zPo;IK8kkrNO!wT1JA%M#R+MQl{zXd+YFx^Vx$y>H0F+(fO9l>VV9GHt9ds*hHEM91 zZZn2=i~Nr)GpKsiYTYGBGSaKje2ty;2}G3HB~uNpY0fhotp4ac~{z=ulZ1slITOp0 zpZ%rgCc5ZWX!0sSd3oUO?2#W1O|}5lSWJ-+V=M^yQ*7cbjb2LH%d1+;?ac62`3c5d zoZ%94u0P>d-_+d1bJnd|rE94jEScQZUgqCFV6!Z@$xjo9!B{Q@56ffO!MI{?p53I( z)L=Jt4)$H!do{z+qr+aSLcn5K&A$mQOH;z%YIWAo5$IX{+jsZ&Z7f>@%^vQ3P zW4EOeE<%ip*QiulySm!fUa+QpW2M68xLyA1mU*WsY+{YC z;WM6YsN?!}4fd6|y>`eyBgY<3CD4e)s52}FDSWc&+uhs0z0{+sE974%NA_GQ0Y@x` zooPA9aHC!~BDB3ARVUdV0X&THrzR;2r+b8_>qqaX0|HSfPW<2P$M4995JviAn( zvW74}H~aggw5Il#_e;(>TFx3pwO!Q3N;=M3mRGITuFiGG?CQyP^;NohQ+-z_s;f7B zuGUpf_2$0WT`lQaY=wgs%5i*BLb zRgaYv%i0_4YPY(zKR2t_EB0cht86)MRacMKwdf-13)o{N#j@6*t1QOsy?Xs`ten2r zy80v4;d>Rkje1kd2je zoVEJd@HJp7Vqi}nk!)WNs9*QonD+H`)$!W6?>Dsq$ITsDfh!eb)OX71E7#9nM~A^i zy8?M-eaIMm(udENcI+>xuRxEL6w6w+E!AqR74&s1->Cs*5dvT!QI?5ch*(KJoE4y3 zdj|WM9j*Y3^@koVcPO!vd^jt7GqtP#s;Nq5hP@95G!r+?If4mGZdLFr+6+$A>U?V7 z*+b9r)vBX|K0CB2J0dy^Hq8rCu0tM1u3H+Z|NEyJIX<=Vz0e72!;L!eX?5~14KSek zBjpQp%&jy>&O5y%xkpapQSO**j6u&DZSdp5JN;m9MZ;5RIjypY57SKMZ^>b!N6KM) zEYDWekX5U!tJLVi6tS7l0OtcW!H>v+qYn4j$Z&=>H8@ipzIaKcWf_|ZQ~TR;=%}wl zkLBrf%dPM&j_AI=c_Q8`hl{eYa<0enTw3Q=Sl{9f^6tp9=c96Z_5O_dV(?fVtJEQjErx3buWQ+;3_cP6o*X{v zPh5}XxlD*#;rmkNZR-YAGe#eiLq&bsJeH?2>u#}W+i{6%xnDjm2a5XL=CM4Kb?#R9 zPbSpVa4RoqsVrW~1Vcr!eR|YQv`5`Wt&G>?FDusl)V!fb9gkW*xa^dV^r*|W0={?E zH`458rs^T%QO9HUA&W4qYDV~{42Jh%xj*hG6D!HHmSq=))wcs~834=?>TgIMD=9Xd z6`w*pi9OMcd$)g$!f_oOd4 zKI``=cKx%pSzjX{ZF#F_{ZU<$$1>_SlgCPmW$mY)bpUKnC=i@> z+BgoV{F2HGRpy22&y{zE@;<28w-xKwHMXh4yLAsA)RZKT$#<&{eUsCMOi}|Nvi*-jz6VSo>2ZX$~{~R9y*NWH|0tT$_|^2<#*idm=qp5 zdj|Dlw);xBx>8Zr|X*BA&gB_g~3rFM5ca_Ihk&t_IZ%&Um$V zaBvYr%u;zl4i@!iugCIOy60ASKNWVMr?tI$$1(r=7sWK z<*-q2vB&akuI(0U@nC2%A5{KL4i)tldn`|7rrkyusnH zw3wIdSB#2!i#?X7*54V!j`8V?@iFrMFgEHf_E?_HDsqdB@%GT-W0mrsa>fDm7JDpD z%^r_1#>;7ON&X`_Y}8xqu`El~VHKfRti?M*i|48KzvNI+Z?VVn)EUZg8==K#bSddL z`Kxl+sBb|Y%d=TUZm|t>SMQ#SRX<<;V>wuqh05*au{?IB>f8!na@B6VmPH$swLt#g za^NV>Y2Y5q!@0Oy;nSnwd&;V9mcJ$kiUI-Zu{@L>y2alA`merfD_bDEv6lFtX2&2)gXufixTteImgf#ZRfuu< z_7g69>R98V&h=QHYqJ*cF|L27#*4u?blA&0h>&p{x;r?KFnKRy$#v2r!rDLET z%R_xVDn-!TyNaOp6+5pqd{MwML%ppY%VW8uTdb|&D|YS&ZYZEAk5x|eSRPv6Rz9bs zMtq9e%G%XewJpn-F`zzTtMygQa{H=wpRVw_e7|n!<@;-2+Vv=ZvwWv~q zyitBLXKyf}hOA7_WSjV-@+T!5(qj0%8#_9`d-DmSOspi&T9#iNS^c=q?_2zwS_f=&Xr0+nOI4lwT5en!DMiN@nk`Hm2@bv zl6*KDZqk`HSiIz+$4Q+@tR&AGb#4WwO*(@IYk}zrQfCq?$+I>hQJhLvpeF?pZ(C zwQY=Rj~@vCAYN9HZl7*g6pUmjmdC1U$O=z8Vfn`%hM)C^dsjILt~)MmF$uaNUb0(oBkSgdF}-pDn6hTOV)Dblu|0sZEj z`c}1ZwAcARJkQs~n6NLhUt+#@@~&_|KV7}&f+NGe$lggEufo}!x!ODTZ%T9g)1Lny zEpmlh<=Abhgiq#H4A-U1r}eK}@Htar{C5u68K&?)6e9Zn$TX$uVJq{f#E5zMu@FgP ecU$=rrto--V@pgC-siC9OzinIl=!<4=l(CrlccEt literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_stab.h.sisc b/lab/LAB4.si4project/cache/parse/inc_stab.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..16ba2ad79282f924ac953fa3c06c76063f403383 GIT binary patch literal 4524 zcmeH~O>9(E6vr>Mw6zur0)nDA;&=UM{aBbtOxildlIgV0v=L%-0(6=-l1gYHur?Zq z3m0G{#ElCUY;?ue#KagkE?i)YF>c%#SH^{L_x%6PJ9pl+b9J`Hc#_j|-u?L9bI-fy z&g)oT2=gKIJ}wPCA&l(^;nvL_)9+-_>p$KaqV4*ZH@0DK3;)Z1B?G+syQRCep)1ml zrT0r8llDrH7p_bV&kY?K!2fJ8gtxYZuLPH2VqwuUgGAiovlcRgQ|zOVEAv-EPmV$>q1rC(^y zi+VnwAdZMJs(I(+ecgWARg1+n|rn zG9}&xY=5;eRUMxx*W~LJkOvd9&c*M}Wp*xbw~D(^C0e$zGw;Z)Q)x?4nH?n&ZGGOe zz&`Hufo7eHpW+trQ8gV|s7#8>OJnXX=bCjces^xiOPd*=uD+_NI@5uIN6b1FKZPwo zgd4Ag{7m&$8*`Jy${CM`(X2!9Q_y19K#L{(fYm&;cWC-uQpBud@l#mZq9jsVuS{3V z3mPya-RlF*Iu}31C1+8xtXPF`2da&iTVP#|VV{pQ>tOs8cwg zjNcvHk>I)#%weEX?=h%b$I_Oj=L5|;7eB?__|A%I_S>dDTOkR%qz9a8)~Wa@YP?68lBkF| zPXblSPbXs5vG^(M#urwU9l`3#Et7KQb*mm*~D_7@h$KX<_4@eQS z&c#o0i?^TTRwioWcHvN|2Z2h=Iu}31Eq;WP=`A14(?Fd*2vcI#vG^%$kVCwW?A86LO_$ltjvs*+Tk3-~As*gC=taI^G+%B)J zEUr}rwfd-Y%{mvqJGWScc=aJtDOV43jZvy2QZ_Uu-Qs?1Yv1-S?+y)W)s}QzWA*jp zC*D+dtX@U}MA~iqpvrrSyNTy4E8ZZn?p#?~U2HCuijP0;2#WSuDe_!yYz5j_Y4Zv` z#7xH>(Og|zSt?PNob~uS{r%;s;j7mc>~^^+<_Ai}pK81K(a<1E3|tx-BztU@aQJ*@ zZu=*!9!-k$=bvb74C(gy-lv5=&4=3O^c#9+`>g+jlz6ecmG-tGh3b&B$JDX?)yCTT zne$+I*-uLO(Z;fOu(543R$VPgVEK-wgxT#=Qn1(N6Rfh^$w literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_stdarg.h.sisc b/lab/LAB4.si4project/cache/parse/inc_stdarg.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..a96ff79678fef5b7fedaeb720426be10e69ac078 GIT binary patch literal 2442 zcmeH|J!@1!6o#*BKG%(jUu4zh3Kp@m6cHgPakVhfO(2adi%Dc5gpe$vAXteh1tW;Y zGN7G}VmgZy`2&#@{(zJzErjuX=FZ6-cN5gcLOk&9nK^U5?t9PNJ>Qii<4MwSPDlz# z^06mLHa`?RzDR@BubU-otLyLj&&KdrOB#Te&qw;V*Dh*Wa&bY%-VA#?TRT;l7YjI`9d&G$EH;kGBC_8hCHPE`XE4AwQ)#2OMY88>h-AFov6Z(um zQP!sfBTLIRagImLgaY07>$Ta&Vsk=kzYk~LD>TlU#;IZCEj=m~*_$|LbY^*aly|XN zUuah4K|{U4)9a9!b!+17C#9klA;h_yFBFz zdTwe;p&VETR7C92(TBYy|1n=I&JFG!5IfkInVXuPNn2kd?L%u{@V1=f$F^6U;ObQy zE9$*5lhR6jUAA;xE`;myR%hRZPr5G8I?Mj;Z9FX%Y12lY>q6;xB(?QoRIs6r?Jah% z7$2w~9(PnAH;;WJ=wmImRQp)soX+J$Q@c=~zl9P=c_L_iL3YbvONIT!x%{e-vSYTs z*lgu+Lwqg0&OSNDVUKuy-q6ZG&5`|v8BR( z(#B!);rukg@f?=LS9vAlkXhiGP0F^je%a3(bI5IuIn;K~In1XZYw}O#&}NV?1pJ|m zKeMH>#qtaO&dQg6EMTn=4h05oH?V12(nyu>j_{3&q+rL9ZNFu~=cXoN^`UU`h5jKc Yr(u8BhdyGTE!E!{%Y2MZ>zzJ-03R*%z5oCK literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_stdio.h.sisc b/lab/LAB4.si4project/cache/parse/inc_stdio.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..0e4d5231e1afaac0ac3f780a51d0829d31ac00e8 GIT binary patch literal 13099 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_string.h.sisc b/lab/LAB4.si4project/cache/parse/inc_string.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..c54d79f411c10a889b7f4f84e3822e56a155cc12 GIT binary patch literal 19591 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 A6951J literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_syscall.h.sisc b/lab/LAB4.si4project/cache/parse/inc_syscall.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..7410a2349a42117f8b831235bfe96445ac5d37ce GIT binary patch literal 2790 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 TI5@Y#=EV7aoJC+;;(Y8+oq_wH literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/inc_x86.h.sisc b/lab/LAB4.si4project/cache/parse/inc_x86.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..cdd006c674c8072d137b08edecd3b52c8e8be2af GIT binary patch literal 29351 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_console.c.sisc b/lab/LAB4.si4project/cache/parse/kern_console.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..e08be4312147809b69d73d4592b6853656d02023 GIT binary patch literal 23232 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 KzT_q6@c#pb4WwKE literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_console.h.sisc b/lab/LAB4.si4project/cache/parse/kern_console.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..f4df42fcb5f0f28431048e2eb91c6d7fca50c517 GIT binary patch literal 3681 zcmeHJJ8x7+6rL;w%z9ygKzO9N;vpqfQcxiA5XM@AiQ^?+J46U&G2UzT3TGGHT_cb} zOi4i$3Ir(`%zSg+ z%g1Ys88fEmLoAasW@x=JkMHMX{RPf-_wUCA>hAu2Z$0@c^OoL}2r&0Mu(rUVTUb9} zZN}nv4;Ja!H-p6|+jr(E|BQOMw9c5`*}>vZkNSJ5Q?i~;{@CA(BZi;4htd*y*YkJ4 z`Ht3--c8@}M}-vuQ1>8vVb}v)+=2BQbTRlptBoncwlg?=2l76wr;ulH_6#2T1#1EF z7trx-eOLI#L`R1J(?MyQtnFLco z3mVOKusdo@PS4cBAZqVA2Q(sTx`cbnC^I76mQklty(_QcY=aHEj#j73)=3-bA}J;^BZ=6hHqaz&=xZS(vx(&$KOcoZl+qr+X>i^$ad`wME5 zdtr6hs6|s1+@y2(2^HGuInk)gLQOJAyVV|tx<*g~USoDN9COzOi~DECrP*0RHLQ8) z&i;A0muHWESI9GeJWq4@3k(MMj%Gr~^rfuwalJc~? zva=dmXX`5TX}7Nn@T>lHXJRiyck_?LSGE${>vbeHJ(uVwNp&mx`T~i42FK>Ebvj#z z?#Qo+vvibg`Z}CV&q_KeFjOhZ`Ryg1 x+Iv|sx2&RRFDKjFRoHUqefdq$s^_RspLk|FI&;3{&ZrMM6`434E$TmY&jAK7SUUg! literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_cpu.h.sisc b/lab/LAB4.si4project/cache/parse/kern_cpu.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..bb59bbb91b202e6376327e5c5aaea636d6555f5b GIT binary patch literal 6385 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 WtXyhaczfKNo-?# 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_kclock.h.sisc b/lab/LAB4.si4project/cache/parse/kern_kclock.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..a4a04b4e90303eae5bdfd0a67247ca645c841f40 GIT binary patch literal 4158 zcmeHK-)me&6dsebuIVP*YOOI=8QLOdb@Q7M!@oe1ul{;7OWoBQ*C!}P)&KNg$pG*EaqxZw zv(TuYkV>Xbrp$V|&5B0sJEPY4A^& zzlQy^D>jYX+t)D|m`G6EpD?7ymUwpGioPoae&1qTfo=`3)} zwMn~_`Zo+qk)9Sxeh_p5eW>1Sbv6DiYnaq;_(9uW(@lTb^MmJfuj>c;&7iXyEU$NU zx7q2fdAi-%(1%;?b89`%*R731HJ}kuF3d>h8OLd{Lmg2V_A^7A-K9#STAzCrLzaoD z4UrC(x-?i`flwIs(?QtD#kt0*m#g{3My;N&*3Ux4yzO!OjdbuFr@<3OC=4fLXriC! z!V z;n)NB8TmbPyj&qVZ9nGFjdbW7{}puWJFf)Y(h%hlFw2=^=8WD+c{e}Kjwkan;QRWy znPbOiXJ#7#9x@*i*QdcG${8@xIA&>ZogIX9?NW9;S?N;6_C_Zo^tXf7hVSDDH^^~0 zN_grh`v91L_^yS*a7u>eAx*Vb+Md6{c9iUZ?6E9wIV>ej1JtD%qE2W>j~y^nC|9u+ zml}0y$uUv*nul8upKPXf`E9SY!v4taeh^H0(h7q{T^g#}V#JRAXiznC%Yv75EPXPc zE1o}Nn!%UQj{>)e&+F}r&*x}j`=jhQi;O|h9ezq75}#7eNpgoA(~iuCeM;GxNN2#b z882w+NuoPue+gJ6{w6<%#x=7>+nHXw+gfe=-f2we5J9w)hatrnb>Qgq)`wa7eqe=0 zBorIeXyC8%Y&?F`hx`Wum*U zdK?UR3c+RGPX;^--Gv+dfTgbft$^ivDM@nW_Z9FF0PJ@xfe@655N2k{Qp!_k?_WJ- z|EC1CqY<|pNm=-t<%sc%K9j_ER_`@j%y)}Vm@Z4-xyEXY@41BvzI@W|k$9x?(|$To F_a|HZl#BoX literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_kdebug.c.sisc b/lab/LAB4.si4project/cache/parse/kern_kdebug.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..283db2c11217a70beeb8f729d68abceae7c4c99a GIT binary patch literal 10643 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_kdebug.h.sisc b/lab/LAB4.si4project/cache/parse/kern_kdebug.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..ea89564817115d04ae35c0be2fd4d54bdf033cc7 GIT binary patch literal 3159 zcmeH}&r4KM6vuCqmD=berPvS1MTV^^im;S0NsEGhSe6wvWb;NJ=xZ!*vg9!?+1})ycxhzX zwP8-9@3Qx$!*TGMELbQK*$q`61(GKz$sA$WR0&Z_(}~mP@+bQSPUTM??du&pmOoA= zs<%ob8)sll#zyH<5{Au{5bK-$;KtZg!E5W*VE5$hl6NaJdiateM5&b?(QJ^p2lH7E z<#HX5vxF)VhS|y(oNS+8DtN;}EnF9rp#*!Ig!3@Au1Hpa{0EJ8wj*mNR0l0xERwM-JN z@q&V11To3>*JAeZdu6t_Yx`Sit9_b*! zJ8Q<3;Js|4>?bJ<8I+P2T&@HQyOKV;WVs_r))j`;A1t-h>iY6Uf6N1zRuQI2SP}qi zzBI5x75Odjm>+mUT0$l|3?P>42H1RQU}7d=s1H&s;H-}-4)VeEaqo)ebROnYG}d@v zzU8s2YyrD5fj#C0lnyLqQv|j}N_pl>!!M@W?@Pa4C`^D2At-BL9b@v?kyg4K)?bMCBpXQ65cBC$%oX{Q1PQ~s$j2Y@)=lYFN|O`$$@Gbb z^xs71oiZJ-Y9%M06&*|aswW1)PVl!*%zH|XWW`RnMyuFmX~*DNK~8a+ZyGxnxIi~&4Sj<4wl#O PJ|MhRNSbo^c)xxE52rFE literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_lapic.c.sisc b/lab/LAB4.si4project/cache/parse/kern_lapic.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..e3d2e33e964cbd39d922f49861d1afe3b1637ff2 GIT binary patch literal 10218 zcmeI1+izS~6~<2-Cz%coPH9SA!et+ zPTU)5l&ZKiZ3Dd!q`p?9g3`Pc{0Hz5BpwPBNqh{N~WXRnzvGbiI% zkVr)=Y0X+^?|r_#Zu@fV&b2{M3WC;c;-Do6KG+-tSKeuH{GKHI#`{;=XnW&#Z>~qK z4*pO7D-j^~_lh^lp;yGOi#x@6ajO`*_)1^DT8?&lxk{3Gtd{Iuq#sfv-cy~vzb*)#lNGOjJP7WWep+pRl#$!S zFMcctwyp_+Kdb-2JA&Xz=?@6}5uxnSWIq?b>k&igzn4Ly;y-EJ#di6=J_z=SKM?<2 z_}${~$=6VQ&uXr}q=TSKbNp3&NNu|`&pEa27H^RqPsxV!Z9(ui@qY1-Wy2NCe@1*w z`u8RV=4MA` zG|4e_V7B7x$Vop5deS7c8HM3praEKqs+nYRa$a+g7z|d99XaXeKwo~2W{Ej5H&&kZ zo?x+CLni$!v?a|#B8{4Rve32HdxFKPHb+kSIna~lu=Mf5jZ5qY0Cqu2j;CMDmkjK#>+z^dwMQBn%Bh+s7i%b;VM5p>!lq zwg{h2ZikCBT=XPdTPX}}$X0K5AU9M5mI!u;F&AmD=t-~)F=~MAE*7)0SN(*L!w6V+ zDEZK$FAqyfBO>If-fRR+B@o6>i2+8Mz3556j5BJegn{f(b^ug@xJk@tq@kiGq1sYp zXanlOp6+6a*b>7}i$O&iDtZ!Xt*vznY_QayEfgtRV#o!J;Yfo;PlBa#j2g=J;F03P zM1c5xRtzZ8K+%&xo360F+;FxRRO0tJG32B#1N5YITTOgIT(xfdbD$Exj2O!B<5AI* zP_f^rAzP)~p=@DL-GuM+Vj_SvRP>|>xUy!PsNuvK-pMK;cwZ0$i8M&`BuG~zj1z@n zH5hIcBwWDC@tpc29_`B6@KRP-d&rV+>%3WM%QBz{}OBn)W@Lr+Rr zb-O06bu0Ezck!FqUREpt+$x5g^v0qm8CzRgt?oU3R*PFpDgi)=-!?Jiqz6S$0=0F> z_=atu)DwXczArOEN(zOM)R^y{cIg53PpPHW}aU|$*|Nd!73&az?EiNwqq%F0FJbhQnEb>k6MJY_!@0qug;LLVG=zdU=ZC%}iFIs3FZeb@r6|s|rSFNghv9mS zcW1R*!|S8$otPV$og0}U(v;TQ{*8AeK_@nsd>g{zu~m_du%b>P-4aWnk92va?4qMV zwu3Ca+}A#F`bfJ&6WkebhyFaYSlE;XJ@sN+n&KzgSj3-#XpjFXLywLOlLzL3A;ua- zEw#U#i@)?uY-8XPTf8+XwW4bQvR_mPYEAd zW8wuR=)=7SQuxGfV?~BFBuFALK{k$l=DFDfF+T6#v3QxJ&vYdweqX7vq2ZIWJT+JE z>#+U?dHtzcUoXr5Z**0C#b&epcKB+UMMC(B{-64KRelY7Us(X;^&j}U^MG4mEIf_} z0?M4X%2!)(do>4SGOo+ljjq%GEW6<96Pr@OcKon5v0ZAL*6nFisul@X*j>_@D!M<6%oU_%?M!U5=+tCrPI>A+l zAVXHkXQgv=n55726+1krmvQNIMgzKqJD8)RSf&< z7RRt+cuk9gm$~d1hZ(w~^^kVbusu2-^)5_=5VHEL8 zVlMwk0t=|Msoh;K)YL#B|A+Gg=&CaNElB6ZT)dF{6_Rn*R*y)uj2bQtr)E!nSDjeJ zc7wH~lXsZM+Vo*tv2yWzTe|8j<HHe%`~bTXlAo{2W#_Ce>W2q~^=Bx?u2o-MkL3uA>c?um$&~;~2|4HycOB z=lwh8no0UhR}5Elw%(_A2^nm*NOiVhAN(87t&-4HT~03)I|$K7oy?^qKbrL=jsGaO z-HfldbIgA;md)(GVIOtRnt*J5a5-4i*Y$__O|JHB3`azK%w?^Qr6bXpM*$EmM8f^< u@cN!un|)Y49c#0%=$TlX?VGGgBfD4r+8QLe#6WLF!u@CGtk-|!CF0+Wf298a literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_monitor.c.sisc b/lab/LAB4.si4project/cache/parse/kern_monitor.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..c65b70b0a914650d6347a53e3d107b37e6e622c6 GIT binary patch literal 10831 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_monitor.h.sisc b/lab/LAB4.si4project/cache/parse/kern_monitor.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..504848e1db5b4b6eb8c5218ff80ab8412ecfcea2 GIT binary patch literal 6180 zcmeI0&u>&!6vv;Xz)-;QODJgcS*+F_{(w|Lf(x3~ACw<0RuBv2 zaU#ZGL}cNXq}>=dCjA3kbm79pU|6^yuDWE|h5Gz{-g{@}&a_P1#dKjj>6vrix%YnW zJ?EbLoi{zO!Se<^uk~4}*W!8Idpz&XPc4!DE{op&G#sML|bK%j&FP0^B)hj)BaP3e?%R#-}JWo{YO*yOu|I+Gq0u|l9Na4Q)xxA zIkEJ!j@6RQb>}2QBXdv#uSrMs^qas63E=Z)L^fH1HhmA%@c;?K{z?zy`?En% z3jEH&d||@ZU)tB2{)KE%%#Qi_Y&w$-4*OFR*}xwUO6P<0#R-2RUz!@r_{GwszrRo% z9h=Hz{la9Y4l~+~B^lc(B?+|GOSdM^GG5;oU7SHh!f<1y&CWJnEENlrrC>;Hiov47 zz9a>gHhthS2Pt3cY9k9KVOXsb#-xNhlFyEfzpV#06_r+EUy%hEUp;W@tFAU%MBS>e zEtp8~ZvmLh6^gmiIXO6L9Ze+Iqf)?W*MoO|-qnWBBn*iu7QnXx{$6_Y!eo#h&F18( zW-CTzEa-^kCVq-PYqzdzmk9p7g$)9D^P*?%qQY+am)U70K$3(*1 z?R6_1f8(^go1_*!M}mNYZ}}B$MqC5yv&BpycSbWQFS}4X)kZ+Ww-hSYJWc=A=jvFfB zA?8#59*aHkXKnr{<5*aC(_oMu&xta#L5yRqRepvdML3yvIdIJcR>3- z>x%BT+>xxH%ct5 z%%|vg#h&=n<c*r%liiqCgI^Pesc zTH!CiUY25yNDUO9?|{yIxoZBJ)1jA>FRekrai?$T(0}ZS?=-K+BnxTgoi_d=L^~8L zV!p;@zWAU?lgnT8igosCe5H-QI&{sCJy(qt6y`NER^u!&0pM7B`;@TK;6!{I#Gmzg74CmDi!)OUj&I;A_cWgk^_174`t`jUU1l-JE&kElzfz>b;A#mD_gMAQxJ*Amke3U3mSk07waG*qpl=Yv9dma0d z``nVaD>fdq>d%&FJ@$dvo_N=r)6bieZ#^2V$DZipI=N#mYs~$V@ff>m77uTzCd^0h F{R^wKyKVpg literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_mpconfig.c.sisc b/lab/LAB4.si4project/cache/parse/kern_mpconfig.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..65c70d5c2773692dd8f0d0511ad083d208a58442 GIT binary patch literal 15692 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 XKCAGVZt;C|V0E||Pk+D(E&}=m_6Z35 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_picirq.h.sisc b/lab/LAB4.si4project/cache/parse/kern_picirq.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..b6c1a4cdc82a1eca5204785af42b7d3d6c0e4ffa GIT binary patch literal 3515 zcmeHJ&2LOm6u+vi8rAwXJ|Zuegq4rb)JG&kMhx}UX{93ZjLxgRsF`{*^|26k8Vivq zv0y1d*hs7_Y)JS6h=q-vrKN@B`u*;^XXd^3HDzHVPI~6td+xcv^Ks9;ubW$y>QkzD zBUm*lb+cWmkFS~xe}W`G{_?S%y2o#y&ZnHM{?orw0iOK|@De060e%Qx2`&9>jMF%dO^IlN)Mx0@u;I94Fz%<3;ydVnOHf;0rz3 z6S=dPF_*=5)kurXF{2Z&)}-EwoNK*Q)JDHlj&C;xn`&1_y=v3&o-?pvjJ%*EBdr&X zlf1<1BJqXwUL5msrMnA0P63BmE&~JF$Tg6}5#4r-qZF@EBTv?-!w)XH7mC&MZui#h zJF@IWJ|@fUeo842$2|7=c8%iOtxU??B&(a!i=+Oa>zDl+FF1QHZ4D_iV8+d{082fd z+|HyLr^yqTbio;S)vGl^_khCglWdtCiHOuuHgd-V6n#>(me|7Tr~RRF$s6Lej=v;K zg*A{jSn{U>>XIB$Cp0ycxT9Q8FH9M#geTXKDAdjDL1GG1Y4OS>f2fF^onR^Cmiw(=%6d1!x&M=R+o~K>4>? zhLwyaCJ91aPZkxFi$is+ZKu54V}7}|rOU0cV!ZfdIaUmfGdd&_l`Qpok9&0G^{QAk zaTa#DF0tcxN%l-<-zYKTVXP#Ho6q3`#N_maF^LWHiQ0UI&HG$vBe}>^$_H7zNFAu- K)gZ}pO5HF1Lqj3} literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_pmap.c.sisc b/lab/LAB4.si4project/cache/parse/kern_pmap.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..9948953ca08ffa42348ef30cb396293f5f95c6b2 GIT binary patch literal 51924 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 KzRU+e?*9S7&HsV` literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_pmap.h.sisc b/lab/LAB4.si4project/cache/parse/kern_pmap.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..eaa9109107d3ff1e2ef9f821377edc42a8349f99 GIT binary patch literal 21284 zcmeI4U2I&}amUxxhgURX+O?dlBgeTCMR?ODwIbU!V=J}jOWSelI5E6&?L__zn-3rbYG9oPtsWYHKoit$)0Tky5EMwkhd%hB4}463q9F3o z?f-Z0nZ1X1S9hs4>xZHPkLKLD=gv9*nK^UL-d*~@&P-+`liB_eai%AesSRf`Km9>Z z$p0z{zxi)J?L+tGkKcM9a$DyA>Hmrci2Y6C-2(KQ_}k(EabCP#46VI(yuWtCp)Bop z`ZAfH_h&Lo(k*}K?ofvwYB(DH&XFw7av9#xKT55T_B(l%B;!~v*|YvLu4^d%T?X?q z@{S(7MRQmXKdw7Jye5-*SX`3+7w&<()b}OvZ8H9?9huC(XqIbw_C#+c^MZ8mivLvY zpYO_Ko|XR7S_24;>jEE4(2c{?bq(h0@ul&An@*TW$YsG)^@2 z*gsL8o2$+R`$j60^MU>=1{yFpU!I#OPX(27u~eSBC%7@?axl5DZ$j3v2tp{7Zf3OcO8U%{YmTsUli5C`#%8auq)e8$f zm3zl^S0T*E zhoM(Q0P6cfwYo6BP#izMP@Vm(6yyP2Zg%okNi&WvX5^9cJa07OE1a=&CN%pwH34$H z7_&$wh*{I6o7Eb0gxOv)cWm}tX>txfaMQ9XlrBqXTTU_*RR2m}Z#+jTRKgF#M~)sn zjUQA}GJC{$d9N4?w27G!lY!Qs>+20yLUbvsJJmn39Qt8wwpc2KlO+`fUAIuW$Vd z@J5YBB4|fWo;-E`*dxbIpBhyk(&>Qfd%GlNS?;EjDS4(nH5vpbB2ZoPRB@&{Ggh9t zF#Ytyy5>R4C*%!c?9(PFc+05r<-T5E8Z{bmAhDfQO&Xh=nOtBkldN~So=968v|9{6 z(bpS$fZ)ZU#PBYbMravN|CV@23?V-%X3De~l__%#)t~I^#eGICo(?S+r>3goOd9l` zaD9;jVocGtNt@~QXOgDdO?qOkTqcIVzgr9;kBhNHn^-bwBve-}`vGl

qdi8QV9C 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 ksIEqQSb_FMBK&v6wan+a literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_printf.c.sisc b/lab/LAB4.si4project/cache/parse/kern_printf.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..fda30fe5d8a39a42e931d9ce60adef4012093a36 GIT binary patch literal 4214 zcmeHKO-NKx6uwQCX4*)ZO&Bqi1GOrsMMOkx#GPgd?#gDg87LDS#da+Ute^-rT@Vj%rWUz~4jj&V=iYnH`OeRMGY8fibK01? zePEL?W@plvr6&o??;*(#KQ1*<_wd!DX3DkZKm98iVC}bqTLEYWd=HG4Fpc0kFzM-Z zXL5d~51nDm5%kDA@H};=Qrs3&;Hl^Si3Te9szn^JRPW^)NcvGP>1_0j-)hBY9C(YT zA+J1$_v_$uc&9Ddv9hJ4 zfIBT@n}mjm?8soNN1VJeZ`mdX~RLFJXffZn#37(RPq$BCl$`*7B)A8D?ehyS3oA1Fk z+UM~tUaI)gr6VT0uEk9%JI>D9>~N9cl+|XYGnw}{5c?qqZh)@k&9Mds#1>Uxv{vZ` zg4&Yy@r8cmy;g0wpID=*Qp&idXVhc|-$ms$kvESO4Iamu0jcJp8*8=AEhLZOgYbaehG9$}BUAaQz`)253k)up4&+qoK z15!4rOGj+(y%V3i(j?GMVql~Pf~ngKW;!W#J4gq;yGyYaryz)hSz(l?W;>IqX?M-? zy32tN&vhn`KlAO4?*aoOGnT*A-nw3ueo43tOH#eP8J#1duFK{JMw$C)e^1^;f6qFw z{a7Q|Dd^1e5?H0|Z-QlSNBcrO19jLx)xqk^<9e=sV&Ke$!dQ_pNAWHL+sd57t9hP> zZgR0S&zxh@YR|KNKS(kLJp+3y-$lPW&;0$tgOuCA%&~Oo$e>K!jL)8`{_{My!v^nH z%8g*!l&<>l{c@i9J>oo5a(HP{y6PrlVOE&uWz6%6|6FOFSD<_F(zQ5$j;-cAEB%sy z8kVGbi&vQE4jg8E$)!}d1Tu-_jAtEB0sO+%@_J*-uSmx#tyf#q{@>Z7y;d@2;voqe qn`05*-KpMojD6^*<5d8q9g|Bk} literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_sched.c.sisc b/lab/LAB4.si4project/cache/parse/kern_sched.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..d0f5a44360ea52c2a9380de8f03266b66f76538a GIT binary patch literal 5531 zcmeI0&u>&!6vwAS2irc;G86*TA0s~tNEiw7BV{U4P&Sg$ppqC<+Rk7HN;~Nc1mmXv zfn(yzXk-(O>_ z^J`6EdSdEaE}uFmX4hD$l%FlfCr3_dk*w8CIg_Co_;zL_u7mHds`G@us>#fS{d;BO zl;q4|2XHjBVYXXCaef5LRSFd~1oW({+c=Y-o!(U{7N)0WCeFyxm}V(7s{ltsOYrTY zF|Szf`?O8~tRHB$l%GB?BjcJ#2(6Bs8|Mr?Ua34bTOQR#R>+NO zOd&UhbV!r{$gs(D_UaB-e@nPF)wBcOZ@I@#&CI3>)8#@YJzO|=?8vc~hYLG)9Mf7n zM_o>@ky`JNq^AOv}kFux@H2eZdf|8ogU@lg%OBD#{FKvS@{}zqHo;&I+k2rB_eC7Oz*Ql*t^4RLHVbRTgXE zB`b68lFdpsH{9!1NReW4 z-|m}7odY`306WA1JTD}>wg*`hKGc90*FE#1_S)K)no;%`zvR~z2XOp=5J#aTnWC9Y za#grJ-1)4GY9S$JgoOLF5DREES@hDX>4Q>Jb?|-tw;=@dB;9k^^cM2Xit1;CIQpCr z69izgsENw0RulE&I9L04xiT4^T4`{NFeiO1I;0~v^z72VSxpaa0yU2FSIteHx|;M3 zWr8N>vzllD_OxE7L%SOdMaWUGePnk;c(;aP4>4J6)z6b&?7IP%3v?o1%p+`iEVhe^ zE&FwIY*oopBaPTtONrXW*0XEj*eL5^;bLRUa;fZGdfhh3#z2VVmAp)Z6yCMqF-lvKAv=Unyuj?kFKeyf95U+HMPri97Q2;)&Tkv&~;PiEd|KzqT!DXgN-4x TEu^g59P&dE+4hj%8Ik=1+yfh$ literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_sched.h.sisc b/lab/LAB4.si4project/cache/parse/kern_sched.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..fd9e7744d3c7ff7c4779c2e0f428c026cc7faa80 GIT binary patch literal 1887 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_spinlock.h.sisc b/lab/LAB4.si4project/cache/parse/kern_spinlock.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..3fbd34d7bf42af3fd4a295dcf5020f84a3599295 GIT binary patch literal 5818 zcmeI0OKg-?6vsbH!J!=(9!1MTGdwhPp>&}MiH0C(EoyiO)%r+AY^UjjIy68H#tp_- zbY&t6Ml^0nYJy9XZcH??s5>{9#<#Z9kkzFnk1`KGu&)slT1f0Iu2;z#}dB7=Ih{)A+wcqpClhrkaCs7Ih@)qYd*ck#n&e=U7Y^H>jt zyp$oP!wI?6La`mrt;xo)cg>Ug57qYW+fzGqVDG-C_wRYC*8hssS}k*jY52+#w2>>t z3z2i$cPTM{U86ZPHZfeUKBC6 zGsZe*_2m2I4$C|rI7iF^fxV(7CRmPF8^u_P+#&|ebmSnW)|eD5KUzQDtdG?!DrEjH zG11v91{cro78hyyR571mV{`cJ1hf_wAS#S*6@z`h7;JRg#6=o?tC&lo5(?2rB?LP~ zAJJGjf&dwcWxhwkSX|@IS+;`Z>l-7@;rd8*?ul?jA7hEFX1QV|bjadLW`%~7U5?;D z_|erEVWHL?`-}zvvGa)?3ju^~@kR1tWs#-z=5S*KR5sjpG1MD`M?)7-V`GCZohH-g zL#4O~r4?C8x60)C0l%{k3+!)kw{(NwZSDYjHr=EYF_XAeurWTF)%BFG7x0+}Eq1G1 z4AYY5kXrOm5Z+E~g|#ES$JSr1eoV1F&gB~v8P55n1O1J?SVcqO0QgnES zoa;_cAr{5qe(8RT90tG~xLFRzRcP5oLO4wO+79P?0ejnrMvojP195gspY&C(ejc(* z`Tr@N)I;q zYAB<5&gx>(l+N~5N@)!3SnXF_zf6mUKO1gk(U@B%@x|IVR5V40C*|BsdXLz#IwRfb zZ+DiM%Oy|!*=cdJc8Q%byxQ3z$PHp_FkMycm|E|V!m-MOuIOyHvO80_Lk4m7Qtm7j zgTssM5UTxKHLPu3X9J@yLuNbp~ MNRV9Ufgt?vKfaD?a{vGU literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_syscall.c.sisc b/lab/LAB4.si4project/cache/parse/kern_syscall.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..eaaf1cd7a02417751f79f6cedca79092a320ed29 GIT binary patch literal 23722 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 AkN^Mx literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_syscall.h.sisc b/lab/LAB4.si4project/cache/parse/kern_syscall.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..184330c8d139ed99c35804476922dd28f4896855 GIT binary patch literal 3963 zcmeH}PiS0K6vm&^){b%7u_e$1U0kYAU0K^&1T`2+hs1`oBrQx49fr({GdP`;nGDp8 zq9{bS*6KpgO`ruAZiH@X{ZE$NRI(`OGCQ|!4w*ew8k0c0~4;0RBuigc{d01`|cReI)e}OQpU^vazD*;9!lM4!(SL zzINvH+-zg=Uu-ScHQOf((B#&rJn0Gm-_97>ntt1$6K9+cE1t2*7D(o&_FbT z-X@tb<}&^{vqRbu3pj@i`vnc2?!DPtsJGjN=7fsH7lpk#_BAQ^jM05k%VXpH(uh5X z+$xB@7%#-xn?NsWyeD@1-*zTz^Z9e$B#KnRiQpe^Ep{5=BKMhlL$W11-U=}kBH_d4 zBUu(&5`zO6FPuG)i*$NsPF`4A^B6Bs@NFN#PQ=;m2|JC};=E3ByR;?paBMspzO7J` zE#5?ty-89j9@UX(w$ndVr&n*soqk65aakPK)ah4#KUXHi#)qX5NN|pH=yc}UPSVs1 z>n7~CtKP2Dztmnn8*>V{D*c1NlB$#fWNO%EhClWcDH6=18geEe8#`J6WM z{NPba*vF(63!h6v1Z(e>>?O1Ue`6Q(+|}t{Ix9b3u#O~Fe`N=l_*@3F`BuJJtVm;= zLj4&axo#ju)7z7>mL@)zfh@k4PcsjB3`hzN$jQW>k~K(tE(5vp&URTI2a;+7ayGGC zutDN;8OZC(GR=$2OlMqRp?(5LtGQP+2KrU0LE>{+$hS))>5FUy`7B4XrC2Na){s7@(!cZ5M3H>>mSJH=DwMv=mZhKOAE#)kY*+f=U62|rD@80qK*oA!s&gQl zOWddB*N9u}CpDfYJSK80Il@!&eepv|*b*NWVS0k}v51X#gm6{lHj3zy|ScE4P3zAsG#ydiIUF52{lD?w8 zKAI_M`j@gE7Ge7WVi5>4-Vwr2eo`qHzuEl4W4eUjzDr*iqLlTp2;27=i$Iw1zaspE z4vr>jA0thDkJ6_o{|ljzM8@>u#r5&z4|E}M4{W^YzTX9pMJ&W((jII2r)XvFQIAJF b)@YgRo^|cH^J2WmzW$c)e(g2kJc92pEvB-S literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_trap.c.sisc b/lab/LAB4.si4project/cache/parse/kern_trap.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..3c3fc3290a04e664baa99f07acdb8efc9aa60782 GIT binary patch literal 21438 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/kern_trap.h.sisc b/lab/LAB4.si4project/cache/parse/kern_trap.h.sisc new file mode 100644 index 0000000000000000000000000000000000000000..74bd5a4a0c92c5f4d2087b83094bd89c92c74cde GIT binary patch literal 5324 zcmeHKO>7%g5MI(GIIfG+HcA3TVjKRPa)3jTB2fZ8)TDrDNK+aRurc0syscwfYa8`O zL9HlUK%x{59NL@^cK#Ve(xAWec zc{B69A3ri^81shFKM6Ma3}bb#VchttPw~%?xpir@&Jev+329Lka4H{D6#44<`U6gP+pJZ_;ip zjN2gTN3bMwqjQ3xN<4+doEiW=!HdvbgMl#^P2l@8^jY}+Bbe|jj81~jfy)@v1iy?v z`h-f6l30M~7zo1Zpy*nBKOOdQZu;qC$E|0M%spq#&mEq%W-dX;7_l5hN(T1XX5SsU zYt#R}e>Bw7{!z#CDxNtpUvz6G{&FT9nx`GF?3B!+ld~P~F|$!~JhSRmmb~0@&8!tG zjgoDaD|Pc;x129EY{zu#6FFF;MJbh%!OGZX2D-0|SkOc}BVzjy8V}dKT(z$_y@(FN zWe7}CGH}B7W=^OR@_n2;0ny3c4kydY4fvRao~cZM#{zjbB<+aqQM9Af>4TOvv9-gs z>&GEk_FZ6X110Z)@C4knc+( zb?t_jX3H(R^;a;2RYPtSQSJlNGTU*>E9X+l_7b@#Wu~?~99p)jj+d`CPQnPC%SNSq z089sLivxa>GH<7n3{}YY)j6R)nUQ4GbIWzhbCzn{gY4X+I<-82Hce3%H{EllVx0ta0uEZHZfg&+ChcLsDcf#= z8I~IfRgu5NB|$tzSE#aCQQE8{C9$@u%qo$7TRY z2E-JqjfATX&5o;%-z2Fd+ng&E-Ri32_~(N;0(g<^llH+j45{u|gYQd3+He2s71xdj z+r+&-^L=NqXAta@U$=v0badE@VC7^I$)KdY?O>VxXl2(C?9>lB*e}q>m&xzYy+1IX zl*)2%a(8bPtW*+1Rh8v?tI85lB&n`!C6Vlt_O=72Q3g!|`vZADB!d&3*?tBXt@A17 zC!`IK;gKDOOakz@(9~Ic5mUK8#-TgAHm#m~ybT2RO5URV!AwR2lK>fww2?tR4?^mE z&Z%vy`dGchY@=43L%?y^6hF+SuLc3HVBnwN7IasJ+OT07d35&*HgZdegzNB5-8O8F zVKRfJu?GV=3CZk=&Wyt5-8gKd-uk5Js~0wa=A&$S;X4hQmtaW~rowXezHFZBuKV;Auf;e51j` zM_ez#BhiV(a>I!K9q=>}UF%yNv4Cd*x+`zA!NXgM)GP3eXm{bem!G2h+u)%AzTGJI zgIRjfnGx_b@#_d(A#M0|6z;<~c&4xq$Ajlwc=AB^TX0?RdEQI#NOU3@lC%$Yy{>My zUG57k(26`mXqA}|=3AL8Pr?OU*sJgD?8qs$bI=`1%=jnN7uJ(jxIQx9_UrIJdvc%h eFEwWsqGJ|t$6kM2kCAoD?*cx)rD_s0b$G?%MVk-DYtX&eUrpfD0A5Qeh} zPng-EFzc;5im@s=I@$pgg!nxow04P2N-e)GjI=$FR`0O@KSAx@=0>e~yQA59r`885 zHphOLI;Uaf`KaTZ3fBigfa6?a&HIH<@5joMO0l~g?Z+?a_JmFC$BU^_o_N8_LY_MS zMY138>3MJltO@Ykv3uk8-MTXQzhZ!H#hHo;tPFzYo1Yt<<2=Fses#r53U?&inI3E*b0rVxL0>6}Jq)5nL$~v|E#xwNwtDT& zGm74L)jP-8U|hXy3pF1X(laPqLp>(@t8M8l=_VB4Ib$j(A%mMzi4}+ z)4r#f?Nf{h4r}Lgur^t)RR2T&r1IsH{zFKf=;%(`rmI|gHzFGg$g68$lUOi;=x_bv B%wPZj literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_exit.c.sisc b/lab/LAB4.si4project/cache/parse/lib_exit.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..6bf2a4c73cf3c97329d9eefb5215b80b71f1f05f GIT binary patch literal 1302 zcmeHFJxc>Y5FO*GXE;3}3W`k%3$09HDG{5)R!GEB^a6Jfv{A9q#4fELg@tX3`~V9( zK@0yt#KIq9cfPlGbGL$EFAlt&*_nB>yR%ap7iow%D}a0`~yMK*|6{!N~hX;P<*spPNTuZbZcG1pd?YrfU+iCCMZj zq<(HS&YBdR9h5NV=w7)t#}Kk5%=8{Kxdg@NnZn2Yw22gpT{B54d4OkE;=_aXN!Y5c z!&q&{`=zM94L|RzcbkCCx?_O$1ZFPojmLK7k|fMZ*<790S$xa_c2n=Vf&bb`o7zN- z58S#8{MvKfW$yBoSJtLc|I}2tjc6V>@6H~UEO&Q#_Xo~GKb@Wzx7JsOB9{AD5qWKY?#h7Z^%$djZ MRvT%K-p?N8FZ^(8EdT%j literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_fork.c.sisc b/lab/LAB4.si4project/cache/parse/lib_fork.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..b16393ebebc7f9afdeb823975eab5b7b86c0b879 GIT binary patch literal 7469 zcmeI0U2I&%6~}KJhZr1;fq*FC!wLa8FRd%lClbp|iegccY=WJngw{6MwY{xbmW}N` z@MRua(L8{WP=yczClEeb8eD}UkQ~VmeX!J*l~8yA(MX7@QeSu@LMpfa-^`rd@%6^U z7LgF@k0450d2U-x`JuiMqyk2~TxLFL%yj^W8zuJQ;c|tjIMhP%0-Qd0NwW2dh z1NA<0wpD4B@JQd&>#A*<=BOpeo7?<4mPM!N^q1+Km84La!Q{xhu>PM*PSPHv^??JJKA4^51XgS$?=Lk#Y(#9-Vk-YGURtc3%O zaDDiR$@=_6xjZyd*rzsrJ`w<4mIU{Q;!4oP;?2+JGO5_CSl#Z1fZII$aOF4q)xgN( zPMsvLO9IM5CxR{(ouAFM(r=Wexaz9{&~-;arI*r}l8?yp>(#dNFMjUKVK(|+$wm~T zV?|tbIaS!XlfLS{(!fdKl&Qq-S!Y$}zB8@Z0^=1`2VR`ndUQm;5$j+*#8@M*S^WE! z9$ypa*OL1s`$IR|!&;V3Ch4}eQfwp7MyykB`zZ44wrBF;Vm_w_`RMX-Q;@evvJg3n zuEUprT1m2?0Jui@NmFyngRY$zAI4C$Dj^pnBsmYJ>9nboRYOYCjG;sMd<8>MUoB?G zkT;0|HQn-{8AA(|${x)nyRL~OI|ZicvY7N4rD^>M^feW-9fU37%Y&qV8E3jIBH=gk z+3ue}TvsSf7W2%Gvvf)sIe*$`>0$Nd#naMN`xe{*Vh0KF!WyzvqG6WCtFw+p$ucy~ zATVM&s0Zd)qL^fiwUv=zJ-1s-=JL&DN(y#bf$} z+N;^D1%hTfxmnUs(TQsnI=VlLicOxtX)2ejK6mMnc}S8DNYgE!`2cyMwYEH702A|j zBMCN`rpsd1QP}+Ylf$eO#&MmRxJOKaA#W6eX}T;Xb!3#L8P_L=M%BlDlRv<4U^9q3 zGo20rEO*p$Up-e*q$#JYC(PVb9Pa3xm@JPUE|-3J2bYP1TOWH&nx>{E&Q^fPQ`Wj) z%vyxWbn#kmYAwbYEje2YV@C^g5{oGzA*b~=J-2t|Z&MaxzQwCc1)9wEph^yjIj7pC z>)GYcDZ7|352sdhPVLmZpNXx|)m%apEo(5=iUAzIl zrr!1b{zBvMw@3cY-&6OO`NU_n{^F;RU>Xt$X#RGnjgLsk+ROV}%T;$wv`mza7Dq}2 z{8_ZYIXO2Q9Hx%}RW?0WcbL$Tq2_RG{0q(XQyGI}B2W;UheOQcxe>+5JEP=n|JTZs z7u+~`zmOm8@A%E6&-tbe&PAJPVQS>t4bdCtLcUonF4niId`sS4xo`Lt`_`kkX;1L& zQ3V>FlD{vUKV7@#+C_-{qcD+;?2NC2tYQ21O}=p;K&MC!1?Wrhezm#sZW0Jr;8W_d z;(dg{B9n1j$-L2ZhM(BZC0}Quc8kNSzgq?j`q zX^}MD@~Euu37j<*5IHb@D<;p7*v2^1Wf2Lf(UMDQ5kzcbHoJ%1AT~sFD?y_TRxs^U2JVV=h3$s^!DvtMLn}Se-N{4(_*k$&vY?%?$hdFZ_?LpN4c~;w`))T?#}+cyASnky{lZ>mfNMvzylgU$vrP-0pw;ePSNJ8Fb@0Z zKj$)kFkGb(o>=Uvf$$H*z(o1T(AXF~@v)K9vC$RY=k#$T4ocU4uRrejLx4TQaprMs z*fF5TMTCtpS%7VPT*C1<+ObVjI+CX|Hcj(d3U>@_A~tO9rLqZMVw+~P{(P{BAf6D< zDo!&WpLX%bCX$52Fq_nDc)T*kh;>#Hr%{b(&M`4K&x)DPfn>Tk85cgCbNi)kM;E%7 z=5;ac?*4I?zntc_-l1G%LL7tkzv_c6voAff(kWN4fyB2QKwgSm0XMd3O6w24*MrJk zDahY0**Wv`dj8T$4kK4{AHA6TGR_Pd!1^F%D0`6nmqY=@l9&3kA2 zGze$sm4t)47i#Z#93>f$m&)0ku(9p97%~~Rvd0s_U|JdmlNnGUbx@mp-t@?{STU`4|f0n literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_ipc.c.sisc b/lab/LAB4.si4project/cache/parse/lib_ipc.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..fe1ff75542e47d1d611aea639be8eb3de0ce3b5c GIT binary patch literal 6523 zcmeI0O>9(E6vrP0p>)8sLP04XBe4|>NG*P#fGI*FCIVH8*0`8TX9{CVJGQ0bZk8^) zaKXYwH^h%^lq>SvRs_ zQNFLc_i#3s-lEQi-u(WmgD>vW4D@0fv_=iR_-cuokzqJms7sj)9){JzD5FHosm>R= zGXuHqVH6{1QG;GqLorG>su|%R=*Ypk6yrt}6%Xe6vTtbyi(ZXqD!P&4`Qp1`8O)Sz z>a9ze2a$*20wJD9H!^Sm7Wd@)vYA}pFhb&8)QX5JEzYfbav^dQBHzhJ1+onpA_Z7) z=nDTdrh;EwdY#b3rP9+b-K{GwM`?6&&>4xLtRcPN7S55smzB~`)vQG9W1%60c-PjH zCdHl3n6u#t^>gCpJPW^Zrdt1LmksgiiTcCPIg&x_n3wMx+SrmAdRu+4V9!G_PmALt zlj*x!pAr3ZpggUT#76IfJp=uR2vBBlsDB{0M32swZFPFC0(*=Y01XFX^74cr{6pW zBGOc>V#?V(#@PqUAsnm=xZ)bdAxlfrjSG>^sc8h)pj0uBOnu8;W!anp$`?dk07FMk~X)DhZMz;P*Qi^^wW z{=B%UM3(kdzFTf)nM*0)ly02ztQyMUR=Q0lxt}7Mkp}9 zr(bVPk0tLpW$2|iLm4AO+ZDCZQw=F>;wr$CG>o9$TK&{#P`I2#jX6HC9>U{W)qD>l z_sPFYT7~VymJJITM`uwR@AM~o{qjBijBM6P8@=u_k|kgplPvf?!4^4I@=Dmo?gHC3 zt$j)DZn1R<+mT@U*zl!~txGt%t~zYI&}PdKx2q) z3&;r?_Tyz<1#oM8(@JT2u`#vjxl6cvrl_>lOl?p>@16FvapS&8qtTVh P=MGQC)dFpEESmQ(P~c`R literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_libmain.c.sisc b/lab/LAB4.si4project/cache/parse/lib_libmain.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..29cc64fc934906470f61fab05085b1d94e2118ce GIT binary patch literal 3197 zcmeH}KS)(^6vuz*GapawSxQ+JJkqG992y)-XpuKsC^`1@N$-Zf$W&}8m!Kj-$iSgS z!P*0Da2@rj+9G)DA{D7N7> z3tNPiU;4?Zs+u4b0zMk1CkkF!RS%-ZVy6&#QixUK#d=~2xHIs5q(Z=I<5bDJJyxE% zsxw_n3yBQcEkxINwe7~iV>dJ6l?#)1%7uwBLPpgDj_HiqgF?L-6|h3&A5|BkQSt;8 zrLOu?iolI{Hf*a;`?HJDurWPgUIRGa(2>F4>f=)xd>~Ie3>*ApWAzz;+2jL1Ah6xA z4N2xzAnDv?QS9T3q8rt*az5`|JKqM$SbRT@0{^L*n_dy4B!RKR5w(IEFBi5b!fBE8I)q;ztH%!*{u0xG| z*A(v^&TMS=YVYj5F-p>QR?_W!8*FTFRnp15W!&EBb$<=R>%6RjlFJm1g5?t;Xerx53vFkH}61)8uD`>jLBq-B8SW`y(wQVhB6jB I|Lz$425xFYL;wH) literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_panic.c.sisc b/lab/LAB4.si4project/cache/parse/lib_panic.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..a5ec9585b83e074f4d1f1c64a9f01336f53b2eed GIT binary patch literal 2435 zcmeH|ziU%b6vwY=EHPG7X~FmlQZS%XwTd`Iu}jEir7d*Rn55)Ej6te6D0Ol42exjm zmDXJlTsk;(bg6XkkMIu=p5M=V@8rD%8nbi}zi@KyJ@?*o&-a{jUoMS0x8Pj*qQs?~ zTg^DP`#BZJ4{2oM=k6G`jc;4W&?D|Y{*??+`%{uh5n7jgkf;q@R+5&0r|achW_2;g z_^Tv;$hl3~w%^UFTVnVTnp?9OZE;L(6`#O*hjnZ=x3kGJ>`$Vu$vp{Y5fJF{*v9;L zuoC|yefs`HcY(VnymqbixZWs~G?;FA_fyTA^Rg40k;`k0-xHD}5`&RzzABQgE_{Df z=f{FMcZ}ZcRNG$du!hOBW|YDUFT%8bl>gt7ylhL`Q(3O7yeVc0gE5-4O7*0bInXQa zf_sKd>%5#VYClvyMIP=*bEnZa&9aTJI!DKJ(VJpxoG^~`lZRd%r;s3jQ~-Ta!bN5) z#Qt68b$?F#oGyE<22Np$gL9Fdk~XK<3JIs1YkzUt^4g6#9pWyWPDgr1+MHr5B%D@W z7K3uh9KiQ2`C)J)%MVs=YlX5LmEaeR;L~hcx9rLqt_1`A_&&J{f%jCk!_j0n<=>Zc z&1YdZQBfYtb#>FN%cV@vJ!(=k=Lls`H^rBQ`;E{rkJP%yifUR{b_=cUIm_HIuzPCF z>Z5+L6`slSknDoIKz2#Cw=*$Wf<_LKEWJW(khBIw1G5b#YpIQT#cQwhbKQY!^qH{2 z?#b4<5_6?rDcV7DO%~SP1scGW@nEh*83NX63VU9I$w=ZwIMxnCYo^Q}=Dy!xbl^k7=-6O>DmRqw)Zkox^ltgc<=fhU z-{hh?(#_J?hO3j*OAI?#I-q0t{=s-moCo{H?+p)3%T`8(p^v4MSbMuL6g zEMKAmux9Xm1snl8so4I=z*sInG|?}TB$HgwCc(fV$x(^HjLvpsb-fv8>s6*9m7-VkNJSrMQC7cxHY9Q_lcxX>)3@ZO4t z_eXP3$zbQ`u!Ey%2Em(NFDE)LP?!;up*cokgtr7~r&cG!> zl4;jh5ov*2@t9`W#(NIDSBH5Gs_%HDFG&-OacSpjG!3xUQ`%CN`!E^RQKetkZjy6M zLITiy60mEW_}H%KBKST#Ltv+DVo<-N?*uc+X$hWV!njijix;w`z0;_jA+XpuI-D-; zovtq0J*WiQgo?@=QXbkfK!uRnm1osB*!<1xM(#B8gyRfnMq?sMNBC9{O z?XO|dSj%yTxQt&&8hc3snr{xy0!`iWTp?+NdSa!JG$K7Iu`{fdqA0dc-QM=2%{_ll z&&VhrC4|J`PkW>p+Z>KqKzg;?8+VKGrzB+m%CB9SG`<^`TrV2qKd}Lelg>{oU+tBh gq%eq)H3~SnXHIXrTovxIPZ@bIST&MEpgwoM0ApABF8}}l literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_printf.c.sisc b/lab/LAB4.si4project/cache/parse/lib_printf.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..64eaab54b7f067fd1bc6865e8cb49a411ed53c17 GIT binary patch literal 5213 zcmeI0&ug4z5XaxdtXX3;u}y0Hh1;57J(M=pmIz7IOUOm5(n3W-vRbme@t&~Mi7y23yf*!;(L|V7)%ccpM04ZPf!P}7ob0UXn0q+PnTTzrX}77J zPu-=d{N!BWTy9VgN6Qzc&&@U$hp{4K&U2Q#FoPAIx3j`JqsCTd%Z1W;S;=cT=VE8& zWU#{X&Q=bXL5FjoCKg#4n|WVm-qRvdOsXL#gBhN8HnZRD;}7ocuQ4-O8kdbT(r3iF zRa|Ot4BS}9ff{8$?lX6sDox!HyJu`ua-mW-d)LTJOOD&P>mh^F`dHa(czkQ8B3P;y$sFp)M}wIV+!}CkosccG?8->T?a-?KNDuc&x0LB=!`{Y6 z-eH^uZM#;L+L2*0zzz)U)T(P*L%h)IV(d~W*hFGC);*$eOto!kR)Y_v!UC8ifGZ13 zq+yz_9#cyyl%{o<`KdCPXt@M9cO=&Zewyx%FjbA6n+m zmkOu!faCO`^&=gGA=Bl2jMC`g)B2`ownnIW%PVhpB{w8w$xjoM_aV)${S|aRAyW{j9N;v`m;}&YqR>Cm9>nrrfMq zOHP&RV_i^O1K}EaOCZF$Cf&>5Rbw@jy^NJo$G5m_C>6+bjbp9k-<4nG^#eeh+;t_l z7y@R_C3khCqw}X~zyxX)Msh7#td9wYW3q#?^>H%db>PQ7tzFiAbIBLns{;L9T$G=O zzdl&GZ+NTNn+2b+y&eAD+&6y6UKh(ji4B#Mc{b(MsxAH`1y|aa4wu1 zWamc#ZtC-@_|g;ZY-|nsnl(DVUxxe|>(3#80__WueuF43eg#0!c;Wu?%?us%!hMnV KhUa5JBK`$0LK7_j literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_printfmt.c.sisc b/lab/LAB4.si4project/cache/parse/lib_printfmt.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..61a63cf207b34df5129ad7267021c42374d066e3 GIT binary patch literal 21856 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_readline.c.sisc b/lab/LAB4.si4project/cache/parse/lib_readline.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..7d024d0371a9378e7dea3003569971ea56099481 GIT binary patch literal 3646 zcmeH}&ud&&6vuDJG#%5?6l-j4{4toANfyOa3T~2sf*}hj6&uW=i#9Wp&PbY+X-lJ2 z5EaZu5Ug6XiknIWw?a2vsW@O4*;Kml59puJm9O8=z3;qt=OvoDunY0PnRD*B=brOD z_nv#-O!hl>%(=b^u`4MT6c32|#L&WLvxD8Q=LgX@b~yK<`sCWB*}+fV+J{?4NlNb9m&>eWXp>svN$uuI zVSFCzC0iS>NnO1d(Sn=OmQv#djTfa8r-%0BHs&7fne4@sBtzLOIELCQ_2u)8W_3!+ z3un(Y+N-733|T;LnY>K1pl_8$=8XP6OS98i?I_C|@&|+MhnHy<^s?CYPUccGx+tRYozcBms3Gu=LeiCp$C& ztp-?H6Ujc2$ZXZn3$h5vhsB-EVGy+cOlS4^GJIIf{vdHAtl4Cz#WG^fC`s}W zadxzc2!2+x3<+CAZ2u@?{a9GxqwG$jJr+g8R*Wc9MoE&NFc^0=>#f!H$|>SftFDqq zHzLUvb1-I8<7TyY->nQVZ?q}yg;smHSv^Fhaj#xiUoLzTdX*k&h`X|#xH(fM9+v>g zuK7b!uS(srSL6KTp&n?vUd6}y(%Qu&bEY45?kUDb+x8`(<6>{CusfGSu^$WJ4RKkQ zb#mtcUnIp+B+X{UQdFEsLr?e^k>`GkeKTD&q1-=7=kBmsG!419Kg1%Y*?JCIk4KDW z(*xRGs@A6_TUu`6=x}{2eOO?V0$Uum^>*<}hKEjWe%-Lbj@PHBYsVLB7cY8c?WLvK z#8|0RT1{v2HI}C}_nB>eQHx8)m_(5Ts6Q=dzKItFf#xFT0u&`JE7N$|f=Ea8XyruenvA!A881@(>*VJF*@Auvi znTurZMSF2;91 k4H^x?|2?z!;Xq{LafF@-!u#i>7n z{-3k&x!3nfs8=64T{G*heb(N4?Y;JT?0p{6_BEBt-b!WlMZ(I;N@dSbrSkNjtW5Do zqTrYQ;pq+VzVxlfHbPfb{vZCYtN^xum9SR|JuLjJ@LXY4xLOGGKfHTW|F7-rq5PAz zl}cTuiBIj`wEc%yr9Ak+e1O_xSNF)3((ANBKU@QS8L6xgWgPpG`$9vL26C&e`Ze~0 z!he>}0zW>jQn^QXnXW&m$-YtLZK6*Lzo7x{knp+&e!t4!SNWjIUsb=?s@$jY7V+;> z-+kgSAI~wRn+qOwX9#16=Q%%rPF^L^m2*Z$_wB!ZXgIk-g-gc{9~v3Gb!Bbm9#tXQ zYnIY53}rBArcyJ^&m%koN~^BE{@vF@h3hhQWs4}&Jzcmy@F4Jjsk=6~X?i_BzeaW0 zsK{BP+3p`6l~<(J$18wW3oZ8Sl#~5<#i}3Nu+C*_=I7Toh+QkOqms*XWu(e$Xe9VW zA#$11YlQ~On!RtsxuF(?81q7b%zJqrn79EttQn*yVh^65hQcm_`v9&wP)1@~P zi^Sf1m{mZ;4)}tdLd4<=mkAA?VUHHqLr}*mtgLKEo6#m+1x**Z7<-oxc$W~l8--U3 z4VF8gRmdin)gX6OFuCRK56ghzuL%Me$IEbS;6Xgc*$-@3=NN~dt!`-$Q z2yPT27Tyg)gQr{j?XuCBZtCr+(XwT@?I2deNB0E*?-xZbEr$XR;^|I(YQwtB^jT## z-A3QtS3AUXS@Y4XRpoY3i#-r{5R0uo&^+ChQAjY|TSi8Qm@XC?r?cQbA#%?W-YGPA z8S0XoO)jg+rmJ`t&}PkT!?%qMr%r}LJpf-YB}DA`!Uu&0i=BO_*~wN_ej#l}o3#>q z+kqp)Om~y;iL|CtnHEJZDm)o@aB{i#ZY?=4p@us(O&1;hEUlRNz58-JVZvZORO;r46eaLV}$5G<^mCB19}J z{v)BmVrw66UWGW+Qn6V`VE1Q3|9=xjEX(y=;6W_5`q8pjGDDHaSOxo7ulhY7WSl3V z$bFOWg}{SY?$pQ2tGh<3ZA)9Gt03P!d|*GmK-#_|ttea=(eR+GNDQcFz;z9&*pXWj zZ9dnD$IkcVQ1^JCh=bQkEIh;fe35++yLx#4*zkK);9&5*(CYhv(h*)~p+%}h=xM{F zLnF6PS|{{?Gdj}L|LDD`AI^#Yl5j>xnq#N+tz(3qk7Y>#-(fZ!Y2e4(zAjU+OfDD) z1ZZo>IL*J0ibcZOBSb!P1We=d<&_G)kpr@Q(R4N#89jWBDoJwWSgZ*}0OOdKWa(BM z9qE3jd^VtE2I#b642hJ;A*?bK&!C-o;%BK|JfM)liWFC=#8IweyUfW3wP2U`s%}Ww zBU`=r%U7gFO3p9n1R?>uh_ti|Z48VeHn&N8A7^$Mp!I6DtFp2^Qmp#L%)_m0UA&Y1g|g}5 zBS6^g>=iqUz1h4)E6apq%TCC$eUCJTbH6fL-^n7J$qO5V%N@=aX-vR0F2CY%euJbC z&QOQ5c}X04O`CHmOrmh6KbCH1-(MSFNz*&3Tu@Ng?z(*kV&r7WCLb~(e@ zj$vwLaiB#jOTu3#bXuE`V&g&CUsXn)kY)QRy+nIT<}<5wptv!}dW$GaaD@=n7{@#Mc#n3rT|2V4_fu^8;ojZe#<9A+6AGB8 zWnJ1$NS~A)ES*`Vl=yD??#}di0?M*(toL#$>#%_WC`)7eWl5;!EBmaUTs@unRMR7+a8qcXufixLzdQa29Yb9t_a~l8K^YXhuf|)ejX`f-v2F6+F zoG|@fDfGB-J_vYR)MnWgc&1#sEVJ}-ZHV=5dJ3GGg|x^LUo9klq26W8OQICkbI-ze z8Tu0%&@ut=;q*2k_JVRc zTM^3e%6kHJhNd;u>G{TyQC_uS^4&t3zeC6xGn9E+gM3?<(wa7kWvj~ow>e!8?6KC) z?X-#=wyyjzQA&{G;%)v;7DT*zWMqIDb$d6sT4UIYyc?L;K4*~GGC<>&cd&CL$kNs~ zDP_0+RiP}MS?1+Z*6s}jP?qwNm8~ij&3-=H=e-*YhG9KF+SP`GzEJ%%}2hd5J*s+{aq=}{r68r`lD0;X|Ursz#8!%r-? zDXm6tnXXm)vxHCtFphail&U6vtDLHf)n@%x9As9M=uOgxUMRFgcu6F&u8&U&87g8vY;#Iy; zD2tLPyj;rKtWdzFUbM1AMQqtQS#~Zc`wp4!1>t~{-ShS<)AzUB=hGffb;M!i*voa9 z0=t00iIVGuL>$q+R~Sbfn>t_`m!)`bS{Z)g`Lv5V5<4BCXA9BAyd;W|S>1-KDuJnx5Cy zW!Y+JKc5lrslU!#n=g@YYmk|AJC42brW!K0hAh0aIG&SYgC%8qeov3ELLB?EE0$`x zl(nNk0TidaWMwB5#}h$WgboR(#5)=?G|HkR9@0%^eRyFG_F*VsUVCLZYh-|7!plR7 zaoXyW9mm7rg-=m_CLEN#C)X4Qh4tcX6rL+==g2IFfpI{fQ`$O_HLLK5l6xhVc3z=ojzk*Rl-5H;K+LDB8|2v@^#PZ?xsoBE8D?SHIM z*;(a#lul{IQlr` z@T=I(b(z8|eK^W4_c;kA55&0L@kX!DXt;#4Pz`;f@qKyO~PLV5n=Il@aKiM3C5 znByoCxp(@25Hmq}Qi(+KRG&Y*6g#bh0!>Nh;68D2rn`kmxmQREK)QLFb1re9=^J^z z6v%+pJ4cU0t9o{E(UGl}UwP&BZQDjuis;y1tMbj+(zDTi@pio`3r@c9XBsRY)9d!; zk7?{iP{6!J1t-2)R<{55b?5wOmWlRCFdOaQA87MGt5BA;1G=fKpHZQhJsb*{*IrrA zGK-W|vU8KJ(yKq{$|)XQYuaMAZz^=fs2I1Ky87+{y&QW`z`XXlGP?}WI^12ri2Zm* zs@1|KLmleQiudBVg}Ml0nXIl4rD8PzZDR0ZyM3G!<95VmJg0GuKN0qVN43s(O3;LO zlRw{+fBQ_Tq@VW!%+X4I@vb9lztA~-LCU0eI}-e#D)TYMwW5!S0^SoI$S(6g(c#iO znaAFlwuHIiGOM5H zAXBf)ye}Y&$MsOYv$9NhNhGr_nbaAYvUt8PJftQYg-}+2Ugj-oUq}z5IP5VYdjS-O zL85tOi8zs=X^um`qADakEJVs9LV9o~U|zh_^yrpIRXNPhqge*nX(KP*t{B?3ZS3OF zokKVj^Fu1Nj|!0<^J3`(O@EU`R?2|>=^xB6%{a0q6-9HUBjvb~`-_{iX!jqG(T{<< zy=&n(c62CUo}y>r=jT?t))Z;v%Z=yfIq^=eFO+4a@RH?HRu)VZgaRl_dCAK5Xxo|% zIn&!#pDdefD3rxPz-}t*Z41Sm8lZrA?UltG8KlN({YI}xstpF)(wJ?lD&Db3U1Ajx zR@d8*SPg))$3P#z?c=na)fB&Ra1ChunQ(JT3+6N^-u80}6EGJ?HNoXEXdlBXofC@} zZ6=m`PO`;Hfd(~5!G+lqG{o788$&|4{Ex6+yQG%(IW*Xe}Xw!5u*A_z6*(q*|y zZ>Ua5Jg=5pC|eT?{G@PWpx#K#OERBOEq~aywUnfbrANUP`E3=wnG4jnRpup;#M%2g zNX)lSdUK?Mk^~spyd;u1@K6Vd`S$r0Nx)1{Tn&lll{dRW&sMiptRqG~DOAsta!oJu z$`V<3L(}$o8$Dy!tji6jOX<0$a5)-Ip0i>v-y>vU@ZxhCoR>GZZkdy|SKVIAON9gX&Yx84tR8 zE1Ht7H}w^|vSheRH+A(^gkBCa-$9wzURP$90a}MUDB`QZkEPmFQ1?3N#NEoYc*%cgFgQ!J{-sZ5tC5VHox@nUID;S_XRo?1s6uOtbhA zN_z!mqcPjMf7y^Bx&@$mA zk<8jBw=VEbQ3&-0V_rEiGMb?&G3IwFf1xHA9qQz5URfe*Z)lR3->H04O&I&z zLVDoO=4pj84^@w%rw}i<&sI)pce@Rt#~- z!*{xK`%`6dmNTByoW`$($B{gL`Y&Nky#DFpZw*PjDCpgVv0KTT32pXq*>NhUdyNcu zyS!jRypu2Q%0IZ=qW0t^=Pm@txk8sIA3R94n(3Z z-7gGutEff7OCpg|5=ot5e!eX7vTIa_l@R%+Kra=wNO(ykvaZBf2*EE=keU6H zkVeehJe{2KSx$VUxGh%`>AfD30wUMnQ5)GmoQz&_N%LRN%qXzyrOY-i-tq7_(Em;h zJ20nir*V6qDN4B9KG+@4nH#oD<8>)E6GGi-d`i5h!aYCAvS2Lqaw&UZP!I~BEafFD zJ1xa}O0S3~mDeg^gGO1_3=iw3vQFbD<|u{&=CxP0Wg4e@oW`f5S~a{{pl(Q57jIAa z4heNp6Jb`@M@q38phz1T8=nB&K2EP$P4>LZxuqfQ4`AW zl1O4*|MgI;9GZ6&mhv>=zX~~aLaRa~ny30aSBst2L4l^F)Ia+hqjT&>eL8;jKhgM( za6rDbIlK_{KW9WqCe!UC{hY?IiR~ojUB1*8qCHY<=8rRF_i7*lc}~1%!dV+-?fl(T z*5@u1v-d#(^V%!xS!O#@tIv3<(rX|j2tT^0%Gi6($R1sw>uQbX-M?Fgb&f`_twBF1 zU|xG&i}Zxnr+5h6FLi6dkFS?bcL@ii?oB6Olb!|n+ooQ1KS$_%h~PN)=rV;kqSlJz z#ip$xG;JXNt*aA(bG-tMoOnX?Wuf!p^P%39OP93_Ofd(>@{hltMlRuYDKb# zB7q<`FNrclkNzX7s&Z(`Ib&E0b?JS6pcjf-BD^G$IIA~v)ES!oWLr7s;Ne4PkFz0` z6D;%+p~b>WBC%5+D^HZ(88E%ozkc)BFi~`x@INBDL1l!Rr~25Mswtr9?qziNR%GH9 zKaD847n$ajW!gQ|MDA2vQCfB6=KXs`aig^of}C^oL)3AkH!nVO*B;#3^dGI&GzDa? z&Cc9AkQJx$fzNCE4-xMpXx}6J$IL9^`G2^K%Th9*ZbiIZ-5zMFA#<;kt1tZ9mRA37 zZBUBMeWh{V>JjgF_(~CFSu7T5xs-LlKmin|ykuo-N@Ue18~3eAS^K6l3(Gn{x~Z)9 zEfjMYLjm*JD_e?=7B5fxWyJnqSR!XgSeO1s!+`|Dq9akd9J=zLhOwZhi{en`l`}zO z!Y=7LG;-_f)wefbQJcv`E_l9vK-;sffBKtzXU`^8Ee71ZQ=k9sc8u3a=BesW#gBD3 zRhv`s-FK<=mJ`!XG8fr)CGy(IY*!bL6_-2p=~TZMSy9_m7p@m0KkDDH-y-C)=cRC} zK8xjB9`saw<2H+FSMIl%>xIr`F*4JfM9u=7yEt_X>R-d`x#7I@JW1Z7jxC)#RLZoO z<{y^-W7g)&x&|K4Ncw{Mj!^dB5S^jxrvvXNfkJpP2|SbjX76@?5XyfSDCF5t{`ZLY zKqx;J@g51~6M^dVm43j?<#B!l@cebi_fk&w^UYAM2TD87|Ng*(+#Sjv36ysJsP9h$ z590lEd&Jup%D)luIO_wP>O5gth40@_q literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/lib_syscall.c.sisc b/lab/LAB4.si4project/cache/parse/lib_syscall.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..120c2f9f626e3dd5784c5cb2a49fd240c5f6a892 GIT binary patch literal 15683 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_badsegment.c.sisc b/lab/LAB4.si4project/cache/parse/user_badsegment.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..dea973bd615112e5543b470532106f3e034b97a7 GIT binary patch literal 1962 zcmeH`y=xR<5XQ&Lovi2S3K5bJiz_VF$`lqB8c4HPs$6={J24CKgy6*wh#%d7f+AvN zVG~e$L97%lEJcV|SXt%2SfAhS&EDP_jE#->z{9-n%)B!@AG@&EtYua`CR)YphwfXi zD;d8^!p-kn4Ro6yUmieC*?;^i9booz;$ao^M0_S{4XiF!MG)MH!{Fv}$oZ`}v&U>! zx_6J40(6da2z$O1$i=w2jhMi92Rk~y``hvx{LAR-azXUB*s{2XMmlT7& z+y7FnzJk={gGB<@{l3$cv#MxPM50{^oWZe)=-UKI{Z{`^82q h@&M1thewL{`Sg4i&wX6thtG|TIBd3ZA5T#JfS=7gxOxBp literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_breakpoint.c.sisc b/lab/LAB4.si4project/cache/parse/user_breakpoint.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..5d1acfc52384856519d3f6eaa3f81e179b997b31 GIT binary patch literal 1958 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_evilhello.c.sisc b/lab/LAB4.si4project/cache/parse/user_evilhello.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..893f330459cd7b749c05a781e1105cce05e76665 GIT binary patch literal 1966 zcmeH{ziU%b6vvNgA|Xbf&_Yw{kikJG9UL6A*yYi&N(&v0iI_l*P;3{e)&D?h$2u0O zyYO&P!9PHRN(Lt<|AcPO@8`XDl4~OB;v#!;dif7(Ea#S|& zw|ae6VOI~I#L?hU-c{NJ2hu&OG-_n)?$&GEf;IAIU6ne6Pl^qBAoyKZS7q}mvoyOY zNiMJ2CC9$LV#Y%m;>XU8ZbAO?)`MP$pj@8TQ9P3IcstQG&4$ltX`+>5L0cR5+5{y7 z!Db6NFX=(iHG`ms&&TI88FUNha6E}dk!go6vwYJI>yu#4I`D9g~(VTv9Qoa6PeigRf$9-sx!=sQHfH57P}^X#IIPf zB-l$DiLfA=*w|Do`~m(1yXX6Pcg~yJM>LVxh?AUm-~HZm&+qeQwk~yU*tsQ}#jeY_ zQw8VdUUnt?Su6bH>s%4+$-C!0tc%@$`d2bQ?bnI>6wm|lBeB}RsSVT+p7K{~rEixG zmDs%!uU+I^S=ifqLwPUZpK+V^Js!$S#Idz=bVAlUoP*ik?uK`e52>!rF)??|w`A?@ zV4STGhZO3Jl8LX5GLxxqHOXI2D&89Y^bmZ*GQIrxf3aAxpzu1(5RRX2cHx^bpu}_zJ2sIb((5*oxqtTYRB;X0LGFN$wLhdepnAPOz-bjuv#1J5S(UQGG-UmFW@V z8a;|oh;0bmtUmNzC6R>UxKlt>_C+Tu=bF)YV{BqzV3VHXN46a$!6X&s2(1xggjfs< zjpT0^3-kTXRISk(Z{Te>4;S@C*>l;?!?4ck;xC$qJ0AvhOp>u{SlGqS?iUO53yXK2xYvE58MPXfZ6IMIR~2t{(#Ojg@s_XGO1s_+=DEiR z;s?Y^yw;cr7(7hQAnrpZANuD{I?vFj9rCH%9xf#CX^(um^R`n1q9ZR>1G6D$9{s6L z8>OYM%@zlW(Pyl`A`Ye|P<5(S`t*J<{XOvLPfrv7=|BKy+4Jl^y@wz82$`>Z<)$a) v$3Q4HC85lWWVY`1GWKIx=0cnJQbIOh>b2yv4Q78z!01KD7ADiu+a2ruc)H`3eRCL`db;T)MJ0 zm1fo3;oLcKc`cXTdpDMdOuVQ@l-V9j2uhBn?X!j~rb75Uh9&cj`*?@wCy3;(l7`kQMKA5`xAamj-I)EF_@nz-O)Ge(|*UfGm^yU5%)$qgw;0usyQy%!xIpvdubtG zD00g9#478#^!BrGViOAg6MmjckMCYclI>tKm9z{*VPX;u6JrgrD?C(ZCw8=(-giNP7 z4~3fWw{gz(i$vb!)MP3DWVV!FnDI-gtQ!Y{^ug1xWL_G0MY=cL12vfALpexFrfu}@ zkAxLw9YjLb!Pba0FhtNO6c?Lo9oOv}j&2{2pw@)y&wQ=dN)-H#vQ`Fbwc22jkPW+a ztxbcSp39dm%DF${dMm<2B!dScHusADAWUS2tk2qQATw)Fwpskqhy0umvUBp(Bm}mR fn}hxgW&_~jHY@sb^X*1xV+r(MqDFRasn6&)1Va?E literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultallocbad.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultallocbad.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..f1d041bbb831bcd5cb61c2c9b3696197440fee12 GIT binary patch literal 2869 zcmeH}&r4KM6vwZ>a+;>5RLC-7f(l#ZqD6}kgpyWap%k>~<+El$r+BCcW!BC`WQ4V9 zD`e{e7cGQ>{0D5+AK;%Lw3xo1``(#(GsX-p+(ZY?oOjQ!d(S!FdzqmF&W$_Qc|q*j zojaFxZu@h)=O2>r+RyDAy0vfXhmjrbKm98mVD=}(eJW^G{9ep_1p@&hrj5nX{GG*# zJgc5I=T3^3rQ3Wnl1W^=s3cTeAIS(xj-}aILzYu1{62;yi%rM)faE7kUXTRxN6?E8{)0I^E-Q;Vy{$Qe54ACq1lpcg( zL~wfM8_zZKrFiCdWedey(!Jgs_O}s)(khsA&1P=ckeffGHL2Ci@xPtKSo=+4vv1A$ z6lT6(ga zEbxV)RwV=PkKVHeal70mG28cFLmco>0Ivg`LGrp$i0KL`IA&foLcCTQMRf+z!%32| zAOTMhlKW#x(G^lj2j8_$I!|yKkqa8dRx+M(*+TJ#UZKMG7?HefhBOYdUx?(9u)?f^ zNXR2wUULn{jAkq+4Nu;CS&W$5aF dKZE%IxU^43fZVzk`w#;ii-rHSdrN&rzX40<7PJ5W literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultbadhandler.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultbadhandler.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..725d33cef645a58ed65f077d650badd37546610a GIT binary patch literal 1974 zcmeH{zfV(96vvOHm6xXYOdvsnLk9<(bYLVTEH92|XyV{NZH;{i)Px9w0WDhxLI^s# zHbHlj#)*M}e*oja#Kh=-@I0S)-|4$lV_8^?-{kb%d+zytPT!-OBFiGh2TD>9IoJE? z*Fs9)l|#L=(+aZQ@#hKnnEc1T(g9|FS7}NM`l$3tN!LKiN<}5m-;Tm=rxtSlrZjy+ zBzPZ%M+b`mGDDJKrMDQUig2|zd;;4Y-jUheY<(N_eKhs5qJ(Wp38egXF5~T1`jY?n zK9gi}@IdUzxZPOYXuhn@>*3*Q{G!lWc&c)88_zT+l;fAXU$E8GI;haD0g{BQT!zFb zZLHPfHYdNUhuXnsSyyQj6zoLde(6q`Xu)2kOa#vGKXp~bDQr?)hy#I9U9G9kmsC^a ziE^tFkyY=X=R{bP0WNno&w}{H&DU`grzB6?C?3vu(gHJC)rs{ca`<7ml|xSJ>#rI( zB?8W-Gd`o-oFc1wPEU46JKebhA64ct&`uC6W zTJd7JUstWRg8pC`CNSCGYaQB_MytMlUyWH>C~t);hJqkg5;F7tyD0qeJR;^On8|N? k_$4N=_X3`m&j&bzRnbr6|mz<9M5B;y&FDF*LQ~&?~ literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultdie.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultdie.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..c33871d0a523a68ba278579b0091f7b79d2d00ac GIT binary patch literal 2851 zcmeHJziU%b6u!p9hM1a?6s)aC2GKa_;NT#obqE=?Bv^3qnU|VC8s*UxLHfh3ps1jO zgF}}>>n>yv9CQ$zD;@j;`X@N~{J#6{dGF?>BnY~Q2Tsqu=boSUeD|eSPAFAXDtQU4 z5=vdnD7F7Sq4^smdFT6nmb#tKd*hVH)qna|Zh*5t1D-@fufcD@oG)MiKm_z?t(;rj ztmU}NA5&@?+=K4$)qL8RXyF@D+w*BaNpUOZ+><0GLg+k#CGoX=w1fHM8u3hY{5Y znOfCz9xi##azk&S5-3~)s1MeImietA_cqJ9m#L`?%O=q2!*+BFLx3(ZVXAGlJ=UXI zCcxj(2_ztw=Pi0bhZ&$!g$gf!FZ}TbHR(yZGQ?7$*-FrO~wP0KaNPgK50yDkdh=f zI2@4z1_O;&XC>b27G7G#ygovLy;jic+{dU_Mxo!|>{TFW50=9uiEenWvBB1xj&~l; zlZKf>OT#<=GQa literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultevilhandler.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultevilhandler.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..0fc8efc66865fd0dc7a035457f9e1af5d9176bdb GIT binary patch literal 1962 zcmeH{KTi~45XQ&jz{`2MCYS($;tGqilET8mkkDK#D8N8M>3L_oP4G;J5F3Q@5{)s$ zfoVxGE$JKs-A=ys02+(Zu8fBY*QVD@9qJ6_Ny=Vzy{ffb#3C#bxw23zY30p|nf z$ThQl*Bx$77tje&irMYyg1Z=3*@y|WJJ`|buD97Y_-E1Z%TuS`VvFP6?&`4J!jM5W zW)ux~EaV;zTlJ-t#`E$cKippmpXHiUPh3x2)lV;od)+zc6jW2;LkX7-q6n|VlN^I9 zFKc0oQ?{!=H>yESvh(3f%{4+K|rb-{ghV^6a= zm*i3`Nz6JwFk?|V=($`n;Z%W&7`hgKk6}D6dX}C$ zkRNCA{ONe`pH1JWTawsx_OVQG7kbB{Y)RgMu=TpX)?=@0aU)qpR)SjFUjO9RZmmSo zxBsnLwSv^8!6Jclzpu4#Tk6f)@?C$-(!y>ll42+b-bktE`)k#p@@3^_(-`kztcZ--<*oXtOZ{GZT-rpXAZ?w)qIGM!PYf<|u^vtX0<$4Ir+>}SaqhO`zpOplbOK1dD z50>UTOv()t9M0ECteTX%mX*|bw0+VQ2HWj3O?@fTr;oZnrZXRXb3B{UPqnh+MgRZ+ literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultread.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultread.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..adb06bcf3e8270546f43042250d7be056424e9fc GIT binary patch literal 1958 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 literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_faultwrite.c.sisc b/lab/LAB4.si4project/cache/parse/user_faultwrite.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..cbf5c385871c8df354e1229247a53f1b8412ac3c GIT binary patch literal 1958 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 Se}>NVsq&vK>^k@(LiZg4Y!HqB literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_pingpongs.c.sisc b/lab/LAB4.si4project/cache/parse/user_pingpongs.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..3fc4c1eaa0b3228db747f9d26d8df1faf03521c1 GIT binary patch literal 2844 zcmeH}O-qzf6vwY`IZoOL8kI(k(7*^m1`#f_bkX1{dQoucd<=_2sb? z>mzl}b&9v7`}}e^fzBw1X`(!wkcne!XBw@L43l&G*euyy|4wwH`nj&FFCp20%eV3|(sz-NVUXtZarmI`xMbw~>ji@`v`+%w&7 zOlze~)Xu60^mWAved?E?QbQgL_4Re9y(qKKGD*&j_CB$hbXJiL-kX`5zmx6l?HTMF zl`+j{pz(i73`31z7N9eILD7wvDSmYp3ZZ}=Fuc)w$|XEWN)-{@XcG~x1l(D ze|N5L_0Y5Nxgn4>aXS+c3AqqnX5f=^0KFcgiQD6T&;WYBcCkf=eg`Rc1y`7 z9z~7ijAVaF_t8t1fenX4lEzx2wB11z(kCmm+53&~?O6LUjl9XF#vkvDX+s0p?hPA- z=eb$~%m-LL9WHO_XCN-eT0``I1zY!4Q3k^^M9P_ur; oS-9LC#%VU>=-aGo1~#rlHq;m*S0npxVEFoyiGNj{V+|pH11CKcU;qFB literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_primes.c.sisc b/lab/LAB4.si4project/cache/parse/user_primes.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..2a8d8b94fd225e411a181901de701647290357e8 GIT binary patch literal 3355 zcmeH}$!k28_fdE)(KO#R!5D3`p>#QB?G1%nas1G6~Vd+(iiJK}{ka z^k&56;zjVJ9z+736%YOq-dqkozu$XZd7U9lB;Z9XsHyJiuCJ@AtNP8pHO`%Ju6~c$ z)jD^**}0D|YZLw?3D1A|xDMU?yQk}sb?!g?D;ePKH;Y>p(5(1@nEP!K*NdUHxxW1L z+}S+i)*9!wito?#<=@`zZ9r!fd+LAK+n`c%Ol^%hWSD|T&aqlD+t4O42!4thzZPE< zV~>weB3m*YYa5c4>?g#HS8@APF+*?esc?WvolctQ*B~ zPWEb35jeStk%6eZR-^FF&d>JcU)@jd?6jc1i9hSkT1J`^wCUT0CQbku6z)tMM?*oW~`@~q}eEx#tETGVx`+?X3Jy~E5a{ArjdUx_Z4 zOT`nK5E$vqc}ZX#W;*FJYw1IZWACMu0M|q({RnH!kfhoW(N#yppOiqXjS?s61fYl< zNmUsnx=P5*Ei#|Y5+}!~D#BG8xJEDO0rr`$5;1cNM66Q+F;^;2M#X-ONS^hJNl(QXDc=5g`d7bE3kcbaS2UtaGx`eW9r)rDJ_J@@j8WL0JQ=86zGLv@Y zBZ2-9AChirVaH-uf=xb<_=H>zAHR(_=TCj2^PY)$nos$_PHD`rAcjna54h5@w)~14BetiAb)D;y9aus5b-Cu$HD&H|PCV znVzD)k4ty-OA7`L`D$gXL-+dfZTHf?p?-;VO8-h)K4h^biI@Iw#%g^+TvmNZ$aK|Xttjcip@H$; zGH&&pr6Nr#iGUA!HuD8t^uELG)Wd4XU{+%r+El}-wiaS6J0@mw0$Faj*w4g$EREat kkh5^lD?R*Q`_n!4w_-Oyp7_W>yHerwu~~fZy1fqZ8>N;kjsO4v literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_sendpage.c.sisc b/lab/LAB4.si4project/cache/parse/user_sendpage.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..02cf01a0d9a068f7da5dc8852b018e617a8a1429 GIT binary patch literal 2805 zcmeH{%}bO~6vl6U)HqF!X!M~`6GZ7EvS=Zqf@ES)V5Z?BFw<;?Ou^J_*P>OcAcN?O z2n20iVT+(ekkF=$;i5mlrOOt<+w;3KXXcuc610gPIGp>QbMLw5Paxgt&X>n{gbEPQVa$a`wr=~x>jXjx<+;^(u%-Oas z*~o0W-{IV0Y0BLvp*;r6cKKc+Ug#?EOV!R@ejD*iCvNm-M#wm1@|0K`dzNMLTZR82 znSaoptbKhj&TR`*i8xts&i6@7=EjgQ`tx&KiG7jsGMnoFw1C_Oa$3OKl@|v7dHw#)fPfpRL6vo>m@V4r|((85#ez)|g&W z`f;{a7)`BvWV`>VP%Ale?r+v=FNeB}k7!`F-`86Bi;!>0K)Qd7!{J~XRM_&9Y_a$# zwnMf%?+e9JBtx@eZBR0;0u2eV*})#tA>Kb?XNW^QlOtLqR??El_o2FJ)w_{oGL@t5Wr|5vg-^f=rzt34~7***5#qz4AxI^ZV-^yb}9D0>0m literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_softint.c.sisc b/lab/LAB4.si4project/cache/parse/user_softint.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..35fccfb50e9270e4f98db33b0a4a9454fc4da90b GIT binary patch literal 1958 zcmeH{v1?ON6vnSu!2h##Dsd(S!docEn`$mCh)=A0{DmAHa) z-*i8ETS(=LG_wEosDf?(wj|FbS_4;>6eVD4t67a+%vU+T zmyDfpuD;!@9z2_guo;pJ(aV`gA&#s0$O&wB@ME*Py$#eF*zjGz z5g^Q&B(=VW+O@dXSz77dYuwP`+ERSCusD5NcJdm3NRqddiBt;X)Ou2(U40}8k)9d9 zrIiQmxW_5%YD-<6+VfqdO~|oqPfPVO)uP9hG8K&NNnMpYg?%X(>iF7z0@m3yF!wXB z`|HehOPX4i%QS8~Uw4j0>0`LF7Uk;~S0Bb*l0t%pKpxF_tew~z;wqKm`+B~Wxuoso z`yG;|eU%=QkaR*~NwGD8q*pdhPrAzEa6E^b&1!4ck7rK4uH;xY_hCAM5kt2H;A0q% z)X>s%2NuVfI)6GI;%BorVF&q6U^b2AlDGKZ;jvgXUw0(#J<4_j>;SXFoicQnz#vCYWtarM1N|wN+vQ>mAmy+1z}6ANKpGYBDRq*Zd-V zsAFU8pu~qCGYp5@OZW~4_4%ch>O%gk2B(&StEt-LCE3YsAlZ3Tnz*Wy({pLVINiII zpvqXI??>9{!j%g&*Q4TQTU&d^jbNadv#)v)7I~1204K-nyQkq z&qmV-epZ}g)#+8$8SQ;3;hHXUkZ@7L(Ab-1&Bmu)LJy*X9WdQv!@8dQ94aV#|9$)AxG^ZC;QQXOYUjL}#Q4 zYBrUjovF;x8XAP56+cd{Z=v42B0HtqFCh*uiE8+^<6g|dYJBzD5+MwSY#0$93KsJP z#Vsu^H?9|o#ZqaUuzq)aQYTF$Z+2R1yqyWz+{ei@N7J)tKpJ!xWB(?Z1KY=#bBtiG z?qWaX#K$h#G;20iHyvSa@N@XBoI(9&H`gukdYil?IvTF$WxMmf!BXLu(?}xb zLmc9nsGl8Tl-8AF<=gfThL(NUR^P_>PxkJ8JDQUpxdY=sohtgseJ+hr>WBktG`_!Q ZOMlt5bMYR0z_D0Gzr1gt?@Gb=-z&Pw-LG4{ilDW0`z{Hc(W3ED1IuYzZwG#L_#wUdYcxW z4>s}Dvc|dX;wRF5xqmv7ns^bX)c5RkMx*5Tw0*uI!xV(~W3yyu!!!Os`ZJQs&yttK zoUfqfvW~q?6`Pf@#BpnB7yqqMVR(FMB%kfp;?Q_>xn}I7>cVyKyfKy32yFD|YQ@V@ z9M_k&@KHZJF;$q%7td?Wx7A^v)?n@thj>=6g*%P3qC|0A>oRV;{|2Xa>RK);tk){+ z*e7*o_Eplc^)j0l&q?>;=cx?d+HW>Ca2hYj-*rrCPoaDKU=OX-u|e6q7thKGV{lHg zU(OfBuL(lbFJ@`gFv*^+k2*);OB7B>9Gg{I)#-_71W*#AoCJ?#9B^d1tWy_JT@eJN6H`8^~Q z$GA_3;MPPS8WP7qp=sE$MpunUt&El+UL|p2N>6%eh^DJXv=ISyN#Zy1`N9QlSZIL3 zSutVScQt6aDS#4ELO83to-5`HlZ+fO@lpZRA|^YInr?Sc&#_yL4VAE*P6*gcG@6Zi zdb&C<>VvrSQhKnRk~U(d3xVhECihEbp5j=~Q%V3gk4_YY+<7AEKCGXP4x(jVESh;; z)~zp+3(QkABA$EL+jOt1+dr*53)VLR;{r?gONk80?9k!Iy0g*+#=b8-!%W#-vbi>$ zF6a(yjVdpwc}x7RjS7?1xn`8tr#DHibdX%PN_YK8Iag3P_cwF3$B4Y_iX$P@{W(|b zUiugfkL8LS4jX%1i7mcPl4Xx%&q&vKteh;J1j>@NMoCpc6eJ`owb_S_2<=#hG0i{f zZJK#m8B^x5{#qO_$3!d)(%*_{udsRMVar2H-*obX52S2m9#Y)18@kJPR{H^&S)f{W zxmw%R+Eq9rcJhKOM+Rz0eV;ks=I@i)kb7t|E1T>iD$( Ha?t$(fr%cd literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_testbss.c.sisc b/lab/LAB4.si4project/cache/parse/user_testbss.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..d8e5700ca4435b284f3822b119cd913c7cbdabd5 GIT binary patch literal 2299 zcmeH`ziU%b6vuDdMAI0JP$AJeM09b|!NEa_6%2Kewzi^9rj0ZY+6uuIbr;mt3Jwk~ zh3YPdgSFt$f1uLAKcJ)FqSN*Jx$m9iH5%jMB0X^4x$peG=X~$kea=lempLtV{my;c z@7&hg{=lCl;ngo&1$3*QULQmbxIOw`Ccy5GijU|*E8>^pj5wc23AeUVE$*yO7dbEV zId@Vxxi8)M$0giaGA6k?Ycvmw7-zCN((c#Ckqm$@{^U zjT(calar%2uU)xyd0KyHh{gwbTuj%dvq?$y3wclNn8=fxiRNm}X6?bGeylaj$HXM% zvh8NtW6M1(?&drjP3M42ca#+%mqN}8m?mX(9bor`+sC7Wh zNRc3kq^6VJCLwKX3kQ9?$1^6H>x=kLFa5^zYO%2qFMUe3y7)UwUmpp}1xn!+N*`{m zrR(_HrJEmi>QE8twRC*O#l+bBO=7dN7R_^N(e6cCwYcs;w0N)ct~mjGECDz`$! uE^y1-jV!F2{jc@(LZ6WJ47}f|pReO_Kjvc+KYYqs*o#ZCkKvv>8T|zP#mij) literal 0 HcmV?d00001 diff --git a/lab/LAB4.si4project/cache/parse/user_yield.c.sisc b/lab/LAB4.si4project/cache/parse/user_yield.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..8e99b55ad30e8ab202247fc30f348f8a7bd852c3 GIT binary patch literal 2340 zcmeH{ziU%b6vuDVL_@GfsZgbY5iC?Xn8AY3TIgWuB(}7W!J#!#`=CuB*v^hs#6c@$ zaB(P9H$kBYf7Z>ph=bd}cIrsd!=f3h0=jNQtUKF{E zbLG5qdv7zIzKBCxU-yn7+iJb+gZH}s_*Xi>-JcPiQbC)d=OT@PD~Pfpu)R4|tbCj= zvVJET=y9(3bgKB_$)u*GgSd^#i^;r999z@k6WHvaM`n9F8=k>FL`|Cok)1{7{hsK^ z&>cq+AoLl>{i%l7{ZYNTyjHti8rR~|a&#-RG%+hVeyx7F_c8m#b0UM)H2i3YcBP2p zoa_@3F>-4wi&34EVOR6&YO|Ge^|jLeA=+10hu@qpP{sCxp#l+D!|5tKtVUZ8J>nF^ z`O~h>%l4IMMnUYVX0#`!Rc~CPRCd`p1|~(AQyh0rkVkfXHLBs1;{r z)AYmcmUcN^Y}~El)c03>pzUZ-+?*mS1y1wos6;6aWGbiY*QF-bQ4yKJX)jJqCV85v z#9jvnag1dGlIw|X>T5OPnYzPXAUhX$+|dT=3o+mqU0X0|tenB2!9KCoP0Xu`{aR2}S literal 0 HcmV?d00001 diff --git a/lab/gradelib.py b/lab/gradelib.py new file mode 100644 index 0000000..07a7a84 --- /dev/null +++ b/lab/gradelib.py @@ -0,0 +1,547 @@ +from __future__ import print_function + +import sys, os, re, time, socket, select, subprocess, errno, shutil, traceback +from subprocess import check_call, Popen +from optparse import OptionParser + +__all__ = [] + +################################################################## +# Test structure +# + +__all__ += ["test", "end_part", "run_tests", "get_current_test"] + +TESTS = [] +TOTAL = POSSIBLE = 0 +PART_TOTAL = PART_POSSIBLE = 0 +CURRENT_TEST = None + +def test(points, title=None, parent=None): + """Decorator for declaring test functions. If title is None, the + title of the test will be derived from the function name by + stripping the leading "test_" and replacing underscores with + spaces.""" + + def register_test(fn, title=title): + if not title: + assert fn.__name__.startswith("test_") + title = fn.__name__[5:].replace("_", " ") + if parent: + title = " " + title + + def run_test(): + global TOTAL, POSSIBLE, CURRENT_TEST + + # Handle test dependencies + if run_test.complete: + return + run_test.complete = True + if parent: + parent() + + # Run the test + fail = None + start = time.time() + CURRENT_TEST = run_test + sys.stdout.write("%s: " % title) + sys.stdout.flush() + try: + fn() + except AssertionError as e: + fail = "".join(traceback.format_exception_only(type(e), e)) + + # Display and handle test result + POSSIBLE += points + if points: + print("%s" % \ + (color("red", "FAIL") if fail else color("green", "OK")), end=' ') + if time.time() - start > 0.1: + print("(%.1fs)" % (time.time() - start), end=' ') + print() + if fail: + print(" %s" % fail.replace("\n", "\n ")) + else: + TOTAL += points + for callback in run_test.on_finish: + callback(fail) + CURRENT_TEST = None + + # Record test metadata on the test wrapper function + run_test.__name__ = fn.__name__ + run_test.title = title + run_test.complete = False + run_test.on_finish = [] + TESTS.append(run_test) + return run_test + return register_test + +def end_part(name): + def show_part(): + global PART_TOTAL, PART_POSSIBLE + print("Part %s score: %d/%d" % \ + (name, TOTAL - PART_TOTAL, POSSIBLE - PART_POSSIBLE)) + print() + PART_TOTAL, PART_POSSIBLE = TOTAL, POSSIBLE + show_part.title = "" + TESTS.append(show_part) + +def run_tests(): + """Set up for testing and run the registered test functions.""" + + # Handle command line + global options + parser = OptionParser(usage="usage: %prog [-v] [filters...]") + parser.add_option("-v", "--verbose", action="store_true", + help="print commands") + parser.add_option("--color", choices=["never", "always", "auto"], + default="auto", help="never, always, or auto") + (options, args) = parser.parse_args() + + # Start with a full build to catch build errors + make() + + # Clean the file system if there is one + reset_fs() + + # Run tests + limit = list(map(str.lower, args)) + try: + for test in TESTS: + if not limit or any(l in test.title.lower() for l in limit): + test() + if not limit: + print("Score: %d/%d" % (TOTAL, POSSIBLE)) + except KeyboardInterrupt: + pass + if TOTAL < POSSIBLE: + sys.exit(1) + +def get_current_test(): + if not CURRENT_TEST: + raise RuntimeError("No test is running") + return CURRENT_TEST + +################################################################## +# Assertions +# + +__all__ += ["assert_equal", "assert_lines_match"] + +def assert_equal(got, expect, msg=""): + if got == expect: + return + if msg: + msg += "\n" + raise AssertionError("%sgot:\n %s\nexpected:\n %s" % + (msg, str(got).replace("\n", "\n "), + str(expect).replace("\n", "\n "))) + +def assert_lines_match(text, *regexps, **kw): + """Assert that all of regexps match some line in text. If a 'no' + keyword argument is given, it must be a list of regexps that must + *not* match any line in text.""" + + def assert_lines_match_kw(no=[]): + return no + no = assert_lines_match_kw(**kw) + + # Check text against regexps + lines = text.splitlines() + good = set() + bad = set() + for i, line in enumerate(lines): + if any(re.match(r, line) for r in regexps): + good.add(i) + regexps = [r for r in regexps if not re.match(r, line)] + if any(re.match(r, line) for r in no): + bad.add(i) + + if not regexps and not bad: + return + + # We failed; construct an informative failure message + show = set() + for lineno in good.union(bad): + for offset in range(-2, 3): + show.add(lineno + offset) + if regexps: + show.update(n for n in range(len(lines) - 5, len(lines))) + + msg = [] + last = -1 + for lineno in sorted(show): + if 0 <= lineno < len(lines): + if lineno != last + 1: + msg.append("...") + last = lineno + msg.append("%s %s" % (color("red", "BAD ") if lineno in bad else + color("green", "GOOD") if lineno in good + else " ", + lines[lineno])) + if last != len(lines) - 1: + msg.append("...") + if bad: + msg.append("unexpected lines in output") + for r in regexps: + msg.append(color("red", "MISSING") + " '%s'" % r) + raise AssertionError("\n".join(msg)) + +################################################################## +# Utilities +# + +__all__ += ["make", "maybe_unlink", "reset_fs", "color"] + +MAKE_TIMESTAMP = 0 + +def pre_make(): + """Delay prior to running make to ensure file mtimes change.""" + while int(time.time()) == MAKE_TIMESTAMP: + time.sleep(0.1) + +def post_make(): + """Record the time after make completes so that the next run of + make can be delayed if needed.""" + global MAKE_TIMESTAMP + MAKE_TIMESTAMP = int(time.time()) + +def make(*target): + pre_make() + if Popen(("make",) + target).wait(): + sys.exit(1) + post_make() + +def show_command(cmd): + from pipes import quote + print("\n$", " ".join(map(quote, cmd))) + +def maybe_unlink(*paths): + for path in paths: + try: + os.unlink(path) + except EnvironmentError as e: + if e.errno != errno.ENOENT: + raise + +COLORS = {"default": "\033[0m", "red": "\033[31m", "green": "\033[32m"} + +def color(name, text): + if options.color == "always" or (options.color == "auto" and os.isatty(1)): + return COLORS[name] + text + COLORS["default"] + return text + +def reset_fs(): + if os.path.exists("obj/fs/clean-fs.img"): + shutil.copyfile("obj/fs/clean-fs.img", "obj/fs/fs.img") + +################################################################## +# Controllers +# + +__all__ += ["QEMU", "GDBClient"] + +class QEMU(object): + _GDBPORT = None + + def __init__(self, *make_args): + # Check that QEMU is not currently running + try: + GDBClient(self.get_gdb_port(), timeout=0).close() + except socket.error: + pass + else: + print("""\ +GDB stub found on port %d. +QEMU appears to already be running. Please exit it if possible or use +'killall qemu' or 'killall qemu.real'.""" % self.get_gdb_port(), file=sys.stderr) + sys.exit(1) + + if options.verbose: + show_command(("make",) + make_args) + cmd = ("make", "-s", "--no-print-directory") + make_args + self.proc = Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE) + # Accumulated output as a string + self.output = "" + # Accumulated output as a bytearray + self.outbytes = bytearray() + self.on_output = [] + + @staticmethod + def get_gdb_port(): + if QEMU._GDBPORT is None: + p = Popen(["make", "-s", "--no-print-directory", "print-gdbport"], + stdout=subprocess.PIPE) + (out, _) = p.communicate() + if p.returncode: + raise RuntimeError( + "Failed to get gdbport: make exited with %d" % + p.returncode) + QEMU._GDBPORT = int(out) + return QEMU._GDBPORT + + def fileno(self): + if self.proc: + return self.proc.stdout.fileno() + + def handle_read(self): + buf = os.read(self.proc.stdout.fileno(), 4096) + self.outbytes.extend(buf) + self.output = self.outbytes.decode("utf-8", "replace") + for callback in self.on_output: + callback(buf) + if buf == b"": + self.wait() + return + + def wait(self): + if self.proc: + self.proc.wait() + self.proc = None + + def kill(self): + if self.proc: + self.proc.terminate() + +class GDBClient(object): + def __init__(self, port, timeout=15): + start = time.time() + while True: + self.sock = socket.socket() + try: + self.sock.settimeout(1) + self.sock.connect(("localhost", port)) + break + except socket.error: + if time.time() >= start + timeout: + raise + self.__buf = "" + + def fileno(self): + if self.sock: + return self.sock.fileno() + + def handle_read(self): + try: + data = self.sock.recv(4096).decode("ascii", "replace") + except socket.error: + data = "" + if data == "": + self.sock.close() + self.sock = None + return + self.__buf += data + + while True: + m = re.search(r"\$([^#]*)#[0-9a-zA-Z]{2}", self.__buf) + if not m: + break + pkt = m.group(1) + self.__buf = self.__buf[m.end():] + + if pkt.startswith("T05"): + # Breakpoint + raise TerminateTest + + def __send(self, cmd): + packet = "$%s#%02x" % (cmd, sum(map(ord, cmd)) % 256) + self.sock.sendall(packet.encode("ascii")) + + def __send_break(self): + self.sock.sendall(b"\x03") + + def close(self): + if self.sock: + self.sock.close() + self.sock = None + + def cont(self): + self.__send("c") + + def breakpoint(self, addr): + self.__send("Z1,%x,1" % addr) + + +################################################################## +# QEMU test runner +# + +__all__ += ["TerminateTest", "Runner"] + +class TerminateTest(Exception): + pass + +class Runner(): + def __init__(self, *default_monitors): + self.__default_monitors = default_monitors + + def run_qemu(self, *monitors, **kw): + """Run a QEMU-based test. monitors should functions that will + be called with this Runner instance once QEMU and GDB are + started. Typically, they should register callbacks that throw + TerminateTest when stop events occur. The target_base + argument gives the make target to run. The make_args argument + should be a list of additional arguments to pass to make. The + timeout argument bounds how long to run before returning.""" + + def run_qemu_kw(target_base="qemu", make_args=[], timeout=30): + return target_base, make_args, timeout + target_base, make_args, timeout = run_qemu_kw(**kw) + + # Start QEMU + pre_make() + self.qemu = QEMU(target_base + "-nox-gdb", *make_args) + self.gdb = None + + try: + # Wait for QEMU to start or make to fail. This will set + # self.gdb if QEMU starts. + self.qemu.on_output = [self.__monitor_start] + self.__react([self.qemu], timeout=30) + self.qemu.on_output = [] + if self.gdb is None: + print("Failed to connect to QEMU; output:") + print(self.qemu.output) + sys.exit(1) + post_make() + + # QEMU and GDB are up + self.reactors = [self.qemu, self.gdb] + + # Start monitoring + for m in self.__default_monitors + monitors: + m(self) + + # Run and react + self.gdb.cont() + self.__react(self.reactors, timeout) + finally: + # Shutdown QEMU + try: + if self.gdb is None: + sys.exit(1) + self.qemu.kill() + self.__react(self.reactors, 5) + self.gdb.close() + self.qemu.wait() + except: + print("""\ +Failed to shutdown QEMU. You might need to 'killall qemu' or +'killall qemu.real'. +""") + raise + + def __monitor_start(self, output): + if b"\n" in output: + try: + self.gdb = GDBClient(self.qemu.get_gdb_port(), timeout=30) + raise TerminateTest + except socket.error: + pass + if not len(output): + raise TerminateTest + + def __react(self, reactors, timeout): + deadline = time.time() + timeout + try: + while True: + timeleft = deadline - time.time() + if timeleft < 0: + sys.stdout.write("Timeout! ") + sys.stdout.flush() + return + + rset = [r for r in reactors if r.fileno() is not None] + if not rset: + return + + rset, _, _ = select.select(rset, [], [], timeleft) + for reactor in rset: + reactor.handle_read() + except TerminateTest: + pass + + def user_test(self, binary, *monitors, **kw): + """Run a user test using the specified binary. Monitors and + keyword arguments are as for run_qemu. This runs on a disk + snapshot unless the keyword argument 'snapshot' is False.""" + + maybe_unlink("obj/kern/init.o", "obj/kern/kernel") + if kw.pop("snapshot", True): + kw.setdefault("make_args", []).append("QEMUEXTRA+=-snapshot") + self.run_qemu(target_base="run-%s" % binary, *monitors, **kw) + + def match(self, *args, **kwargs): + """Shortcut to call assert_lines_match on the most recent QEMU + output.""" + + assert_lines_match(self.qemu.output, *args, **kwargs) + +################################################################## +# Monitors +# + +__all__ += ["save", "stop_breakpoint", "call_on_line", "stop_on_line"] + +def save(path): + """Return a monitor that writes QEMU's output to path. If the + test fails, copy the output to path.test-name.""" + + def setup_save(runner): + f.seek(0) + f.truncate() + runner.qemu.on_output.append(f.write) + get_current_test().on_finish.append(save_on_finish) + + def save_on_finish(fail): + f.flush() + save_path = path + "." + get_current_test().__name__[5:] + if fail: + shutil.copyfile(path, save_path) + print(" QEMU output saved to %s" % save_path) + elif os.path.exists(save_path): + os.unlink(save_path) + print(" (Old %s failure log removed)" % save_path) + + f = open(path, "wb") + return setup_save + +def stop_breakpoint(addr): + """Returns a monitor that stops when addr is reached. addr may be + a number or the name of a symbol.""" + + def setup_breakpoint(runner): + if isinstance(addr, str): + addrs = [int(sym[:8], 16) for sym in open("obj/kern/kernel.sym") + if sym[11:].strip() == addr] + assert len(addrs), "Symbol %s not found" % addr + runner.gdb.breakpoint(addrs[0]) + else: + runner.gdb.breakpoint(addr) + return setup_breakpoint + +def call_on_line(regexp, callback): + """Returns a monitor that calls 'callback' when QEMU prints a line + matching 'regexp'.""" + + def setup_call_on_line(runner): + buf = bytearray() + def handle_output(output): + buf.extend(output) + while b"\n" in buf: + line, buf[:] = buf.split(b"\n", 1) + line = line.decode("utf-8", "replace") + if re.match(regexp, line): + callback(line) + runner.qemu.on_output.append(handle_output) + return setup_call_on_line + +def stop_on_line(regexp): + """Returns a monitor that stops when QEMU prints a line matching + 'regexp'.""" + + def stop(line): + raise TerminateTest + return call_on_line(regexp, stop) diff --git a/lab/mergedep.pl b/lab/mergedep.pl new file mode 100644 index 0000000..1730d53 --- /dev/null +++ b/lab/mergedep.pl @@ -0,0 +1,86 @@ +#!/usr/bin/perl +# Copyright 2003 Bryan Ford +# Distributed under the GNU General Public License. +# +# Usage: mergedep [ ...] +# +# This script merges the contents of all specified +# on the command line into the single file , +# which may or may not previously exist. +# Dependencies in the will override +# any existing dependencies for the same targets in . +# The are deleted after is updated. +# +# The are typically generated by GCC with the -MD option, +# and the is typically included from a Makefile, +# as shown here for GNU 'make': +# +# .deps: $(wildcard *.d) +# perl mergedep $@ $^ +# -include .deps +# +# This script properly handles multiple dependencies per , +# including dependencies having no target, +# so it is compatible with GCC3's -MP option. +# + +sub readdeps { + my $filename = shift; + + open(DEPFILE, $filename) or return 0; + while () { + if (/([^:]*):([^\\:]*)([\\]?)$/) { + my $target = $1; + my $deplines = $2; + my $slash = $3; + while ($slash ne '') { + $_ = ; + defined($_) or die + "Unterminated dependency in $filename"; + /(^[ \t][^\\]*)([\\]?)$/ or die + "Bad continuation line in $filename"; + $deplines = "$deplines\\\n$1"; + $slash = $2; + } + #print "DEPENDENCY [[$target]]: [[$deplines]]\n"; + $dephash{$target} = $deplines; + } elsif (/^[#]?[ \t]*$/) { + # ignore blank lines and comments + } else { + die "Bad dependency line in $filename: $_"; + } + } + close DEPFILE; + return 1; +} + + +if ($#ARGV < 0) { + print "Usage: mergedep [ ..]\n"; + exit(1); +} + +%dephash = (); + +# Read the main dependency file +$maindeps = $ARGV[0]; +readdeps($maindeps); + +# Read and merge in the new dependency files +foreach $i (1 .. $#ARGV) { + readdeps($ARGV[$i]) or die "Can't open $ARGV[$i]"; +} + +# Update the main dependency file +open(DEPFILE, ">$maindeps.tmp") or die "Can't open output file $maindeps.tmp"; +foreach $target (keys %dephash) { + print DEPFILE "$target:$dephash{$target}"; +} +close DEPFILE; +rename("$maindeps.tmp", "$maindeps") or die "Can't overwrite $maindeps"; + +# Finally, delete the new dependency files +foreach $i (1 .. $#ARGV) { + unlink($ARGV[$i]) or print "Error removing $ARGV[$i]\n"; +} + diff --git a/lab/mitlab4.si4project/mitlab4.sip_sym b/lab/mitlab4.si4project/mitlab4.sip_sym new file mode 100644 index 0000000000000000000000000000000000000000..c5f073a76097ca86b5573b82145497e8e9492911 GIT binary patch literal 224432 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 JJ$93X`Ma?pelgzB9 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 literal 0 HcmV?d00001 diff --git a/lab/mitlab4.si4project/mitlab4.sip_xf b/lab/mitlab4.si4project/mitlab4.sip_xf new file mode 100644 index 0000000000000000000000000000000000000000..2a43253823479a7865b8794b0f1ca647ccf29e4e GIT binary patch literal 186720 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