summaryrefslogtreecommitdiff
path: root/grade-lab-pgtbl
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2024-02-11 14:44:22 +0800
committerMole Shang <[email protected]>2024-02-11 16:06:15 +0800
commit2fe04bc8faa4bf737a86c36a8017473e84814f3b (patch)
tree2146d3dae86f21060e2e807ad364f5a949fd1c53 /grade-lab-pgtbl
parent5ce1f630132d8b7b35b9dc46b4a55f860eb85d5c (diff)
parent48a5e34fcd07852b4a68825ce8e37feb6f6d04d7 (diff)
downloadxv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.tar.gz
xv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.tar.bz2
xv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.zip
Merge branch 'traps' into cow
Conflicts: .gitignore Makefile conf/lab.mk
Diffstat (limited to 'grade-lab-pgtbl')
-rwxr-xr-xgrade-lab-pgtbl79
1 files changed, 79 insertions, 0 deletions
diff --git a/grade-lab-pgtbl b/grade-lab-pgtbl
new file mode 100755
index 0000000..121bb3b
--- /dev/null
+++ b/grade-lab-pgtbl
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+
+import re
+from gradelib import *
+
+r = Runner(save("xv6.out"))
+
+PTE_PRINT = """page table 0x0000000087f6b000
+ ..0: pte 0x0000000021fd9c01 pa 0x0000000087f67000
+ .. ..0: pte 0x0000000021fd9801 pa 0x0000000087f66000
+ .. .. ..0: pte 0x0000000021fda01b pa 0x0000000087f68000
+ .. .. ..1: pte 0x0000000021fd9417 pa 0x0000000087f65000
+ .. .. ..2: pte 0x0000000021fd9007 pa 0x0000000087f64000
+ .. .. ..3: pte 0x0000000021fd8c17 pa 0x0000000087f63000
+ ..255: pte 0x0000000021fda801 pa 0x0000000087f6a000
+ .. ..511: pte 0x0000000021fda401 pa 0x0000000087f69000
+ .. .. ..509: pte 0x0000000021fdcc13 pa 0x0000000087f73000
+ .. .. ..510: pte 0x0000000021fdd007 pa 0x0000000087f74000
+ .. .. ..511: pte 0x0000000020001c0b pa 0x0000000080007000"""
+
+VAL_RE = "(0x00000000[0-9a-f]+)"
+INDENT_RE = r"\s*\.\.\s*"
+INDENT_ESC = "\\\s*\.\.\\\s*"
+
+@test(0, "pgtbltest")
+def test_pgtbltest():
+ r.run_qemu(shell_script([
+ 'pgtbltest'
+ ]), timeout=300)
+
+@test(10, "pgtbltest: ugetpid", parent=test_pgtbltest)
+def test_nettest_():
+ r.match('^ugetpid_test: OK$')
+
+@test(10, "pgtbltest: pgaccess", parent=test_pgtbltest)
+def test_nettest_():
+ r.match('^pgaccess_test: OK$')
+
+@test(10, "pte printout")
+def test_pteprint():
+ first = True
+ r.run_qemu(shell_script([
+ 'echo hi'
+ ]))
+ r.match('^hi')
+ p = re.compile(VAL_RE)
+ d = re.compile(INDENT_RE)
+ for l in PTE_PRINT.splitlines():
+ l = d.sub(INDENT_ESC, l)
+ l = p.sub(VAL_RE, l)
+ r.match(r'^{}$'.format(l))
+ if first:
+ first = False
+ else:
+ matches = re.findall(r'^{}$'.format(l), r.qemu.output, re.MULTILINE)
+ assert_equal(len(matches[0]), 2)
+ pa = (int(matches[0][0], 16) >> 10) << 12
+ assert_equal(int(matches[0][1], 16), pa)
+
+@test(5, "answers-pgtbl.txt")
+def test_answers():
+ # just a simple sanity check, will be graded manually
+ check_answers("answers-pgtbl.txt")
+
+@test(0, "usertests")
+def test_usertests():
+ r.run_qemu(shell_script([
+ 'usertests -q'
+ ]), timeout=300)
+
+@test(10, "usertests: all tests", parent=test_usertests)
+def test_usertests():
+ r.match('^ALL TESTS PASSED$')
+
+@test(1, "time")
+def test_time():
+ check_time()
+
+run_tests()