From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1d2pjE-0000XO-ME for mharc-grub-devel@gnu.org; Mon, 24 Apr 2017 21:57:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35130) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d2nty-0006MD-Rn for grub-devel@gnu.org; Mon, 24 Apr 2017 20:00:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d2nty-0004Hu-37 for grub-devel@gnu.org; Mon, 24 Apr 2017 20:00:18 -0400 Received: from mail-pg0-x232.google.com ([2607:f8b0:400e:c05::232]:33499) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d2ntx-0004H3-TH for grub-devel@gnu.org; Mon, 24 Apr 2017 20:00:18 -0400 Received: by mail-pg0-x232.google.com with SMTP id 63so19795290pgh.0 for ; Mon, 24 Apr 2017 17:00:17 -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; bh=nfjvTlHqvPwyqv7Y18BPY71/NHTNzd7FLEP0VzBBknQ=; b=DFNSGw04CbgRL9ICITreIn8ZT/7dY9cVjD90yOHoX1b3id8f07lnItw/y7JDIw4+0V /Mu/pijpyT/A84O0Z9ooxmdtRd2CQuORrHotVNNTPwpW/iFVv7jlWrY4nvCo8JELdL+M 9tf+9k1Ig6yqAnn5XOfgqhDVx3LwXNk+2GPeo= 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; bh=nfjvTlHqvPwyqv7Y18BPY71/NHTNzd7FLEP0VzBBknQ=; b=O9FZV/i0ygu7bkaMhNT0hcDkKMn34TJRLlqAS/NFq8YmrG7Sq+sjcVoSGu7Nj2R+Uc Y/B+rvrPUALximL1yoEb/Acit/3evSTJIrNqK3Ver3DaIuy9zgxeE5KWiQf0xnMoXsMs PCajelqPlU2AKhq33zpBr7qVjXwJxNlVLTXeRRtziocjayT+5iU35mz0p2w5LfcMTi1R kgGCsFkakBLM4rdEJ91OgaCmaemKcHuS1bPW/+cDmYyGoUPy5FwYAjszb9cuTnQlp23Z vx4LPKxwA73mtrxFiGhS77A2n3SOcqF+g10h35GwR2UNiHIqDxlwuqDzCkwtF3RaUs2P Bq6Q== X-Gm-Message-State: AN3rC/6vOswTgyFxQkfRZDekKM0RnpzRERlvn4GesmizDlTK/P6zNKaW 8SakdljTaEifdE44 X-Received: by 10.99.114.22 with SMTP id n22mr26732625pgc.163.1493078416452; Mon, 24 Apr 2017 17:00:16 -0700 (PDT) Received: from jwerner-linux.mtv.corp.google.com ([172.22.64.164]) by smtp.gmail.com with ESMTPSA id i15sm32645474pfj.51.2017.04.24.17.00.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 24 Apr 2017 17:00:14 -0700 (PDT) From: Julius Werner To: grub-devel@gnu.org Cc: Paul Menzel , Vladimir Serbinenko , Julius Werner Subject: [PATCH] grub-core/term/i386/coreboot/cbmemc.c: Update console format Date: Mon, 24 Apr 2017 17:00:08 -0700 Message-Id: <20170425000008.10286-1-jwerner@chromium.org> X-Mailer: git-send-email 2.13.0.rc0.306.g87b477812d-goog X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::232 X-Mailman-Approved-At: Mon, 24 Apr 2017 21:57:19 -0400 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 00:00:20 -0000 Changed cbmemc to support updated console format from coreboot. --- grub-core/term/i386/coreboot/cbmemc.c | 44 +++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c index 25e64a05c..9e20f52fb 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) +#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,20 +99,28 @@ grub_cmd_cbmemc (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { - grub_size_t len; - char *str; + grub_size_t size, cursor; struct grub_linuxbios_cbmemc *cbmemc_saved; 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; cbmemc = 0; - grub_xnputs (str, len); + cursor = cbmemc->cursor & CURSOR_MASK; + if (!(cbmemc->cursor & OVERFLOW) && cursor < cbmemc->size) + size = cursor; + else + size = cbmemc->size; + if (cbmemc->cursor & OVERFLOW) + { + if (cursor > size) + cursor = 0; + grub_xnputs(cbmemc->body + cursor, size - cursor); + grub_xnputs(cbmemc->body, cursor); + } + else + grub_xnputs(cbmemc->body, size); cbmemc = cbmemc_saved; return 0; } -- 2.12.2