if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) {
val = s->iosapic_reg[s->iosapic_reg_select];
} else {
- val = 0;
- ret = MEMTX_DECODE_ERROR;
+ goto check_hf;
}
}
trace_iosapic_reg_read(s->iosapic_reg_select, size, val);
break;
default:
- val = 0;
- ret = MEMTX_DECODE_ERROR;
+ check_hf:
+ if (s->status_control & HF_ENABLE) {
+ val = 0;
+ ret = MEMTX_DECODE_ERROR;
+ } else {
+ /* return -1ULL if HardFail is disabled */
+ val = ~0;
+ ret = MEMTX_OK;
+ }
}
trace_elroy_read(addr, size, val);
if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) {
s->iosapic_reg[s->iosapic_reg_select] = val;
} else {
- return MEMTX_DECODE_ERROR;
+ goto check_hf;
}
break;
case 0x0840: /* IOSAPIC_REG_EOI */
}
break;
default:
- return MEMTX_DECODE_ERROR;
+ check_hf:
+ if (s->status_control & HF_ENABLE) {
+ return MEMTX_DECODE_ERROR;
+ }
}
return MEMTX_OK;
}