Index: src/target/target.c
===================================================================
--- src/target/target.c	(revision 879)
+++ src/target/target.c	(working copy)
@@ -71,6 +71,8 @@
 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_bplist_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_bpsave_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -1234,6 +1236,8 @@
 	register_command(cmd_ctx,  NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <addr> <value> [count]");
 
 	register_command(cmd_ctx,  NULL, "bp", handle_bp_command, COMMAND_EXEC, "set breakpoint <address> <length> [hw]");
+	register_command(cmd_ctx,  NULL, "bplist", handle_bplist_command, COMMAND_EXEC, "list breakpoints");
+	register_command(cmd_ctx,  NULL, "bpsave", handle_bpsave_command, COMMAND_EXEC, "save breakpoints <file>");
 	register_command(cmd_ctx,  NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
 	register_command(cmd_ctx,  NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
 	register_command(cmd_ctx,  NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
@@ -2271,12 +2275,90 @@
 	return ERROR_OK;
 }
 
+int handle_bplist_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+	target_t *target = get_current_target(cmd_ctx);
+
+	breakpoint_t *breakpoint = target->breakpoints;
+
+	while (breakpoint)
+	{
+	    command_print(cmd_ctx, "%s breakpoint at 0x%8.8x of length 0x%8.8x %s",
+		    breakpoint_type_strings[breakpoint->type],
+		    breakpoint->address, breakpoint->length,
+            breakpoint->set ? "set" : "unset");
+		breakpoint = breakpoint->next;
+	}
+
+	return ERROR_OK;
+}
+
+int handle_bpsave_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+	fileio_t fileio;
+
+	u32 address;
+	u32 size;
+	u8 buffer[560];
+	int retval=ERROR_OK;
+
+	duration_t duration;
+	char *duration_text;
+
+	target_t *target = get_current_target(cmd_ctx);
+	breakpoint_t *breakpoint = target->breakpoints;
+
+	if (argc > 0)
+	{
+	    if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
+	    {
+		    return ERROR_OK;
+	    }
+    }
+    else
+    {
+        /* Use a default file name */
+	    if (fileio_open(&fileio, "BreakPoints.bpt", FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
+	    {
+		    return ERROR_OK;
+	    }
+    }
+
+	while (breakpoint)
+	{
+		u32 size_written;
+        char str[256];
+        sprintf(str, "bp 0x%8.8x 0x%8.8x %s\r\n", breakpoint->address, breakpoint->length, breakpoint->type == BKPT_HARD ? "hw" : "sw");
+		retval = fileio_write(&fileio, strlen(str), str, &size_written);
+		if (retval != ERROR_OK)
+		{
+			break;
+		}
+
+		breakpoint = breakpoint->next;
+	}
+
+	fileio_close(&fileio);
+
+	return ERROR_OK;
+
+}
+
 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
 	target_t *target = get_current_target(cmd_ctx);
 
 	if (argc > 0)
 		breakpoint_remove(target, strtoul(args[0], NULL, 0));
+    else
+    {
+	    breakpoint_t *breakpoint = target->breakpoints;
+	    while (breakpoint)
+	    {
+		    breakpoint_remove(target, breakpoint->address);
+		    breakpoint = target->breakpoints;
+	    }
+    }
 
 	return ERROR_OK;
 }
