// 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
