From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1d36uy-0007iP-5J for mharc-grub-devel@gnu.org; Tue, 25 Apr 2017 16:18:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d36uv-0007iD-NE for grub-devel@gnu.org; Tue, 25 Apr 2017 16:18:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d36uu-0004DH-UR for grub-devel@gnu.org; Tue, 25 Apr 2017 16:18:33 -0400 Received: from mail-io0-x22e.google.com ([2607:f8b0:4001:c06::22e]:36559) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d36uu-0004D5-P3 for grub-devel@gnu.org; Tue, 25 Apr 2017 16:18:32 -0400 Received: by mail-io0-x22e.google.com with SMTP id p80so104887280iop.3 for ; Tue, 25 Apr 2017 13:18:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zzkvqznwSXBHY+0e1UvrrE80PF4q07KaRp+iz5cf+Vs=; b=V2DXmp8XbxdvD4bJggZb08c0FLyYHRLQ/W41DnhzC1sORPWCniLB3huIhzoYiFvXPH g0NyNQsq8WVIUGVJdDaLv5zj8iFLzXf0g/1fx2K6WI8cnbnPYmfiz+2h8bOnarVnRhC2 9Al80B8/BmGkDSOspFQPfFTXvYxCGRJ46Wd98= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zzkvqznwSXBHY+0e1UvrrE80PF4q07KaRp+iz5cf+Vs=; b=Vhhk3m7DTqxPs9IsiPSFZaIBXHSZ9IO/eOyr1nID9E3zvM7kVORIExie26iwPaBgMq EWFDjcifNpusuAu0a33e3gsr4qrkAtL0CI+nSmzcU4j49LyPE0N5As27rUprPWLK/MCu d/8G+GiOg3z3L9FR5qDu+6X5Tl+0Cd2z3WFerkiDhuLCwGv5glxAorN37gWgbDFjzGE6 +GjEw1ZvCNLvMJN9KGHfMJHJzwo2McyH2+JoNuv+foeCHsSJRufpE5f+PqXWroWyIyU+ x9Fj7ftWMLH2A7vLEXoIcRRS9UUnj2tJH7QH5SqbW74gydLFMVKbcq9cSsJy1DN8yzYb +mqw== X-Gm-Message-State: AN3rC/54ulric06Hk7M5gyOwLtjzOemT4Uj30Iw4ToHJ/e3h8Fc5b8kG KC3Ie3J/LNYNM/3m X-Received: by 10.107.35.6 with SMTP id j6mr17529436ioj.77.1493151512129; Tue, 25 Apr 2017 13:18:32 -0700 (PDT) Received: from jwerner-linux.mtv.corp.google.com ([172.22.64.164]) by smtp.gmail.com with ESMTPSA id r141sm2710716ita.2.2017.04.25.13.18.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 25 Apr 2017 13:18:30 -0700 (PDT) From: Julius Werner To: grub-devel@gnu.org Cc: Paul Menzel , Vladimir Serbinenko , Julius Werner Subject: [PATCH v2] grub-core/term/i386/coreboot/cbmemc.c: Update console format Date: Tue, 25 Apr 2017 13:18:25 -0700 Message-Id: <20170425201825.15337-1-jwerner@chromium.org> X-Mailer: git-send-email 2.13.0.rc0.306.g87b477812d-goog In-Reply-To: <20170425000008.10286-1-jwerner@chromium.org> References: <20170425000008.10286-1-jwerner@chromium.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4001:c06::22e X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Apr 2017 20:18:34 -0000 Changed cbmemc to support updated console format from coreboot. --- grub-core/term/i386/coreboot/cbmemc.c | 50 ++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c index 25e64a05c..436eda52a 100644 --- a/grub-core/term/i386/coreboot/cbmemc.c +++ b/grub-core/term/i386/coreboot/cbmemc.c @@ -29,11 +29,14 @@ GRUB_MOD_LICENSE ("GPLv3+"); +#define CURSOR_MASK ((1 << 28) - 1) +#define OVERFLOW (1 << 31) + struct grub_linuxbios_cbmemc { grub_uint32_t size; - grub_uint32_t pointer; - char data[0]; + grub_uint32_t cursor; + char body[0]; }; static struct grub_linuxbios_cbmemc *cbmemc; @@ -41,11 +44,20 @@ static struct grub_linuxbios_cbmemc *cbmemc; static void put (struct grub_term_output *term __attribute__ ((unused)), const int c) { + grub_uint32_t flags, cursor; if (!cbmemc) return; - if (cbmemc->pointer < cbmemc->size) - cbmemc->data[cbmemc->pointer] = c; - cbmemc->pointer++; + flags = cbmemc->cursor & ~CURSOR_MASK; + cursor = cbmemc->cursor & CURSOR_MASK; + if (cursor >= cbmemc->size) + return; + cbmemc->body[cursor++] = c; + if (cursor >= cbmemc->size) + { + cursor = 0; + flags |= OVERFLOW; + } + cbmemc->cursor = flags | cursor; } struct grub_terminfo_output_state grub_cbmemc_terminfo_output = @@ -87,21 +99,29 @@ grub_cmd_cbmemc (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { - grub_size_t len; - char *str; - struct grub_linuxbios_cbmemc *cbmemc_saved; + grub_size_t size, cursor; + struct grub_linuxbios_cbmemc *real_cbmemc; if (!cbmemc) return grub_error (GRUB_ERR_IO, "no CBMEM console found"); - len = cbmemc->pointer; - if (len > cbmemc->size) - len = cbmemc->size; - str = cbmemc->data; - cbmemc_saved = cbmemc; + real_cbmemc = cbmemc; cbmemc = 0; - grub_xnputs (str, len); - cbmemc = cbmemc_saved; + cursor = real_cbmemc->cursor & CURSOR_MASK; + if (!(real_cbmemc->cursor & OVERFLOW) && cursor < real_cbmemc->size) + size = cursor; + else + size = real_cbmemc->size; + if (real_cbmemc->cursor & OVERFLOW) + { + if (cursor > size) + cursor = 0; + grub_xnputs(real_cbmemc->body + cursor, size - cursor); + grub_xnputs(real_cbmemc->body, cursor); + } + else + grub_xnputs(real_cbmemc->body, size); + cbmemc = real_cbmemc; return 0; } -- 2.12.2