Author: stepan
Date: 2006-07-23 16:29:29 +0200 (Sun, 23 Jul 2006)
New Revision: 71
Modified:
openbios-devel/arch/sparc32/aoutload.c
openbios-devel/arch/sparc32/boot.c
openbios-devel/arch/sparc32/boot.h
openbios-devel/arch/sparc32/console.c
openbios-devel/arch/sparc32/elfload.c
openbios-devel/arch/sparc32/linux_load.c
openbios-devel/arch/sparc32/romvec.c
openbios-devel/arch/sparc32/tree.fs
openbios-devel/drivers/obio.c
openbios-devel/modules/video.c
Log:
blueswirl's latest console-nographic.diff.bz2
Modified: openbios-devel/arch/sparc32/aoutload.c
===================================================================
--- openbios-devel/arch/sparc32/aoutload.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/aoutload.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -51,7 +51,8 @@
return 0;
}
-int aout_load(struct sys_info *info, const char *filename, const char *cmdline)
+int aout_load(struct sys_info *info, const char *filename, const char *cmdline,
+ const void *romvec)
{
int retval = -1;
int image_retval;
@@ -126,14 +127,8 @@
#if 1
{
- extern unsigned int qemu_mem_size;
- extern char boot_device;
- void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
-
int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
- const void *romvec;
- romvec = init_openprom(qemu_mem_size, cmdline, boot_device);
entry = (void *) addr_fixup(start);
image_retval = entry(romvec, 0, 0, 0, 0);
}
Modified: openbios-devel/arch/sparc32/boot.c
===================================================================
--- openbios-devel/arch/sparc32/boot.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/boot.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -8,10 +8,11 @@
#include "openbios/nvram.h"
#include "libc/diskio.h"
#include "sys_info.h"
+#include "openprom.h"
-int elf_load(struct sys_info *, const char *filename, const char *cmdline);
-int aout_load(struct sys_info *, const char *filename, const char *cmdline);
-int linux_load(struct sys_info *, const char *filename, const char *cmdline);
+int elf_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
+int aout_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
+int linux_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
void boot(void);
@@ -21,43 +22,54 @@
uint32_t cmdline;
uint32_t cmdline_size;
char boot_device;
+extern unsigned int qemu_mem_size;
+void *init_openprom(unsigned long memsize);
+extern struct linux_arguments_v0 obp_arg;
void boot(void)
{
- char *path=pop_fstr_copy(), *param;
+ char *path = pop_fstr_copy(), *param, *oldpath;
char altpath[256];
-
- if (kernel_size) {
- extern unsigned int qemu_mem_size;
- void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
+ int unit;
+ const void *romvec;
- int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
- const void *romvec;
-
- printk("[sparc] Kernel already loaded\n");
- romvec = init_openprom(qemu_mem_size, (void *)cmdline, boot_device);
- entry = (void *) kernel_image;
- entry(romvec, 0, 0, 0, 0);
- }
-
if(!path) {
switch(boot_device) {
case 'a':
path = "/obio/SUNW,fdtwo";
+ oldpath = "fd()";
+ unit = 0;
break;
case 'c':
path = "disk";
+ oldpath = "sd(0,0,0):d";
+ unit = 0;
break;
default:
case 'd':
path = "cdrom";
+ // FIXME: hardcoding this looks almost definitely wrong.
+ // With sd(0,2,0):b we get to see the solaris kernel though
+ //oldpath = "sd(0,2,0):d";
+ oldpath = "sd(0,2,0):b";
+ unit = 2;
break;
case 'n':
path = "net";
+ oldpath = "le()";
+ unit = 0;
break;
}
}
+ obp_arg.boot_dev_ctrl = 0;
+ obp_arg.boot_dev_unit = unit;
+ obp_arg.dev_partition = 0;
+ obp_arg.boot_dev[0] = oldpath[0];
+ obp_arg.boot_dev[1] = oldpath[1];
+ obp_arg.argv[0] = oldpath;
+ obp_arg.argv[1] = cmdline;
+
param = strchr(path, ' ');
if(param) {
*param = '\0';
@@ -66,22 +78,31 @@
param = (char *)cmdline;
}
+ romvec = init_openprom(qemu_mem_size);
+
+ if (kernel_size) {
+ int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
+
+ printk("[sparc] Kernel already loaded\n");
+ entry = (void *) kernel_image;
+ entry(romvec, 0, 0, 0, 0);
+ }
+
printk("[sparc] Booting file '%s' ", path);
if(param)
printk("with parameters '%s'\n", param);
else
printk("without parameters.\n");
+ if (elf_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT)
+ if (linux_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT)
+ if (aout_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT) {
- if (elf_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
- if (linux_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
- if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT) {
-
sprintf(altpath, "%s:d", path);
- if (elf_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
- if (linux_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
- if (aout_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
+ if (elf_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
+ if (linux_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
+ if (aout_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
printk("Unsupported image format\n");
}
Modified: openbios-devel/arch/sparc32/boot.h
===================================================================
--- openbios-devel/arch/sparc32/boot.h 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/boot.h 2006-07-23 14:29:29 UTC (rev 71)
@@ -7,8 +7,11 @@
*/
int forth_load(struct sys_info *info, const char *filename, const char *cmdline);
-int elf_load(struct sys_info *info, const char *filename, const char *cmdline);
-int linux_load(struct sys_info *info, const char *file, const char *cmdline);
+int elf_load(struct sys_info *, const char *filename, const char *cmdline,
+ const void *romvec);
+int aout_load(struct sys_info *, const char *filename, const char *cmdline,
+ const void *romvec);
+int linux_load(struct sys_info *, const char *filename, const char *cmdline,
+ const void *romvec);
unsigned int start_elf(unsigned long entry_point, unsigned long param);
-
Modified: openbios-devel/arch/sparc32/console.c
===================================================================
--- openbios-devel/arch/sparc32/console.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/console.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -192,13 +192,13 @@
static int shiftstate;
-static int
+int
keyboard_dataready(void)
{
return ((inb(KBD_BASE) & 1) == 1);
}
-static unsigned char
+unsigned char
keyboard_readdata(void)
{
unsigned char ch;
Modified: openbios-devel/arch/sparc32/elfload.c
===================================================================
--- openbios-devel/arch/sparc32/elfload.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/elfload.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -302,7 +302,8 @@
return bhdr;
}
-int elf_load(struct sys_info *info, const char *filename, const char *cmdline)
+int elf_load(struct sys_info *info, const char *filename, const char *cmdline,
+ const void *romvec)
{
Elf_ehdr ehdr;
Elf_phdr *phdr = NULL;
@@ -383,14 +384,8 @@
#if 1
{
- extern unsigned int qemu_mem_size;
- extern char boot_device;
- void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
-
int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
- const void *romvec;
- romvec = init_openprom(qemu_mem_size, cmdline, boot_device);
entry = (void *) addr_fixup(ehdr.e_entry);
image_retval = entry(romvec, 0, 0, 0, 0);
}
Modified: openbios-devel/arch/sparc32/linux_load.c
===================================================================
--- openbios-devel/arch/sparc32/linux_load.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/linux_load.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -578,7 +578,8 @@
return ctx->regs[REG_O0];
}
-int linux_load(struct sys_info *info, const char *file, const char *cmdline)
+int linux_load(struct sys_info *info, const char *file, const char *cmdline,
+ const void *romvec)
{
struct linux_header hdr;
struct linux_params *params;
Modified: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/romvec.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -33,8 +33,9 @@
static struct linux_mlist_v0 *ptphys;
static struct linux_mlist_v0 *ptmap;
static struct linux_mlist_v0 *ptavail;
-static char obp_stdin, obp_stdout;
+char obp_stdin, obp_stdout;
static int obp_fd_stdin, obp_fd_stdout;
+const char *obp_stdin_path, *obp_stdout_path;
static int obp_nextnode(int node);
static int obp_child(int node);
@@ -45,7 +46,7 @@
static int obp_devread(int dev_desc, char *buf, int nbytes);
static int obp_devseek(int dev_desc, int hi, int lo);
-static struct linux_arguments_v0 obp_arg;
+struct linux_arguments_v0 obp_arg;
static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
static void (*sync_hook)(void);
@@ -444,7 +445,7 @@
}
void *
-init_openprom(unsigned long memsize, const char *cmdline, char boot_device)
+init_openprom(unsigned long memsize)
{
free_ram = va2pa((int)&_data) - PAGE_SIZE;
@@ -503,50 +504,17 @@
romvec0.pv_v2devops.v2_dev_read = obp_devread;
romvec0.pv_v2devops.v2_dev_write = obp_devwrite;
romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
- obp_arg.boot_dev_ctrl = 0;
- obp_arg.boot_dev_unit = 0;
- obp_arg.dev_partition = 0;
- obp_arg.argv[0] = "sd(0,0,0):d";
-
- switch(boot_device) {
- default:
- case 'a':
- obp_arg.argv[0] = "fd()";
- obp_arg.boot_dev[0] = 'f';
- obp_arg.boot_dev[1] = 'd';
- break;
- case 'd':
- obp_arg.boot_dev_unit = 2;
- // FIXME: hardcoding this looks almost definitely wrong.
- // With sd(0,2,0):b we get to see the solaris kernel though
- //obp_arg.argv[0] = "sd(0,2,0):d";
- obp_arg.argv[0] = "sd(0,2,0):b";
- // Fall through
- case 'c':
- obp_arg.boot_dev[0] = 's';
- obp_arg.boot_dev[1] = 'd';
- break;
- case 'n':
- obp_arg.argv[0] = "le()";
- obp_arg.boot_dev[0] = 'l';
- obp_arg.boot_dev[1] = 'e';
- break;
- }
- obp_arg.argv[1] = cmdline;
romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0];
romvec0.pv_v2bootargs.bootargs = &obp_arg.argv[1];
romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;
romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
- push_str("/builtin/console");
+ push_str(obp_stdin_path);
fword("open-dev");
obp_fd_stdin = POP();
- push_str("/builtin/console");
+ push_str(obp_stdout_path);
fword("open-dev");
obp_fd_stdout = POP();
-
- obp_stdin = PROMDEV_TTYA;
- obp_stdout = PROMDEV_TTYA;
romvec0.v3_cpustart = obp_cpustart;
romvec0.v3_cpustop = obp_cpustop;
Modified: openbios-devel/arch/sparc32/tree.fs
===================================================================
--- openbios-devel/arch/sparc32/tree.fs 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/tree.fs 2006-07-23 14:29:29 UTC (rev 71)
@@ -9,10 +9,6 @@
" SUNW,501-3059" encode-string " model" property
h# 0a21fe80 encode-int " clock-frequency" property
- " /obio/zs@0,100000:a" encode-string " stdin-path" property
- " /obio/zs@0,100000:a" encode-string " stdout-path" property
-
-
: encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ;
Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/drivers/obio.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -25,7 +25,18 @@
path, name##_m, sizeof(name##_m)/sizeof(method_t)); \
} while(0)
+#define REGISTER_NODE_METHODS( name, path ) do { \
+ const char *paths[1]; \
+ \
+ paths[0] = path; \
+ bind_node( name##_flags_, name##_size_, \
+ paths, 1, name##_m, sizeof(name##_m)/sizeof(method_t)); \
+ } while(0)
+#define PROMDEV_KBD 0 /* input from keyboard */
+#define PROMDEV_SCREEN 0 /* output to screen */
+#define PROMDEV_TTYA 1 /* in/out to ttya */
+
/* DECLARE data structures for the nodes. */
DECLARE_UNNAMED_NODE( ob_obio, INSTALL_OPEN, sizeof(int) );
@@ -88,10 +99,145 @@
fword("property");
}
+// XXX move all arch/sparc32/console.c stuff here
+#define CTRL(addr) (*(char *)(addr))
+#define DATA(addr) (*(char *)(addr + 2))
+/* Read Register 0 */
+#define Rx_CH_AV 0x1 /* Rx Character Available */
+#define Tx_BUF_EMP 0x4 /* Tx Buffer empty */
+
+static int uart_charav(int port)
+{
+ return (CTRL(port) & Rx_CH_AV) != 0;
+}
+
+static char uart_getchar(int port)
+{
+ while (!uart_charav(port));
+
+ return DATA(port) & 0177;
+}
+
+static void uart_putchar(int port, unsigned char c)
+{
+ if (c == '\n')
+ uart_putchar(port, '\r');
+ while (!(CTRL(port) & Tx_BUF_EMP));
+
+ DATA(port) = c;
+}
+
+/* ( addr len -- actual ) */
static void
+zs_read(unsigned long *address)
+{
+ char *addr;
+ int len;
+
+ len = POP();
+ addr = (char *)POP();
+
+ if (len != 1)
+ printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+ if (uart_charav(*address)) {
+ *addr = (char)uart_getchar(*address);
+ PUSH(1);
+ } else {
+ PUSH(0);
+ }
+}
+
+int keyboard_dataready(void);
+unsigned char keyboard_readdata(void);
+
+/* ( addr len -- actual ) */
+static void
+zs_read_keyboard(unsigned long *address)
+{
+ unsigned char *addr;
+ int len;
+
+ len = POP();
+ addr = (unsigned char *)POP();
+
+ if (len != 1)
+ printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+ if (keyboard_dataready()) {
+ *addr = keyboard_readdata();
+ PUSH(1);
+ } else {
+ PUSH(0);
+ }
+}
+
+/* ( addr len -- actual ) */
+static void
+zs_write(unsigned long *address)
+{
+ unsigned char *addr;
+ int i, len;
+
+ len = POP();
+ addr = (unsigned char *)POP();
+
+ for (i = 0; i < len; i++) {
+ uart_putchar(*address, addr[i]);
+ }
+ PUSH(len);
+}
+
+static void
+zs_close(void)
+{
+}
+
+static void
+zs_open(unsigned long *address)
+{
+ int len;
+ phandle_t ph;
+ unsigned long *prop;
+ char *args;
+
+ fword("my-self");
+ fword("ihandle>phandle");
+ ph = (phandle_t)POP();
+ prop = (unsigned long *)get_property(ph, "address", &len);
+ *address = *prop;
+ fword("my-args");
+ args = pop_fstr_copy();
+ if (args && args[0] == 'a')
+ *address += 4;
+
+ //printk("zs_open: address %lx, args %s\n", *address, args);
+ RET ( -1 );
+}
+
+DECLARE_UNNAMED_NODE(zs, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(zs) = {
+ { "open", zs_open },
+ { "close", zs_close },
+ { "read", zs_read },
+ { "write", zs_write },
+};
+
+DECLARE_UNNAMED_NODE(zs_keyboard, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(zs_keyboard) = {
+ { "open", zs_open },
+ { "close", zs_close },
+ { "read", zs_read_keyboard },
+};
+
+static void
ob_zs_init(unsigned long base, unsigned long offset, int intr, int slave, int keyboard)
{
+ char nodebuff[256];
+
ob_new_obio_device("zs", "serial");
ob_reg(base, offset, ZS_REGS, 1);
@@ -116,6 +262,13 @@
ob_intr(intr);
fword("finish-device");
+
+ sprintf(nodebuff, "/obio/zs@0,%x", offset);
+ if (keyboard) {
+ REGISTER_NODE_METHODS(zs_keyboard, nodebuff);
+ } else {
+ REGISTER_NODE_METHODS(zs, nodebuff);
+ }
}
static char *nvram;
@@ -147,8 +300,12 @@
extern uint32_t cmdline;
extern uint32_t cmdline_size;
extern char boot_device;
+ extern char obp_stdin, obp_stdout;
+ extern const char *obp_stdin_path, *obp_stdout_path;
+ const char *stdin, *stdout;
unsigned int i;
+ char nographic;
ob_new_obio_device("eeprom", NULL);
@@ -171,6 +328,7 @@
cmdline = nv_info.cmdline;
cmdline_size = nv_info.cmdline_size;
boot_device = nv_info.boot_device;
+ nographic = nv_info.nographic;
push_str("mk48t08");
fword("model");
@@ -301,6 +459,35 @@
fword("finish-device");
}
+
+ if (nographic) {
+ obp_stdin = PROMDEV_TTYA;
+ obp_stdout = PROMDEV_TTYA;
+ stdin = "/obio/zs@0,100000:a";
+ stdout = "/obio/zs@0,100000:a";
+ } else {
+ obp_stdin = PROMDEV_KBD;
+ obp_stdout = PROMDEV_SCREEN;
+ stdin = "/obio/zs@0,0:a";
+ stdout = "/iommu/sbus/SUNW,tcx";
+ }
+
+ push_str("/");
+ fword("find-device");
+ push_str(stdin);
+ fword("encode-string");
+ push_str("stdin-path");
+ fword("encode-string");
+ fword("property");
+
+ push_str(stdout);
+ fword("encode-string");
+ push_str("stdout-path");
+ fword("encode-string");
+ fword("property");
+
+ obp_stdin_path = stdin;
+ obp_stdout_path = stdout;
}
static void
Modified: openbios-devel/modules/video.c
===================================================================
--- openbios-devel/modules/video.c 2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/modules/video.c 2006-07-23 14:29:29 UTC (rev 71)
@@ -242,11 +242,32 @@
fill_rect( color_ind, x, y, w, h );
}
+/* ( addr len -- actual ) */
+static void
+video_write(void)
+{
+ char *addr;
+ int i, len;
+
+ len = GETTOS();
+ addr = pop_fstr_copy();
+
+ console_draw_str(addr);
+ PUSH(len);
+}
+
+static void
+video_open(void)
+{
+}
+
NODE_METHODS( video ) = {
+ {"open", video_open },
{"dimensions", video_dimensions },
{"set-colors", video_set_colors },
{"fill-rectangle", video_fill_rect },
{"color!", video_color_bang },
+ {"write", video_write },
};