| // Copyright 2024 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "cheriot/riscv_cheriot_priv_instructions.h" |
| |
| #include <cstdint> |
| |
| #include "cheriot/cheriot_register.h" |
| #include "cheriot/cheriot_state.h" |
| #include "riscv//riscv_xstatus.h" |
| |
| namespace mpact { |
| namespace sim { |
| namespace cheriot { |
| |
| using UIntReg = uint32_t; |
| |
| void RiscVPrivMRet(const Instruction *inst) { |
| auto *state = static_cast<CheriotState *>(inst->state()); |
| state->pcc()->CopyFrom(*state->mepcc()); |
| state->set_branch(true); |
| auto *mstatus = state->mstatus(); |
| // Set mstatus:mie to the value of mstatus:mpie. |
| mstatus->set_mie(mstatus->mpie()); |
| // Set mstatus:mpie to 1. |
| mstatus->set_mpie(1); |
| mstatus->set_mpp(*PrivilegeMode::kMachine); |
| mstatus->Submit(); |
| state->SignalReturnFromInterrupt(); |
| } |
| |
| void RiscVPrivWfi(const Instruction *inst) { |
| // WFI is treated as a no-op, unless the user sets a callback. |
| auto *state = static_cast<CheriotState *>(inst->state()); |
| state->WFI(inst); |
| } |
| |
| } // namespace cheriot |
| } // namespace sim |
| } // namespace mpact |