Browse Source

regress/args
- some simple fiddling with the args
- some floating point operations that used to crash if the stack wasn't aligned right
- an explicit check for stack alignment.

regress/syscall
- do a busy-loop of open/read/close on /proc/1/status.
- crashes every time,
- either a kernel page fault at a low address, or sometimes
- just a deadlock in clockintr (ilock).

Change-Id: I73ee5fcebb611c17566ce7fe71bc33a04487f425

Aki Nyrhinen 8 years ago
parent
commit
a0f58cf1db
2 changed files with 63 additions and 0 deletions
  1. 38 0
      sys/src/regress/args.c
  2. 25 0
      sys/src/regress/syscall.c

+ 38 - 0
sys/src/regress/args.c

@@ -0,0 +1,38 @@
+#include <u.h>
+#include <libc.h>
+
+/*
+ *	The whole regression test I am after here is to call regress/args with
+ *	arguments of various lengths, in order to trigger different stack alignments
+ *	due to varying amounts of stuff in args.
+ *
+ *	It turned out that gcc compiles fprintf into something that uses
+ *	fpu instructions which require the stack to be 16-aligned, so in
+ *	fact the fprint for sum here would suicide the process if the stack
+ *	it got happened to be not 16-aligned.
+ *
+ */
+
+void
+main(int argc, char *argv[])
+{
+	char *p;
+	int i;
+	double sum;
+
+	if(((uintptr_t)&p & 15) != 0){
+		fprint(2, "%p not 16-aligned\n", &p);
+		print("FAIL\n");
+		exits("FAIL");
+	}
+
+	sum = 0.0;
+	for(i = 0; i < argc; i++){
+		p = argv[i];
+		sum += strtod(p, nil);
+	}
+	fprint(2, "&sum %p\n", &sum);
+	fprint(2, "sum %f\n", sum);
+	print("PASS\n");
+	exits("PASS");
+}

+ 25 - 0
sys/src/regress/syscall.c

@@ -0,0 +1,25 @@
+
+#include <u.h>
+#include <libc.h>
+
+void
+main(void)
+{
+	char buf[1024];
+	int i, n, oldn, fail;
+	int fd;
+
+	fail = 0;
+	for(i = 0; i < 10000; i++){
+		fd = open("/proc/1/status", OREAD);
+		n = read(fd, buf, sizeof buf);
+		if(i != 0 && n != oldn){
+			fprint(2, "read %d, want %d\n", n, oldn);
+			fail++;
+		}
+		oldn = n;
+		close(fd);
+	}
+	print("PASS\n");
+	exits("PASS");
+}