mirror of
https://github.com/GaloisInc/macaw.git
synced 2024-12-26 23:52:48 +03:00
Added ArchInfo lookupReg and updateReg for PPC.
This commit is contained in:
parent
9f46c9e60b
commit
9c5ebee0bc
@ -62,6 +62,8 @@ import qualified Data.Macaw.CFG as MC
|
|||||||
import qualified Data.Macaw.Types as MT
|
import qualified Data.Macaw.Types as MT
|
||||||
import qualified Data.Macaw.Symbolic as MS
|
import qualified Data.Macaw.Symbolic as MS
|
||||||
import qualified Data.Macaw.Symbolic.Backend as MSB
|
import qualified Data.Macaw.Symbolic.Backend as MSB
|
||||||
|
import qualified Lang.Crucible.Simulator.RegMap as MCR
|
||||||
|
import qualified Lang.Crucible.Simulator.RegValue as MCRV
|
||||||
import qualified Data.Macaw.PPC as MP
|
import qualified Data.Macaw.PPC as MP
|
||||||
|
|
||||||
import qualified Data.Macaw.PPC.Symbolic.AtomWrapper as A
|
import qualified Data.Macaw.PPC.Symbolic.AtomWrapper as A
|
||||||
@ -144,6 +146,8 @@ instance MS.ArchInfo MP.PPC64 where
|
|||||||
sfns <- liftIO $ F.newSymFuns sym
|
sfns <- liftIO $ F.newSymFuns sym
|
||||||
k (ppc64MacawEvalFn sfns)
|
k (ppc64MacawEvalFn sfns)
|
||||||
, MS.withArchConstraints = \x -> x
|
, MS.withArchConstraints = \x -> x
|
||||||
|
, MS.lookupReg = archLookupReg
|
||||||
|
, MS.updateReg = archUpdateReg
|
||||||
}
|
}
|
||||||
|
|
||||||
instance MS.ArchInfo MP.PPC32 where
|
instance MS.ArchInfo MP.PPC32 where
|
||||||
@ -153,6 +157,8 @@ instance MS.ArchInfo MP.PPC32 where
|
|||||||
sfns <- liftIO $ F.newSymFuns sym
|
sfns <- liftIO $ F.newSymFuns sym
|
||||||
k (ppc32MacawEvalFn sfns)
|
k (ppc32MacawEvalFn sfns)
|
||||||
, MS.withArchConstraints = \x -> x
|
, MS.withArchConstraints = \x -> x
|
||||||
|
, MS.lookupReg = archLookupReg
|
||||||
|
, MS.updateReg = archUpdateReg
|
||||||
}
|
}
|
||||||
|
|
||||||
ppcRegName :: MP.PPCReg ppc tp -> C.SolverSymbol
|
ppcRegName :: MP.PPCReg ppc tp -> C.SolverSymbol
|
||||||
@ -204,6 +210,17 @@ lookupReg r asgn =
|
|||||||
Nothing -> X.throwM (MissingRegisterInState (Some r))
|
Nothing -> X.throwM (MissingRegisterInState (Some r))
|
||||||
Just pair -> return (asgn Ctx.! MSB.crucibleIndex pair)
|
Just pair -> return (asgn Ctx.! MSB.crucibleIndex pair)
|
||||||
|
|
||||||
|
archLookupReg :: ( MP.KnownVariant v
|
||||||
|
, ppc ~ MP.AnyPPC v
|
||||||
|
) =>
|
||||||
|
MCR.RegEntry sym (MS.ArchRegStruct (MP.AnyPPC v))
|
||||||
|
-> MP.PPCReg ppc tp
|
||||||
|
-> MCR.RegEntry sym (MS.ToCrucibleType tp)
|
||||||
|
archLookupReg regEntry reg =
|
||||||
|
case lookupReg reg (MCR.regValue regEntry) of
|
||||||
|
Just (MCRV.RV val) -> MCR.RegEntry (MS.typeToCrucible $ MT.typeRepr reg) val
|
||||||
|
Nothing -> error $ "unexpected register: " ++ show (MC.prettyF reg)
|
||||||
|
|
||||||
updateReg :: forall v ppc m f tp
|
updateReg :: forall v ppc m f tp
|
||||||
. (MP.KnownVariant v,
|
. (MP.KnownVariant v,
|
||||||
ppc ~ MP.AnyPPC v,
|
ppc ~ MP.AnyPPC v,
|
||||||
@ -217,6 +234,19 @@ updateReg r upd asgn = do
|
|||||||
Nothing -> X.throwM (MissingRegisterInState (Some r))
|
Nothing -> X.throwM (MissingRegisterInState (Some r))
|
||||||
Just pair -> return (asgn & MapF.ixF (MSB.crucibleIndex pair) %~ upd)
|
Just pair -> return (asgn & MapF.ixF (MSB.crucibleIndex pair) %~ upd)
|
||||||
|
|
||||||
|
archUpdateReg :: ( MP.KnownVariant v
|
||||||
|
, ppc ~ MP.AnyPPC v
|
||||||
|
) =>
|
||||||
|
MCR.RegEntry sym (MS.ArchRegStruct (MP.AnyPPC v))
|
||||||
|
-> MP.PPCReg ppc tp
|
||||||
|
-> MCRV.RegValue sym (MS.ToCrucibleType tp)
|
||||||
|
-> MCR.RegEntry sym (MS.ArchRegStruct (MP.AnyPPC v))
|
||||||
|
archUpdateReg regEntry reg val =
|
||||||
|
case updateReg reg (const $ MCRV.RV val) (MCR.regValue regEntry) of
|
||||||
|
Just r -> regEntry { MCR.regValue = r }
|
||||||
|
Nothing -> error $ "unexpected register: " ++ show (MC.prettyF reg)
|
||||||
|
|
||||||
|
|
||||||
ppcGenFn :: forall ids h s tp v ppc
|
ppcGenFn :: forall ids h s tp v ppc
|
||||||
. ( ppc ~ MP.AnyPPC v )
|
. ( ppc ~ MP.AnyPPC v )
|
||||||
=> MP.PPCPrimFn ppc (MC.Value ppc ids) tp
|
=> MP.PPCPrimFn ppc (MC.Value ppc ids) tp
|
||||||
|
Loading…
Reference in New Issue
Block a user