lguest: debugging patch to dump device state
---
 Documentation/lguest/lguest.c |   25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff -r 5f57a5948c6c Documentation/lguest/lguest.c
--- a/Documentation/lguest/lguest.c	Thu Nov 15 23:14:53 2007 +1100
+++ b/Documentation/lguest/lguest.c	Thu Nov 15 23:19:12 2007 +1100
@@ -745,6 +745,27 @@ struct console_abort
 	struct timeval start;
 };
 
+static void dump_devices(void)
+{
+	struct device *i;
+	struct virtqueue *vq;
+
+	/* Check each virtqueue. */
+	for (i = devices.dev; i; i = i->next) {
+		printf("Device %s:\n", i->name);
+		for (vq = i->vq; vq; vq = vq->next) {
+			printf("  Virtqueue %p:\n", vq);
+			printf("   num = %u\n", vq->vring.num);
+			printf("   avail: flags=%u idx=%u (last=%u)\n",
+			       vq->vring.avail->flags,
+			       vq->vring.avail->idx, vq->last_avail_idx);
+			printf("   used: flags=%u idx=%u\n",
+			       vq->vring.used->flags,
+			       vq->vring.used->idx);
+		}
+	}
+}
+
 /* This is the routine which handles console input (ie. stdin). */
 static bool handle_console_input(int fd, struct device *dev)
 {
@@ -801,10 +822,12 @@ static bool handle_console_input(int fd,
 				/* Just in case waker is blocked in BREAK, send
 				 * unbreak now. */
 				write(fd, args, sizeof(args));
+				dump_devices();
 				exit(2);
 			}
 			abort->count = 0;
-		}
+		} else if (abort->count == 2)
+			dump_devices();
 	} else
 		/* Any other key resets the abort counter. */
 		abort->count = 0;
