Following is a chunk of patches that fix some bugs and add some features that are needed for the soon to come chooser payload.
Reverse rows and columns on the video putc() function, and watch printf work again.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/drivers/video/video.c =================================================================== --- libpayload.orig/drivers/video/video.c 2008-05-12 14:40:19.000000000 -0600 +++ libpayload/drivers/video/video.c 2008-05-12 14:40:23.000000000 -0600 @@ -126,14 +126,14 @@ case '\t': while(cursorx % 8 && cursorx < VIDEO_COLS) { if (console) - console->putc(cursorx, cursory, (ch & 0xFF00) | ' '); + console->putc(cursory, cursorx, (ch & 0xFF00) | ' ');
cursorx++; } break; default: if (console) - console->putc(cursorx++, cursory, ch); + console->putc(cursory, cursorx++, ch); break; }
Reverse rows and columns on the video putc() function, and watch printf work again.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
Thanks, Myles
Index: libpayload/drivers/video/video.c
--- libpayload.orig/drivers/video/video.c 2008-05-12
14:40:19.000000000 -
0600 +++ libpayload/drivers/video/video.c 2008-05-12 14:40:23.000000000 - 0600 @@ -126,14 +126,14 @@ case '\t': while(cursorx % 8 && cursorx < VIDEO_COLS) { if (console)
console->putc(cursorx, cursory, (ch &
0xFF00) | '
');
console->putc(cursory, cursorx, (ch &
0xFF00) | '
');
cursorx++; } break;
default: if (console)
console->putc(cursorx++, cursory, ch);
break; }console->putc(cursory, cursorx++, ch);
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
On 14/05/08 10:08 -0600, Myles Watson wrote:
Reverse rows and columns on the video putc() function, and watch printf work again.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
r3316 (which also accidently included a fix to sample/hello.c, but it was a useful fix so I'm not sad it is there).
Thanks, Myles
Index: libpayload/drivers/video/video.c
--- libpayload.orig/drivers/video/video.c 2008-05-12
14:40:19.000000000 -
0600 +++ libpayload/drivers/video/video.c 2008-05-12 14:40:23.000000000 - 0600 @@ -126,14 +126,14 @@ case '\t': while(cursorx % 8 && cursorx < VIDEO_COLS) { if (console)
console->putc(cursorx, cursory, (ch &
0xFF00) | '
');
console->putc(cursory, cursorx, (ch &
0xFF00) | '
');
cursorx++; } break;
default: if (console)
console->putc(cursorx++, cursory, ch);
break; }console->putc(cursory, cursorx++, ch);
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
This fixes subwindows in curses so that they draw and refresh correctly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/curses/tinycurses.c =================================================================== --- libpayload.orig/curses/tinycurses.c 2008-05-12 16:21:46.000000000 -0600 +++ libpayload/curses/tinycurses.c 2008-05-13 13:38:19.000000000 -0600 @@ -66,7 +66,7 @@ static int window_count = 1;
// struct ldat foo; -static struct ldat ldat_list[3]; +static struct ldat ldat_list[MAX_WINDOWS][SCREEN_Y]; static int ldat_count = 0;
/* One item bigger than SCREEN_X to reverse place for a NUL byte. */ @@ -306,7 +306,7 @@ win->_begx = begx; // win->_yoffset = SP->_topstolen;
- win->_line = &ldat_list[ldat_count++]; + win->_line = ldat_list[ldat_count++];
/* FIXME: Is this right? Should the window attributes be normal? */ win->_color = PAIR_NUMBER(0); @@ -491,8 +491,8 @@ int werase(WINDOW *win) { int x, y; - for (y = 0; y < win->_maxy; y++) { - for (x = 0; x < win->_maxx; x++) { + for (y = 0; y <= win->_maxy; y++) { + for (x = 0; x <= win->_maxx; x++) { win->_line[y].text[x].chars[0] = ' '; win->_line[y].text[x].attr = WINDOW_ATTRS(win); } @@ -559,8 +559,8 @@ // FIXME. int x, y;
- for (y = 0; y < win->_maxy; y++) { - for (x = 0; x < win->_maxx; x++) { + for (y = 0; y <= win->_maxy; y++) { + for (x = 0; x <= win->_maxx; x++) { if (curses_flags & F_ENABLE_SERIAL) serial_putchar(win->_line[y].text[x].chars[0]);
@@ -587,7 +587,7 @@ * but this will break wide characters! */ c |= (chtype) (win->_line[y].text[x].chars[0] & 0xff); - video_console_putc(y, x, c); + video_console_putc(win->_begy + y, win->_begx + x, c); } } }
-----Original Message----- From: coreboot-bounces+mylesgw=gmail.com@coreboot.org [mailto:coreboot- bounces+mylesgw=gmail.com@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 2/5] libpayload: Fix curses subwindows
This fixes subwindows in curses so that they draw and refresh correctly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
Thanks, Myles
Index: libpayload/curses/tinycurses.c
--- libpayload.orig/curses/tinycurses.c 2008-05-12
16:21:46.000000000 -
0600 +++ libpayload/curses/tinycurses.c 2008-05-13 13:38:19.000000000 -0600 @@ -66,7 +66,7 @@ static int window_count = 1;
// struct ldat foo; -static struct ldat ldat_list[3]; +static struct ldat ldat_list[MAX_WINDOWS][SCREEN_Y]; static int ldat_count = 0;
/* One item bigger than SCREEN_X to reverse place for a NUL byte. */ @@ -306,7 +306,7 @@ win->_begx = begx; // win->_yoffset = SP->_topstolen;
- win->_line = &ldat_list[ldat_count++];
win->_line = ldat_list[ldat_count++];
/* FIXME: Is this right? Should the window attributes be normal? */ win->_color = PAIR_NUMBER(0);
@@ -491,8 +491,8 @@ int werase(WINDOW *win) { int x, y;
- for (y = 0; y < win->_maxy; y++) {
for (x = 0; x < win->_maxx; x++) {
- for (y = 0; y <= win->_maxy; y++) {
}for (x = 0; x <= win->_maxx; x++) { win->_line[y].text[x].chars[0] = ' '; win->_line[y].text[x].attr = WINDOW_ATTRS(win);
@@ -559,8 +559,8 @@ // FIXME. int x, y;
- for (y = 0; y < win->_maxy; y++) {
for (x = 0; x < win->_maxx; x++) {
- for (y = 0; y <= win->_maxy; y++) {
for (x = 0; x <= win->_maxx; x++) { if (curses_flags & F_ENABLE_SERIAL)
serial_putchar(win->_line[y].text[x].chars[0]);
@@ -587,7 +587,7 @@ * but this will break wide characters! */ c |= (chtype)
(win->_line[y].text[x].chars[0] &
0xff);
video_console_putc(y, x, c);
video_console_putc(win->_begy + y,
win->_begx + x,
c); } } }
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
On 15/05/08 10:25 -0600, Myles Watson wrote:
-----Original Message----- From: coreboot-bounces+mylesgw=gmail.com@coreboot.org [mailto:coreboot- bounces+mylesgw=gmail.com@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 2/5] libpayload: Fix curses subwindows
This fixes subwindows in curses so that they draw and refresh correctly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
r3336 (no, really). THanks.
Thanks, Myles
Index: libpayload/curses/tinycurses.c
--- libpayload.orig/curses/tinycurses.c 2008-05-12
16:21:46.000000000 -
0600 +++ libpayload/curses/tinycurses.c 2008-05-13 13:38:19.000000000 -0600 @@ -66,7 +66,7 @@ static int window_count = 1;
// struct ldat foo; -static struct ldat ldat_list[3]; +static struct ldat ldat_list[MAX_WINDOWS][SCREEN_Y]; static int ldat_count = 0;
/* One item bigger than SCREEN_X to reverse place for a NUL byte. */ @@ -306,7 +306,7 @@ win->_begx = begx; // win->_yoffset = SP->_topstolen;
- win->_line = &ldat_list[ldat_count++];
win->_line = ldat_list[ldat_count++];
/* FIXME: Is this right? Should the window attributes be normal? */ win->_color = PAIR_NUMBER(0);
@@ -491,8 +491,8 @@ int werase(WINDOW *win) { int x, y;
- for (y = 0; y < win->_maxy; y++) {
for (x = 0; x < win->_maxx; x++) {
- for (y = 0; y <= win->_maxy; y++) {
}for (x = 0; x <= win->_maxx; x++) { win->_line[y].text[x].chars[0] = ' '; win->_line[y].text[x].attr = WINDOW_ATTRS(win);
@@ -559,8 +559,8 @@ // FIXME. int x, y;
- for (y = 0; y < win->_maxy; y++) {
for (x = 0; x < win->_maxx; x++) {
- for (y = 0; y <= win->_maxy; y++) {
for (x = 0; x <= win->_maxx; x++) { if (curses_flags & F_ENABLE_SERIAL)
serial_putchar(win->_line[y].text[x].chars[0]);
@@ -587,7 +587,7 @@ * but this will break wide characters! */ c |= (chtype)
(win->_line[y].text[x].chars[0] &
0xff);
video_console_putc(y, x, c);
video_console_putc(win->_begy + y,
win->_begx + x,
c); } } }
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
Add a function to get a pointer to the start of a LAR entry.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/include/libpayload.h 2008-05-13 15:23:18.000000000 -0600 @@ -247,6 +247,7 @@ struct larent *readlar(struct LAR *lar); void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); +void *larfptr(struct LAR *lar, const char *filename); struct LFILE * lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
Index: libpayload/libc/lar.c =================================================================== --- libpayload.orig/libc/lar.c 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/libc/lar.c 2008-05-13 13:42:59.000000000 -0600 @@ -218,6 +218,16 @@ return 0; }
+void * larfptr(struct LAR *lar, const char *filename) +{ + struct lar_header *header = get_header_by_name(lar, filename); + + if (header == NULL) + return NULL; + + return (void *) ((u8 *) header + ntohl(header->offset)); +} + struct LFILE * lfopen(struct LAR *lar, const char *filename) { struct LFILE *file;
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-bounces@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 3/5] libpayload: Add larfptr function
Add a function to get a pointer to the start of a LAR entry.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13
13:40:12.000000000 -
0600 +++ libpayload/include/libpayload.h 2008-05-13 15:23:18.000000000 -0600 @@ -247,6 +247,7 @@ struct larent *readlar(struct LAR *lar); void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); +void *larfptr(struct LAR *lar, const char *filename); struct LFILE * lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
Index: libpayload/libc/lar.c
--- libpayload.orig/libc/lar.c 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/libc/lar.c 2008-05-13 13:42:59.000000000 -0600 @@ -218,6 +218,16 @@ return 0; }
+void * larfptr(struct LAR *lar, const char *filename) +{
- struct lar_header *header = get_header_by_name(lar, filename);
- if (header == NULL)
return NULL;
- return (void *) ((u8 *) header + ntohl(header->offset));
+}
Why do we want it to return a void*?
Thanks, Myles
On 14/05/08 10:11 -0600, Myles Watson wrote:
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-bounces@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 3/5] libpayload: Add larfptr function
Add a function to get a pointer to the start of a LAR entry.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13
13:40:12.000000000 -
0600 +++ libpayload/include/libpayload.h 2008-05-13 15:23:18.000000000 -0600 @@ -247,6 +247,7 @@ struct larent *readlar(struct LAR *lar); void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); +void *larfptr(struct LAR *lar, const char *filename); struct LFILE * lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
Index: libpayload/libc/lar.c
--- libpayload.orig/libc/lar.c 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/libc/lar.c 2008-05-13 13:42:59.000000000 -0600 @@ -218,6 +218,16 @@ return 0; }
+void * larfptr(struct LAR *lar, const char *filename) +{
- struct lar_header *header = get_header_by_name(lar, filename);
- if (header == NULL)
return NULL;
- return (void *) ((u8 *) header + ntohl(header->offset));
+}
Why do we want it to return a void*?
I tend to to use void when I can because its is maliable, but I can be convinced to use u8 * or unsigned long *.
Jordan
-----Original Message----- From: Jordan Crouse [mailto:jordan.crouse@amd.com] Sent: Wednesday, May 14, 2008 5:08 PM To: Myles Watson Cc: coreboot@coreboot.org Subject: Re: libpayload: Add larfptr function
On 14/05/08 10:11 -0600, Myles Watson wrote:
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-
bounces@coreboot.org]
On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 3/5] libpayload: Add larfptr function
Add a function to get a pointer to the start of a LAR entry.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13
13:40:12.000000000 -
0600 +++ libpayload/include/libpayload.h 2008-05-13
15:23:18.000000000 -
0600
@@ -247,6 +247,7 @@ struct larent *readlar(struct LAR *lar); void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); +void *larfptr(struct LAR *lar, const char *filename); struct LFILE * lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE
*stream);
Index: libpayload/libc/lar.c
--- libpayload.orig/libc/lar.c 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/libc/lar.c 2008-05-13 13:42:59.000000000 -0600 @@ -218,6 +218,16 @@ return 0; }
+void * larfptr(struct LAR *lar, const char *filename) +{
- struct lar_header *header = get_header_by_name(lar, filename);
- if (header == NULL)
return NULL;
- return (void *) ((u8 *) header + ntohl(header->offset));
+}
Why do we want it to return a void*?
I tend to to use void when I can because its is maliable, but I can be convinced to use u8 * or unsigned long *.
Because anything larger than u8 needs ntohl, I'd vote for u8*.
Acked-by: Myles Watson mylesgw@gmail.com
Thanks, Myles
Jordan
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
On 15/05/08 09:36 -0600, Myles Watson wrote:
-----Original Message----- From: Jordan Crouse [mailto:jordan.crouse@amd.com] Sent: Wednesday, May 14, 2008 5:08 PM To: Myles Watson Cc: coreboot@coreboot.org Subject: Re: libpayload: Add larfptr function
On 14/05/08 10:11 -0600, Myles Watson wrote:
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-
bounces@coreboot.org]
On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 3/5] libpayload: Add larfptr function
Add a function to get a pointer to the start of a LAR entry.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13
13:40:12.000000000 -
0600 +++ libpayload/include/libpayload.h 2008-05-13
15:23:18.000000000 -
0600
@@ -247,6 +247,7 @@ struct larent *readlar(struct LAR *lar); void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); +void *larfptr(struct LAR *lar, const char *filename); struct LFILE * lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE
*stream);
Index: libpayload/libc/lar.c
--- libpayload.orig/libc/lar.c 2008-05-13 13:40:12.000000000 -0600 +++ libpayload/libc/lar.c 2008-05-13 13:42:59.000000000 -0600 @@ -218,6 +218,16 @@ return 0; }
+void * larfptr(struct LAR *lar, const char *filename) +{
- struct lar_header *header = get_header_by_name(lar, filename);
- if (header == NULL)
return NULL;
- return (void *) ((u8 *) header + ntohl(header->offset));
+}
Why do we want it to return a void*?
I tend to to use void when I can because its is maliable, but I can be convinced to use u8 * or unsigned long *.
Because anything larger than u8 needs ntohl, I'd vote for u8*.
Acked-by: Myles Watson mylesgw@gmail.com
r3337. Thanks.
Jordan
Add functions for libpayload to execute other payloads in memory, and have those functions return cleanly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/i386/Makefile.inc =================================================================== --- libpayload.orig/i386/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,3 +29,4 @@
TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o +TARGETS-y += i386/exec.o Index: libpayload/i386/exec.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/i386/exec.S 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,64 @@ +/* calling syntax: i386_do_exec(long addr, int argc, char **argv, int *ret) */ + +.align 4 +.text + +.global i386_do_exec + .type i386_do_exec,@function + +i386_do_exec: + pushl %ebp + movl %esp, %ebp + pushl %eax + + # Put the run address in %eax + movl 8(%ebp), %eax + + # Save off the rest of the registers + + pushl %esi + pushl %ecx + pushl %ebp + + # Push the argc and argv pointers on to the stack + + movl 12(%ebp), %esi + movl 16(%ebp), %ecx + + pushl %esi + pushl %ecx + + # Move a "magic" number on the stack - the other + # payload will use this as a clue that the argc + # and argv are sane + + movl $12345678, %ecx + pushl %ecx + + # Jump to the code + call *%eax + + /* %eax has the return value */ + + /* Skip over the argc/argv stuff still on the stack */ + addl $12, %esp + + # Get back %ebp + popl %ebp + + # Get the pointer to the return value + # and save the return value in it + + movl 20(%ebp), %ecx + movl %eax, (%eax) + + # Get the rest of the saved registers + popl %ecx + popl %esi + popl %eax + + # Restore the stack pointer + movl %ebp,%esp + popl %ebp + ret + Index: libpayload/i386/head.S =================================================================== --- libpayload.orig/i386/head.S 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/head.S 2008-05-13 13:42:59.000000000 -0600 @@ -63,13 +63,14 @@
/* Let's rock. */ call start_main - + + /* %eax has the return value - pass it on unmolested */ _leave: /* Get old stack pointer. */ popl %ebx
/* Restore old stack. */ - movl %esp, %ebx + movl %ebx, %esp
/* Return to the original context. */ - lret + ret Index: libpayload/libc/exec.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/libc/exec.c 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,52 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 Advanced Micro Devices, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <libpayload.h> + +#ifdef CONFIG_TARGET_I386 +extern void i386_do_exec(long, int, char **, int *); +#endif + +/** + * Execute code in memory + * + * @param ptr The entry point to jump to + * @return Return the return value from the entry point + */ + + +int exec(long addr, int argc, char **argv) +{ + int val = -1; + +#ifdef CONFIG_TARGET_I386 + i386_do_exec(addr, argc, argv, &val); +#endif + return val; +} Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 +++ libpayload/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 @@ -145,6 +145,9 @@ void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size);
+/* libc/exec.c */ +int exec(long addr, int argc, char **argv); + /* libc/lib.c */ int bcd2dec(int b); int dec2bcd(int d); Index: libpayload/libc/Makefile.inc =================================================================== --- libpayload.orig/libc/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/libc/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,4 +29,4 @@
TARGETS-y += libc/malloc.o libc/printf.o libc/console.o libc/string.o TARGETS-y += libc/memory.o libc/ctype.o libc/ipchecksum.o libc/lib.o -TARGETS-y += libc/rand.o libc/time.o libc/lar.o +TARGETS-y += libc/rand.o libc/time.o libc/lar.o libc/exec.o
On Tue, May 13, 2008 at 05:34:09PM -0600, jordan.crouse@amd.com wrote:
Add functions for libpayload to execute other payloads in memory, and have those functions return cleanly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/i386/Makefile.inc =================================================================== --- libpayload.orig/i386/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,3 +29,4 @@
TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o +TARGETS-y += i386/exec.o Index: libpayload/i386/exec.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/i386/exec.S 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,64 @@
More reviews later, but NACK for this, missing license header.
+/* calling syntax: i386_do_exec(long addr, int argc, char **argv, int *ret) */
+.align 4 +.text
+.global i386_do_exec
.type i386_do_exec,@function
+i386_do_exec:
- pushl %ebp
movl %esp, %ebp
- pushl %eax
- # Put the run address in %eax
- movl 8(%ebp), %eax
- # Save off the rest of the registers
- pushl %esi
- pushl %ecx
- pushl %ebp
- # Push the argc and argv pointers on to the stack
- movl 12(%ebp), %esi
- movl 16(%ebp), %ecx
- pushl %esi
- pushl %ecx
- # Move a "magic" number on the stack - the other
- # payload will use this as a clue that the argc
- # and argv are sane
- movl $12345678, %ecx
- pushl %ecx
- # Jump to the code
- call *%eax
- /* %eax has the return value */
- /* Skip over the argc/argv stuff still on the stack */
- addl $12, %esp
- # Get back %ebp
- popl %ebp
- # Get the pointer to the return value
- # and save the return value in it
- movl 20(%ebp), %ecx
- movl %eax, (%eax)
- # Get the rest of the saved registers
- popl %ecx
- popl %esi
- popl %eax
- # Restore the stack pointer
- movl %ebp,%esp
- popl %ebp
- ret
Index: libpayload/i386/head.S
--- libpayload.orig/i386/head.S 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/head.S 2008-05-13 13:42:59.000000000 -0600 @@ -63,13 +63,14 @@
/* Let's rock. */ call start_main
- /* %eax has the return value - pass it on unmolested */
_leave: /* Get old stack pointer. */ popl %ebx
/* Restore old stack. */
- movl %esp, %ebx
movl %ebx, %esp
/* Return to the original context. */
- lret
- ret
Index: libpayload/libc/exec.c
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/libc/exec.c 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,52 @@ +/*
- This file is part of the libpayload project.
- Copyright (C) 2008 Advanced Micro Devices, Inc.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- */
+#include <libpayload.h>
+#ifdef CONFIG_TARGET_I386 +extern void i386_do_exec(long, int, char **, int *); +#endif
+/**
- Execute code in memory
- @param ptr The entry point to jump to
- @return Return the return value from the entry point
- */
+int exec(long addr, int argc, char **argv) +{
- int val = -1;
+#ifdef CONFIG_TARGET_I386
- i386_do_exec(addr, argc, argv, &val);
+#endif
- return val;
+} Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 +++ libpayload/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 @@ -145,6 +145,9 @@ void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size);
+/* libc/exec.c */ +int exec(long addr, int argc, char **argv);
/* libc/lib.c */ int bcd2dec(int b); int dec2bcd(int d); Index: libpayload/libc/Makefile.inc =================================================================== --- libpayload.orig/libc/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/libc/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,4 +29,4 @@
TARGETS-y += libc/malloc.o libc/printf.o libc/console.o libc/string.o TARGETS-y += libc/memory.o libc/ctype.o libc/ipchecksum.o libc/lib.o -TARGETS-y += libc/rand.o libc/time.o libc/lar.o +TARGETS-y += libc/rand.o libc/time.o libc/lar.o libc/exec.o
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
On 14/05/08 11:12 +0200, Uwe Hermann wrote:
On Tue, May 13, 2008 at 05:34:09PM -0600, jordan.crouse@amd.com wrote:
Add functions for libpayload to execute other payloads in memory, and have those functions return cleanly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/i386/Makefile.inc =================================================================== --- libpayload.orig/i386/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,3 +29,4 @@
TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o +TARGETS-y += i386/exec.o Index: libpayload/i386/exec.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/i386/exec.S 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,64 @@
More reviews later, but NACK for this, missing license header.
Oops - thanks for the heads up.
Jordan
On Tue, May 13, 2008 at 05:34:09PM -0600, jordan.crouse@amd.com wrote:
Add functions for libpayload to execute other payloads in memory, and have those functions return cleanly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/i386/Makefile.inc =================================================================== --- libpayload.orig/i386/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,3 +29,4 @@
TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o +TARGETS-y += i386/exec.o Index: libpayload/i386/exec.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/i386/exec.S 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,64 @@ +/* calling syntax: i386_do_exec(long addr, int argc, char **argv, int *ret) */
+.align 4 +.text
+.global i386_do_exec
.type i386_do_exec,@function
+i386_do_exec:
- pushl %ebp
movl %esp, %ebp
- pushl %eax
- # Put the run address in %eax
- movl 8(%ebp), %eax
- # Save off the rest of the registers
- pushl %esi
- pushl %ecx
- pushl %ebp
- # Push the argc and argv pointers on to the stack
- movl 12(%ebp), %esi
- movl 16(%ebp), %ecx
- pushl %esi
- pushl %ecx
- # Move a "magic" number on the stack - the other
- # payload will use this as a clue that the argc
- # and argv are sane
- movl $12345678, %ecx
This should probably be documented somewhere and/or agreed upon on the list, as it introduces sort an "API" of some sort? It'll be only relevant for "our" payloads ("well-behaved" payloads), right?
- pushl %ecx
- # Jump to the code
- call *%eax
- /* %eax has the return value */
- /* Skip over the argc/argv stuff still on the stack */
- addl $12, %esp
- # Get back %ebp
- popl %ebp
- # Get the pointer to the return value
- # and save the return value in it
- movl 20(%ebp), %ecx
- movl %eax, (%eax)
- # Get the rest of the saved registers
- popl %ecx
- popl %esi
- popl %eax
- # Restore the stack pointer
- movl %ebp,%esp
- popl %ebp
- ret
Index: libpayload/i386/head.S
--- libpayload.orig/i386/head.S 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/head.S 2008-05-13 13:42:59.000000000 -0600 @@ -63,13 +63,14 @@
/* Let's rock. */ call start_main
- /* %eax has the return value - pass it on unmolested */
_leave: /* Get old stack pointer. */ popl %ebx
/* Restore old stack. */
- movl %esp, %ebx
- movl %ebx, %esp
Is this related, or was it a bug before?
+#include <libpayload.h>
+#ifdef CONFIG_TARGET_I386 +extern void i386_do_exec(long, int, char **, int *);
Please add the argument names, too, if only for consistency.
+#endif
+/**
- Execute code in memory
- @param ptr The entry point to jump to
- @return Return the return value from the entry point
- */
+int exec(long addr, int argc, char **argv) +{
- int val = -1;
+#ifdef CONFIG_TARGET_I386
- i386_do_exec(addr, argc, argv, &val);
+#endif
- return val;
+} Index: libpayload/include/libpayload.h =================================================================== --- libpayload.orig/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 +++ libpayload/include/libpayload.h 2008-05-13 13:42:59.000000000 -0600 @@ -145,6 +145,9 @@ void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size);
+/* libc/exec.c */ +int exec(long addr, int argc, char **argv);
/* libc/lib.c */ int bcd2dec(int b); int dec2bcd(int d); Index: libpayload/libc/Makefile.inc =================================================================== --- libpayload.orig/libc/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/libc/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,4 +29,4 @@
TARGETS-y += libc/malloc.o libc/printf.o libc/console.o libc/string.o TARGETS-y += libc/memory.o libc/ctype.o libc/ipchecksum.o libc/lib.o -TARGETS-y += libc/rand.o libc/time.o libc/lar.o +TARGETS-y += libc/rand.o libc/time.o libc/lar.o libc/exec.o
Uwe.
On 16/05/08 02:08 +0200, Uwe Hermann wrote:
On Tue, May 13, 2008 at 05:34:09PM -0600, jordan.crouse@amd.com wrote:
Add functions for libpayload to execute other payloads in memory, and have those functions return cleanly.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/i386/Makefile.inc =================================================================== --- libpayload.orig/i386/Makefile.inc 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/Makefile.inc 2008-05-13 13:42:59.000000000 -0600 @@ -29,3 +29,4 @@
TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o +TARGETS-y += i386/exec.o Index: libpayload/i386/exec.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ libpayload/i386/exec.S 2008-05-13 13:42:59.000000000 -0600 @@ -0,0 +1,64 @@ +/* calling syntax: i386_do_exec(long addr, int argc, char **argv, int *ret) */
+.align 4 +.text
+.global i386_do_exec
.type i386_do_exec,@function
+i386_do_exec:
- pushl %ebp
movl %esp, %ebp
- pushl %eax
- # Put the run address in %eax
- movl 8(%ebp), %eax
- # Save off the rest of the registers
- pushl %esi
- pushl %ecx
- pushl %ebp
- # Push the argc and argv pointers on to the stack
- movl 12(%ebp), %esi
- movl 16(%ebp), %ecx
- pushl %esi
- pushl %ecx
- # Move a "magic" number on the stack - the other
- # payload will use this as a clue that the argc
- # and argv are sane
- movl $12345678, %ecx
This should probably be documented somewhere and/or agreed upon on the list, as it introduces sort an "API" of some sort? It'll be only relevant for "our" payloads ("well-behaved" payloads), right?
Yeah - this needs to be documented. Most of it should be similar to how libc behaves, but there will be differences. The magic number was added to avoid the possiblity that the 'argc' we pop off of the stack is a random and very large number. That would suck.
Index: libpayload/i386/head.S
--- libpayload.orig/i386/head.S 2008-05-13 13:40:07.000000000 -0600 +++ libpayload/i386/head.S 2008-05-13 13:42:59.000000000 -0600 @@ -63,13 +63,14 @@
/* Let's rock. */ call start_main
- /* %eax has the return value - pass it on unmolested */
_leave: /* Get old stack pointer. */ popl %ebx
/* Restore old stack. */
- movl %esp, %ebx
- movl %ebx, %esp
Is this related, or was it a bug before?
Existing bug, but clearly relevant now that we have something to return.
Jordan
Implement the wborder function for curses to draw a box around a window.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com Index: libpayload/curses/tinycurses.c =================================================================== --- libpayload.orig/curses/tinycurses.c 2008-05-13 13:51:05.000000000 -0600 +++ libpayload/curses/tinycurses.c 2008-05-13 14:08:27.000000000 -0600 @@ -464,7 +464,39 @@ } // int wbkgd (WINDOW *, chtype) {} void wbkgdset(WINDOW *win, chtype ch) { /* TODO */ } -// int wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype) {} + +int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, + chtype tl, chtype tr, chtype bl, chtype br) +{ + int x, y; + + for(y = 0; y <= win->_maxy; y++) { + + if (y == 0) { + mvwaddch(win, y, 0, tl); + + for(x = 1; x < win->_maxx; x++) + mvwaddch(win, y, x, ts); + + mvwaddch(win, y, win->_maxx, tr); + } + else if (y == win->_maxy) { + mvwaddch(win, y, 0, bl); + + for(x = 1; x < win->_maxx; x++) + mvwaddch(win, y, x, bs); + + mvwaddch(win, y, win->_maxx, br); + } + else { + mvwaddch(win, y, 0, ls); + mvwaddch(win, y, win->_maxx, rs); + } + } + + return OK; +} + // int wchgat (WINDOW *, int, attr_t, short, const void *) {} /* D */ int wclear(WINDOW *win) {
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-bounces@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 5/5] libpayload: implement wborder function
Implement the wborder function for curses to draw a box around a window.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
Thanks, Myles
Index: libpayload/curses/tinycurses.c
--- libpayload.orig/curses/tinycurses.c 2008-05-13
13:51:05.000000000 -
0600 +++ libpayload/curses/tinycurses.c 2008-05-13 14:08:27.000000000 -0600 @@ -464,7 +464,39 @@ } // int wbkgd (WINDOW *, chtype) {} void wbkgdset(WINDOW *win, chtype ch) { /* TODO */ } -// int wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype) {}
+int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs,
chtype tl, chtype tr, chtype bl, chtype br)
+{
- int x, y;
- for(y = 0; y <= win->_maxy; y++) {
if (y == 0) {
mvwaddch(win, y, 0, tl);
for(x = 1; x < win->_maxx; x++)
mvwaddch(win, y, x, ts);
mvwaddch(win, y, win->_maxx, tr);
}
else if (y == win->_maxy) {
mvwaddch(win, y, 0, bl);
for(x = 1; x < win->_maxx; x++)
mvwaddch(win, y, x, bs);
mvwaddch(win, y, win->_maxx, br);
}
else {
mvwaddch(win, y, 0, ls);
mvwaddch(win, y, win->_maxx, rs);
}
- }
- return OK;
+}
// int wchgat (WINDOW *, int, attr_t, short, const void *) {} /* D */ int wclear(WINDOW *win) {
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot
On 14/05/08 10:48 -0600, Myles Watson wrote:
-----Original Message----- From: coreboot-bounces@coreboot.org [mailto:coreboot-bounces@coreboot.org] On Behalf Of jordan.crouse@amd.com Sent: Tuesday, May 13, 2008 5:34 PM To: coreboot@coreboot.org Cc: Jordan Crouse Subject: [coreboot] [patch 5/5] libpayload: implement wborder function
Implement the wborder function for curses to draw a box around a window.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Acked-by: Myles Watson mylesgw@gmail.com
r3317. Thanks.
Thanks, Myles
Index: libpayload/curses/tinycurses.c
--- libpayload.orig/curses/tinycurses.c 2008-05-13
13:51:05.000000000 -
0600 +++ libpayload/curses/tinycurses.c 2008-05-13 14:08:27.000000000 -0600 @@ -464,7 +464,39 @@ } // int wbkgd (WINDOW *, chtype) {} void wbkgdset(WINDOW *win, chtype ch) { /* TODO */ } -// int wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype) {}
+int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs,
chtype tl, chtype tr, chtype bl, chtype br)
+{
- int x, y;
- for(y = 0; y <= win->_maxy; y++) {
if (y == 0) {
mvwaddch(win, y, 0, tl);
for(x = 1; x < win->_maxx; x++)
mvwaddch(win, y, x, ts);
mvwaddch(win, y, win->_maxx, tr);
}
else if (y == win->_maxy) {
mvwaddch(win, y, 0, bl);
for(x = 1; x < win->_maxx; x++)
mvwaddch(win, y, x, bs);
mvwaddch(win, y, win->_maxx, br);
}
else {
mvwaddch(win, y, 0, ls);
mvwaddch(win, y, win->_maxx, rs);
}
- }
- return OK;
+}
// int wchgat (WINDOW *, int, attr_t, short, const void *) {} /* D */ int wclear(WINDOW *win) {
-- Jordan Crouse Systems Software Development Engineer Advanced Micro Devices, Inc.
-- coreboot mailing list coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot