forked from Yehowshua/RiscV-Formal
91 lines
3.7 KiB
Haskell
91 lines
3.7 KiB
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE NumericUnderscores #-}
|
|
|
|
module Exceptions(
|
|
Exception(..),
|
|
exceptionCode,
|
|
isSynchronousException
|
|
) where
|
|
|
|
import Clash.Prelude
|
|
import Types(Addr, Insn)
|
|
|
|
data Exception =
|
|
SupervisorSoftwareInterrupt
|
|
| MachineSoftwareInterrupt
|
|
| SupervisorTimerInterrupt
|
|
| MachineTimerInterrupt
|
|
| SupervisorExternalInterrupt
|
|
| MachineExternalInterrupt
|
|
| CounterOverflowInterrupt
|
|
| InstructionAddressMisaligned Addr
|
|
| InstructionAccessFault Addr
|
|
| IllegalInstruction Insn
|
|
| Breakpoint
|
|
| LoadAddressMisaligned
|
|
| LoadAccessFault
|
|
| StoreAMOAddressMisaligned
|
|
| StoreAMOAccessFault
|
|
| EnvironmentCallFromUMode
|
|
| EnvironmentCallFromSMode
|
|
| EnvironmentCallFromMMode
|
|
| InstructionPageFault
|
|
| LoadPageFault
|
|
| StoreAMOPageFault
|
|
| DoubleTrap
|
|
| SoftwareCheck
|
|
| HardwareError
|
|
deriving (Generic, Show, Eq, NFDataX)
|
|
|
|
exceptionCode :: Exception -> Unsigned 6
|
|
exceptionCode SupervisorSoftwareInterrupt = 1
|
|
exceptionCode MachineSoftwareInterrupt = 3
|
|
exceptionCode SupervisorTimerInterrupt = 5
|
|
exceptionCode MachineTimerInterrupt = 7
|
|
exceptionCode SupervisorExternalInterrupt = 9
|
|
exceptionCode MachineExternalInterrupt = 11
|
|
exceptionCode CounterOverflowInterrupt = 13
|
|
exceptionCode (InstructionAddressMisaligned _) = 0
|
|
exceptionCode (InstructionAccessFault _) = 1
|
|
exceptionCode (IllegalInstruction _) = 2
|
|
exceptionCode Breakpoint = 3
|
|
exceptionCode LoadAddressMisaligned = 4
|
|
exceptionCode LoadAccessFault = 5
|
|
exceptionCode StoreAMOAddressMisaligned = 6
|
|
exceptionCode StoreAMOAccessFault = 7
|
|
exceptionCode EnvironmentCallFromUMode = 8
|
|
exceptionCode EnvironmentCallFromSMode = 9
|
|
exceptionCode EnvironmentCallFromMMode = 11
|
|
exceptionCode InstructionPageFault = 12
|
|
exceptionCode LoadPageFault = 13
|
|
exceptionCode StoreAMOPageFault = 15
|
|
exceptionCode DoubleTrap = 16
|
|
exceptionCode SoftwareCheck = 18
|
|
exceptionCode HardwareError = 19
|
|
|
|
isSynchronousException :: Exception -> Bool
|
|
isSynchronousException SupervisorSoftwareInterrupt = False
|
|
isSynchronousException MachineSoftwareInterrupt = False
|
|
isSynchronousException SupervisorTimerInterrupt = False
|
|
isSynchronousException MachineTimerInterrupt = False
|
|
isSynchronousException SupervisorExternalInterrupt = False
|
|
isSynchronousException MachineExternalInterrupt = False
|
|
isSynchronousException CounterOverflowInterrupt = False
|
|
isSynchronousException (InstructionAddressMisaligned _) = True
|
|
isSynchronousException (InstructionAccessFault _) = True
|
|
isSynchronousException (IllegalInstruction _) = True
|
|
isSynchronousException Breakpoint = True
|
|
isSynchronousException LoadAddressMisaligned = True
|
|
isSynchronousException LoadAccessFault = True
|
|
isSynchronousException StoreAMOAddressMisaligned = True
|
|
isSynchronousException StoreAMOAccessFault = True
|
|
isSynchronousException EnvironmentCallFromUMode = True
|
|
isSynchronousException EnvironmentCallFromSMode = True
|
|
isSynchronousException EnvironmentCallFromMMode = True
|
|
isSynchronousException InstructionPageFault = True
|
|
isSynchronousException LoadPageFault = True
|
|
isSynchronousException StoreAMOPageFault = True
|
|
isSynchronousException DoubleTrap = True
|
|
isSynchronousException SoftwareCheck = True
|
|
isSynchronousException HardwareError = True
|