Update kerneldb.
[virt-mem.git] / extract / codegen / code_generation.mli
index 36140cd..b803e71 100644 (file)
    to the kernel structures, and [kernel.ml] is the implementation.
 *)
 
-(** {2 Generate types} *)
+type code =
+    Camlp4.PreCast.Syntax.Ast.str_item * Camlp4.PreCast.Syntax.Ast.sig_item
+
+(** {2 Generate types}
+
+    Our internal types, representing kernel structures.
+*)
 
 val generate_types :
   (string
-   * Struct_classify.shape_field_struct list
-   * Struct_classify.content_field_struct list) list ->
-  Camlp4.PreCast.Syntax.Ast.str_item * Camlp4.PreCast.Syntax.Ast.sig_item
-    (** [generate_types structures] generates the internal
-       types used to store variants of each structure, including:
-       - shape field structures
-       - content field structures
+   * (string * (Pahole_parser.f_type * bool)) list) list ->
+  code
+    (** [generate_types structures] generates the
+       types used to store each structure.
     *)
 
-(** {2 Generate parsers} *)
+(** {2 Generate offset functions}
+
+    [offset_of_<struct>_<field> kernel_version] functions.
+
+    These actually play a very minor role: We just use them when
+    adjusting [list_head] pointers which cross between structure
+    types, so we only generate functions for those right now.
+*)
+
+val generate_offsets :
+  (string * ((Pahole_parser.info * Pahole_parser.structure) list
+            * (string * (Pahole_parser.f_type * bool)) list)) list ->
+  code
+    (** [generate_offsets] generates the offset functions. *)
+
+(** {2 Generate parsers}
+
+    Functions which parse the different structures from bitstrings
+    into our internal types.
+*)
 
-val generate_parsers : (string * Struct_classify.parser_ list) list ->
-  Camlp4.PreCast.Syntax.Ast.str_item * Camlp4.PreCast.Syntax.Ast.sig_item
-  * (string, string) Hashtbl.t
+val generate_parsers :
+  (string * ((string * (Pahole_parser.f_type * bool)) list
+            * Minimizer.parser_ list)) list ->
+  code * (string, string) Hashtbl.t
     (** [generate_parsers] generates the parser functions.
 
        We cannot generate the complete code here because we
@@ -52,17 +75,50 @@ val generate_parsers : (string * Struct_classify.parser_ list) list ->
        by the contents of the returned hash table in {!output_implem}.
     *)
 
+(** {2 Generate version maps}
+
+    The version maps are functions such as [size_of_<struct> kernel_version]
+    which return some aspects of the structures and fields that
+    depend at runtime on the kernel version.
+*)
+
+val generate_version_maps :
+  (string * ((Pahole_parser.info * Pahole_parser.structure) list
+            * (string, Minimizer.parser_) Hashtbl.t)) list ->
+  code
+
+(** {2 Generate followers}
+
+    The "followers" are functions which recursively follow every
+    structure in the kernel, starting out at known root structures
+    such as [init_task] and [init_net].  Their job is to (a) find
+    every kernel structure, (b) ensure it is loaded into our
+    memory map, (c) produce a map of address -> structure.
+*)
+
+val generate_followers :
+  string list ->
+  (string * (string * (Pahole_parser.f_type * bool)) list) list ->
+  code
+  (** [generate_followers] generates the follower functions. *)
+
 (** {2 Output final files} *)
 
 val output_interf : output_file:string ->
   Camlp4.PreCast.Syntax.Ast.sig_item ->
   Camlp4.PreCast.Syntax.Ast.sig_item ->
+  Camlp4.PreCast.Syntax.Ast.sig_item ->
+  Camlp4.PreCast.Syntax.Ast.sig_item ->
+  Camlp4.PreCast.Syntax.Ast.sig_item ->
   unit
   (** Output the interface file. *)
 
 val output_implem : output_file:string ->
   Camlp4.PreCast.Syntax.Ast.str_item ->
   Camlp4.PreCast.Syntax.Ast.str_item ->
+  Camlp4.PreCast.Syntax.Ast.str_item ->
   (string, string) Hashtbl.t ->
+  Camlp4.PreCast.Syntax.Ast.str_item ->
+  Camlp4.PreCast.Syntax.Ast.str_item ->
   unit
   (** Output the implementation file. *)