forked from Yehowshua/RiscV-Formal
92 lines
3.6 KiB
Haskell
92 lines
3.6 KiB
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE NumericUnderscores #-}
|
|
|
|
module Exceptions(
|
|
Exception(..),
|
|
exceptionCode,
|
|
isSynchronousException
|
|
) where
|
|
|
|
import Clash.Prelude
|
|
|
|
data Exception =
|
|
SupervisorSoftwareInterrupt
|
|
| MachineSoftwareInterrupt
|
|
| SupervisorTimerInterrupt
|
|
| MachineTimerInterrupt
|
|
| SupervisorExternalInterrupt
|
|
| MachineExternalInterrupt
|
|
| CounterOverflowInterrupt
|
|
| InstructionAddressMisaligned
|
|
| InstructionAccessFault
|
|
| IllegalInstruction
|
|
| Breakpoint
|
|
| LoadAddressMisaligned
|
|
| LoadAccessFault
|
|
| StoreAMOAddressMisaligned
|
|
| StoreAMOAccessFault
|
|
| EnvironmentCallFromUMode
|
|
| EnvironmentCallFromSMode
|
|
| EnvironmentCallFromMMode
|
|
| InstructionPageFault
|
|
| LoadPageFault
|
|
| Reserved
|
|
| 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 Reserved = True
|
|
isSynchronousException StoreAMOPageFault = True
|
|
isSynchronousException DoubleTrap = True
|
|
isSynchronousException SoftwareCheck = True
|
|
isSynchronousException HardwareError = True
|