diff --git a/defs.h b/defs.h
index 244b10e..ca306ad 100755
--- a/defs.h
+++ b/defs.h
@@ -2223,6 +2223,7 @@ struct list_data {             /* generic structure used by do_list() to walk */
 #define RETURN_ON_LIST_ERROR (VERBOSE << 6)
 #define LIST_STRUCT_RADIX_10 (VERBOSE << 7)
 #define LIST_STRUCT_RADIX_16 (VERBOSE << 8)
+#define LIST_HEAD_REVERSE    (VERBOSE << 9)
 
 struct tree_data {
 	ulong flags;
diff --git a/help.c b/help.c
index 430be52..61246a3 100755
--- a/help.c
+++ b/help.c
@@ -4661,6 +4661,9 @@ char *help__list[] = {
 "               structure; use the \"struct.member\" format in order to display",
 "               a particular member of the structure.  To display multiple",
 "               members of a structure, use a comma-separated list of members.",
+"           -r  For a list linked with list_head structures, traverse the list",
+"               in the reverse order (i.e, using the \"prev\" pointer instead",
+"               of \"next\".)",
 "           -x  Override the default output format with hexadecimal format.",
 "           -d  Override the default output format with decimal format.",
 " ",
diff --git a/tools.c b/tools.c
index 80ebaa4..d8dd04a 100755
--- a/tools.c
+++ b/tools.c
@@ -3162,7 +3162,7 @@ cmd_list(void)
 	ld = &list_data;
 	BZERO(ld, sizeof(struct list_data));
 
-        while ((c = getopt(argcnt, args, "Hhs:e:o:xd")) != EOF) {
+        while ((c = getopt(argcnt, args, "Hhrs:e:o:xd")) != EOF) {
                 switch(c)
 		{
 		case 'H':
@@ -3174,6 +3174,10 @@ cmd_list(void)
 			ld->flags |= LIST_HEAD_FORMAT;
 			break;
 
+		case 'r':
+			ld->flags |= LIST_HEAD_REVERSE;
+			break;
+
 		case 's':
 			if (ld->structname_args++ == 0) 
 				hq_open();
@@ -3363,12 +3367,15 @@ next_arg:
 
 	if (ld->flags & LIST_HEAD_FORMAT) {
 		ld->list_head_offset = ld->member_offset;
-		ld->member_offset = 0;
+		if (ld->flags & LIST_HEAD_REVERSE)
+			ld->member_offset = sizeof(void *);
+		else
+			ld->member_offset = 0;
 		if (ld->flags & LIST_HEAD_POINTER) {
 			if (!ld->end)
 				ld->end = ld->start;
-        		readmem(ld->start, KVADDR, &ld->start, sizeof(void *),
-				"LIST_HEAD contents", FAULT_ON_ERROR);
+			readmem(ld->start + ld->member_offset, KVADDR, &ld->start,
+				sizeof(void *), "LIST_HEAD contents", FAULT_ON_ERROR);
 			if (ld->start == ld->end) {
 				fprintf(fp, "(empty)\n");
 				return;
-- 
1.7.11.3

