From 8a58614aefa70c0805186d3c08a80876173c57a2 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 26 Nov 2016 11:23:25 +0100 Subject: [PATCH] Rework the tests to run on pc86; lots of test fixes for the brk() test, which was nearly useless; lots of fixes to qemuppc and pc86 sbrk(), which was broken; change the pc86 console to echo output to the serial port (needed for running tests on qemu). --- .travis.yml | 1 + build.lua | 1 + plat/pc86/boot.s | 11 +++++++---- plat/pc86/include/unistd.h | 1 + plat/pc86/libsys/brk.c | 22 +++++++++++++++++++--- plat/pc86/tests/build.lua | 7 +++++++ plat/qemuppc/libsys/brk.c | 17 +++++++++++++++-- tests/plat/_dummy.c | 1 + tests/plat/brk_c.c | 32 +++++++++++++++++++++++++++----- tests/plat/build.lua | 9 ++++++++- tests/plat/from_d_to_si_e.c | 9 +++++---- tests/plat/from_d_to_ui_e.c | 5 +++-- tests/plat/from_si_to_d_e.c | 9 +++++---- tests/plat/from_ui_to_d_e.c | 5 +++-- tests/plat/inn_e.e | 34 +++++++++++++++++++++------------- tests/plat/intshift_e.c | 9 +++++---- tests/plat/intsub_e.c | 7 ++++--- tests/plat/lib/build.lua | 1 - tests/plat/lib/test.c | 2 +- tests/plat/lib/test.h | 2 +- tests/plat/testdriver.sh | 25 ++++++++++++++++++++----- 21 files changed, 155 insertions(+), 55 deletions(-) create mode 100644 plat/pc86/tests/build.lua diff --git a/.travis.yml b/.travis.yml index c6e2f5913..9db308dea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ addons: packages: - ed - openbios-ppc + - qemu-system-i386 git: depth: 10 diff --git a/build.lua b/build.lua index cc550cb9e..584449834 100644 --- a/build.lua +++ b/build.lua @@ -15,6 +15,7 @@ vars.plats = { } vars.plats_with_tests = { "qemuppc", + "pc86", } local plat_packages = {} diff --git a/plat/pc86/boot.s b/plat/pc86/boot.s index 534809697..51b288e75 100644 --- a/plat/pc86/boot.s +++ b/plat/pc86/boot.s @@ -23,7 +23,7 @@ ! If you ever need to change the boot code, this needs adjusting. I recommend ! a hex editor. -PADDING = 0xB7 +PADDING = 0xB3 ! Some definitions. @@ -271,9 +271,12 @@ finished: ! Push standard parameters onto the stack and go. - push envp ! envp - push argv ! argv - push 1 ! argc + mov ax, envp + push ax + mov ax, argv + push ax + mov ax, 1 + push ax call __m_a_i_n ! fall through into the exit routine. diff --git a/plat/pc86/include/unistd.h b/plat/pc86/include/unistd.h index ea4f51c0f..174c43ad0 100644 --- a/plat/pc86/include/unistd.h +++ b/plat/pc86/include/unistd.h @@ -37,6 +37,7 @@ extern char** environ; extern void _exit(int); extern pid_t getpid(void); +extern int brk(void* addr); extern void* sbrk(int increment); extern int isatty(int d); extern off_t lseek(int fildes, off_t offset, int whence); diff --git a/plat/pc86/libsys/brk.c b/plat/pc86/libsys/brk.c index 952a9c747..293703234 100644 --- a/plat/pc86/libsys/brk.c +++ b/plat/pc86/libsys/brk.c @@ -22,7 +22,10 @@ int brk(void* newend) if ((p > (&dummy - STACK_BUFFER)) || (p < _end)) + { + errno = ENOMEM; return -1; + } current = p; return 0; @@ -31,13 +34,26 @@ int brk(void* newend) void* sbrk(int increment) { char* old; - + char* new; + if (increment == 0) return current; old = current; - if (brk(old + increment) < 0) - return OUT_OF_MEMORY; + + new = old + increment; + + if ((increment > 0) && (new <= old)) + goto out_of_memory; + else if ((increment < 0) && (new >= old)) + goto out_of_memory; + + if (brk(new) < 0) + goto out_of_memory; return old; + +out_of_memory: + errno = ENOMEM; + return OUT_OF_MEMORY; } diff --git a/plat/pc86/tests/build.lua b/plat/pc86/tests/build.lua new file mode 100644 index 000000000..fe871e450 --- /dev/null +++ b/plat/pc86/tests/build.lua @@ -0,0 +1,7 @@ +include("tests/plat/build.lua") + +plat_testsuite { + name = "tests", + plat = "pc86", + method = "qemu-system-i386" +} diff --git a/plat/qemuppc/libsys/brk.c b/plat/qemuppc/libsys/brk.c index 118bda3cf..7d49fa960 100644 --- a/plat/qemuppc/libsys/brk.c +++ b/plat/qemuppc/libsys/brk.c @@ -34,13 +34,26 @@ int brk(void* newend) void* sbrk(int increment) { char* old; + char* new; if (increment == 0) return current; old = current; - if (brk(old + increment) < 0) - return OUT_OF_MEMORY; + + new = old + increment; + + if ((increment > 0) && (new <= old)) + goto out_of_memory; + else if ((increment < 0) && (new >= old)) + goto out_of_memory; + + if (brk(new) < 0) + goto out_of_memory; return old; + +out_of_memory: + errno = ENOMEM; + return OUT_OF_MEMORY; } diff --git a/tests/plat/_dummy.c b/tests/plat/_dummy.c index 48104b5aa..a4693300f 100644 --- a/tests/plat/_dummy.c +++ b/tests/plat/_dummy.c @@ -6,3 +6,4 @@ void _m_a_i_n(void) ASSERT(0 == 0); finished(); } + diff --git a/tests/plat/brk_c.c b/tests/plat/brk_c.c index aa0f7ef99..9a07c7d3b 100644 --- a/tests/plat/brk_c.c +++ b/tests/plat/brk_c.c @@ -7,9 +7,11 @@ int main(int argc, const char* argv[]) { - void* p; + char* o; + char* p; - ASSERT(-1 == (intptr_t)brk((void*)0xffffffff)); + errno = 0; + ASSERT(-1 == brk((void*)-1)); ASSERT(ENOMEM == errno); p = sbrk(0); @@ -19,9 +21,29 @@ int main(int argc, const char* argv[]) ASSERT(p != sbrk(-8)); ASSERT(p == sbrk(0)); - /* We assume the test environment has less than 2GB of RAM. */ - ASSERT(-1 == (intptr_t)sbrk(INT_MAX)); - ASSERT(-1 == (intptr_t)sbrk(INT_MIN)); + errno = 0; + o = sbrk(INT_MAX); + if (o == (char*)-1) + ASSERT(ENOMEM == errno); + else + { + ASSERT(0 == errno); + p = sbrk(0); + ASSERT(p > o); + brk(o); + } + + errno = 0; + o = sbrk(INT_MIN); + if (o == (char*)-1) + ASSERT(ENOMEM == errno); + else + { + ASSERT(0 == errno); + p = sbrk(0); + ASSERT(p < o); + brk(o); + } finished(); } diff --git a/tests/plat/build.lua b/tests/plat/build.lua index 23685ba40..3873ed9a5 100644 --- a/tests/plat/build.lua +++ b/tests/plat/build.lua @@ -14,6 +14,13 @@ definerule("plat_testsuite", "tests/plat/*.p" ) + acklibrary { + name = "lib", + srcs = { "tests/plat/lib/test.c" }, + hdrs = { "tests/plat/lib/test.h" }, + vars = { plat = e.plat }, + } + local tests = {} for _, f in ipairs(testfiles) do local fs = replace(basename(f), "%..$", "") @@ -25,7 +32,7 @@ definerule("plat_testsuite", local bin = ackprogram { name = fs.."_bin", srcs = { f }, - deps = { "tests/plat/lib+lib" }, + deps = { "+lib" }, vars = { plat = e.plat, lang = lang, diff --git a/tests/plat/from_d_to_si_e.c b/tests/plat/from_d_to_si_e.c index 8c7e31c3e..7f51e6c5b 100644 --- a/tests/plat/from_d_to_si_e.c +++ b/tests/plat/from_d_to_si_e.c @@ -1,11 +1,12 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ double one = 1.0; double zero = 0.0; double minusone = -1.0; -double big = 2147483647.0; -double minusbig = -2147483648.0; +double big = (double)INT_MAX; +double minusbig = (double)INT_MIN; /* Bypasses the CRT, so there's no stdio or BSS initialisation. */ void _m_a_i_n(void) @@ -13,8 +14,8 @@ void _m_a_i_n(void) ASSERT((int)zero == 0); ASSERT((int)one == 1); ASSERT((int)minusone == -1); - ASSERT((int)big == 2147483647); - ASSERT((int)minusbig == -2147483648); + ASSERT((int)big == INT_MAX); + ASSERT((int)minusbig == INT_MIN); finished(); } \ No newline at end of file diff --git a/tests/plat/from_d_to_ui_e.c b/tests/plat/from_d_to_ui_e.c index b16667502..811780b87 100644 --- a/tests/plat/from_d_to_ui_e.c +++ b/tests/plat/from_d_to_ui_e.c @@ -1,16 +1,17 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ double one = 1.0; double zero = 0.0; -double big = 4294967295.0; +double big = (double)UINT_MAX; /* Bypasses the CRT, so there's no stdio or BSS initialisation. */ void _m_a_i_n(void) { ASSERT((unsigned int)zero == 0); ASSERT((unsigned int)one == 1); - ASSERT((unsigned int)big == 4294967295); + ASSERT((unsigned int)big == UINT_MAX); finished(); } \ No newline at end of file diff --git a/tests/plat/from_si_to_d_e.c b/tests/plat/from_si_to_d_e.c index e81c2f7c2..b6c7a25ba 100644 --- a/tests/plat/from_si_to_d_e.c +++ b/tests/plat/from_si_to_d_e.c @@ -1,11 +1,12 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ int one = 1; int zero = 0; int minusone = -1; -int big = 0x7fffffff; -int minusbig = -0x8000000; +int big = INT_MAX; +int minusbig = INT_MIN; /* Bypasses the CRT, so there's no stdio or BSS initialisation. */ void _m_a_i_n(void) @@ -13,8 +14,8 @@ void _m_a_i_n(void) ASSERT((double)zero == 0.0); ASSERT((double)one == 1.0); ASSERT((double)minusone == -1.0); - ASSERT((double)big == 2147483647.0); - /* ASSERT((double)minusbig == -2147483648.0); FIXME: fails for now */ + ASSERT((double)big == (double)INT_MAX); + /* ASSERT((double)minusbig == (double)INT_MIN); FIXME: fails for now */ finished(); } \ No newline at end of file diff --git a/tests/plat/from_ui_to_d_e.c b/tests/plat/from_ui_to_d_e.c index a3517b24c..b8e017c99 100644 --- a/tests/plat/from_ui_to_d_e.c +++ b/tests/plat/from_ui_to_d_e.c @@ -1,16 +1,17 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ unsigned int one_u = 1; unsigned int zero_u = 0; -unsigned int big_u = 0xffffffff; +unsigned int big_u = UINT_MAX; /* Bypasses the CRT, so there's no stdio or BSS initialisation. */ void _m_a_i_n(void) { ASSERT((double)zero_u == 0.0); ASSERT((double)one_u == 1.0); - ASSERT((double)big_u == 4294967295.0); + ASSERT((double)big_u == (double)UINT_MAX); finished(); } \ No newline at end of file diff --git a/tests/plat/inn_e.e b/tests/plat/inn_e.e index 4e53b35c5..7d27abf42 100644 --- a/tests/plat/inn_e.e +++ b/tests/plat/inn_e.e @@ -1,5 +1,5 @@ # - mes 2, 4, 4 + mes 2, EM_WSIZE, EM_PSIZE exp $_m_a_i_n pro $_m_a_i_n, 0 @@ -10,12 +10,12 @@ rom 0I1, 0I1, 0I1, 0I1 loe .1 loc 1 /* bit number */ - inn 4 + inn EM_WSIZE zeq *1 loc __LINE__ cal $fail - ass 4 + ass EM_WSIZE 1 /* Test existent bit */ @@ -24,12 +24,12 @@ rom 2I1, 0I1, 0I1, 0I1 loe .2 loc 1 /* bit number */ - inn 4 + inn EM_WSIZE zne *2 loc __LINE__ cal $fail - ass 4 + ass EM_WSIZE 2 /* Test non-existent high bit */ @@ -38,36 +38,44 @@ rom 0I1, 0I1, 0I1, 0I1 rom 0I1, 0I1, 0I1, 0I1 .31 - rom 33 /* to defeat constant folding */ + rom (EM_WSIZE*8)+1 /* to defeat constant folding */ lae .3 - loi 8 + loi EM_WSIZE*2 loe .31 /* bit number */ - inn 8 + inn EM_WSIZE*2 zeq *3 loc __LINE__ cal $fail - ass 4 + ass EM_WSIZE 3 /* Test existent high bit */ .4 +#if EM_WSIZE == 2 + rom 0I1, 0I1 + rom 2I1, 0I1 +#elif EM_WSIZE == 4 rom 0I1, 0I1, 0I1, 0I1 rom 2I1, 0I1, 0I1, 0I1 +#else + #error Unknown word size +#endif + .41 - rom 33 /* to defeat constant folding */ + rom (EM_WSIZE*8)+1 /* to defeat constant folding */ lae .4 - loi 8 + loi EM_WSIZE*2 loe .41 /* bit number */ - inn 8 + inn EM_WSIZE*2 zne *4 loc __LINE__ cal $fail - ass 4 + ass EM_WSIZE 4 cal $finished diff --git a/tests/plat/intshift_e.c b/tests/plat/intshift_e.c index dd280142c..3cc6d52f9 100644 --- a/tests/plat/intshift_e.c +++ b/tests/plat/intshift_e.c @@ -1,3 +1,4 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ @@ -25,8 +26,8 @@ void _m_a_i_n(void) ASSERT(((unsigned int)one >>(unsigned int)zero) == 1); ASSERT(((unsigned int)one >>(unsigned int)one) == 0); - ASSERT(((unsigned int)minusone>>(unsigned int)zero) == 0xffffffff); - ASSERT(((unsigned int)minusone>>(unsigned int)one) == 0x7fffffff); + ASSERT(((unsigned int)minusone>>(unsigned int)zero) == UINT_MAX); + ASSERT(((unsigned int)minusone>>(unsigned int)one) == (UINT_MAX>>1)); ASSERT((one <<0) == 1); ASSERT((one <<1) == 2); @@ -45,8 +46,8 @@ void _m_a_i_n(void) ASSERT(((unsigned int)one >>(unsigned int)0) == 1); ASSERT(((unsigned int)one >>(unsigned int)1) == 0); - ASSERT(((unsigned int)minusone>>(unsigned int)0) == 0xffffffff); - ASSERT(((unsigned int)minusone>>(unsigned int)1) == 0x7fffffff); + ASSERT(((unsigned int)minusone>>(unsigned int)0) == UINT_MAX); + ASSERT(((unsigned int)minusone>>(unsigned int)1) == (UINT_MAX>>1)); finished(); } \ No newline at end of file diff --git a/tests/plat/intsub_e.c b/tests/plat/intsub_e.c index 72ba0ff08..d8f67d3a3 100644 --- a/tests/plat/intsub_e.c +++ b/tests/plat/intsub_e.c @@ -1,3 +1,4 @@ +#include #include "test.h" /* Constants in globals to defeat constant folding. */ @@ -19,13 +20,13 @@ void _m_a_i_n(void) ASSERT((1 - two) == -1); ASSERT(((unsigned int)two - (unsigned int)one) == 1); - ASSERT(((unsigned int)one - (unsigned int)two) == 0xffffffff); + ASSERT(((unsigned int)one - (unsigned int)two) == UINT_MAX); ASSERT(((unsigned int)two - (unsigned int)1) == 1); - ASSERT(((unsigned int)one - (unsigned int)2) == 0xffffffff); + ASSERT(((unsigned int)one - (unsigned int)2) == UINT_MAX); ASSERT(((unsigned int)2 - (unsigned int)one) == 1); - ASSERT(((unsigned int)1 - (unsigned int)two) == 0xffffffff); + ASSERT(((unsigned int)1 - (unsigned int)two) == UINT_MAX); finished(); } \ No newline at end of file diff --git a/tests/plat/lib/build.lua b/tests/plat/lib/build.lua index cb6b5cbea..be9928c84 100644 --- a/tests/plat/lib/build.lua +++ b/tests/plat/lib/build.lua @@ -4,5 +4,4 @@ acklibrary { name = "lib", srcs = { "./test.c" }, hdrs = { "./test.h" }, - vars = { plat = "qemuppc" } } diff --git a/tests/plat/lib/test.c b/tests/plat/lib/test.c index 33d72f3ce..d05417326 100644 --- a/tests/plat/lib/test.c +++ b/tests/plat/lib/test.c @@ -25,7 +25,7 @@ void writehex(uint32_t code) void fail(uint32_t code) { - write(1, "@@FAIL on line 0x", 7); + write(1, "@@FAIL 0x", 10); writehex(code); write(1, "\n", 1); } diff --git a/tests/plat/lib/test.h b/tests/plat/lib/test.h index 96537a2cb..db16506f9 100644 --- a/tests/plat/lib/test.h +++ b/tests/plat/lib/test.h @@ -9,6 +9,6 @@ extern void writehex(uint32_t code); extern void fail(uint32_t code); #define ASSERT(condition) \ - if (!(condition)) fail(__LINE__) + do { if (!(condition)) fail(__LINE__); } while(0) #endif diff --git a/tests/plat/testdriver.sh b/tests/plat/testdriver.sh index 3424e9626..29d9063eb 100755 --- a/tests/plat/testdriver.sh +++ b/tests/plat/testdriver.sh @@ -1,5 +1,5 @@ #!/bin/sh -qemu=$1 +method=$1 img=$2 timeout=$3 @@ -13,10 +13,25 @@ trap "rm -f $result" EXIT pidfile=/tmp/$$.testdriver.pid trap "rm -f $pidfile" EXIT -( $qemu -nographic -kernel $img 2>&1 & echo $! > $pidfile ) \ - | tee $result \ - | ( timeout $timeout grep -l -q @@FINISHED ; echo ) \ - | ( read dummy && kill $(cat $pidfile) ) +case $method in + qemu-system-*) + if ! hash $method 2>/dev/null; then + echo "Warning: $method not installed, skipping test" + exit 0 + fi + + case $method in + qemu-system-i386) img="-drive file=$img,if=floppy,format=raw" ;; + qemu-system-ppc) img="-kernel $img" ;; + esac + + ( $method -nographic $img 2>&1 & echo $! > $pidfile ) \ + | tee $result \ + | ( timeout $timeout grep -l -q @@FINISHED ; echo ) \ + | ( read dummy && kill $(cat $pidfile) ) + + ;; +esac ( grep -q @@FAIL $result || ! grep -q @@FINISHED $result ) && cat $result && exit 1 exit 0 \ No newline at end of file