Add support to map the contents of a file
Add a package HW.File with a single procedure Map():
procedure Map
(Path : in String;
Addr : in Word64;
Len : in Natural;
Readable : in Boolean := False;
Writable : in Boolean := False;
Map_Copy : in Boolean := False;
Success : out Boolean)
with
Pre => (Readable or Writable) and
(if Map_Copy then Readable and not Writable);
If `Map_Copy` is `False`, it should map `Len` bytes from the start of
the file given by `Path` into the application's address space at `Addr`
using mmap(). If `Map_Copy` is `True`, anonymous memory should be map-
ped instead and be filled with a copy of the file's content using
read().
The current implementation is backed by C code to reduce dependencies
to external libraries (e.g. Florist is not packaged by a famous Linux
distro).
While we are at it, also add a configuration file for common POSIX
environments (configs/posix).
Change-Id: Ic10c35b35d3216dab6a5b2baba7ba619c885b346
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/18779
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/ada/posix/hw-file.adb b/ada/posix/hw-file.adb
new file mode 100644
index 0000000..ae0792b
--- /dev/null
+++ b/ada/posix/hw-file.adb
@@ -0,0 +1,68 @@
+--
+-- Copyright (C) 2017 Nico Huber <nico.h@gmx.de>
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+
+with Interfaces.C;
+with Interfaces.C.Strings;
+
+with HW.Debug;
+
+use Interfaces.C;
+use Interfaces.C.Strings;
+
+package body HW.File is
+
+ READ : constant := 16#01#;
+ WRITE : constant := 16#02#;
+
+ function c_map
+ (path : chars_ptr;
+ addr : Word64;
+ len : Word32;
+ mode : Word32;
+ copy : int)
+ return int;
+ pragma Import (C, c_map, "hw_file_map");
+
+ procedure Map
+ (Path : in String;
+ Addr : in Word64;
+ Len : in Natural;
+ Readable : in Boolean := False;
+ Writable : in Boolean := False;
+ Map_Copy : in Boolean := False;
+ Success : out Boolean)
+ is
+ use type HW.Word32;
+
+ cpath : chars_ptr := New_String (Path);
+ ret : constant int := c_map
+ (path => cpath,
+ addr => Addr,
+ len => Word32 (Len),
+ mode => (if Readable then READ else 0) or
+ (if Writable then WRITE else 0),
+ copy => (if Map_Copy then 1 else 0));
+ begin
+ pragma Warnings(GNAT, Off, """cpath"" modified*, but* never referenced",
+ Reason => "Free() demands to set it to null_ptr");
+ Free (cpath);
+ pragma Warnings(GNAT, On, """cpath"" modified*, but* never referenced");
+ Success := ret = 0;
+
+ pragma Debug (not Success, Debug.Put ("Mapping failed: "));
+ pragma Debug (not Success, Debug.Put_Int32 (Int32 (ret)));
+ pragma Debug (not Success, Debug.New_Line);
+ end Map;
+
+end HW.File;