Add a fence after memory writes.

Change-Id: I5137479b685f735aa573cec5d40170016c40f597
macbuild
Tim Newsome 2017-10-24 12:15:25 -07:00
parent 59a0340261
commit dbecbfee99
1 changed files with 16 additions and 7 deletions

View File

@ -1256,6 +1256,16 @@ static void write_to_buf(uint8_t *buffer, uint64_t value, unsigned size)
}
}
static int execute_fence(struct target *target) {
struct riscv_program program;
riscv_program_init(&program, target);
riscv_program_fence(&program);
int result = riscv_program_exec(&program, target);
if (result != ERROR_OK)
LOG_ERROR("Unable to execute fence");
return result;
}
/**
* Read the requested memory, taking care to execute every read exactly once,
* even if cmderr=busy is encountered.
@ -1279,16 +1289,12 @@ static int read_memory(struct target *target, target_addr_t address,
if (register_read_direct(target, &s1, GDB_REGNO_S1) != ERROR_OK)
return ERROR_FAIL;
if (execute_fence(target) != ERROR_OK)
return ERROR_FAIL;
// Write the program (load, increment)
struct riscv_program program;
riscv_program_init(&program, target);
riscv_program_fence(&program);
if (riscv_program_exec(&program, target) != ERROR_OK)
LOG_ERROR("Unable to execute fence");
// New program.
riscv_program_init(&program, target);
switch (size) {
case 1:
riscv_program_lbr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
@ -1649,6 +1655,9 @@ static int write_memory(struct target *target, target_addr_t address,
if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
return ERROR_FAIL;
if (execute_fence(target) != ERROR_OK)
return ERROR_FAIL;
return ERROR_OK;
}