Implement readquad, writequad, fetchins and crack.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
This commit is contained in:
parent
55089bde91
commit
4c0d93398f
2 changed files with 44 additions and 6 deletions
|
|
@ -210,13 +210,20 @@ let map_addr_segfault (addr : quad) : int =
|
||||||
are glued together.
|
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 =
|
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.
|
(* Compute the instruction result.
|
||||||
* NOTE: See int64_overflow.ml for the definition of the return type
|
* 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
|
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
|
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 *)
|
(* TODO: double check against spec *)
|
||||||
|
|
|
||||||
|
|
@ -44,12 +44,38 @@ let mov_ri =
|
||||||
InsFrag;
|
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 = [
|
let provided_tests : suite = [
|
||||||
|
|
||||||
Test ("My Tests", [
|
Test ("My Tests", [
|
||||||
("assert", test_my)
|
("assert", test_my)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Test ("Student provided crack tests", crack_tests);
|
||||||
|
|
||||||
|
|
||||||
Test ("Student-Provided Big Test for Part III: Score recorded as PartIIITestCase", [
|
Test ("Student-Provided Big Test for Part III: Score recorded as PartIIITestCase", [
|
||||||
|
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue