[OpenBIOS] [commit] r809 - in trunk/openbios-devel: config/examples fs/iso9660 packages

repository service svn at openbios.org
Sat Jul 3 16:39:50 CEST 2010


Author: mcayland
Date: Sat Jul  3 16:39:49 2010
New Revision: 809
URL: http://tracker.coreboot.org/trac/openbios/changeset/809

Log:
Move the separate ISO9660 handler into a new /packages/iso9660-files package in preparation for some future work. Based heavily 
on Laurent's original patch posted to the list.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>

Modified:
   trunk/openbios-devel/config/examples/cross-sparc32_config.xml
   trunk/openbios-devel/config/examples/cross-sparc64_config.xml
   trunk/openbios-devel/fs/iso9660/iso9660_fs.c
   trunk/openbios-devel/packages/disk-label.c
   trunk/openbios-devel/packages/init.c
   trunk/openbios-devel/packages/mac-parts.c
   trunk/openbios-devel/packages/misc-files.c
   trunk/openbios-devel/packages/packages.h
   trunk/openbios-devel/packages/pc-parts.c
   trunk/openbios-devel/packages/sun-parts.c

Modified: trunk/openbios-devel/config/examples/cross-sparc32_config.xml
==============================================================================
--- trunk/openbios-devel/config/examples/cross-sparc32_config.xml	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/config/examples/cross-sparc32_config.xml	Sat Jul  3 16:39:49 2010	(r809)
@@ -56,6 +56,7 @@
   <option name="CONFIG_FS" type="boolean" value="true"/>
   <option name="CONFIG_HFS" type="boolean" value="false"/>
   <option name="CONFIG_HFSP" type="boolean" value="false"/>
+  <option name="CONFIG_ISO9660" type="boolean" value="false"/>
   <option name="CONFIG_GRUBFS" type="boolean" value="true"/>
   <option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
   <option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>

Modified: trunk/openbios-devel/config/examples/cross-sparc64_config.xml
==============================================================================
--- trunk/openbios-devel/config/examples/cross-sparc64_config.xml	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/config/examples/cross-sparc64_config.xml	Sat Jul  3 16:39:49 2010	(r809)
@@ -56,6 +56,7 @@
   <option name="CONFIG_FS" type="boolean" value="true"/>
   <option name="CONFIG_HFS" type="boolean" value="false"/>
   <option name="CONFIG_HFSP" type="boolean" value="false"/>
+  <option name="CONFIG_ISO9660" type="boolean" value="false"/>
   <option name="CONFIG_GRUBFS" type="boolean" value="true"/>
   <option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
   <option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>

Modified: trunk/openbios-devel/fs/iso9660/iso9660_fs.c
==============================================================================
--- trunk/openbios-devel/fs/iso9660/iso9660_fs.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/fs/iso9660/iso9660_fs.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -1,12 +1,18 @@
 /*
+ * /packages/iso9660-files filesystem handler
  *
  * (c) 2009 Laurent Vivier <Laurent at vivier.eu>
- *
+ * (c) 2010 Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
  */
 
+#include "config.h"
+#include "libopenbios/bindings.h"
 #include "libiso9660.h"
 #include "fs/fs.h"
 #include "libc/vsprintf.h"
+#include "libc/diskio.h"
+
+extern void     iso9660_init( void );
 
 typedef struct {
 	enum { FILE, DIR } type;
@@ -16,34 +22,159 @@
 	};
 } iso9660_COMMON;
 
+typedef struct {
+	iso9660_VOLUME *volume;
+	iso9660_COMMON *common;
+} iso9660_info_t;
+
+DECLARE_NODE( iso9660, 0, sizeof(iso9660_info_t), "+/packages/iso9660-files" );
+
+/* ( -- success? ) */
+static void
+iso9660_files_open( iso9660_info_t *mi )
+{
+	int fd;
+	char *path = my_args_copy();
+
+	if ( ! path )
+		RET( 0 );
+ 
+	fd = open_ih( my_parent() );
+	if ( fd == -1 ) {
+		free( path );
+		RET( 0 );
+	}
+ 
+	mi->volume = iso9660_mount( fd );
+	if ( mi->volume == NULL ) {
+		free( path );
+		close_io( fd );
+		RET( -1 );
+	}
+
+	mi->common->dir = iso9660_opendir( mi->volume, path );
+	if ( mi->common->dir == NULL ) {
+		mi->common->file = iso9660_open( mi->volume, path );
+		if (mi->common->file == NULL) {
+			iso9660_umount( mi->volume );
+			close_io( fd );
+			free( path );
+			RET( -1 );
+		}
+		mi->common->type = FILE;
+		free( path );
+		RET( 0 );
+ 	}
+	mi->common->type = DIR;
+	free( path );
+
+	RET( -1 );
+}
+
+/* ( -- ) */
+static void
+iso9660_files_close( iso9660_info_t *mi )
+{
+	int fd = mi->volume->fd;
+ 
+	if (mi->common->type == FILE )
+		iso9660_close( mi->common->file );
+	else if ( mi->common->type == DIR )
+		iso9660_closedir( mi->common->dir );
+	iso9660_umount( mi->volume );
+	close_io( fd );
+}
+
+/* ( buf len -- actlen ) */
+static void
+iso9660_files_read( iso9660_info_t *mi )
+{
+	int count = POP();
+	char *buf = (char *)POP();
+	int ret;
+ 
+	if ( mi->common->type != FILE )
+		PUSH( 0 );
+ 
+	ret = iso9660_read( mi->common->file, buf, count );
+ 
+	PUSH( ret );
+}
+
+/* ( pos.d -- status ) */
+static void
+iso9660_files_seek( iso9660_info_t *mi )
+{
+	llong pos = DPOP();
+	cell ret;
+	int offs = (int)pos;
+	int whence = SEEK_SET;
+
+	if (mi->common->type != FILE)
+		PUSH( -1 );
+
+	if( offs == -1 ) {
+		offs = 0;
+		whence = SEEK_END;
+	}
+ 
+	ret = iso9660_lseek(mi->common->file, offs, whence);
+ 
+	PUSH( (ret < 0)? -1 : 0 );
+}
+
+/* ( -- filepos.d ) */
 static void
-umount( fs_ops_t *fs )
+iso9660_files_offset( iso9660_info_t *mi )
 {
-	iso9660_VOLUME *volume = (iso9660_VOLUME *)fs->fs_data;
+	if ( mi->common->type != FILE )
+		DPUSH( -1 );
+ 
+	DPUSH( mi->common->file->offset );
+}
 
-	iso9660_umount( volume );
+/* ( addr -- size ) */
+static void
+iso9660_files_load( iso9660_info_t *mi)
+{
+	char *buf = (char*)POP();
+	int ret, size;
+ 
+	if ( mi->common->type != FILE )
+		PUSH( 0 );
+ 
+	size = 0;
+	while(1) {
+		ret = iso9660_read( mi->common->file, buf, 512 );
+		if (ret <= 0)
+			break;
+		buf += ret;
+		size += ret;
+		if (ret != 512)
+			break;
+	}
+	PUSH( size );
 }
 
 static void
-dir_fs ( file_desc_t *fd )
+iso9660_files_dir( iso9660_info_t *mi )
 {
-	iso9660_COMMON *common = (iso9660_COMMON *)fd;
 	struct iso_directory_record *idr;
 	char name_buf[256];
-
-	if (common->type != DIR)
+ 
+	if (mi->common->type != DIR)
 		return;
 
 	forth_printf("\n");
-	while ( (idr = iso9660_readdir(common->dir)) ) {
-
+	while ( (idr = iso9660_readdir(mi->common->dir)) ) {
+ 
 		forth_printf("% 10d ", isonum_733(idr->size));
 		forth_printf("%d-%02d-%02d %02d:%02d:%02d ",
 			     idr->date[0] + 1900, /* year */
 			     idr->date[1], /* month */
                              idr->date[2], /* day */
 			     idr->date[3], idr->date[4], idr->date[5]);
-		iso9660_name(common->dir->volume, idr, name_buf);
+		iso9660_name(mi->common->dir->volume, idr, name_buf);
 		if (idr->flags[0] & 2)
 			forth_printf("%s\\\n", name_buf);
 		else
@@ -51,126 +182,50 @@
 	}
 }
 
-static file_desc_t *
-open_path( fs_ops_t *fs, const char *path )
-{
-	iso9660_VOLUME *volume = (iso9660_VOLUME *)fs->fs_data;
-	iso9660_COMMON *common;
-
-	common = (iso9660_COMMON *)malloc(sizeof(*common));
-	if (common == NULL)
-		return NULL;
-
-	common->dir = iso9660_opendir(volume, path);
-	if (common->dir == NULL) {
-		common->file = iso9660_open(volume, path);
-		if (common->file == NULL) {
-			free(common);
-			return NULL;
-		}
-		common->type = FILE;
-		return (file_desc_t *)common;
-	}
-	common->type = DIR;
-	return (file_desc_t *)common;
-}
-
-static char *
-get_path( file_desc_t *fd, char *buf, int size )
-{
-	iso9660_COMMON *common = (iso9660_COMMON *)fd;
-
-	if (common->type != FILE)
-		return NULL;
-
-	strncpy(buf, common->file->path, size);
-
-	return buf;
-}
-
-static int
-file_lseek( file_desc_t *fd, off_t offs, int whence )
-{
-	iso9660_COMMON *common = (iso9660_COMMON *)fd;
-
-	if (common->type != FILE)
-		return -1;
-
-	return iso9660_lseek(common->file, offs, whence);
-}
-
+/* static method, ( pos.d ih -- flag? ) */
 static void
-file_close( file_desc_t *fd )
+iso9660_files_probe( iso9660_info_t *dummy )
 {
-	iso9660_COMMON *common = (iso9660_COMMON *)fd;
+	ihandle_t ih = POP_ih();
+	llong offs = DPOP(); 
+	int fd, ret = 0;
 
-	if (common->type == FILE)
-		iso9660_close(common->file);
-	else if (common->type == DIR)
-		iso9660_closedir(common->dir);
-	free(common);
-}
-
-static int
-file_read( file_desc_t *fd, void *buf, size_t count )
-{
-	iso9660_COMMON *common = (iso9660_COMMON *)fd;
+	fd = open_ih(ih);
+	if (iso9660_probe(fd, offs))
+		ret = -1;
 
-	if (common->type != FILE)
-		return -1;
+	close_io(fd);
 
-	return iso9660_read(common->file, buf, count);
+	RET (ret);
 }
 
-static char *
-vol_name( fs_ops_t *fs, char *buf, int size )
+static void
+iso9660_files_block_size( iso9660_info_t *dummy )
 {
-	iso9660_VOLUME *volume = (iso9660_VOLUME *)fs->fs_data;
-
-	strncpy(buf, volume->descriptor->volume_id, size);
-
-	return buf;
+	PUSH(2048);
 }
-
-static const char *
-get_fstype( fs_ops_t *fs )
+ 
+static void
+iso9660_initializer( iso9660_info_t *dummy )
 {
-	return "ISO9660";
+	fword("register-fs-package");
 }
-
-static const fs_ops_t iso9660_ops = {
-	.dir		= dir_fs,
-	.close_fs	= umount,
-
-	.open_path	= open_path,
-	.get_path	= get_path,
-	.close		= file_close,
-	.read		= file_read,
-	.lseek		= file_lseek,
-
-	.vol_name	= vol_name,
-	.get_fstype	= get_fstype,
+ 
+NODE_METHODS( iso9660 ) = {
+	{ "probe",	iso9660_files_probe		},
+	{ "open",	iso9660_files_open		},
+	{ "close",	iso9660_files_close		},
+	{ "read",	iso9660_files_read		},
+	{ "seek",	iso9660_files_seek		},
+	{ "offset",	iso9660_files_offset		},
+	{ "load",	iso9660_files_load		},
+	{ "dir",	iso9660_files_dir		},
+	{ "block-size",	iso9660_files_block_size	},
+	{ NULL,		iso9660_initializer	},
 };
 
-int  
-fs_iso9660_probe( int fd, llong offs ) 
-{ 
-	if (iso9660_probe(fd, offs)) 
-		return 0; 
-
-	return -1; 
-} 
-
-int fs_iso9660_open(int fd, fs_ops_t *fs)
+void
+iso9660_init( void )
 {
-	iso9660_VOLUME *volume;
-
-	volume = iso9660_mount(fd);
-	if (volume == NULL)
-		return -1;
-
-	*fs = iso9660_ops;
-	fs->fs_data = volume;
-
-	return 0;
+	REGISTER_NODE( iso9660 );
 }

Modified: trunk/openbios-devel/packages/disk-label.c
==============================================================================
--- trunk/openbios-devel/packages/disk-label.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/disk-label.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -16,6 +16,7 @@
 
 #include "config.h"
 #include "libopenbios/bindings.h"
+#include "libopenbios/load.h"
 #include "libc/diskio.h"
 #include "libc/vsprintf.h"
 #include "packages.h"
@@ -68,6 +69,8 @@
 
 	DPRINTF("dlabel-open '%s'\n", path );
 
+	di->part_ih = 0;
+
 	/* Find parent methods */
 	di->parent_seek_xt = find_parent_method("seek");
 	di->parent_tell_xt = find_parent_method("tell");
@@ -111,9 +114,16 @@
 		selfword("find-filesystem");
 		ph = POP_ph();
 		if( ph ) {
-			push_str( path );
-			PUSH_ph( ph );
-			fword("interpose");
+			/* If we have been asked to open a particular file, interpose the filesystem package with the passed filename as an argument */
+			DPRINTF("path: %s length: %d\n", path, strlen(path));
+
+			if (strlen(path)) {
+				DPRINTF("INTERPOSE!\n");
+
+				push_str( path );
+				PUSH_ph( ph );
+				fword("interpose");
+			}
 		} else if (*path && strcmp(path, "%BOOT") != 0) {
 			goto out;
 		}
@@ -175,14 +185,24 @@
 
 	DPRINTF("load invoked with address %p\n", buf);
 
-	xt = find_ih_method("load", di->part_ih);
-	if (!xt) {
-		forth_printf("load currently not implemented for ihandle " FMT_ucellx "\n", di->part_ih);
-		PUSH(0);
-		return;
-	}
+	/* If we have a partition handle, invoke the load word on it */
+	if (di->part_ih) {
+		xt = find_ih_method("load", di->part_ih);
+		if (!xt) {
+			forth_printf("load currently not implemented for ihandle " FMT_ucellx "\n", di->part_ih);
+			PUSH(0);
+			return;
+		}
+	
+		DPRINTF("calling load on ihandle " FMT_ucellx "\n", di->part_ih);
+
+		call_package(xt, di->part_ih);
+	} else {
+		/* Otherwise attempt load directly on the raw disk */
+		DPRINTF("calling load on raw disk ihandle " FMT_ucellx "\n", my_self());
 
-	call_package(xt, di->part_ih);
+		load(my_self());
+	}
 }
 
 NODE_METHODS( dlabel ) = {

Modified: trunk/openbios-devel/packages/init.c
==============================================================================
--- trunk/openbios-devel/packages/init.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/init.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -30,6 +30,9 @@
 #ifdef CONFIG_DISK_LABEL
 	disklabel_init();
 #endif
+#ifdef CONFIG_ISO9660
+	iso9660_init();
+#endif
 #ifdef CONFIG_FS
 	files_init();
 #endif

Modified: trunk/openbios-devel/packages/mac-parts.c
==============================================================================
--- trunk/openbios-devel/packages/mac-parts.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/mac-parts.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -36,6 +36,7 @@
 	ucell	        offs_hi, offs_lo;
         ucell	        size_hi, size_lo;
 	uint		blocksize;
+	phandle_t	filesystem_ph;
 } macparts_info_t;
 
 DECLARE_NODE( macparts, INSTALL_OPEN, sizeof(macparts_info_t), "+/packages/mac-parts" );
@@ -111,6 +112,7 @@
 	DPRINTF("want_bootcode %d\n", want_bootcode);
 	DPRINTF("macparts_open %d\n", parnum);
 
+	di->filesystem_ph = 0;
 	di->read_xt = find_parent_method("read");
 	di->seek_xt = find_parent_method("seek");
 
@@ -244,10 +246,16 @@
 
 	ph = POP_ph();
 	if( ph ) {
-		DPRINTF("mac-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, str);
-		push_str( argstr );
-		PUSH_ph( ph );
-		fword("interpose");
+		DPRINTF("mac-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, argstr);
+		di->filesystem_ph = ph;
+
+		/* If we have been asked to open a particular file, interpose the filesystem package with 
+		   the passed filename as an argument */
+		if (strlen(argstr)) {
+			push_str( argstr );
+			PUSH_ph( ph );
+			fword("interpose");
+		}
 	} else {
 		DPRINTF("mac-parts: no filesystem found; bypassing misc-files interpose\n");
 	}

Modified: trunk/openbios-devel/packages/misc-files.c
==============================================================================
--- trunk/openbios-devel/packages/misc-files.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/misc-files.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -66,11 +66,6 @@
 		}
 
 		if( err ) {
-			err = fs_iso9660_open(fd, fs);
-			DPRINTF("--- ISO9660 returned %d\n", err);
-		}
-
-		if( err ) {
 			err = fs_ext2_open(fd, fs);
 			DPRINTF("--- ext2 returned %d\n", err);
 		}
@@ -361,11 +356,6 @@
 		}
 
 		if( err ) {
-			err = fs_iso9660_probe(fd, offs);
-			DPRINTF("--- ISO9660 returned %d\n", err);
-		}
-
-		if( err ) {
 			err = fs_ext2_probe(fd, offs);
 			DPRINTF("--- ext2 returned %d\n", err);
 		}

Modified: trunk/openbios-devel/packages/packages.h
==============================================================================
--- trunk/openbios-devel/packages/packages.h	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/packages.h	Sat Jul  3 16:39:49 2010	(r809)
@@ -20,6 +20,7 @@
 extern void	deblocker_init( void );
 extern void	disklabel_init( void );
 extern void	files_init( void );
+extern void	iso9660_init( void );
 extern void	macparts_init( void );
 extern void	pcparts_init( void );
 extern void	sunparts_init( void );

Modified: trunk/openbios-devel/packages/pc-parts.c
==============================================================================
--- trunk/openbios-devel/packages/pc-parts.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/pc-parts.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -32,6 +32,7 @@
 	xt_t		seek_xt, read_xt;
 	ucell	        offs_hi, offs_lo;
         ucell	        size_hi, size_lo;
+	phandle_t	filesystem_ph;
 } pcparts_info_t;
 
 DECLARE_NODE( pcparts, INSTALL_OPEN, sizeof(pcparts_info_t), "+/packages/pc-parts" );
@@ -134,6 +135,7 @@
 	if( parnum < 0 )
 		parnum = 0;
 
+	di->filesystem_ph = 0;
 	di->read_xt = find_parent_method("read");
 	di->seek_xt = find_parent_method("seek");
 
@@ -264,10 +266,16 @@
 	
 		ph = POP_ph();
 		if( ph ) {
-			DPRINTF("pc-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, str);
-			push_str( argstr );
-			PUSH_ph( ph );
-			fword("interpose");
+			DPRINTF("pc-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, argstr);
+			di->filesystem_ph = ph;
+
+			/* If we have been asked to open a particular file, interpose the filesystem package with 
+			the passed filename as an argument */
+			if (strlen(argstr)) {
+				push_str( argstr );
+				PUSH_ph( ph );
+				fword("interpose");
+			}
 		} else {
 			DPRINTF("pc-parts: no filesystem found; bypassing misc-files interpose\n");
 		}

Modified: trunk/openbios-devel/packages/sun-parts.c
==============================================================================
--- trunk/openbios-devel/packages/sun-parts.c	Sat Jul  3 10:07:59 2010	(r808)
+++ trunk/openbios-devel/packages/sun-parts.c	Sat Jul  3 16:39:49 2010	(r809)
@@ -33,6 +33,7 @@
         ucell	        offs_hi, offs_lo;
         ucell	        size_hi, size_lo;
 	int		type;
+	phandle_t	filesystem_ph;
 } sunparts_info_t;
 
 DECLARE_NODE( sunparts, INSTALL_OPEN, sizeof(sunparts_info_t), "+/packages/sun-parts" );
@@ -152,6 +153,7 @@
 
 	DPRINTF("parstr: %s  argstr: %s  parnum: %d\n", parstr, argstr, parnum);
 
+	di->filesystem_ph = 0;
 	di->read_xt = find_parent_method("read");
 	di->seek_xt = find_parent_method("seek");
 
@@ -205,10 +207,16 @@
 
 	ph = POP_ph();
 	if( ph ) {
-		DPRINTF("sun-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, str);
-		push_str( argstr );
-		PUSH_ph( ph );
-		fword("interpose");
+		DPRINTF("sun-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, argstr);
+		di->filesystem_ph = ph;
+
+		/* If we have been asked to open a particular file, interpose the filesystem package with 
+		   the passed filename as an argument */
+		if (strlen(argstr)) {
+			push_str( argstr );
+			PUSH_ph( ph );
+			fword("interpose");
+		}
 	} else {
 		DPRINTF("sun-parts: no filesystem found; bypassing misc-files interpose\n");
 	}



More information about the OpenBIOS mailing list