Mercurial > hvf > hvf-old
changeset 543:37c1f0f94441
cp/nucleus: move the splash onto the ipl volume
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Tue, 26 Apr 2011 21:37:55 -0400 |
parents | dc23b6cfbda3 |
children | 8913c07b293c |
files | Makefile cp/config/local-3215.txt cp/drivers/console.c cp/include/config.h cp/include/splash.h cp/nucleus/config.c cp/shell/Makefile cp/shell/splash.c installer/cpio.c |
diffstat | 9 files changed, 135 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Tue Apr 26 20:01:16 2011 -0400 +++ b/Makefile Tue Apr 26 21:37:55 2011 -0400 @@ -16,6 +16,7 @@ ./build/mkarchive \ cp/config/hvf.directory text 80 \ cp/config/system.config text 80 \ + cp/config/local-3215.txt text 80 \ cp/hvf bin \ loader/eckd.rto bin \ loader/loader.rto bin \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cp/config/local-3215.txt Tue Apr 26 21:37:55 2011 -0400 @@ -0,0 +1,12 @@ + HH HH VV VV FFFFFFFFFFFF + HH HH VV VV FFFFFFFFFFFF + HH HH VV VV FF + HH HH VV VV FF + HH HH VV VV FF + HHHHHHHHHHHH VV VV FFFFFFF + HHHHHHHHHHHH VV VV FFFFFFF + HH HH VV VV FF + HH HH VV VV FF + HH HH VV VV FF + HH HH VVVV FF + HH HH VV FF
--- a/cp/drivers/console.c Tue Apr 26 20:01:16 2011 -0400 +++ b/cp/drivers/console.c Tue Apr 26 21:37:55 2011 -0400 @@ -9,7 +9,6 @@ #include <slab.h> #include <sched.h> #include <directory.h> -#include <splash.h> #include <vsprintf.h> /* @@ -228,10 +227,20 @@ static void print_splash(struct console *con) { - int i; + struct logo_rec *rec; + struct logo *logo; + + list_for_each_entry(logo, &sysconf.logos, list) { + if (con->dev->type != logo->devtype) + continue; - for(i = 0; splash[i]; i++) - con_printf(con, splash[i]); + /* FIXME: check the connection type */ + + list_for_each_entry(rec, &logo->lines, list) + con_printf(con, "%*.*s\n", CONFIG_LRECL, + CONFIG_LRECL, (char*) rec->data); + break; + } con_printf(con, "HVF VERSION " VERSION "\n\n"); }
--- a/cp/include/config.h Tue Apr 26 20:01:16 2011 -0400 +++ b/cp/include/config.h Tue Apr 26 21:37:55 2011 -0400 @@ -32,6 +32,25 @@ struct list_head logos; }; +enum { + LOGO_CONN_LOCAL = 1, +}; + +struct logo_rec { + struct list_head list; + u8 data[0]; +}; + +struct logo { + struct list_head list; + int conn; + u16 devtype; + char fn[8]; + char ft[8]; + + struct list_head lines; +}; + extern struct fs *sysfs; /* the actual config */
--- a/cp/include/splash.h Tue Apr 26 20:01:16 2011 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -/* - * (C) Copyright 2007-2010 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> - * - * This file is released under the GPLv2. See the COPYING file for more - * details. - */ - -#ifndef __SPLASH_H -#define __SPLASH_H - -extern char *splash[]; - -#endif
--- a/cp/nucleus/config.c Tue Apr 26 20:01:16 2011 -0400 +++ b/cp/nucleus/config.c Tue Apr 26 21:37:55 2011 -0400 @@ -8,6 +8,7 @@ #include <device.h> #include <bdev.h> #include <edf.h> +#include <slab.h> #include <ebcdic.h> struct sysconf sysconf; @@ -82,13 +83,24 @@ return 0; } +static void copy_fn(char *dst, char *src) +{ + int len; + + len = strnlen(src, 8); + + memcpy(dst, src, 8); + if (len < 8) + memset(dst + len, ' ', 8 - len); +} + static int __parse_logo(char *s) { + char *conn, *_devtype, *fn, *ft; + struct logo *logo; + u16 devtype; int ret; - char *conn, *_devtype, *fn, *ft; - u16 devtype; - if ((conn = strsep(&s, " ")) == NULL) return -EINVAL; @@ -105,9 +117,32 @@ if ((ft = strsep(&s, " ")) == NULL) return -EINVAL; - /* FIXME: save the <conn, devtype, fn, ft> pair */ + logo = malloc(sizeof(struct logo), ZONE_NORMAL); + if (!logo) + return -ENOMEM; + + INIT_LIST_HEAD(&logo->list); + INIT_LIST_HEAD(&logo->lines); + + /* save the <conn, devtype, fn, ft> pair */ + + if (!strcmp(conn, "LOCAL")) + logo->conn = LOGO_CONN_LOCAL; + else + goto out_free; + + logo->devtype = devtype; + + copy_fn(logo->fn, fn); + copy_fn(logo->ft, ft); + + list_add_tail(&logo->list, &sysconf.logos); return 0; + +out_free: + free(logo); + return -ECORRUPT; } int parse_config_stmnt(char *stmnt) @@ -147,12 +182,55 @@ s[i+1] = '\0'; } +static void __load_logos(struct fs *fs) +{ + struct logo *logo, *tmp; + struct logo_rec *rec; + struct file *file; + int ret; + int i; + + list_for_each_entry_safe(logo, tmp, &sysconf.logos, list) { + + /* look up the config file */ + file = edf_lookup(fs, logo->fn, logo->ft); + if (IS_ERR(file)) + goto remove; + + if ((file->FST.LRECL != CONFIG_LRECL) || + (file->FST.RECFM != FSTDFIX)) + goto remove; + + /* parse each record in the config file */ + for(i=0; i<file->FST.AIC; i++) { + rec = malloc(sizeof(struct logo_rec) + CONFIG_LRECL, + ZONE_NORMAL); + if (!rec) + goto remove; + + ret = edf_read_rec(file, (char*) rec->data, i); + if (ret) + goto remove; + + ebcdic2ascii(rec->data, CONFIG_LRECL); + + list_add_tail(&rec->list, &logo->lines); + } + + continue; + +remove: + list_del(&logo->list); + free(logo); + } +} + struct fs *load_config(u32 iplsch) { + char buf[CONFIG_LRECL+1]; struct device *dev; struct fs *fs; struct file *file; - char buf[CONFIG_LRECL+1]; int ret; int i; @@ -175,6 +253,9 @@ if (IS_ERR(file)) return ERR_CAST(file); + if (file->FST.LRECL != CONFIG_LRECL) + return ERR_PTR(-EINVAL); + /* parse each record in the config file */ for(i=0; i<file->FST.AIC; i++) { ret = edf_read_rec(file, buf, i); @@ -183,7 +264,7 @@ ebcdic2ascii((u8 *) buf, CONFIG_LRECL); - /* FIXME: uppercase everything */ + ascii2upper((u8 *) buf, CONFIG_LRECL); null_terminate(buf, CONFIG_LRECL); @@ -192,7 +273,7 @@ return ERR_PTR(ret); } - /* FIXME: load all the logo files */ + __load_logos(fs); return fs; }
--- a/cp/shell/Makefile Tue Apr 26 20:01:16 2011 -0400 +++ b/cp/shell/Makefile Tue Apr 26 21:37:55 2011 -0400 @@ -1,2 +1,2 @@ objs-shell := init.o directory.o cmds.o disassm.o guest.o reset.o intercept.o \ - guest_ipl.o exception.o instruction.o instruction_priv.o splash.o + guest_ipl.o exception.o instruction.o instruction_priv.o
--- a/cp/shell/splash.c Tue Apr 26 20:01:16 2011 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* - * (C) Copyright 2007-2010 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> - * - * This file is released under the GPLv2. See the COPYING file for more - * details. - */ - -#include <splash.h> - -char *splash[] = { - " HH HH VV VV FFFFFFFFFFFF\n", - " HH HH VV VV FFFFFFFFFFFF\n", - " HH HH VV VV FF\n", - " HH HH VV VV FF\n", - " HH HH VV VV FF\n", - " HHHHHHHHHHHH VV VV FFFFFFF\n", - " HHHHHHHHHHHH VV VV FFFFFFF\n", - " HH HH VV VV FF\n", - " HH HH VV VV FF\n", - " HH HH VV VV FF\n", - " HH HH VVVV FF\n", - " HH HH VV FF\n", - "\n", - NULL, -};
--- a/installer/cpio.c Tue Apr 26 20:01:16 2011 -0400 +++ b/installer/cpio.c Tue Apr 26 21:37:55 2011 -0400 @@ -32,6 +32,7 @@ static struct table table[] = { {"hvf.directory", "HVF ", "DIRECT ", 80, 1, 0}, {"system.config", "SYSTEM ", "CONFIG ", 80, 1, 0}, + {"local-3215.txt", "HVF ", "LOGO ", 80, 1, 0}, {"hvf", "HVF ", "ELF ", 4096, 0, 0}, {"eckd.rto", "ECKDLOAD", "BIN ", 4096, 0, 1}, {"loader.rto", "DASDLOAD", "BIN ", 4096, 0, 2},