Patrick Georgi has uploaded this change for review.

View Change

Make gcc11 compatible

It's much more picky when dealing with arrays containing volatile or
atomic members.

Meanwhile System.Address_To_Access_Conversions doesn't seem to be
able to return an element with atomic/volatile aspect, so everything
fell apart.

Entire untested except that it builds (for me)

Change-Id: Ieb50c4dd8ba96248c3051a7282f9e5cdbb270344
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
---
M ada/dynamic_mmio/hw-mmio_range.adb
M common/hw-mmio_range.ads
M common/hw-pci-dev.ads
M common/hw-pci-mmconf.adb
M common/hw-pci-mmconf.ads
5 files changed, 30 insertions(+), 31 deletions(-)

git pull ssh://review.coreboot.org:29418/libhwbase refs/changes/67/55167/1
diff --git a/ada/dynamic_mmio/hw-mmio_range.adb b/ada/dynamic_mmio/hw-mmio_range.adb
index 86c8d1b..60cbbd5 100644
--- a/ada/dynamic_mmio/hw-mmio_range.adb
+++ b/ada/dynamic_mmio/hw-mmio_range.adb
@@ -14,14 +14,12 @@

with HW.Debug;
with GNAT.Source_Info;
-with System.Storage_Elements;
-with System.Address_To_Access_Conversions;

package body HW.MMIO_Range
with
Refined_State =>
- (State => null, -- the contents accessed, Range_A points to it
- Base_Address => Range_A) -- the address, stored in Range_A
+ (State => null, -- the contents accessed, Base points to it
+ Base_Address => (Base, Range_A)) -- the address, stored in Base
is
pragma Warnings (Off, "implicit dereference",
Reason => "This is what this package is about.");
@@ -29,12 +27,6 @@
Debug_Reads : constant Boolean := False;
Debug_Writes : constant Boolean := False;

- type Range_Access is access all Array_T;
- package Conv_Range is new System.Address_To_Access_Conversions (Array_T);
-
- Range_A : Range_Access :=
- Range_Access (Conv_Range.To_Pointer (System'To_Address (Base_Addr)));
-
procedure Read (Value : out Element_T; Index : in Index_T)
is
use type Word32;
@@ -45,9 +37,8 @@
pragma Debug (Debug_Reads, Debug.Put_Word32 (Word32 (Value)));
pragma Debug (Debug_Reads, Debug.Put (" <- "));
pragma Debug (Debug_Reads, Debug.Put_Word32
- (Word32 (System.Storage_Elements.To_Integer
- (Conv_Range.To_Address (Conv_Range.Object_Pointer (Range_A)))) +
- Word32 (Index) * (Element_T'Size / 8)));
+ (Word32 (System.Storage_Elements.To_Integer (Base))
+ + Word32 (Index) * (Element_T'Size / 8)));
pragma Debug (Debug_Reads, Debug.New_Line);
end Read;

@@ -60,17 +51,17 @@
pragma Debug (Debug_Writes, Debug.Put_Word32 (Word32 (Value)));
pragma Debug (Debug_Writes, Debug.Put (" -> "));
pragma Debug (Debug_Writes, Debug.Put_Word32
- (Word32 (System.Storage_Elements.To_Integer
- (Conv_Range.To_Address (Conv_Range.Object_Pointer (Range_A)))) +
- Word32 (Index) * (Element_T'Size / 8)));
+ (Word32 (System.Storage_Elements.To_Integer (Base))
+ + Word32 (Index) * (Element_T'Size / 8)));
pragma Debug (Debug_Writes, Debug.New_Line);
Range_A (Index) := Value;
end Write;

- procedure Set_Base_Address (Base : Word64) is
+ procedure Set_Base_Address (New_Base : Word64) is
+ Address : System.Storage_Elements.Integer_Address;
begin
- Range_A := Range_Access
- (Conv_Range.To_Pointer (System'To_Address (Base)));
+ Address := System.Storage_Elements.Integer_Address (New_Base);
+ Base := System.Storage_Elements.To_Address(Address);
end Set_Base_Address;

end HW.MMIO_Range;
diff --git a/common/hw-mmio_range.ads b/common/hw-mmio_range.ads
index 8495f73..86ddcd6 100644
--- a/common/hw-mmio_range.ads
+++ b/common/hw-mmio_range.ads
@@ -13,17 +13,17 @@
--

with System;
+with System.Storage_Elements;

generic
Base_Addr : Word64;
type Element_T is mod <>;
type Index_T is range <>;
- type Array_T is array (Index_T) of Element_T;
package HW.MMIO_Range
with
Abstract_State =>
((State with External),
- Base_Address),
+ (Base_Address with External)),
Initializes => Base_Address
is

@@ -31,6 +31,18 @@

procedure Write (Index : in Index_T; Value : in Element_T);

- procedure Set_Base_Address (Base : Word64);
+ procedure Set_Base_Address (New_Base : Word64);
+
+private
+
+ Base : System.Address := System.Storage_Elements.To_Address
+ (System.Storage_Elements.Integer_Address (Base_Addr))
+ with Part_Of => Base_Address;
+
+ type Volatile_Element_T is new Element_T with Volatile;
+ type Array_T is array (Index_T) of Element_T with Volatile_Components;
+
+ Range_A : Array_T with Part_Of => Base_Address;
+ for Range_A'Address use Base;

end HW.MMIO_Range;
diff --git a/common/hw-pci-dev.ads b/common/hw-pci-dev.ads
index 5b20aa1..6bfef74 100644
--- a/common/hw-pci-dev.ads
+++ b/common/hw-pci-dev.ads
@@ -16,7 +16,7 @@
Dev : PCI.Address := (0, 0, 0);
package HW.PCI.Dev
with
- Abstract_State => (Address_State, (PCI_State with External)),
+ Abstract_State => ((Address_State with External), (PCI_State with External)),
Initializes => Address_State
is

diff --git a/common/hw-pci-mmconf.adb b/common/hw-pci-mmconf.adb
index 180f2d7..493780d 100644
--- a/common/hw-pci-mmconf.adb
+++ b/common/hw-pci-mmconf.adb
@@ -29,16 +29,12 @@
type Index16 is new Index range 0 .. Index'Last / 2;
type Index32 is new Index range 0 .. Index'Last / 4;

- type Array8 is array (Index) of Byte with Atomic_Components;
- type Array16 is array (Index16) of Word16 with Atomic_Components;
- type Array32 is array (Index32) of Word32 with Atomic_Components;
-
package MM8 is new HW.MMIO_Range
- (Default_Base_Address, Word8, Index, Array8);
+ (Default_Base_Address, Word8, Index);
package MM16 is new HW.MMIO_Range
- (Default_Base_Address, Word16, Index16, Array16);
+ (Default_Base_Address, Word16, Index16);
package MM32 is new HW.MMIO_Range
- (Default_Base_Address, Word32, Index32, Array32);
+ (Default_Base_Address, Word32, Index32);

procedure Read8 (Value : out Word8; Offset : Index) renames MM8.Read;

diff --git a/common/hw-pci-mmconf.ads b/common/hw-pci-mmconf.ads
index 597ebfa..22e2e2e 100644
--- a/common/hw-pci-mmconf.ads
+++ b/common/hw-pci-mmconf.ads
@@ -21,7 +21,7 @@
Dev : Address := (0, 0, 0);
package HW.PCI.MMConf
with
- Abstract_State => (Address_State, (PCI_State with External)),
+ Abstract_State => ((Address_State with External), (PCI_State with External)),
Initializes => Address_State
is


To view, visit change 55167. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: libhwbase
Gerrit-Branch: master
Gerrit-Change-Id: Ieb50c4dd8ba96248c3051a7282f9e5cdbb270344
Gerrit-Change-Number: 55167
Gerrit-PatchSet: 1
Gerrit-Owner: Patrick Georgi <pgeorgi@google.com>
Gerrit-MessageType: newchange