Make OpenOCD work when there is no program buffer.
Fixed abstract register access for registers that aren't XLEN wide. Avoided excessive errors cases where we attempted to execute a fence but failed. Don't mark all the CSRs as caller-save. gdb was saving/restoring dscratch, which broke function calls as a side effect. dscratch is accessible for people who really know what they're doing, but gdb should never quietly access it. The same is probably true for other CSRs. Change-Id: I7bcdbbcb7e3c22ad92cbc205bf537c1fe548b160
This commit is contained in:
@@ -1884,7 +1884,6 @@ int riscv_init_registers(struct target *target)
|
||||
* between). */
|
||||
for (uint32_t number = 0; number < GDB_REGNO_COUNT; number++) {
|
||||
struct reg *r = &target->reg_cache->reg_list[number];
|
||||
r->caller_save = true;
|
||||
r->dirty = false;
|
||||
r->valid = false;
|
||||
r->exist = true;
|
||||
@@ -1896,6 +1895,7 @@ int riscv_init_registers(struct target *target)
|
||||
* target is in theory allowed to change XLEN on us. But I expect a lot
|
||||
* of other things to break in that case as well. */
|
||||
if (number <= GDB_REGNO_XPR31) {
|
||||
r->caller_save = true;
|
||||
switch (number) {
|
||||
case GDB_REGNO_ZERO:
|
||||
r->name = "zero";
|
||||
@@ -1997,10 +1997,12 @@ int riscv_init_registers(struct target *target)
|
||||
r->group = "general";
|
||||
r->feature = &feature_cpu;
|
||||
} else if (number == GDB_REGNO_PC) {
|
||||
r->caller_save = true;
|
||||
sprintf(reg_name, "pc");
|
||||
r->group = "general";
|
||||
r->feature = &feature_cpu;
|
||||
} else if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
|
||||
r->caller_save = true;
|
||||
if (riscv_supports_extension(target, 'D')) {
|
||||
r->reg_data_type = &type_ieee_double;
|
||||
r->size = 64;
|
||||
|
||||
Reference in New Issue
Block a user