@@ -39,8 +39,10 @@ import Data.Foldable (foldlM)
39
39
import qualified Data.List.NonEmpty as NE
40
40
import qualified Data.Vector as Vector
41
41
import qualified Data.Text as Text
42
+ import Data.Text (Text )
42
43
import Data.Text.Encoding (decodeUtf8 , encodeUtf8 )
43
44
import qualified Data.Set as Set
45
+ import Data.Set (Set )
44
46
import qualified Data.Map as Map
45
47
import Data.Map (Map )
46
48
import Data.Maybe
@@ -170,6 +172,27 @@ getReg reg regs = case Macaw.lookupX86Reg reg regs of
170
172
Just (C. RV val) -> pure val
171
173
Nothing -> throwX86 $ mconcat [" Invalid register: " , show reg]
172
174
175
+ -- TODO: extend to more than general purpose registers
176
+ stringToReg :: Text -> Maybe (Some Macaw. X86Reg )
177
+ stringToReg s = case s of
178
+ " rax" -> Just $ Some Macaw. RAX
179
+ " rbx" -> Just $ Some Macaw. RBX
180
+ " rcx" -> Just $ Some Macaw. RCX
181
+ " rdx" -> Just $ Some Macaw. RDX
182
+ " rsp" -> Just $ Some Macaw. RSP
183
+ " rbp" -> Just $ Some Macaw. RBP
184
+ " rsi" -> Just $ Some Macaw. RSI
185
+ " rdi" -> Just $ Some Macaw. RDI
186
+ " r8" -> Just $ Some Macaw. R8
187
+ " r9" -> Just $ Some Macaw. R9
188
+ " r10" -> Just $ Some Macaw. R10
189
+ " r11" -> Just $ Some Macaw. R11
190
+ " r12" -> Just $ Some Macaw. R12
191
+ " r13" -> Just $ Some Macaw. R13
192
+ " r14" -> Just $ Some Macaw. R14
193
+ " r15" -> Just $ Some Macaw. R15
194
+ _ -> Nothing
195
+
173
196
cryptolUninterpreted ::
174
197
(MonadIO m , MonadThrow m ) =>
175
198
CryptolEnv ->
@@ -217,11 +240,17 @@ crucible_llvm_verify_x86 bic opts (Some (llvmModule :: LLVMModule x)) path nm gl
217
240
halloc <- getHandleAlloc
218
241
let mvar = C.LLVM. llvmMemVar . view C.LLVM. transContext $ modTrans llvmModule
219
242
sfs <- liftIO $ Macaw. newSymFuns sym
220
- cenv <- rwCryptol <$> getTopLevelRW
243
+ rw <- getTopLevelRW
244
+ let cenv = rwCryptol rw
221
245
liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnAesEnc sfs) $ cryptolUninterpreted cenv " aesenc"
222
246
liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnAesEncLast sfs) $ cryptolUninterpreted cenv " aesenclast"
247
+ liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnAesDec sfs) $ cryptolUninterpreted cenv " aesdec"
248
+ liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnAesDecLast sfs) $ cryptolUninterpreted cenv " aesdeclast"
249
+ liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnAesKeyGenAssist sfs) $ cryptolUninterpreted cenv " aeskeygenassist"
250
+ liftIO $ C. sawRegisterSymFunInterp sym (Macaw. fnClMul sfs) $ cryptolUninterpreted cenv " clmul"
223
251
224
- (C. SomeCFG cfg, elf, relf, addr, cfgs) <- liftIO $ buildCFG opts halloc path nm
252
+ let preserved = Set. fromList . catMaybes $ stringToReg . Text. toLower . Text. pack <$> rwPreservedRegs rw
253
+ (C. SomeCFG cfg, elf, relf, addr, cfgs) <- liftIO $ buildCFG opts halloc preserved path nm
225
254
addrInt <- if Macaw. segmentBase (Macaw. segoffSegment addr) == 0
226
255
then pure . toInteger $ Macaw. segmentOffset (Macaw. segoffSegment addr) + Macaw. segoffOffset addr
227
256
else fail $ mconcat [" Address of \" " , nm, " \" is not an absolute address" ]
@@ -334,6 +363,7 @@ crucible_llvm_verify_x86 bic opts (Some (llvmModule :: LLVMModule x)) path nm gl
334
363
buildCFG ::
335
364
Options ->
336
365
C. HandleAllocator ->
366
+ Set (Some Macaw. X86Reg ) {- ^ Registers to treat as callee-saved -} ->
337
367
String {- ^ Path to ELF file -} ->
338
368
String {- ^ Function's symbol in ELF file -} ->
339
369
IO ( C. SomeCFG
@@ -350,7 +380,7 @@ buildCFG ::
350
380
(EmptyCtx ::> Macaw. ArchRegStruct Macaw. X86_64 )
351
381
(Macaw. ArchRegStruct Macaw. X86_64 ))
352
382
)
353
- buildCFG opts halloc path nm = do
383
+ buildCFG opts halloc preserved path nm = do
354
384
printOutLn opts Info $ mconcat [" Finding symbol for \" " , nm, " \" " ]
355
385
elf <- getElf path
356
386
relf <- getRelevant elf
@@ -360,10 +390,17 @@ buildCFG opts halloc path nm = do
360
390
_ -> fail $ mconcat [" Could not find symbol \" " , nm, " \" " ]
361
391
printOutLn opts Info $ mconcat [" Found symbol at address " , show addr, " , building CFG" ]
362
392
let
393
+ preservedRegs = Set. union preserved Macaw. x86CalleeSavedRegs
394
+ preserveFn :: forall t . Macaw. X86Reg t -> Bool
395
+ preserveFn r = Set. member (Some r) preservedRegs
396
+ macawCallParams = Macaw. x86_64CallParams { Macaw. preserveReg = preserveFn }
397
+ macawArchInfo = (Macaw. x86_64_info preserveFn)
398
+ { Macaw. archCallParams = macawCallParams
399
+ }
363
400
initialDiscoveryState =
364
- Macaw. emptyDiscoveryState (memory relf) (funSymMap relf) Macaw. x86_64_linux_info
401
+ Macaw. emptyDiscoveryState (memory relf) (funSymMap relf) macawArchInfo
402
+ -- "inline" any function addresses that we happen to jump to
365
403
& Macaw. trustedFunctionEntryPoints .~ Set. empty
366
- let
367
404
finalState = Macaw. cfgFromAddrsAndState initialDiscoveryState [addr] []
368
405
finfos = finalState ^. Macaw. funInfo
369
406
cfgs <- forM finfos $ \ (Some finfo) ->
@@ -790,6 +827,7 @@ assertPointsTo env tyenv nameEnv (LLVMPointsTo _ cond tptr tptexpected) = do
790
827
ptr <- resolvePtrSetupValue env tyenv tptr
791
828
memTy <- liftIO $ typeOfSetupValue cc tyenv nameEnv texpected
792
829
storTy <- liftIO $ C.LLVM. toStorableType memTy
830
+
793
831
actual <- liftIO $ C.LLVM. assertSafe sym =<< C.LLVM. loadRaw sym mem ptr storTy C.LLVM. noAlignment
794
832
pure $ LO. matchArg opts sc cc ms MS. PostState actual memTy texpected
795
833
0 commit comments