[OpenBIOS] [commit] r792 - in trunk/openbios-devel: fs fs/ext2 fs/hfs fs/hfs/include fs/hfsplus fs/hfsplus/include include/fs packages

repository service svn at openbios.org
Thu Jun 10 00:30:33 CEST 2010


Author: mcayland
Date: Thu Jun 10 00:30:32 2010
New Revision: 792
URL: http://tracker.coreboot.org/trac/openbios/changeset/792

Log:
Fix up the majority of the non-grubfs filesystems from my last commit, since they require a "probe with offset" function to 
allow the partition handler to identify a valid FS before interposition to /packages/misc-files.

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

Modified:
   trunk/openbios-devel/fs/ext2/ext2_fs.c
   trunk/openbios-devel/fs/ext2/ext2_utils.c
   trunk/openbios-devel/fs/ext2/ext2_utils.h
   trunk/openbios-devel/fs/hfs/hfs.c
   trunk/openbios-devel/fs/hfs/hfs_fs.c
   trunk/openbios-devel/fs/hfs/include/hfs.h
   trunk/openbios-devel/fs/hfs/include/volume.h
   trunk/openbios-devel/fs/hfs/volume.c
   trunk/openbios-devel/fs/hfsplus/hfsp_fs.c
   trunk/openbios-devel/fs/hfsplus/include/volume.h
   trunk/openbios-devel/fs/hfsplus/volume.c
   trunk/openbios-devel/fs/ioglue.c
   trunk/openbios-devel/fs/os.h
   trunk/openbios-devel/include/fs/fs.h
   trunk/openbios-devel/packages/misc-files.c

Modified: trunk/openbios-devel/fs/ext2/ext2_fs.c
==============================================================================
--- trunk/openbios-devel/fs/ext2/ext2_fs.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/ext2/ext2_fs.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -201,3 +201,11 @@
 
 	return 0;
 }
+
+int fs_ext2_probe(int fd, llong offs)
+{
+	if (ext2_probe(fd, offs))
+		return -1;
+
+	return 0;
+}

Modified: trunk/openbios-devel/fs/ext2/ext2_utils.c
==============================================================================
--- trunk/openbios-devel/fs/ext2/ext2_utils.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/ext2/ext2_utils.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -12,6 +12,23 @@
 #include "libc/diskio.h"
 #include "libc/byteorder.h"
 
+int ext2_probe(int fd, llong offset)
+{
+	struct ext2_super_block *super;
+
+	super = (struct ext2_super_block*)malloc(sizeof(struct ext2_super_block));
+	seek_io(fd, 2 * 512 + offset);
+	read_io(fd, super, sizeof (*super));
+
+	if (__be16_to_cpu(super->s_magic) != EXT2_SUPER_MAGIC) {
+		free(super);
+		return 0;
+	}
+
+	free(super);
+	return -1;
+}
+
 void ext2_get_super(int fd, struct ext2_super_block *super)
 {
 	seek_io(fd, 2 * 512);

Modified: trunk/openbios-devel/fs/ext2/ext2_utils.h
==============================================================================
--- trunk/openbios-devel/fs/ext2/ext2_utils.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/ext2/ext2_utils.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -36,6 +36,7 @@
 
 /* utilities */
 
+extern int ext2_probe(int fd, llong offset);
 extern void ext2_get_super(int fd, struct ext2_super_block *super);
 extern void ext2_read_block(ext2_VOLUME* volume, unsigned int fsblock);
 extern void ext2_get_group_desc(ext2_VOLUME* volume,

Modified: trunk/openbios-devel/fs/hfs/hfs.c
==============================================================================
--- trunk/openbios-devel/fs/hfs/hfs.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfs/hfs.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -736,3 +736,12 @@
 
   return 0;
 }
+
+/*
+ * NAME:	hfs->probe()
+ * DESCRIPTION:	return whether a HFS filesystem is present at the given offset
+ */
+int hfs_probe(int fd, llong offset)
+{
+  return v_probe(fd, offset);
+}

Modified: trunk/openbios-devel/fs/hfs/hfs_fs.c
==============================================================================
--- trunk/openbios-devel/fs/hfs/hfs_fs.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfs/hfs_fs.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -458,3 +458,12 @@
 
 	return 0;
 }
+
+int 
+fs_hfs_probe( int fd, llong offs )
+{
+	if (hfs_probe(fd, offs))
+		return -1;
+
+	return 0;
+}
\ No newline at end of file

Modified: trunk/openbios-devel/fs/hfs/include/hfs.h
==============================================================================
--- trunk/openbios-devel/fs/hfs/include/hfs.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfs/include/hfs.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -177,3 +177,4 @@
 
 int hfs_format(const char *, int, int,
 	       const char *, unsigned int, const unsigned long []);
+int hfs_probe(int fd, llong offset);

Modified: trunk/openbios-devel/fs/hfs/include/volume.h
==============================================================================
--- trunk/openbios-devel/fs/hfs/include/volume.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfs/include/volume.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -66,5 +66,6 @@
 
 int v_scavenge(hfsvol *);
 
+int v_probe(int fd, llong offset);
 
 #endif   /* _H_VOLUME */

Modified: trunk/openbios-devel/fs/hfs/volume.c
==============================================================================
--- trunk/openbios-devel/fs/hfs/volume.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfs/volume.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -32,6 +32,8 @@
 #include "record.h"
 #include "os.h"
 
+#include "libc/byteorder.h"
+
 /*
  * NAME:	vol->init()
  * DESCRIPTION:	initialize volume structure
@@ -589,3 +591,22 @@
 fail:
   return -1;
 }
+
+/* Determine whether the volume is a HFS volume */
+int
+v_probe(int fd, llong offset)
+{
+	MDB *mdb;
+
+	mdb = (MDB*)malloc(2 * 512);
+	os_seek_offset( fd, 2 * 512 + offset );
+	os_read(fd, mdb, 2, 9);
+
+	if (__be16_to_cpu(mdb->drSigWord) != HFS_SIGWORD) {
+		free(mdb);
+		return 0;
+	}
+
+	free(mdb);
+	return -1;
+}
\ No newline at end of file

Modified: trunk/openbios-devel/fs/hfsplus/hfsp_fs.c
==============================================================================
--- trunk/openbios-devel/fs/hfsplus/hfsp_fs.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfsplus/hfsp_fs.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -397,3 +397,12 @@
 
 	return 0;
 }
+
+int 
+fs_hfsp_probe(int fd, llong offs)
+{
+	if (volume_probe(fd, offs))
+		return -1;
+
+	return 0;
+}
\ No newline at end of file

Modified: trunk/openbios-devel/fs/hfsplus/include/volume.h
==============================================================================
--- trunk/openbios-devel/fs/hfsplus/include/volume.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfsplus/include/volume.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -72,6 +72,8 @@
     return vol->extents;
 }
 
+/* Determine whether the volume is a HFS-plus volume */
+int volume_probe(int fd, llong offset);
 
 #ifdef DEBUG
     /* Print raw fork information to stdout */

Modified: trunk/openbios-devel/fs/hfsplus/volume.c
==============================================================================
--- trunk/openbios-devel/fs/hfsplus/volume.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/hfsplus/volume.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -35,6 +35,7 @@
 #include "swab.h"
 #include "hfstime.h"
 
+
 /* Fill a given buffer with the given block in volume.
  */
 int
@@ -288,3 +289,22 @@
   fail:
 	vol->extents = NULL;
 }
+
+/* Determine whether the volume is a HFS-plus volume */
+int
+volume_probe(int fd, llong offset)
+{
+	struct hfsp_vh *vol;
+
+	vol = (struct hfsp_vh*)malloc(2 * 1 << HFSP_BLOCKSZ_BITS);
+	os_seek_offset( fd, 2 * (1 << HFSP_BLOCKSZ_BITS) + offset );
+	os_read(fd, vol, 2, HFSP_BLOCKSZ_BITS);
+
+	if (__be16_to_cpu(vol->signature) != HFSP_VOLHEAD_SIG) {
+		free(vol);
+		return 0;
+	}
+
+	free(vol);
+	return -1;
+}
\ No newline at end of file

Modified: trunk/openbios-devel/fs/ioglue.c
==============================================================================
--- trunk/openbios-devel/fs/ioglue.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/ioglue.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -79,6 +79,12 @@
 	return blknum;
 }
 
+void
+os_seek_offset( int fd, llong offset )
+{
+	seek_io(fd, offset);
+}
+
 int
 os_same( int fd1, int fd2 )
 {

Modified: trunk/openbios-devel/fs/os.h
==============================================================================
--- trunk/openbios-devel/fs/os.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/fs/os.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -47,5 +47,11 @@
  */
 unsigned long os_write( int fd, const void *buf, unsigned long len, int blksize_bits);
 
+/*
+ * NAME:	os->seek_offset()
+ * DESCRIPTION:	set a descriptor's seek pointer (offset in bytes)
+ */
+void os_seek_offset( int fd, llong offset );
+
 
 #endif   /* _H_OS */

Modified: trunk/openbios-devel/include/fs/fs.h
==============================================================================
--- trunk/openbios-devel/include/fs/fs.h	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/include/fs/fs.h	Thu Jun 10 00:30:32 2010	(r792)
@@ -53,14 +53,18 @@
 
 #ifdef CONFIG_HFSP
 extern int		fs_hfsp_open( int fd, fs_ops_t *fs );
+extern int 		fs_hfsp_probe( int fd, llong offs );
 #else
 static inline int	fs_hfsp_open( int fd, fs_ops_t *fs ) { return -1; }
+static inline int	fs_hfsp_probe( int fd, llong offs ) { return -1; }
 #endif
 
 #ifdef CONFIG_HFS
 extern int		fs_hfs_open( int fd, fs_ops_t *fs );
+extern int 		fs_hfs_probe( int fd, llong offs );
 #else
 static inline int	fs_hfs_open( int fd, fs_ops_t *fs ) { return -1; }
+static inline int	fs_hfs_probe( int fd, llong offs ) { return -1; }
 #endif
 
 #ifdef CONFIG_ISO9660
@@ -71,8 +75,10 @@
 
 #ifdef CONFIG_EXT2
 extern int		fs_ext2_open( int fd, fs_ops_t *fs );
+extern int 		fs_ext2_probe( int fd, llong offs );
 #else
 static inline int	fs_ext2_open( int fd, fs_ops_t *fs ) { return -1; }
+static inline int	fs_ext2_probe( int fd, llong offs ) { return -1; }
 #endif
 
 #ifdef CONFIG_GRUBFS
@@ -80,6 +86,7 @@
 extern int 		fs_grubfs_probe( int fd, llong offs );
 #else
 static inline int	fs_grubfs_open( int fd, fs_ops_t *fs ) { return -1; }
+static inline int	fs_grubfs_probe( int fd, llong offs ) { return -1; }
 #endif
 
 

Modified: trunk/openbios-devel/packages/misc-files.c
==============================================================================
--- trunk/openbios-devel/packages/misc-files.c	Tue Jun  8 22:59:08 2010	(r791)
+++ trunk/openbios-devel/packages/misc-files.c	Thu Jun 10 00:30:32 2010	(r792)
@@ -351,25 +351,24 @@
 
 	err = (fd = open_ih(ih)) == -1;
 	if( !err ) {
-		/*
-		err = fs_hfsp_open(fd, fs);
+
+		err = fs_hfsp_probe(fd, offs);
 		DPRINTF("--- HFSP returned %d\n", err);
 
 		if( err ) {
-			err = fs_hfs_open(fd, fs);
+			err = fs_hfs_probe(fd, offs);
 			DPRINTF("--- HFS returned %d\n", err);
 		}
-
+/*
 		if( err ) {
 			err = fs_iso9660_open(fd, fs);
 			DPRINTF("--- ISO9660 returned %d\n", err);
 		}
-
+*/
 		if( err ) {
-			err = fs_ext2_open(fd, fs);
+			err = fs_ext2_probe(fd, offs);
 			DPRINTF("--- ext2 returned %d\n", err);
 		}
-		*/
 
 		if( err ) {
 			err = fs_grubfs_probe(fd, offs);



More information about the OpenBIOS mailing list