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},