--
-- This file is part of the coreboot project.
--
-- 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; version 2 of the License.
--
-- 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;

use type Interfaces.C.int;

package body HW.Debug_Sink is

   function console_log_level
     (msg_level : Interfaces.C.int)
      return Interfaces.C.int;
   pragma Import (C, console_log_level, "console_log_level");

   Msg_Level_BIOS_DEBUG : constant := 7;

   procedure console_tx_byte (chr : Interfaces.C.char);
   pragma Import (C, console_tx_byte, "console_tx_byte");

   procedure Put (Item : String) is
   begin
      if console_log_level (Msg_Level_BIOS_DEBUG) /= 0 then
         for Idx in Item'Range loop
            console_tx_byte (Interfaces.C.To_C (Item (Idx)));
         end loop;
      end if;
   end Put;

   procedure Put_Char (Item : Character) is
   begin
      if console_log_level (Msg_Level_BIOS_DEBUG) /= 0 then
         console_tx_byte (Interfaces.C.To_C (Item));
      end if;
   end Put_Char;

   procedure New_Line is
   begin
      Put_Char (Character'Val (16#0a#));
   end New_Line;

end HW.Debug_Sink;
