bc092b9
From 70b555a52a065b2beb91e6fc97a6b358c931b303 Mon Sep 17 00:00:00 2001
bc092b9
From: Julius Werner <jwerner@chromium.org>
bc092b9
Date: Tue, 9 May 2017 09:03:02 +0200
6f1e3d5
Subject: [PATCH 035/198] coreboot: Changed cbmemc to support updated console
bc092b9
 format from coreboot.
bc092b9
bc092b9
---
bc092b9
 grub-core/term/i386/coreboot/cbmemc.c | 50 ++++++++++++++++++++++++-----------
bc092b9
 1 file changed, 35 insertions(+), 15 deletions(-)
bc092b9
bc092b9
diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c
bc092b9
index 129248c7f..cea9b8431 100644
bc092b9
--- a/grub-core/term/i386/coreboot/cbmemc.c
bc092b9
+++ b/grub-core/term/i386/coreboot/cbmemc.c
bc092b9
@@ -29,11 +29,14 @@
bc092b9
 
bc092b9
 GRUB_MOD_LICENSE ("GPLv3+");
bc092b9
 
bc092b9
+#define CURSOR_MASK ((1 << 28) - 1)
bc092b9
+#define OVERFLOW (1 << 31)
bc092b9
+
bc092b9
 struct grub_linuxbios_cbmemc
bc092b9
 {
bc092b9
   grub_uint32_t size;
bc092b9
-  grub_uint32_t pointer;
bc092b9
-  char data[0];
bc092b9
+  grub_uint32_t cursor;
bc092b9
+  char body[0];
bc092b9
 };
bc092b9
 
bc092b9
 static struct grub_linuxbios_cbmemc *cbmemc;
bc092b9
@@ -41,11 +44,20 @@ static struct grub_linuxbios_cbmemc *cbmemc;
bc092b9
 static void
bc092b9
 put (struct grub_term_output *term __attribute__ ((unused)), const int c)
bc092b9
 {
bc092b9
+  grub_uint32_t flags, cursor;
bc092b9
   if (!cbmemc)
bc092b9
     return;
bc092b9
-  if (cbmemc->pointer < cbmemc->size)
bc092b9
-    cbmemc->data[cbmemc->pointer] = c;
bc092b9
-  cbmemc->pointer++;
bc092b9
+  flags = cbmemc->cursor & ~CURSOR_MASK;
bc092b9
+  cursor = cbmemc->cursor & CURSOR_MASK;
bc092b9
+  if (cursor >= cbmemc->size)
bc092b9
+    return;
bc092b9
+  cbmemc->body[cursor++] = c;
bc092b9
+  if (cursor >= cbmemc->size)
bc092b9
+    {
bc092b9
+      cursor = 0;
bc092b9
+      flags |= OVERFLOW;
bc092b9
+    }
bc092b9
+  cbmemc->cursor = flags | cursor;
bc092b9
 }
bc092b9
 
bc092b9
 struct grub_terminfo_output_state grub_cbmemc_terminfo_output =
bc092b9
@@ -87,21 +99,29 @@ grub_cmd_cbmemc (struct grub_command *cmd __attribute__ ((unused)),
bc092b9
 		 int argc __attribute__ ((unused)),
bc092b9
 		 char *argv[] __attribute__ ((unused)))
bc092b9
 {
bc092b9
-  grub_size_t len;
bc092b9
-  char *str;
bc092b9
-  struct grub_linuxbios_cbmemc *cbmemc_saved;
bc092b9
+  grub_size_t size, cursor;
bc092b9
+  struct grub_linuxbios_cbmemc *real_cbmemc;
bc092b9
 
bc092b9
   if (!cbmemc)
bc092b9
     return grub_error (GRUB_ERR_IO, "no CBMEM console found");
bc092b9
 
bc092b9
-  len = cbmemc->pointer;
bc092b9
-  if (len > cbmemc->size)
bc092b9
-    len = cbmemc->size;
bc092b9
-  str = cbmemc->data;
bc092b9
-  cbmemc_saved = cbmemc;
bc092b9
+  real_cbmemc = cbmemc;
bc092b9
   cbmemc = 0;
bc092b9
-  grub_xnputs (str, len);
bc092b9
-  cbmemc = cbmemc_saved;
bc092b9
+  cursor = real_cbmemc->cursor & CURSOR_MASK;
bc092b9
+  if (!(real_cbmemc->cursor & OVERFLOW) && cursor < real_cbmemc->size)
bc092b9
+    size = cursor;
bc092b9
+  else
bc092b9
+    size = real_cbmemc->size;
bc092b9
+  if (real_cbmemc->cursor & OVERFLOW)
bc092b9
+    {
bc092b9
+      if (cursor > size)
bc092b9
+        cursor = 0;
bc092b9
+      grub_xnputs(real_cbmemc->body + cursor, size - cursor);
bc092b9
+      grub_xnputs(real_cbmemc->body, cursor);
bc092b9
+    }
bc092b9
+  else
bc092b9
+    grub_xnputs(real_cbmemc->body, size);
bc092b9
+  cbmemc = real_cbmemc;
bc092b9
   return 0;
bc092b9
 }
bc092b9
 
bc092b9
-- 
da63b36
2.14.3
bc092b9