gerrit
2017-05-09 12:45:25 UTC
This is an automated email from Gerrit.
Salvador Arroyo (***@yahoo.es) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4128
-- gerrit
commit a024c37ba265858fee750116e4b152bf6fcaddfd
Author: Salvador Arroyo <***@yahoo.es>
Date: Tue May 9 14:32:28 2017 +0200
mips32: pracc access fully queued in sync mode
Data scan in write access is now queued. All
required scans for a pracc acces are now queued
and executed when reading address register.
Minor change in restart decision.
Change-Id: I85e217a6fe919c517f480898c712568ebfe10d42
Signed-off-by: Salvador Arroyo <***@yahoo.es>
diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c
index 456414f..7311363 100644
--- a/src/target/mips32_pracc.c
+++ b/src/target/mips32_pracc.c
@@ -165,6 +165,9 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
bool final_check = 0; /* set to 1 if in final checks after function code shifted out */
bool pass = 0; /* to check the pass through pracc text after function code sent */
int retval;
+ bool data_read_pending = 0; /* to check if data read is pending from previous pracc access */
+ uint8_t data_scan_pending[4]; /* buffer to scan in ejtag data register */
+ uint32_t addr_of_data_pending;
while (1) {
if (restart) {
@@ -184,12 +187,19 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
if (retval != ERROR_OK)
return retval;
+ if (data_read_pending) { /* data is now available */
+ /* store data at param out, address based offset */
+ param_out[(addr_of_data_pending - MIPS32_PRACC_PARAM_OUT) / 4] =
+ buf_get_u32(data_scan_pending, 0, 32);
+ data_read_pending = 0;
+ }
+
/* Check for read or write access */
if (ejtag_info->pa_ctrl & EJTAG_CTRL_PRNW) { /* write/store access */
/* Check for pending store from a previous store instruction at dmseg */
if (store_pending == 0) {
LOG_DEBUG("unexpected write at address %" PRIx32, ejtag_info->pa_addr);
- if (code_count < 2) { /* allow for restart */
+ if (code_count < 2 && !final_check) { /* allow for restart */
restart = 1;
continue;
} else
@@ -202,15 +212,12 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
return ERROR_JTAG_DEVICE_ERROR;
}
}
- /* read data */
- uint32_t data = 0;
+ /* add data scan queued, read after queue executed */
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA);
- retval = mips_ejtag_drscan_32(ejtag_info, &data);
- if (retval != ERROR_OK)
- return retval;
+ mips_ejtag_drscan_32_queued(ejtag_info, 0, data_scan_pending);
+ data_read_pending = 1;
+ addr_of_data_pending = ejtag_info->pa_addr;
- /* store data at param out, address based offset */
- param_out[(ejtag_info->pa_addr - MIPS32_PRACC_PARAM_OUT) / 4] = data;
store_pending--;
} else { /* read/fetch access */
@@ -289,7 +296,8 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
if (final_check && !check_last) /* last instr, don't check, execute and exit */
return jtag_execute_queue();
- if (store_pending == 0 && pass) { /* store access done, but after passing pracc text */
+ if (store_pending == 0 && data_read_pending == 0 && pass) {
+ /* store access done, but after passing pracc text */
LOG_DEBUG("warning: store access pass pracc text");
return ERROR_OK;
}
--
Salvador Arroyo (***@yahoo.es) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4128
-- gerrit
commit a024c37ba265858fee750116e4b152bf6fcaddfd
Author: Salvador Arroyo <***@yahoo.es>
Date: Tue May 9 14:32:28 2017 +0200
mips32: pracc access fully queued in sync mode
Data scan in write access is now queued. All
required scans for a pracc acces are now queued
and executed when reading address register.
Minor change in restart decision.
Change-Id: I85e217a6fe919c517f480898c712568ebfe10d42
Signed-off-by: Salvador Arroyo <***@yahoo.es>
diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c
index 456414f..7311363 100644
--- a/src/target/mips32_pracc.c
+++ b/src/target/mips32_pracc.c
@@ -165,6 +165,9 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
bool final_check = 0; /* set to 1 if in final checks after function code shifted out */
bool pass = 0; /* to check the pass through pracc text after function code sent */
int retval;
+ bool data_read_pending = 0; /* to check if data read is pending from previous pracc access */
+ uint8_t data_scan_pending[4]; /* buffer to scan in ejtag data register */
+ uint32_t addr_of_data_pending;
while (1) {
if (restart) {
@@ -184,12 +187,19 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
if (retval != ERROR_OK)
return retval;
+ if (data_read_pending) { /* data is now available */
+ /* store data at param out, address based offset */
+ param_out[(addr_of_data_pending - MIPS32_PRACC_PARAM_OUT) / 4] =
+ buf_get_u32(data_scan_pending, 0, 32);
+ data_read_pending = 0;
+ }
+
/* Check for read or write access */
if (ejtag_info->pa_ctrl & EJTAG_CTRL_PRNW) { /* write/store access */
/* Check for pending store from a previous store instruction at dmseg */
if (store_pending == 0) {
LOG_DEBUG("unexpected write at address %" PRIx32, ejtag_info->pa_addr);
- if (code_count < 2) { /* allow for restart */
+ if (code_count < 2 && !final_check) { /* allow for restart */
restart = 1;
continue;
} else
@@ -202,15 +212,12 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
return ERROR_JTAG_DEVICE_ERROR;
}
}
- /* read data */
- uint32_t data = 0;
+ /* add data scan queued, read after queue executed */
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA);
- retval = mips_ejtag_drscan_32(ejtag_info, &data);
- if (retval != ERROR_OK)
- return retval;
+ mips_ejtag_drscan_32_queued(ejtag_info, 0, data_scan_pending);
+ data_read_pending = 1;
+ addr_of_data_pending = ejtag_info->pa_addr;
- /* store data at param out, address based offset */
- param_out[(ejtag_info->pa_addr - MIPS32_PRACC_PARAM_OUT) / 4] = data;
store_pending--;
} else { /* read/fetch access */
@@ -289,7 +296,8 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, struct pracc_queue_info *ct
if (final_check && !check_last) /* last instr, don't check, execute and exit */
return jtag_execute_queue();
- if (store_pending == 0 && pass) { /* store access done, but after passing pracc text */
+ if (store_pending == 0 && data_read_pending == 0 && pass) {
+ /* store access done, but after passing pracc text */
LOG_DEBUG("warning: store access pass pracc text");
return ERROR_OK;
}
--