| /* |
| * 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. |
| */ |
| |
| #ifndef MPACT_CHERIOT__CHERIOT_TEST_RIG_DECODER_H_ |
| #define MPACT_CHERIOT__CHERIOT_TEST_RIG_DECODER_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| |
| #include "cheriot/cheriot_state.h" |
| #include "cheriot/riscv_cheriot_decoder.h" |
| #include "cheriot/riscv_cheriot_encoding.h" |
| #include "cheriot/riscv_cheriot_enums.h" |
| #include "cheriot/test_rig_packets.h" |
| #include "mpact/sim/generic/arch_state.h" |
| #include "mpact/sim/generic/decoder_interface.h" |
| #include "mpact/sim/generic/instruction.h" |
| #include "mpact/sim/generic/program_error.h" |
| |
| // This is a specialized instruction decoder class for CherIoT TestRIG. It is |
| // specialized due to the fact that the instruction words for TestRIG are |
| // supplied from a socket, and not from an image stored in memory. The decode |
| // function has also been extended to capture register source and destination |
| // numbers. |
| |
| namespace mpact { |
| namespace sim { |
| namespace cheriot { |
| |
| class CheriotTestRigIsaFactory |
| : public isa32::RiscVCheriotInstructionSetFactory { |
| public: |
| std::unique_ptr<isa32::Riscv32CheriotSlot> CreateRiscv32CheriotSlot( |
| generic::ArchState *state) override { |
| return std::make_unique<isa32::Riscv32CheriotSlot>(state); |
| } |
| }; |
| |
| class CheriotTestRigDecoder { |
| public: |
| using SlotEnum = isa32::SlotEnum; |
| using OpcodeEnum = isa32::OpcodeEnum; |
| |
| struct DecodeInfo { |
| int rd; |
| int rs1; |
| int rs2; |
| }; |
| |
| explicit CheriotTestRigDecoder(CheriotState *state); |
| CheriotTestRigDecoder() = delete; |
| CheriotTestRigDecoder(const CheriotTestRigDecoder &) = delete; |
| CheriotTestRigDecoder &operator=(const CheriotTestRigDecoder &) = delete; |
| virtual ~CheriotTestRigDecoder(); |
| |
| // Decode a single instruction and fill in decode time information in the |
| // TestRIG execution packet. |
| generic::Instruction *DecodeInstruction(uint64_t address, uint32_t inst_word, |
| DecodeInfo &decode_info); |
| |
| private: |
| CheriotState *state_; |
| std::unique_ptr<generic::ProgramError> decode_error_; |
| isa32::RiscVCheriotEncoding *cheriot_encoding_; |
| isa32::RiscVCheriotInstructionSetFactory *cheriot_isa_factory_; |
| isa32::RiscVCheriotInstructionSet *cheriot_isa_; |
| }; |
| |
| } // namespace cheriot |
| } // namespace sim |
| } // namespace mpact |
| |
| #endif // MPACT_CHERIOT__CHERIOT_TEST_RIG_DECODER_H_ |