* [PATCH] grub-core/term/i386/coreboot/cbmemc.c: Update console format
@ 2017-04-25 0:00 Julius Werner
2017-04-25 20:18 ` [PATCH v2] " Julius Werner
0 siblings, 1 reply; 3+ messages in thread
From: Julius Werner @ 2017-04-25 0:00 UTC (permalink / raw)
To: grub-devel; +Cc: Paul Menzel, Vladimir Serbinenko, Julius Werner
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2] grub-core/term/i386/coreboot/cbmemc.c: Update console format
2017-04-25 0:00 [PATCH] grub-core/term/i386/coreboot/cbmemc.c: Update console format Julius Werner
@ 2017-04-25 20:18 ` Julius Werner
2017-05-09 7:03 ` Vladimir 'phcoder' Serbinenko
0 siblings, 1 reply; 3+ messages in thread
From: Julius Werner @ 2017-04-25 20:18 UTC (permalink / raw)
To: grub-devel; +Cc: Paul Menzel, Vladimir Serbinenko, Julius Werner
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] grub-core/term/i386/coreboot/cbmemc.c: Update console format
2017-04-25 20:18 ` [PATCH v2] " Julius Werner
@ 2017-05-09 7:03 ` Vladimir 'phcoder' Serbinenko
0 siblings, 0 replies; 3+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2017-05-09 7:03 UTC (permalink / raw)
To: The development of GNU GRUB
Cc: Julius Werner, Vladimir Serbinenko, Paul Menzel
[-- Attachment #1: Type: text/plain, Size: 3090 bytes --]
Committed, thanks
Le Tue, Apr 25, 2017 à 10:19 PM, Julius Werner <jwerner@chromium.org> a
écrit :
> 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
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
[-- Attachment #2: Type: text/html, Size: 3942 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-05-09 7:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-25 0:00 [PATCH] grub-core/term/i386/coreboot/cbmemc.c: Update console format Julius Werner
2017-04-25 20:18 ` [PATCH v2] " Julius Werner
2017-05-09 7:03 ` Vladimir 'phcoder' Serbinenko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.