All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RISU PATCH 0/9] Record/playback patches
@ 2016-12-02 15:59 Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 1/9] risu: a bit more verbosity when running Alex Bennée
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

Hi Peter,

I've been cleaning things up so I thought I should re-post my current
state. These all apply to the current master.

I had to regenerate all the risu binaries as I'd used --no-fp for a
bunch of them originally which was causing failures. I'm not sure if
this is due to the FP registers not being cleared by the kernel if FP
isn't used - but we certainly don't do anything to them except when
set by the memory/context blocks (without --no-fp). This led me to
write the 3 noddy scripts included here.

The record/playback is still aarch64 only. I'm open to ideas to do
this more cleanly otherwise if anyone has access to some PPC hardware
I can port the record/playback code to the other architectures.

Feel free to cherry-pick any of the minor patches as you wish ;-)

Alex Bennée (9):
  risu: a bit more verbosity when running
  aarch64: add hand-coded risu skeleton for directed testing
  risu: add simple trace and replay support
  risu: add support compressed tracefiles
  risu_aarch64: it's -> it is
  risugen: remove grocer's apostrophe from REs
  new: generate_all.sh script
  new: record_traces.sh helper script
  new: run_risu.sh script

 Makefile                      |  10 +-
 aarch64_simd_handcoded.risu.S | 208 ++++++++++++++++++++++++++++++++++++++++++
 configure                     |  55 +++++++++++
 generate_all.sh               |  55 +++++++++++
 record_traces.sh              |  16 ++++
 risu.c                        | 116 ++++++++++++++++++-----
 risu.h                        |  15 +++
 risu_aarch64.c                |  89 +++++++++++++++++-
 risu_reginfo_aarch64.h        |   7 ++
 risugen                       |   2 +-
 run_risu.sh                   |  51 +++++++++++
 11 files changed, 598 insertions(+), 26 deletions(-)
 create mode 100644 aarch64_simd_handcoded.risu.S
 create mode 100755 generate_all.sh
 create mode 100755 record_traces.sh
 create mode 100755 run_risu.sh

-- 
2.10.2

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 1/9] risu: a bit more verbosity when running
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 2/9] aarch64: add hand-coded risu skeleton for directed testing Alex Bennée
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

Before this is could seem a little quite when running as you had no
indication stuff was happening (or how fast). I only dump on the master
side as I want to minimise the amount of qemu logs to sift through.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 risu.c         | 15 +++++++++++++--
 risu.h         |  3 +++
 risu_aarch64.c |  3 +++
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/risu.c b/risu.c
index 7e42160..756ca46 100644
--- a/risu.c
+++ b/risu.c
@@ -37,6 +37,16 @@ sigjmp_buf jmpbuf;
 /* Should we test for FP exception status bits? */
 int test_fp_exc = 0;
 
+long executed_tests = 0;
+void report_test_status(void *pc)
+{
+   executed_tests += 1;
+   if (executed_tests % 100 == 0) {
+      fprintf(stderr,"Executed %ld test instructions (pc=%p)\r",
+              executed_tests, pc);
+   }
+}
+
 void master_sigill(int sig, siginfo_t *si, void *uc)
 {
    switch (recv_and_compare_register_info(master_socket, uc))
@@ -61,6 +71,7 @@ void apprentice_sigill(int sig, siginfo_t *si, void *uc)
          return;
       case 1:
          /* end of test */
+         fprintf(stderr, "\nend of test\n");
          exit(0);
       default:
          /* mismatch */
@@ -129,7 +140,7 @@ int master(int sock)
    }
    master_socket = sock;
    set_sigill_handler(&master_sigill);
-   fprintf(stderr, "starting image\n");
+   fprintf(stderr, "starting master image at 0x%lx\n", image_start_address);
    image_start();
    fprintf(stderr, "image returned unexpectedly\n");
    exit(1);
@@ -139,7 +150,7 @@ int apprentice(int sock)
 {
    apprentice_socket = sock;
    set_sigill_handler(&apprentice_sigill);
-   fprintf(stderr, "starting image\n");
+   fprintf(stderr, "starting apprentice image at 0x%lx\n", image_start_address);
    image_start();
    fprintf(stderr, "image returned unexpectedly\n");
    exit(1);
diff --git a/risu.h b/risu.h
index 26ed834..e4bb323 100644
--- a/risu.h
+++ b/risu.h
@@ -26,6 +26,7 @@ extern uintptr_t image_start_address;
 extern void *memblock;
 
 extern int test_fp_exc;
+extern int ismaster;
 
 /* Ops code under test can request from risu: */
 #define OP_COMPARE 0
@@ -59,6 +60,8 @@ int recv_and_compare_register_info(int sock, void *uc);
  */
 int report_match_status(void);
 
+void report_test_status(void *pc);
+
 /* Move the PC past this faulting insn by adjusting ucontext
  */
 void advance_pc(void *uc);
diff --git a/risu_aarch64.c b/risu_aarch64.c
index 547f987..1595604 100644
--- a/risu_aarch64.c
+++ b/risu_aarch64.c
@@ -28,6 +28,9 @@ void advance_pc(void *vuc)
 {
     ucontext_t *uc = vuc;
     uc->uc_mcontext.pc += 4;
+    if (ismaster) {
+      report_test_status((void *) uc->uc_mcontext.pc);
+    }
 }
 
 static void set_x0(void *vuc, uint64_t x0)
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 2/9] aarch64: add hand-coded risu skeleton for directed testing
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 1/9] risu: a bit more verbosity when running Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 3/9] risu: add simple trace and replay support Alex Bennée
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

Sometimes you want absolute control over your test set-up to feed
explicit values into the test. This started as an experiment but might
be useful for further developing tests.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 Makefile                      |   7 ++
 aarch64_simd_handcoded.risu.S | 208 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 215 insertions(+)
 create mode 100644 aarch64_simd_handcoded.risu.S

diff --git a/Makefile b/Makefile
index bfa8cac..4202c35 100644
--- a/Makefile
+++ b/Makefile
@@ -36,6 +36,13 @@ $(PROG): $(OBJS)
 %.risu.asm: %.risu.bin
 	${OBJDUMP} -b binary -m $(ARCH) -D $^ > $@
 
+# hand-coded tests
+%.risu.bin: %.risu.elf
+	$(OBJCOPY) -O binary $< $@
+
+%.risu.elf: %.risu.S
+	${AS} -o $@ $^
+
 %.o: %.c $(HDRS)
 	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
 
diff --git a/aarch64_simd_handcoded.risu.S b/aarch64_simd_handcoded.risu.S
new file mode 100644
index 0000000..61bd11a
--- /dev/null
+++ b/aarch64_simd_handcoded.risu.S
@@ -0,0 +1,208 @@
+/*
+    Hand coded RISU tests for aarch64
+
+    Sometimes you want slightly more than random instructions and you
+    want a specifically crafted test but within RISU's framework.
+
+    This file offers such a thing.
+        # So the last nibble indicates the desired operation:
+my $OP_COMPARE = 0;        # compare registers
+my $OP_TESTEND = 1;        # end of test, stop
+my $OP_SETMEMBLOCK = 2;    # r0 is address of memory block (8192 bytes)
+my $OP_GETMEMBLOCK = 3;    # add the address of memory block to r0
+my $OP_COMPAREMEM = 4;     # compare memory block
+
+        */
+
+.macro  risuop_comp
+        .word   0x00005af0
+.endm
+.macro  risuop_testend
+        .word   0x00005af1
+.endm
+
+        .org    0x0
+        
+//.globl	.data
+ 	mov	x0, #0x0                   	// #0
+ 	msr	fpsr, x0
+ 	mov	x0, #0x0                   	// #0
+ 	msr	fpcr, x0
+ 	mrs	x0, nzcv
+ 	eor	w0, w0, #0xf0000000
+ 	msr	nzcv, x0
+ 	adr	x0, _q0
+ 	eor	x0, x0, #0xf
+ 	b	reg_setup
+
+        /*
+
+        This is the of block of data used for ld/st and setting up vector regs
+        Each .word is 32bits of data
+
+        */
+        .align  16
+        
+_q0:    .word   0x70000000, 0xffffffff, 0x80000000, 0xffffffff
+_q1:    .word   0x90000000, 0x00000000, 0xa0000000, 0x00000000
+_q2:    .word   0xffff0000, 0x00000000, 0xeeee0000, 0x00000000
+_q3:    .word   0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
+_q4:    .word   0x80000000, 0x00000000, 0xf0000000, 0x00000000
+_q5:    .word   0xffff0000, 0x00000000, 0xeeee0000, 0x00000000
+_q6:    .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q7:    .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+
+_q8:    .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q9:    .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q10:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q11:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q12:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q13:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q14:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q15:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+
+_q16:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q17:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q18:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q19:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q20:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q21:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q22:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q23:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+
+_q24:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q25:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q26:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q27:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q28:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q29:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q30:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+_q31:   .word   0x00000000, 0x00000000, 0x00000000, 0x00000000
+        
+        .align  16
+
+        /* Setup the register state */
+reg_setup:
+ 	ldp	q0, q1, [x0],#32
+ 	ldp	q2, q3, [x0],#16
+ 	ldp	q4, q5, [x0],#16
+ 	ldp	q6, q7, [x0],#16
+ 	ldp	q8, q9, [x0],#16
+ 	ldp	q10, q11, [x0],#16
+ 	ldp	q12, q13, [x0],#16
+ 	ldp	q14, q15, [x0],#16
+ 	ldp	q16, q17, [x0],#16
+ 	ldp	q18, q19, [x0],#16
+ 	ldp	q20, q21, [x0],#16
+ 	ldp	q22, q23, [x0],#16
+ 	ldp	q24, q25, [x0],#16
+ 	ldp	q26, q27, [x0],#16
+ 	ldp	q28, q29, [x0],#16
+ 	ldp	q30, q31, [x0],#16
+
+        /* Set-up integer registers */
+        mov     x0, #0
+        mov     x1, #0
+        mov     x2, #0
+        mov     x3, #0
+        mov     x4, #0
+        mov     x5, #0
+        mov     x6, #0
+        mov     x7, #0
+        mov     x8, #0
+        mov     x9, #0
+        mov     x10, #0
+        mov     x11, #0
+        mov     x12, #0
+        mov     x13, #0
+        mov     x14, #0
+        mov     x15, #0
+        mov     x16, #0
+        mov     x17, #0
+        mov     x18, #0
+        mov     x19, #0
+        mov     x20, #0
+        mov     x21, #0
+        mov     x22, #0
+        mov     x23, #0
+        mov     x24, #0
+        mov     x25, #0
+        mov     x26, #0
+        mov     x26, #0
+        mov     x27, #0
+        mov     x28, #0
+        mov     x29, #0
+        mov     x30, #0
+
+        risuop_comp
+
+        /* Testing ursra */
+        
+ 	ursra	v16.2d, v0.2d, #64
+        risuop_comp
+ 	ursra	v17.2d, v1.2d, #64
+        risuop_comp
+ 	ursra	v18.2d, v2.2d, #64
+        risuop_comp
+ 	ursra	v19.2d, v3.2d, #64
+        risuop_comp
+ 	ursra	v20.2d, v4.2d, #64
+        risuop_comp
+ 	ursra	v21.2d, v5.2d, #64
+        risuop_comp
+ 	ursra	v22.2d, v6.2d, #64
+        risuop_comp
+ 	ursra	v23.2d, v7.2d, #64
+        risuop_comp
+ 	ursra	v24.2d, v8.2d, #64
+        risuop_comp
+ 	ursra	v25.2d, v9.2d, #64
+        risuop_comp
+ 	ursra	v26.2d, v10.2d, #64
+        risuop_comp
+ 	ursra	v27.2d, v11.2d, #64
+        risuop_comp
+ 	ursra	v28.2d, v12.2d, #64
+        risuop_comp
+ 	ursra	v29.2d, v13.2d, #64
+        risuop_comp
+ 	ursra	v30.2d, v14.2d, #64
+        risuop_comp
+ 	ursra	v31.2d, v15.2d, #64
+        risuop_comp
+
+        /* second pass */
+        ursra	v16.2d, v0.2d, #64
+        risuop_comp
+ 	ursra	v17.2d, v1.2d, #64
+        risuop_comp
+ 	ursra	v18.2d, v2.2d, #64
+        risuop_comp
+ 	ursra	v19.2d, v3.2d, #64
+        risuop_comp
+ 	ursra	v20.2d, v4.2d, #64
+        risuop_comp
+ 	ursra	v21.2d, v5.2d, #64
+        risuop_comp
+ 	ursra	v22.2d, v6.2d, #64
+        risuop_comp
+ 	ursra	v23.2d, v7.2d, #64
+        risuop_comp
+ 	ursra	v24.2d, v8.2d, #64
+        risuop_comp
+ 	ursra	v25.2d, v9.2d, #64
+        risuop_comp
+ 	ursra	v26.2d, v10.2d, #64
+        risuop_comp
+ 	ursra	v27.2d, v11.2d, #64
+        risuop_comp
+ 	ursra	v28.2d, v12.2d, #64
+        risuop_comp
+ 	ursra	v29.2d, v13.2d, #64
+        risuop_comp
+ 	ursra	v30.2d, v14.2d, #64
+        risuop_comp
+ 	ursra	v31.2d, v15.2d, #64
+        risuop_comp
+
+        risuop_testend       /* test end */
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 3/9] risu: add simple trace and replay support
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 1/9] risu: a bit more verbosity when running Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 2/9] aarch64: add hand-coded risu skeleton for directed testing Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 4/9] risu: add support compressed tracefiles Alex Bennée
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

This adds a very dumb and easily breakable trace and replay support to
the aarch64 build of risu. In --master mode the various risu ops trigger
a write of register/memory state into a binary file which can be played
back to an apprentice. Currently there is no validation of the image
source so feeding the wrong image will fail straight away.

The trace files will get very big for any appreciable sized test file
and this will be addressed in later patches.

There is an inevitable amount of copy&paste between the trace file and
socket based code. Ideally it would be nice to have as much of this as
common as possible and reduce the re-implementation between the various
backends.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---

v2
  - moved read/write functions into main risu.c
  - cleaned up formatting
  - report more in apprentice --trace mode
v3
  - fix options parsing
---
 risu.c                 | 104 +++++++++++++++++++++++++++++++++++++------------
 risu.h                 |  12 ++++++
 risu_aarch64.c         |  90 ++++++++++++++++++++++++++++++++++++++++--
 risu_reginfo_aarch64.h |   7 ++++
 4 files changed, 185 insertions(+), 28 deletions(-)

diff --git a/risu.c b/risu.c
index 756ca46..f36b4c6 100644
--- a/risu.c
+++ b/risu.c
@@ -31,6 +31,7 @@
 void *memblock = 0;
 
 int apprentice_socket, master_socket;
+int trace_file = 0;
 
 sigjmp_buf jmpbuf;
 
@@ -40,31 +41,57 @@ int test_fp_exc = 0;
 long executed_tests = 0;
 void report_test_status(void *pc)
 {
-   executed_tests += 1;
-   if (executed_tests % 100 == 0) {
-      fprintf(stderr,"Executed %ld test instructions (pc=%p)\r",
-              executed_tests, pc);
+   if (ismaster || trace_file) {
+      executed_tests += 1;
+      if (executed_tests % 100 == 0) {
+         fprintf(stderr,"Executed %ld test instructions (pc=%p)\r",
+                 executed_tests, pc);
+      }
    }
 }
 
+int write_trace(void *ptr, size_t bytes)
+{
+   size_t res = write(trace_file, ptr, bytes);
+   return res == bytes;
+}
+
+int read_trace(void *ptr, size_t bytes)
+{
+   size_t res = read(trace_file, ptr, bytes);
+   return res == bytes;
+}
+
 void master_sigill(int sig, siginfo_t *si, void *uc)
 {
-   switch (recv_and_compare_register_info(master_socket, uc))
-   {
-      case 0:
-         /* match OK */
-         advance_pc(uc);
-         return;
-      default:
-         /* mismatch, or end of test */
-         siglongjmp(jmpbuf, 1);
+   if (trace_file) {
+     if (write_to_tracefile(write_trace, uc)!=0) {
+       /* end of test */
+       siglongjmp(jmpbuf, 1);
+       /* never */
+       return;
+     }
+   } else {
+     if (recv_and_compare_register_info(master_socket, uc)!=0) {
+       /* mismatch, or end of test */
+       siglongjmp(jmpbuf, 1);
+       /* never */
+       return;
+     }
    }
+   advance_pc(uc);
 }
 
 void apprentice_sigill(int sig, siginfo_t *si, void *uc)
 {
-   switch (send_register_info(apprentice_socket, uc))
-   {
+  int resp;
+  if (trace_file) {
+    resp = read_tracefile_and_check(read_trace, uc);
+  } else {
+    resp = send_register_info(apprentice_socket, uc);
+  }
+  switch (resp)
+  {
       case 0:
          /* match OK */
          advance_pc(uc);
@@ -75,6 +102,9 @@ void apprentice_sigill(int sig, siginfo_t *si, void *uc)
          exit(0);
       default:
          /* mismatch */
+         if (trace_file) {
+            report_match_status();
+         }
          exit(1);
    }
 }
@@ -136,7 +166,13 @@ int master(int sock)
 {
    if (sigsetjmp(jmpbuf, 1))
    {
-      return report_match_status();
+      if (trace_file) {
+         close(trace_file);
+         fprintf(stderr,"Done...\n");
+         return 0;
+      } else {
+         return report_match_status();
+      }
    }
    master_socket = sock;
    set_sigill_handler(&master_sigill);
@@ -165,6 +201,7 @@ void usage (void)
    fprintf(stderr, "between master and apprentice risu processes.\n\n");
    fprintf(stderr, "Options:\n");
    fprintf(stderr, "  --master          Be the master (server)\n");
+   fprintf(stderr, "  -t, --trace=FILE  Record/playback trace file\n");
    fprintf(stderr, "  -h, --host=HOST   Specify master host machine (apprentice only)\n");
    fprintf(stderr, "  -p, --port=PORT   Specify the port to connect to/listen on (default 9191)\n");
 }
@@ -175,6 +212,7 @@ int main(int argc, char **argv)
    uint16_t port = 9191;
    char *hostname = "localhost";
    char *imgfile;
+   char *trace_fn = NULL;
    int sock;
 
    // TODO clean this up later
@@ -185,13 +223,14 @@ int main(int argc, char **argv)
          {
             { "help", no_argument, 0, '?'},
             { "master", no_argument, &ismaster, 1 },
+            { "trace", required_argument, 0, 't' },
             { "host", required_argument, 0, 'h' },
             { "port", required_argument, 0, 'p' },
             { "test-fp-exc", no_argument, &test_fp_exc, 1 },
             { 0,0,0,0 }
          };
       int optidx = 0;
-      int c = getopt_long(argc, argv, "h:p:", longopts, &optidx);
+      int c = getopt_long(argc, argv, "h:p:t:", longopts, &optidx);
       if (c == -1)
       {
          break;
@@ -204,6 +243,11 @@ int main(int argc, char **argv)
             /* flag set by getopt_long, do nothing */
             break;
          }
+         case 't':
+         {
+           trace_fn = optarg;
+           break;
+         }
          case 'h':
          {
             hostname = optarg;
@@ -234,18 +278,28 @@ int main(int argc, char **argv)
    }
 
    load_image(imgfile);
-   
+
    if (ismaster)
    {
-      fprintf(stderr, "master port %d\n", port);
-      sock = master_connect(port);
-      return master(sock);
+     if (trace_fn)
+       {
+         trace_file = open(trace_fn, O_WRONLY|O_CREAT, S_IRWXU);
+       } else {
+         fprintf(stderr, "master port %d\n", port);
+         sock = master_connect(port);
+       }
+     return master(sock);
    }
    else
-   {
-      fprintf(stderr, "apprentice host %s port %d\n", hostname, port);
-      sock = apprentice_connect(hostname, port);
-      return apprentice(sock);
+     {
+     if (trace_fn)
+       {
+         trace_file = open(trace_fn, O_RDONLY);
+       } else {
+         fprintf(stderr, "apprentice host %s port %d\n", hostname, port);
+         sock = apprentice_connect(hostname, port);
+       }
+     return apprentice(sock);
    }
 }
 
diff --git a/risu.h b/risu.h
index e4bb323..57161f2 100644
--- a/risu.h
+++ b/risu.h
@@ -52,6 +52,18 @@ int send_register_info(int sock, void *uc);
  */
 int recv_and_compare_register_info(int sock, void *uc);
 
+/* To keep the read/write logic from multiplying across all arches
+ * we wrap up the function here to keep all the changes in one place
+ */
+typedef int (*trace_write_fn) (void *ptr, size_t bytes);
+typedef int (*trace_read_fn) (void *ptr, size_t bytes);
+
+/* Write out to trace file */
+int write_to_tracefile(trace_write_fn write_fn, void *uc);
+
+/* Read from trace file and check */
+int read_tracefile_and_check(trace_read_fn read_fn, void * uc);
+
 /* Print a useful report on the status of the last comparison
  * done in recv_and_compare_register_info(). This is called on
  * exit, so need not restrict itself to signal-safe functions.
diff --git a/risu_aarch64.c b/risu_aarch64.c
index 1595604..9d538cb 100644
--- a/risu_aarch64.c
+++ b/risu_aarch64.c
@@ -13,6 +13,7 @@
 #include <stdio.h>
 #include <ucontext.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "risu.h"
 #include "risu_reginfo_aarch64.h"
@@ -28,9 +29,7 @@ void advance_pc(void *vuc)
 {
     ucontext_t *uc = vuc;
     uc->uc_mcontext.pc += 4;
-    if (ismaster) {
-      report_test_status((void *) uc->uc_mcontext.pc);
-    }
+    report_test_status((void *) uc->uc_mcontext.pc);
 }
 
 static void set_x0(void *vuc, uint64_t x0)
@@ -135,6 +134,91 @@ int recv_and_compare_register_info(int sock, void *uc)
     return resp;
 }
 
+int write_to_tracefile(trace_write_fn write_fn, void *uc)
+{
+   int resp = 0, op;
+   trace_header_t header;
+
+   reginfo_init(&master_ri, uc);
+   op = get_risuop(master_ri.faulting_insn);
+   header.pc = master_ri.pc;
+   header.risu_op = op;
+   write_fn(&header, sizeof(header));
+
+   switch (op) {
+      case OP_TESTEND:
+         resp = 1;
+      case OP_COMPARE:
+      default:
+         write_fn(&master_ri, sizeof(master_ri));
+         break;
+      case OP_SETMEMBLOCK:
+         memblock = (void *)master_ri.regs[0];
+         break;
+      case OP_GETMEMBLOCK:
+         set_x0(uc, master_ri.regs[0] + (uintptr_t)memblock);
+         break;
+      case OP_COMPAREMEM:
+         write_fn(memblock, MEMBLOCKLEN);
+         break;
+   }
+
+   return resp;
+}
+
+
+int read_tracefile_and_check(trace_read_fn read_fn, void * uc)
+{
+   int resp = 0, op;
+   trace_header_t header;
+
+   reginfo_init(&master_ri, uc);
+   op = get_risuop(master_ri.faulting_insn);
+
+   read_fn(&header, sizeof(header));
+   if ( header.pc == master_ri.pc &&
+        header.risu_op == op )
+   {
+      switch (op) {
+         case OP_COMPARE:
+         case OP_TESTEND:
+         default:
+            if (!read_fn(&apprentice_ri, sizeof(apprentice_ri))) {
+               packet_mismatch = 1;
+               resp = 2;
+            } else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
+               /* register mismatch */
+               resp = 2;
+            } else if (op == OP_TESTEND) {
+               resp = 1;
+            }
+            break;
+         case OP_SETMEMBLOCK:
+            memblock = (void *)master_ri.regs[0];
+            break;
+         case OP_GETMEMBLOCK:
+            set_x0(uc, master_ri.regs[0] + (uintptr_t)memblock);
+            break;
+         case OP_COMPAREMEM:
+            mem_used = 1;
+            if (!read_fn(apprentice_memblock, MEMBLOCKLEN)) {
+               packet_mismatch = 1;
+               resp = 2;
+            } else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
+               /* memory mismatch */
+               resp = 2;
+            }
+            break;
+      }
+   } else {
+      fprintf(stderr, "out of sync %lx/%lx %d/%d\n",
+              master_ri.pc, header.pc,
+              op, header.risu_op);
+      resp = 2;
+   }
+   return resp;
+}
+
 /* Print a useful report on the status of the last comparison
  * done in recv_and_compare_register_info(). This is called on
  * exit, so need not restrict itself to signal-safe functions.
diff --git a/risu_reginfo_aarch64.h b/risu_reginfo_aarch64.h
index 166b76c..db51cb2 100644
--- a/risu_reginfo_aarch64.h
+++ b/risu_reginfo_aarch64.h
@@ -28,6 +28,13 @@ struct reginfo
     __uint128_t vregs[32];
 };
 
+typedef struct
+{
+    uint64_t pc;
+    uint32_t risu_op;
+} trace_header_t;
+
+
 /* initialize structure from a ucontext */
 void reginfo_init(struct reginfo *ri, ucontext_t *uc);
 
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 4/9] risu: add support compressed tracefiles
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (2 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 3/9] risu: add simple trace and replay support Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 5/9] risu_aarch64: it's -> it is Alex Bennée
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

This uses the magic of zlib's gzread/write interface to wrap the
tracefile in compression. The code changes are tiny. I spent more time
messing about with the configure/linker stuff to auto-detect bits.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 Makefile  |  3 ++-
 configure | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 risu.c    | 13 +++++++++----
 3 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/Makefile b/Makefile
index 4202c35..4a2ef02 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@
 include Makefile.in
 
 CFLAGS ?= -g -Wall
+LDFLAGS += -lz
 
 PROG=risu
 SRCS=risu.c comms.c risu_$(ARCH).c risu_reginfo_$(ARCH).c
@@ -31,7 +32,7 @@ all: $(PROG) $(BINS)
 dump: $(RISU_ASMS)
 
 $(PROG): $(OBJS)
-	$(CC) $(STATIC) $(CFLAGS) -o $@ $^
+	$(CC) $(STATIC) $(CFLAGS) -o $@ $^ $(LDFLAGS) 
 
 %.risu.asm: %.risu.bin
 	${OBJDUMP} -b binary -m $(ARCH) -D $^ > $@
diff --git a/configure b/configure
index f81bdb5..d11680f 100755
--- a/configure
+++ b/configure
@@ -6,6 +6,10 @@ compile() {
     $CC $CFLAGS -c -o ${1}.o ${1}.c 2>/dev/null
 }
 
+link() {
+    $LD $LDFLAGS -l${2} -o ${1} ${1}.o 2>/dev/null
+}
+
 check_define() {
     c=${tmp_dir}/check_define_${1}
     cat > ${c}.c <<EOF
@@ -34,6 +38,50 @@ guess_arch() {
     fi
 }
 
+check_type() {
+    c=${tmp_dir}/check_type_${1}
+    cat > ${c}.c <<EOF
+#include <inttypes.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+int main(void) { $1 thisone; return 0; }
+EOF
+    compile $c
+}
+
+check_lib() {
+    c=${tmp_dir}/check_lib${1}
+    cat > ${c}.c <<EOF
+#include <stdint.h>
+#include <$2.h>
+
+int main(void) { $3; return 0; }
+EOF
+    compile $c && link $c $1
+}
+
+generate_config() {
+    cfg=config.h
+    echo "generating config.h..."
+
+    echo "/* config.h - generated by the 'configure' script */" > $cfg
+    echo "#ifndef CONFIG_H" >> $cfg
+    echo "#define CONFIG_H 1" >> $cfg
+
+    if check_type uintptr_t ; then
+        echo "#define HAVE_UINTPTR_T 1" >> $cfg
+    fi
+    if check_type socklen_t ; then
+        echo "#define HAVE_SOCKLEN_T 1" >> $cfg
+    fi
+
+    echo "#endif /* CONFIG_H */" >> $cfg
+
+    echo "...done"
+}
+
 generate_makefilein() {
     m=Makefile.in
     echo "generating Makefile.in..."
@@ -93,6 +141,7 @@ done
 
 CC="${CC-${CROSS_PREFIX}gcc}"
 AS="${AS-${CROSS_PREFIX}as}"
+LD="${LD-${CROSS_PREFIX}ld}"
 OBJCOPY="${OBJCOPY-${CROSS_PREFIX}objcopy}"
 OBJDUMP="${OBJDUMP-${CROSS_PREFIX}objdump}"
 
@@ -100,6 +149,12 @@ if test "x${ARCH}" = "x"; then
     guess_arch
 fi
 
+if ! check_lib z zlib "zlibVersion()"; then
+    echo "Cannot find libz compression library"
+    exit 1
+fi
+
+generate_config
 generate_makefilein
 
 echo "type 'make' to start the build"
diff --git a/risu.c b/risu.c
index f36b4c6..1d58d4f 100644
--- a/risu.c
+++ b/risu.c
@@ -25,6 +25,7 @@
 #include <sys/mman.h>
 #include <fcntl.h>
 #include <string.h>
+#include <zlib.h>
 
 #include "risu.h"
 
@@ -32,6 +33,7 @@ void *memblock = 0;
 
 int apprentice_socket, master_socket;
 int trace_file = 0;
+gzFile gz_trace_file;
 
 sigjmp_buf jmpbuf;
 
@@ -52,13 +54,13 @@ void report_test_status(void *pc)
 
 int write_trace(void *ptr, size_t bytes)
 {
-   size_t res = write(trace_file, ptr, bytes);
+   size_t res = gzwrite(gz_trace_file, ptr, bytes);
    return res == bytes;
 }
 
 int read_trace(void *ptr, size_t bytes)
 {
-   size_t res = read(trace_file, ptr, bytes);
+   size_t res = gzread(gz_trace_file, ptr, bytes);
    return res == bytes;
 }
 
@@ -166,8 +168,9 @@ int master(int sock)
 {
    if (sigsetjmp(jmpbuf, 1))
    {
-      if (trace_file) {
-         close(trace_file);
+      if (trace_file)
+      {
+         gzclose(gz_trace_file);
          fprintf(stderr,"Done...\n");
          return 0;
       } else {
@@ -284,6 +287,7 @@ int main(int argc, char **argv)
      if (trace_fn)
        {
          trace_file = open(trace_fn, O_WRONLY|O_CREAT, S_IRWXU);
+         gz_trace_file = gzdopen(trace_file, "wb9");
        } else {
          fprintf(stderr, "master port %d\n", port);
          sock = master_connect(port);
@@ -295,6 +299,7 @@ int main(int argc, char **argv)
      if (trace_fn)
        {
          trace_file = open(trace_fn, O_RDONLY);
+         gz_trace_file = gzdopen(trace_file, "rb");
        } else {
          fprintf(stderr, "apprentice host %s port %d\n", hostname, port);
          sock = apprentice_connect(hostname, port);
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 5/9] risu_aarch64: it's -> it is
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (3 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 4/9] risu: add support compressed tracefiles Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 6/9] risugen: remove grocer's apostrophe from REs Alex Bennée
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 risu_aarch64.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/risu_aarch64.c b/risu_aarch64.c
index 9d538cb..77f9288 100644
--- a/risu_aarch64.c
+++ b/risu_aarch64.c
@@ -82,7 +82,7 @@ int send_register_info(int sock, void *uc)
  * NB: called from a signal handler.
  *
  * We don't have any kind of identifying info in the incoming data
- * that says whether it's register or memory data, so if the two
+ * that says whether it is register or memory data, so if the two
  * sides get out of sync then we will fail obscurely.
  */
 int recv_and_compare_register_info(int sock, void *uc)
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 6/9] risugen: remove grocer's apostrophe from REs
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (4 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 5/9] risu_aarch64: it's -> it is Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 7/9] new: generate_all.sh script Alex Bennée
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

This also fixes perl-modes confusion about escaped strings.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 risugen | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/risugen b/risugen
index a604fe5..77a550b 100755
--- a/risugen
+++ b/risugen
@@ -288,7 +288,7 @@ Valid options:
                    'VMULL' will match 'VMULL A1' and 'VMULL A2' but not
                    'VMULL_scalar A1'. This is generally what you wanted.
     --not-pattern re[,re...] : exclude patterns matching regular expression.
-                   These RE's are applied after the matching pattern which
+                   These REs are applied after the matching pattern which
                    is useful if you want to exclude a specific instruction from
                    a general set you have excluded.
      --no-fp      : disable floating point: no fp init, randomization etc.
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 7/9] new: generate_all.sh script
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (5 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 6/9] risugen: remove grocer's apostrophe from REs Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 8/9] new: record_traces.sh helper script Alex Bennée
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

A simple script to cut up a full .risu file and generate binaries for
the whole set. Call with risu file and instruction count and directory:

  ./generate_all.sh aarch64.risu 4 20000 testcases.aarch64

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 generate_all.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100755 generate_all.sh

diff --git a/generate_all.sh b/generate_all.sh
new file mode 100755
index 0000000..4c490be
--- /dev/null
+++ b/generate_all.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Generate All Patterns
+#
+# Work through a given .risu file and generate full coverage
+#
+
+BASE_SHELL_PARAMS="./risugen"
+
+risufile=$1
+divisor=$2
+insns=$3
+dir=$4
+
+if test -z "$risufile"; then
+    echo "Need to specify a risu defintiion file"
+    exit 1
+fi
+
+if test -z "$divisor"; then
+    divisor=4
+fi
+
+if test -n "$insns"; then
+    BASE_SHELL_PARAMS="${BASE_SHELL_PARAMS} --numinsns $insns"
+fi
+
+if test -n "dir"; then
+    mkdir -p $dir
+else
+    dir="./"
+fi
+
+ALL_INSNS=$(cat $risufile | ag "^\w" | cut -f 1 -d " " | sort)
+COUNT=$(cat $risufile | ag "^\w" | cut -f 1 -d " " | wc -l)
+set -- $ALL_INSNS
+
+GROUP=$((COUNT / $divisor))
+
+while test $# -gt 0 ; do
+    INSN_PATTERNS=""
+    I_FILE="$dir/insn_"
+    for i in `seq 1 $divisor`; do
+        I=$1
+        if test -n "${I}"; then
+            shift
+            INSN_PATTERNS="${INSN_PATTERNS} --pattern ${I}"
+            I_FILE="${I_FILE}${I}_"
+        fi
+    done
+    I_FILE="${I_FILE}_INC.risu.bin"
+    CMD="$BASE_SHELL_PARAMS ${INSN_PATTERNS} $risufile ${I_FILE}"
+    echo "Running: $CMD"
+    $CMD
+done
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 8/9] new: record_traces.sh helper script
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (6 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 7/9] new: generate_all.sh script Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 9/9] new: run_risu.sh script Alex Bennée
  2016-12-05  9:50 ` [Qemu-devel] [RISU PATCH 0/9] Record/playback patches joserz
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

A simple script to run through a bunch of binaries and generate their
trace files.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 record_traces.sh | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100755 record_traces.sh

diff --git a/record_traces.sh b/record_traces.sh
new file mode 100755
index 0000000..89c62d5
--- /dev/null
+++ b/record_traces.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+#
+# Record traces
+#
+# A risu helper script to batch process a bunch of binaries and record their outputs
+#
+set -e
+
+
+for f in $@; do
+    echo "Running risu against $f"
+    t="$f.trace"
+    ./risu --master $f -t $t
+    echo "Checking trace file OK"
+    ./risu $f -t $t
+done
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [RISU PATCH 9/9] new: run_risu.sh script
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (7 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 8/9] new: record_traces.sh helper script Alex Bennée
@ 2016-12-02 15:59 ` Alex Bennée
  2016-12-05  9:50 ` [Qemu-devel] [RISU PATCH 0/9] Record/playback patches joserz
  9 siblings, 0 replies; 11+ messages in thread
From: Alex Bennée @ 2016-12-02 15:59 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, joserz, Alex Bennée

A simple script to work through running all of a bunch of files with
record/playback traces. Dumps a summary and the number of failed tests
at the end.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 run_risu.sh | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100755 run_risu.sh

diff --git a/run_risu.sh b/run_risu.sh
new file mode 100755
index 0000000..8a91e1a
--- /dev/null
+++ b/run_risu.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# Run risu against a set of binaries + trace files
+#
+#
+#set -e
+
+passed=()
+failed=()
+missing=()
+
+script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)
+risu_path=${script_dir}/risu
+
+for f in $@; do
+    t="$f.trace"
+    echo "Running $f against $t"
+    if [ -e $t ]; then
+        ${QEMU} ${risu_path} $f -t $t
+        if [ $? == 0 ]; then
+            passed=( "${passed[@]}" $f )
+        else
+            failed=( "${failed[@]}" $f )
+        fi
+    else
+        missing=( "${missing[@]}" $f )
+    fi
+done
+
+if test ${#missing[@]} -gt 0; then
+    echo "Tests missing ${#missing[@]} trace files:"
+    for m in "${missing[@]}"; do
+        echo "$m"
+    done
+fi
+
+if test ${#passed[@]} -gt 0; then
+    echo "Passed ${#passed[@]} tests:"
+    for p in "${passed[@]}"; do
+        echo "$p"
+    done
+fi
+
+if test ${#failed[@]} -gt 0; then
+    echo "Failed ${#failed[@]} tests:"
+    for f in "${failed[@]}"; do
+        echo "$f"
+    done
+fi
+
+exit ${#failed[@]}
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [RISU PATCH 0/9] Record/playback patches
  2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
                   ` (8 preceding siblings ...)
  2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 9/9] new: run_risu.sh script Alex Bennée
@ 2016-12-05  9:50 ` joserz
  9 siblings, 0 replies; 11+ messages in thread
From: joserz @ 2016-12-05  9:50 UTC (permalink / raw)
  To: Alex Bennée; +Cc: peter.maydell, qemu-devel

On Fri, Dec 02, 2016 at 03:59:26PM +0000, Alex Bennée wrote:
> Hi Peter,
> 
> I've been cleaning things up so I thought I should re-post my current
> state. These all apply to the current master.
> 
> I had to regenerate all the risu binaries as I'd used --no-fp for a
> bunch of them originally which was causing failures. I'm not sure if
> this is due to the FP registers not being cleared by the kernel if FP
> isn't used - but we certainly don't do anything to them except when
> set by the memory/context blocks (without --no-fp). This led me to
> write the 3 noddy scripts included here.
> 
> The record/playback is still aarch64 only. I'm open to ideas to do
> this more cleanly otherwise if anyone has access to some PPC hardware
> I can port the record/playback code to the other architectures.

Excellent job, Alex

I can make the PPC port here. I still have work to do in Risu for PPC so
I can include this in my task as well. I'm planning to start working on
it this week.

Thank you

> 
> Feel free to cherry-pick any of the minor patches as you wish ;-)
> 
> Alex Bennée (9):
>   risu: a bit more verbosity when running
>   aarch64: add hand-coded risu skeleton for directed testing
>   risu: add simple trace and replay support
>   risu: add support compressed tracefiles
>   risu_aarch64: it's -> it is
>   risugen: remove grocer's apostrophe from REs
>   new: generate_all.sh script
>   new: record_traces.sh helper script
>   new: run_risu.sh script
> 
>  Makefile                      |  10 +-
>  aarch64_simd_handcoded.risu.S | 208 ++++++++++++++++++++++++++++++++++++++++++
>  configure                     |  55 +++++++++++
>  generate_all.sh               |  55 +++++++++++
>  record_traces.sh              |  16 ++++
>  risu.c                        | 116 ++++++++++++++++++-----
>  risu.h                        |  15 +++
>  risu_aarch64.c                |  89 +++++++++++++++++-
>  risu_reginfo_aarch64.h        |   7 ++
>  risugen                       |   2 +-
>  run_risu.sh                   |  51 +++++++++++
>  11 files changed, 598 insertions(+), 26 deletions(-)
>  create mode 100644 aarch64_simd_handcoded.risu.S
>  create mode 100755 generate_all.sh
>  create mode 100755 record_traces.sh
>  create mode 100755 run_risu.sh
> 
> -- 
> 2.10.2
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-12-05  9:51 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-02 15:59 [Qemu-devel] [RISU PATCH 0/9] Record/playback patches Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 1/9] risu: a bit more verbosity when running Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 2/9] aarch64: add hand-coded risu skeleton for directed testing Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 3/9] risu: add simple trace and replay support Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 4/9] risu: add support compressed tracefiles Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 5/9] risu_aarch64: it's -> it is Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 6/9] risugen: remove grocer's apostrophe from REs Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 7/9] new: generate_all.sh script Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 8/9] new: record_traces.sh helper script Alex Bennée
2016-12-02 15:59 ` [Qemu-devel] [RISU PATCH 9/9] new: run_risu.sh script Alex Bennée
2016-12-05  9:50 ` [Qemu-devel] [RISU PATCH 0/9] Record/playback patches joserz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.