aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/target/arm720t.c4
-rw-r--r--src/target/arm7_9_common.c14
-rw-r--r--src/target/arm7_9_common.h9
-rw-r--r--src/target/arm7tdmi.c5
-rw-r--r--src/target/arm920t.c15
-rw-r--r--src/target/arm920t.h2
-rw-r--r--src/target/arm926ejs.c14
-rw-r--r--src/target/arm926ejs.h2
-rw-r--r--src/target/arm946e.c4
-rw-r--r--src/target/arm966e.c3
-rw-r--r--src/target/arm9tdmi.c5
-rw-r--r--src/target/fa526.c5
-rw-r--r--src/target/feroceon.c8
-rw-r--r--src/target/target.c22
-rw-r--r--src/target/target_type.h8
15 files changed, 70 insertions, 50 deletions
diff --git a/src/target/arm720t.c b/src/target/arm720t.c
index d38fc82..619c80a 100644
--- a/src/target/arm720t.c
+++ b/src/target/arm720t.c
@@ -565,14 +565,12 @@ struct target_type arm720t_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm720t_read_memory,
- .write_memory = arm7_9_write_memory,
+ .write_memory = arm7_9_write_memory_opt,
.read_phys_memory = arm720t_read_phys_memory,
.write_phys_memory = arm720t_write_phys_memory,
.mmu = arm720_mmu,
.virt2phys = arm720_virt2phys,
- .bulk_write_memory = arm7_9_bulk_write_memory,
-
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index 587cb0e..6eade96 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -2469,6 +2469,20 @@ int arm7_9_write_memory(struct target *target,
return ERROR_OK;
}
+int arm7_9_write_memory_opt(struct target *target,
+ uint32_t address,
+ uint32_t size,
+ uint32_t count,
+ const uint8_t *buffer)
+{
+ struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+ if (size == 4 && count > 32 && arm7_9->bulk_write_memory)
+ return arm7_9->bulk_write_memory(target, address, count, buffer);
+ else
+ return arm7_9_write_memory(target, address, size, count, buffer);
+}
+
static int dcc_count;
static const uint8_t *dcc_buffer;
diff --git a/src/target/arm7_9_common.h b/src/target/arm7_9_common.h
index 737cbae..85e5ac0 100644
--- a/src/target/arm7_9_common.h
+++ b/src/target/arm7_9_common.h
@@ -118,6 +118,13 @@ struct arm7_9_common {
void (*pre_restore_context)(struct target *target);
/**< Callback function called before restoring the processor context */
+
+ /**
+ * Write target memory in multiples of 4 bytes, optimized for
+ * writing large quantities of data.
+ */
+ int (*bulk_write_memory)(struct target *target, uint32_t address,
+ uint32_t count, const uint8_t *buffer);
};
static inline struct arm7_9_common *target_to_arm7_9(struct target *target)
@@ -151,6 +158,8 @@ int arm7_9_read_memory(struct target *target, uint32_t address,
uint32_t size, uint32_t count, uint8_t *buffer);
int arm7_9_write_memory(struct target *target, uint32_t address,
uint32_t size, uint32_t count, const uint8_t *buffer);
+int arm7_9_write_memory_opt(struct target *target, uint32_t address,
+ uint32_t size, uint32_t count, const uint8_t *buffer);
int arm7_9_bulk_write_memory(struct target *target, uint32_t address,
uint32_t count, const uint8_t *buffer);
diff --git a/src/target/arm7tdmi.c b/src/target/arm7tdmi.c
index 3ef9777..4c7cce1 100644
--- a/src/target/arm7tdmi.c
+++ b/src/target/arm7tdmi.c
@@ -648,6 +648,8 @@ int arm7tdmi_init_arch_info(struct target *target,
arm7_9->enable_single_step = arm7_9_enable_eice_step;
arm7_9->disable_single_step = arm7_9_disable_eice_step;
+ arm7_9->bulk_write_memory = arm7_9_bulk_write_memory;
+
arm7_9->post_debug_entry = NULL;
arm7_9->pre_restore_context = NULL;
@@ -694,8 +696,7 @@ struct target_type arm7tdmi_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm7_9_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
+ .write_memory = arm7_9_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm920t.c b/src/target/arm920t.c
index 41d6473..98bd12f 100644
--- a/src/target/arm920t.c
+++ b/src/target/arm920t.c
@@ -740,6 +740,17 @@ int arm920t_write_memory(struct target *target, uint32_t address,
return ERROR_OK;
}
+int arm920t_write_memory_opt(struct target *target, uint32_t address,
+ uint32_t size, uint32_t count, const uint8_t *buffer)
+{
+ struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+ if (size == 4 && count > 32 && arm7_9->bulk_write_memory)
+ return arm7_9->bulk_write_memory(target, address, count, buffer);
+ else
+ return arm920t_write_memory(target, address, size, count, buffer);
+}
+
/* EXPORTED to FA256 */
int arm920t_soft_reset_halt(struct target *target)
{
@@ -1697,14 +1708,12 @@ struct target_type arm920t_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm920t_read_memory,
- .write_memory = arm920t_write_memory,
+ .write_memory = arm920t_write_memory_opt,
.read_phys_memory = arm920t_read_phys_memory,
.write_phys_memory = arm920t_write_phys_memory,
.mmu = arm920_mmu,
.virt2phys = arm920_virt2phys,
- .bulk_write_memory = arm7_9_bulk_write_memory,
-
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm920t.h b/src/target/arm920t.h
index 71876a6..3774513 100644
--- a/src/target/arm920t.h
+++ b/src/target/arm920t.h
@@ -60,6 +60,8 @@ int arm920t_read_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
int arm920t_write_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
+int arm920t_write_memory_opt(struct target *target,
+ uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
int arm920t_post_debug_entry(struct target *target);
void arm920t_pre_restore_context(struct target *target);
int arm920t_get_ttb(struct target *target, uint32_t *result);
diff --git a/src/target/arm926ejs.c b/src/target/arm926ejs.c
index 95930e6..1e0a579 100644
--- a/src/target/arm926ejs.c
+++ b/src/target/arm926ejs.c
@@ -656,6 +656,17 @@ int arm926ejs_write_memory(struct target *target, uint32_t address,
return retval;
}
+int arm926ejs_write_memory_opt(struct target *target, uint32_t address,
+ uint32_t size, uint32_t count, const uint8_t *buffer)
+{
+ struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+ if (size == 4 && count > 32 && arm7_9->bulk_write_memory)
+ return arm7_9->bulk_write_memory(target, address, count, buffer);
+ else
+ return arm926ejs_write_memory(target, address, size, count, buffer);
+}
+
static int arm926ejs_write_phys_memory(struct target *target,
uint32_t address, uint32_t size,
uint32_t count, const uint8_t *buffer)
@@ -808,8 +819,7 @@ struct target_type arm926ejs_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm926ejs_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
+ .write_memory = arm926ejs_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm926ejs.h b/src/target/arm926ejs.h
index cc19c9f..6dde4c6 100644
--- a/src/target/arm926ejs.h
+++ b/src/target/arm926ejs.h
@@ -50,6 +50,8 @@ int arm926ejs_init_arch_info(struct target *target,
int arm926ejs_arch_state(struct target *target);
int arm926ejs_write_memory(struct target *target,
uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
+int arm926ejs_write_memory_opt(struct target *target,
+ uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
int arm926ejs_soft_reset_halt(struct target *target);
extern const struct command_registration arm926ejs_command_handlers[];
diff --git a/src/target/arm946e.c b/src/target/arm946e.c
index 7ffab7a..5c85845 100644
--- a/src/target/arm946e.c
+++ b/src/target/arm946e.c
@@ -504,7 +504,7 @@ int arm946e_write_memory(struct target *target, uint32_t address,
/**
* Write memory
*/
- retval = arm7_9_write_memory(target, address, size, count, buffer);
+ retval = arm7_9_write_memory_opt(target, address, size, count, buffer);
if (retval != ERROR_OK)
return retval;
@@ -764,8 +764,6 @@ struct target_type arm946e_target = {
.read_memory = arm946e_read_memory,
.write_memory = arm946e_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
-
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm966e.c b/src/target/arm966e.c
index 39653c2..6a96ab1 100644
--- a/src/target/arm966e.c
+++ b/src/target/arm966e.c
@@ -264,8 +264,7 @@ struct target_type arm966e_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm7_9_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
+ .write_memory = arm7_9_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/arm9tdmi.c b/src/target/arm9tdmi.c
index c468282..d93c15f 100644
--- a/src/target/arm9tdmi.c
+++ b/src/target/arm9tdmi.c
@@ -752,6 +752,8 @@ int arm9tdmi_init_arch_info(struct target *target,
arm7_9->enable_single_step = arm9tdmi_enable_single_step;
arm7_9->disable_single_step = arm9tdmi_disable_single_step;
+ arm7_9->bulk_write_memory = arm7_9_bulk_write_memory;
+
arm7_9->post_debug_entry = NULL;
arm7_9->pre_restore_context = NULL;
@@ -902,8 +904,7 @@ struct target_type arm9tdmi_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm7_9_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
+ .write_memory = arm7_9_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/fa526.c b/src/target/fa526.c
index aeef858..a33b4a1 100644
--- a/src/target/fa526.c
+++ b/src/target/fa526.c
@@ -284,6 +284,8 @@ static int fa526_init_arch_info_2(struct target *target,
arm7_9->enable_single_step = arm9tdmi_enable_single_step;
arm7_9->disable_single_step = arm9tdmi_disable_single_step;
+ arm7_9->bulk_write_memory = arm7_9_bulk_write_memory;
+
arm7_9->post_debug_entry = NULL;
arm7_9->pre_restore_context = NULL;
@@ -366,8 +368,7 @@ struct target_type fa526_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm920t_read_memory,
- .write_memory = arm920t_write_memory,
- .bulk_write_memory = arm7_9_bulk_write_memory,
+ .write_memory = arm920t_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/feroceon.c b/src/target/feroceon.c
index ab43f3d..d3037c5 100644
--- a/src/target/feroceon.c
+++ b/src/target/feroceon.c
@@ -605,6 +605,8 @@ static void feroceon_common_setup(struct target *target)
arm7_9->enable_single_step = feroceon_enable_single_step;
arm7_9->disable_single_step = feroceon_disable_single_step;
+ arm7_9->bulk_write_memory = feroceon_bulk_write_memory;
+
/* MOE is not implemented */
arm7_9->examine_debug_reason = feroceon_examine_debug_reason;
@@ -695,8 +697,7 @@ struct target_type feroceon_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm926ejs_write_memory,
- .bulk_write_memory = feroceon_bulk_write_memory,
+ .write_memory = arm926ejs_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
@@ -733,8 +734,7 @@ struct target_type dragonite_target = {
.get_gdb_reg_list = arm_get_gdb_reg_list,
.read_memory = arm7_9_read_memory,
- .write_memory = arm7_9_write_memory,
- .bulk_write_memory = feroceon_bulk_write_memory,
+ .write_memory = arm7_9_write_memory_opt,
.checksum_memory = arm_checksum_memory,
.blank_check_memory = arm_blank_check_memory,
diff --git a/src/target/target.c b/src/target/target.c
index 29a011c..6aee098 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -986,12 +986,6 @@ int target_write_phys_memory(struct target *target,
return target->type->write_phys_memory(target, address, size, count, buffer);
}
-static int target_bulk_write_memory_default(struct target *target,
- uint32_t address, uint32_t count, const uint8_t *buffer)
-{
- return target_write_memory(target, address, 4, count, buffer);
-}
-
int target_add_breakpoint(struct target *target,
struct breakpoint *breakpoint)
{
@@ -1173,9 +1167,6 @@ static int target_init_one(struct command_context *cmd_ctx,
if (target->type->write_buffer == NULL)
target->type->write_buffer = target_write_buffer_default;
- if (target->type->bulk_write_memory == NULL)
- target->type->bulk_write_memory = target_bulk_write_memory_default;
-
if (target->type->get_gdb_fileio_info == NULL)
target->type->get_gdb_fileio_info = target_get_gdb_fileio_info_default;
@@ -1802,16 +1793,9 @@ static int target_write_buffer_default(struct target *target, uint32_t address,
if (size >= 4) {
int aligned = size - (size % 4);
- /* use bulk writes above a certain limit. This may have to be changed */
- if (aligned > 128) {
- retval = target->type->bulk_write_memory(target, address, aligned / 4, buffer);
- if (retval != ERROR_OK)
- return retval;
- } else {
- retval = target_write_memory(target, address, 4, aligned / 4, buffer);
- if (retval != ERROR_OK)
- return retval;
- }
+ retval = target_write_memory(target, address, 4, aligned / 4, buffer);
+ if (retval != ERROR_OK)
+ return retval;
buffer += aligned;
address += aligned;
diff --git a/src/target/target_type.h b/src/target/target_type.h
index 21439b6..cf81708 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -130,14 +130,6 @@ struct target_type {
int (*write_buffer)(struct target *target, uint32_t address,
uint32_t size, const uint8_t *buffer);
- /**
- * Write target memory in multiples of 4 bytes, optimized for
- * writing large quantities of data. Do @b not call this
- * function directly, use target_bulk_write_memory() instead.
- */
- int (*bulk_write_memory)(struct target *target, uint32_t address,
- uint32_t count, const uint8_t *buffer);
-
int (*checksum_memory)(struct target *target, uint32_t address,
uint32_t count, uint32_t *checksum);
int (*blank_check_memory)(struct target *target, uint32_t address,