summaryrefslogtreecommitdiff
path: root/src/elf_model/elf_interpreted_segment.lem
blob: 81ee74e284b079aeb20101b6c4b3e9d6e8e5c2e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
open import Basic_classes
open import Bool
open import Num
open import String

open import Elf_types

open import Bitstring
open import Missing_pervasives
open import Show

type elf32_interpreted_segment =
  <| elf32_segment_body  : bitstring            (** Body of the segment *)
   ; elf32_segment_type  : nat                  (** Type of the segment *)
   ; elf32_segment_size  : nat                  (** Size of the segment in bytes *)
   ; elf32_segment_memsz : nat                  (** Size of the segment in memory in bytes *)
   ; elf32_segment_base  : nat                  (** Base address of the segment *)
   ; elf32_segment_flags : (bool * bool * bool) (** READ, WRITE, EXECUTE flags. *)
   |>

type elf64_interpreted_segment =
  <| elf64_segment_body  : bitstring            (** Body of the segment *)
   ; elf64_segment_type  : nat                  (** Type of the segment *)
   ; elf64_segment_size  : nat                  (** Size of the segment in bytes *)
   ; elf64_segment_memsz : nat                  (** Size of the segment in memory in bytes *)
   ; elf64_segment_base  : nat                  (** Base address of the segment *)
   ; elf64_segment_flags : (bool * bool * bool) (** READ, WRITE, EXECUTE flags. *)
   |>

val elf32_interpret_program_header_flags : elf32_word -> (bool * bool * bool)
let elf32_interpret_program_header_flags flags =
  let zero = elf32_word_of_int32 0 in
  let one  = elf32_word_of_int32 1 in
  let two  = elf32_word_of_int32 2 in
  let four = elf32_word_of_int32 4 in
    (not (elf32_word_land flags one = zero),
      not (elf32_word_land flags two = zero),
      not (elf32_word_land flags four = zero))

val elf64_interpret_program_header_flags : elf64_word -> (bool * bool * bool)
let elf64_interpret_program_header_flags flags =
  let zero = elf64_word_of_int32 0 in
  let one  = elf64_word_of_int32 1 in
  let two  = elf64_word_of_int32 2 in
  let four = elf64_word_of_int32 4 in
    (not (elf64_word_land flags one = zero),
      not (elf64_word_land flags two = zero),
      not (elf64_word_land flags four = zero))

val string_of_flags : (bool * bool * bool) -> string
let string_of_flags flags =
  match flags with
    | (read, write, execute) ->
        bracket [show read; show write; show execute]
  end

val string_of_elf32_interpreted_segment : elf32_interpreted_segment -> string
let string_of_elf32_interpreted_segment seg =
  unlines [
    "Body of length: " ^ show (Bitstring.length seg.elf32_segment_body)
  ; "Segment type: " ^ show seg.elf32_segment_type
  ; "Segment size: " ^ show seg.elf32_segment_size
  ; "Segment memory size: " ^ show seg.elf32_segment_memsz
  ; "Segment base address: " ^ show seg.elf32_segment_base
  ; "Segment flags: " ^ string_of_flags seg.elf32_segment_flags
  ]

val string_of_elf64_interpreted_segment : elf64_interpreted_segment -> string
let string_of_elf64_interpreted_segment seg =
  unlines [
    "Body of length: " ^ show (Bitstring.length seg.elf64_segment_body)
  ; "Segment type: " ^ show seg.elf64_segment_type
  ; "Segment size: " ^ show seg.elf64_segment_size
  ; "Segment memory size: " ^ show seg.elf64_segment_memsz
  ; "Segment base address: " ^ show seg.elf64_segment_base
  ; "Segment flags: " ^ string_of_flags seg.elf64_segment_flags
  ]