From 4c0d93398fbac9a83db040fdb05aaf88d4dea558 Mon Sep 17 00:00:00 2001 From: jmug Date: Fri, 31 Jan 2025 22:22:53 -0800 Subject: [PATCH] Implement readquad, writequad, fetchins and crack. Signed-off-by: jmug --- hw2/bin/simulator.ml | 24 ++++++++++++++++++------ hw2/test/studenttests.ml | 26 ++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/hw2/bin/simulator.ml b/hw2/bin/simulator.ml index 673a10b..1d5ce5a 100644 --- a/hw2/bin/simulator.ml +++ b/hw2/bin/simulator.ml @@ -210,13 +210,20 @@ let map_addr_segfault (addr : quad) : int = are glued together. *) -let readquad (m : mach) (addr : quad) : quad = failwith "readquad not implemented" +let readquad (m : mach) (addr : quad) : quad = + int64_of_sbytes @@ Array.to_list @@ Array.sub m.mem (map_addr_segfault addr) 8 let writequad (m : mach) (addr : quad) (w : quad) : unit = - failwith "writequad not implemented" -;; + Array.blit (Array.of_list @@ sbytes_of_int64 w) 0 m.mem (map_addr_segfault addr) 8 + +exception InvalidInstructinAlignment + +let fetchins (m : mach) (addr : quad) : ins = + let ins_byte = m.mem.(map_addr_segfault addr) in + match ins_byte with + | InsB0 i -> i + | _ -> raise InvalidInstructinAlignment -let fetchins (m : mach) (addr : quad) : ins = failwith "fetchins not implemented" (* Compute the instruction result. * NOTE: See int64_overflow.ml for the definition of the return type @@ -239,11 +246,16 @@ let interp_operands (m : mach) : ins -> int64 list = ;; let validate_operands : ins -> unit = function - | _ -> failwith "validate_operands not implemented" + (* TODO: Add validations, leaq can only take indirect operands for example *) + | _ -> () ;; let crack : ins -> ins list = function - | _ -> failwith "crack not implemented" + | Pushq, [ op ] -> [Subq, [Imm (Lit 8L); Reg Rsp]; Movq, [op; Ind2 Rsp]] + | Popq, [ op ] -> [Movq, [Ind2 Rsp; op]; Addq, [Imm (Lit 8L); Reg Rsp]] + | Callq, [ op ] -> [Subq, [Imm (Lit 8L); Reg Rsp]; Movq, [Reg Rip; Ind2 Rsp]; Jmp, [op]] + | Retq, [] -> [Movq, [Ind2 Rsp; Reg Rip]; Addq, [Imm (Lit 8L); Reg Rsp]] + | i -> [ i ] ;; (* TODO: double check against spec *) diff --git a/hw2/test/studenttests.ml b/hw2/test/studenttests.ml index c8639f8..e77eb8a 100644 --- a/hw2/test/studenttests.ml +++ b/hw2/test/studenttests.ml @@ -44,12 +44,38 @@ let mov_ri = InsFrag; ] +let crack_tests = + let open Asm in + let pu = (Pushq, [~$42]) in + let po = (Popq, [~%Rax]) in + let ca = (Callq, [Ind2 Rax]) in + let re = (Retq, []) in + [ + ("crack_pushq", assert_eqf (fun() -> + crack pu) ([ Subq, [Imm (Lit 8L); Reg Rsp] + ; Movq, [~$42; Ind2 Rsp] ])); + ("crack_pop", assert_eqf (fun() -> + crack po) ([ Movq, [Ind2 Rsp; Reg Rax] + ; Addq, [Imm (Lit 8L); Reg Rsp] ])); + ("crack_call", assert_eqf (fun() -> + crack ca) ([ Subq, [Imm (Lit 8L); Reg Rsp] + ; Movq, [Reg Rip; Ind2 Rsp] + ; Jmp, [Ind2 Rax] ])); + ("crack retq", assert_eqf (fun() -> + crack re) ([ Movq, [Ind2 Rsp; Reg Rip] + ; Addq, [Imm (Lit 8L); Reg Rsp] ])); + + ] + let provided_tests : suite = [ Test ("My Tests", [ ("assert", test_my) ]); + Test ("Student provided crack tests", crack_tests); + + Test ("Student-Provided Big Test for Part III: Score recorded as PartIIITestCase", [ ]);