bmx 0.0.2

Binary modeling expressions
Documentation
;; -*- scheme -*-

(enum Class
  (discriminants (tag u8))
  (variants
   (Bits32 1 (properties (address-width 32)))
   (Bits64 2 (properties (address-width 64)))))

(enum Endian
  (discriminants (tag u8))
  (variants
   (Little 1 (properties (endianness le)))
   (Big 2 (properties (endianness be)))))

(enum OsAbi
  (discriminants (tag u8))
  (variants (SystemV (= tag 0))))

(root Abi
  (fields
   (os OsAbi)
   (version u8)))

(enum (FileType endianness)
  (discriminants (tag (u 16 endianness)))
  (variants
   (None 0)
   (Rel 1)
   (Exec 2)
   (Dyn 3)
   (Core 4)
   (LoOs #xFE00)
   (HiOs #xFEFF)
   (LoProc #xFF00)
   (HiProc #xFFFF)))

(enum (Machine endianness)
  (discriminants (tag (u 16 endianness)))
  (variants
   (SPARC #x02)
   (x86 #x03)
   (MIPS #x08)
   (PowerPC #x14)
   (S390 #x16)
   (ARM #x28)
   (SuperH #x2A)
   (IA-64 #x32)
   (AMD64 #x3E)
   (AArch64 #xB7)
   (RISC-V #xF3)))

(root FileHeader
  (fields
   (magic (array 4 u8) (= "\x7F;ELF") hidden)
   (class Class)
   (endianness Endian)
   (version u8 (= 1))
   (abi Abi)
   (pad (array 7 u8) hidden) ;; Needs fixed value?
   (let ((endianness (type-property endianness 'endianness))
         (address-width (type-property class 'address-width)))
     (type (FileType endianness))
     (machine (Machine endianness))
     (version (u 32 endianness) (= 1) hidden)
     (entry (u address-width endianness))
     (program-header-offset (u address-width endianness))
     (section-header-offset (u address-width endianness))
     (flags (u 32 endianness))
     (elf-header-size (u 16 endianness))
     (program-header-entry-size (u 16 endianness))
     (program-header-num (u 16 endianness))
     (section-header-entry-size (u 16 endianness))
     (section-header-num (u 16 endianness))
     (section-header-string-index (u 16 endianness)))))

;; Local Variables:
;; eval: (put 'branch 'scheme-indent-function 1)
;; eval: (put 'enum 'scheme-indent-function 1)
;; End: