----------------------------------------------------------------------- -- keystore-buffers -- Buffer management for the keystore -- Copyright (C) 2019, 2020 Stephane Carrez -- Written by Stephane Carrez (Stephane.Carrez@gmail.com) -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. ----------------------------------------------------------------------- with Ada.Streams; with Ada.Containers.Ordered_Maps; with Util.Encoders.AES; with Util.Refs; private package Keystore.Buffers is use Ada.Streams; BT_HMAC_HEADER_SIZE : constant := 32; -- Data block size defined to a 4K to map system page. Block_Size : constant := 4096; BT_DATA_SIZE : constant := Block_Size - BT_HMAC_HEADER_SIZE; subtype Buffer_Size is Stream_Element_Offset range 0 .. BT_DATA_SIZE; subtype Block_Index is Stream_Element_Offset range 1 .. BT_DATA_SIZE; subtype IO_Block_Type is Stream_Element_Array (1 .. Block_Size); subtype Block_Type is Stream_Element_Array (Block_Index); type Block_Count is new Interfaces.Unsigned_32; subtype Block_Number is Block_Count range 1 .. Block_Count'Last; type Storage_Identifier is new Interfaces.Unsigned_32; type Storage_Block is record Storage : Storage_Identifier := 0; Block : Block_Number := Block_Number'First; end record; -- Get a printable representation of storage block for the logs. function To_String (Value : in Storage_Block) return String; -- Order the two values on the storage and block number. function "<" (Left, Right : in Storage_Block) return Boolean is (Left.Storage < Right.Storage or else (Left.Storage = Right.Storage and then Left.Block < Right.Block)); type Data_Buffer_Type is limited record Data : Block_Type; end record; package Buffer_Refs is new Util.Refs.General_References (Data_Buffer_Type); subtype Buffer_Type is Buffer_Refs.Ref; subtype Buffer_Accessor is Buffer_Refs.Element_Accessor; type Storage_Buffer is record Block : Storage_Block; Data : Buffer_Type; end record; function Is_Null (Buffer : in Storage_Buffer) return Boolean is (Buffer.Data.Is_Null); -- Order the two buffers on the storage and block number. function "<" (Left, Right : in Storage_Buffer) return Boolean is (Left.Block < Right.Block); -- A set of buffers ordered by storage and block number. package Buffer_Maps is new Ada.Containers.Ordered_Maps (Key_Type => Storage_Block, Element_Type => Buffer_Type, "<" => "<", "=" => Buffer_Refs."="); subtype Buffer_Map is Buffer_Maps.Map; subtype Buffer_Cursor is Buffer_Maps.Cursor; -- Find a buffer from the container. function Find (Container : in Buffer_Map; Block : in Storage_Block) return Storage_Buffer; -- Allocate a buffer for the storage block. function Allocate (Block : in Storage_Block) return Storage_Buffer; end Keystore.Buffers;