PERFORCE change 153385 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Nov 23 03:07:35 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=153385
Change 153385 by hselasky at hselasky_laptop001 on 2008/11/23 11:07:16
IFC @ 1553381
Affected files ...
.. //depot/projects/usb/src/sys/amd64/amd64/elf_machdep.c#4 integrate
.. //depot/projects/usb/src/sys/amd64/include/atomic.h#4 integrate
.. //depot/projects/usb/src/sys/amd64/linux32/linux32_sysvec.c#11 integrate
.. //depot/projects/usb/src/sys/arm/arm/elf_machdep.c#5 integrate
.. //depot/projects/usb/src/sys/arm/include/atomic.h#5 integrate
.. //depot/projects/usb/src/sys/arm/mv/mv_pci.c#2 integrate
.. //depot/projects/usb/src/sys/boot/arm/uboot/Makefile#2 integrate
.. //depot/projects/usb/src/sys/boot/arm/uboot/conf.c#2 integrate
.. //depot/projects/usb/src/sys/boot/arm/uboot/version#2 integrate
.. //depot/projects/usb/src/sys/boot/common/interp.c#2 integrate
.. //depot/projects/usb/src/sys/boot/i386/Makefile#5 integrate
.. //depot/projects/usb/src/sys/boot/i386/gptzfsboot/Makefile#1 branch
.. //depot/projects/usb/src/sys/boot/i386/libi386/biosdisk.c#6 integrate
.. //depot/projects/usb/src/sys/boot/i386/zfsboot/zfsboot.c#2 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/devicename.c#2 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/disk.c#2 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/glue.c#4 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/glue.h#4 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/libuboot.h#2 integrate
.. //depot/projects/usb/src/sys/boot/uboot/lib/net.c#4 integrate
.. //depot/projects/usb/src/sys/boot/zfs/Makefile#2 integrate
.. //depot/projects/usb/src/sys/boot/zfs/zfs.c#2 integrate
.. //depot/projects/usb/src/sys/boot/zfs/zfsimpl.c#2 integrate
.. //depot/projects/usb/src/sys/cddl/boot/zfs/zfsimpl.h#2 integrate
.. //depot/projects/usb/src/sys/cddl/boot/zfs/zfssubr.c#2 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_config.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c#3 integrate
.. //depot/projects/usb/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#5 integrate
.. //depot/projects/usb/src/sys/compat/ia32/ia32_sysvec.c#8 integrate
.. //depot/projects/usb/src/sys/compat/svr4/svr4_sysvec.c#5 integrate
.. //depot/projects/usb/src/sys/conf/files#42 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi_hpet.c#8 integrate
.. //depot/projects/usb/src/sys/dev/bce/if_bcereg.h#9 integrate
.. //depot/projects/usb/src/sys/dev/cardbus/cardbus_device.c#4 integrate
.. //depot/projects/usb/src/sys/dev/cardbus/cardbusvar.h#3 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/common/cxgb_ael1002.c#7 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/common/cxgb_common.h#8 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/common/cxgb_t3_hw.c#9 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_adapter.h#8 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_config.h#6 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_main.c#11 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_multiq.c#3 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_osdep.h#9 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/cxgb_sge.c#9 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/sys/cxgb_support.c#3 integrate
.. //depot/projects/usb/src/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c#3 integrate
.. //depot/projects/usb/src/sys/dev/dcons/dcons_crom.c#3 integrate
.. //depot/projects/usb/src/sys/dev/dcons/dcons_os.c#8 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_arm.c#3 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_ia64.c#3 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_powerpc.c#3 integrate
.. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_sparc64.c#3 integrate
.. //depot/projects/usb/src/sys/dev/mxge/if_mxge_var.h#8 integrate
.. //depot/projects/usb/src/sys/dev/nmdm/nmdm.c#6 integrate
.. //depot/projects/usb/src/sys/dev/nxge/xge-osdep.h#3 integrate
.. //depot/projects/usb/src/sys/dev/sound/pci/hda/hdac.c#13 integrate
.. //depot/projects/usb/src/sys/dev/uart/uart_dev_quicc.c#2 integrate
.. //depot/projects/usb/src/sys/i386/i386/elf_machdep.c#4 integrate
.. //depot/projects/usb/src/sys/i386/ibcs2/ibcs2_sysvec.c#4 integrate
.. //depot/projects/usb/src/sys/i386/include/atomic.h#4 integrate
.. //depot/projects/usb/src/sys/i386/include/xen/xen-os.h#3 integrate
.. //depot/projects/usb/src/sys/i386/linux/linux_sysvec.c#8 integrate
.. //depot/projects/usb/src/sys/ia64/ia64/elf_machdep.c#5 integrate
.. //depot/projects/usb/src/sys/ia64/include/atomic.h#5 integrate
.. //depot/projects/usb/src/sys/kern/imgact_aout.c#5 integrate
.. //depot/projects/usb/src/sys/kern/kern_thr.c#10 integrate
.. //depot/projects/usb/src/sys/kern/subr_bufring.c#1 branch
.. //depot/projects/usb/src/sys/kern/uipc_socket.c#14 integrate
.. //depot/projects/usb/src/sys/mips/mips/elf_machdep.c#3 integrate
.. //depot/projects/usb/src/sys/modules/uart/Makefile#3 integrate
.. //depot/projects/usb/src/sys/net/if.c#14 integrate
.. //depot/projects/usb/src/sys/net/if_ethersubr.c#12 integrate
.. //depot/projects/usb/src/sys/net/if_fddisubr.c#7 integrate
.. //depot/projects/usb/src/sys/net/if_fwsubr.c#10 integrate
.. //depot/projects/usb/src/sys/net/if_lagg.c#10 integrate
.. //depot/projects/usb/src/sys/net/if_tun.c#9 integrate
.. //depot/projects/usb/src/sys/net/if_var.h#10 integrate
.. //depot/projects/usb/src/sys/net/if_vlan.c#9 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_hostap.c#5 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_output.c#12 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_var.h#11 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_wds.c#4 integrate
.. //depot/projects/usb/src/sys/netgraph/ng_base.c#13 integrate
.. //depot/projects/usb/src/sys/netgraph/ng_iface.c#7 integrate
.. //depot/projects/usb/src/sys/netgraph/ng_l2tp.c#7 integrate
.. //depot/projects/usb/src/sys/netgraph/ng_socket.c#7 integrate
.. //depot/projects/usb/src/sys/netinet/ip_divert.c#11 integrate
.. //depot/projects/usb/src/sys/netinet/raw_ip.c#14 integrate
.. //depot/projects/usb/src/sys/powerpc/include/atomic.h#5 integrate
.. //depot/projects/usb/src/sys/powerpc/powerpc/elf_machdep.c#4 integrate
.. //depot/projects/usb/src/sys/sparc64/include/atomic.h#3 integrate
.. //depot/projects/usb/src/sys/sparc64/include/intr_machdep.h#7 integrate
.. //depot/projects/usb/src/sys/sparc64/pci/schizo.c#2 integrate
.. //depot/projects/usb/src/sys/sparc64/pci/schizoreg.h#2 integrate
.. //depot/projects/usb/src/sys/sparc64/pci/schizovar.h#2 integrate
.. //depot/projects/usb/src/sys/sparc64/sparc64/elf_machdep.c#6 integrate
.. //depot/projects/usb/src/sys/sparc64/sparc64/intr_machdep.c#8 integrate
.. //depot/projects/usb/src/sys/sparc64/sparc64/nexus.c#4 integrate
.. //depot/projects/usb/src/sys/sun4v/include/atomic.h#3 integrate
.. //depot/projects/usb/src/sys/sys/buf_ring.h#1 branch
.. //depot/projects/usb/src/sys/sys/bus_dma.h#4 edit
.. //depot/projects/usb/src/sys/sys/disklabel.h#3 integrate
.. //depot/projects/usb/src/sys/sys/mbuf.h#9 integrate
.. //depot/projects/usb/src/sys/sys/param.h#16 integrate
.. //depot/projects/usb/src/sys/sys/sysent.h#10 integrate
.. //depot/projects/usb/src/sys/ufs/ufs/ufs_dirhash.c#6 integrate
.. //depot/projects/usb/src/sys/ufs/ufs/ufs_lookup.c#9 integrate
Differences ...
==== //depot/projects/usb/src/sys/amd64/amd64/elf_machdep.c#4 (text+ko) ====
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/elf_machdep.c,v 1.27 2008/09/24 10:14:37 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/elf_machdep.c,v 1.28 2008/11/22 12:36:15 kib Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -72,7 +72,8 @@
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
- .sv_maxssiz = NULL
+ .sv_maxssiz = NULL,
+ .sv_flags = SV_ABI_FREEBSD | SV_LP64
};
static Elf64_Brandinfo freebsd_brand_info = {
==== //depot/projects/usb/src/sys/amd64/include/atomic.h#4 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/amd64/include/atomic.h,v 1.45 2008/03/16 21:20:48 pjd Exp $
+ * $FreeBSD: src/sys/amd64/include/atomic.h,v 1.46 2008/11/22 05:55:56 kmacy Exp $
*/
#ifndef _MACHINE_ATOMIC_H_
#define _MACHINE_ATOMIC_H_
@@ -32,6 +32,10 @@
#error this file needs sys/cdefs.h as a prerequisite
#endif
+#define mb() __asm__ __volatile__ ("mfence;": : :"memory")
+#define wmb() __asm__ __volatile__ ("sfence;": : :"memory")
+#define rmb() __asm__ __volatile__ ("lfence;": : :"memory")
+
/*
* Various simple operations on memory, each of which is atomic in the
* presence of interrupts and multiple processors.
==== //depot/projects/usb/src/sys/amd64/linux32/linux32_sysvec.c#11 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.37 2008/10/19 10:02:26 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.38 2008/11/22 12:36:15 kib Exp $");
#include "opt_compat.h"
#ifndef COMPAT_IA32
@@ -1026,6 +1026,7 @@
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = linux32_fixlimit,
.sv_maxssiz = &linux32_maxssiz,
+ .sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_IA32
};
static Elf32_Brandinfo linux_brand = {
==== //depot/projects/usb/src/sys/arm/arm/elf_machdep.c#5 (text+ko) ====
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/elf_machdep.c,v 1.9 2008/10/13 18:59:59 raj Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/elf_machdep.c,v 1.10 2008/11/22 12:36:15 kib Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -72,7 +72,8 @@
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
- .sv_maxssiz = NULL
+ .sv_maxssiz = NULL,
+ .sv_flags = SV_ABI_FREEBSD | SV_ILP32
};
static Elf32_Brandinfo freebsd_brand_info = {
==== //depot/projects/usb/src/sys/arm/include/atomic.h#5 (text+ko) ====
@@ -33,7 +33,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/arm/include/atomic.h,v 1.24 2008/02/05 10:22:33 raj Exp $
+ * $FreeBSD: src/sys/arm/include/atomic.h,v 1.25 2008/11/22 05:55:56 kmacy Exp $
*/
#ifndef _MACHINE_ATOMIC_H_
@@ -47,6 +47,10 @@
#include <machine/sysarch.h>
#endif
+#define mb()
+#define wmb()
+#define rmb()
+
#ifndef I32_bit
#define I32_bit (1 << 7) /* IRQ disable */
#endif
==== //depot/projects/usb/src/sys/arm/mv/mv_pci.c#2 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/mv/mv_pci.c,v 1.1 2008/11/19 11:30:44 raj Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/mv/mv_pci.c,v 1.2 2008/11/19 17:07:01 raj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -369,8 +369,10 @@
&sc->sc_rid, sc->sc_info->op_base, sc->sc_info->op_base +
sc->sc_info->op_size - 1, sc->sc_info->op_size,
RF_ACTIVE);
- if (sc->sc_res == NULL)
+ if (sc->sc_res == NULL) {
device_printf(parent, "Could not map pcib memory\n");
+ break;
+ }
sc->sc_bst = rman_get_bustag(sc->sc_res);
sc->sc_bsh = rman_get_bushandle(sc->sc_res);
==== //depot/projects/usb/src/sys/boot/arm/uboot/Makefile#2 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/boot/arm/uboot/Makefile,v 1.1 2008/10/14 10:11:14 raj Exp $
+# $FreeBSD: src/sys/boot/arm/uboot/Makefile,v 1.2 2008/11/19 17:34:28 raj Exp $
PROG= ubldr
NEWVERSWHAT= "U-Boot loader" ${MACHINE_ARCH}
@@ -10,8 +10,8 @@
# Architecture-specific loader code
SRCS= start.S conf.c vers.c
-LOADER_DISK_SUPPORT?= no
-LOADER_UFS_SUPPORT?= no
+LOADER_DISK_SUPPORT?= yes
+LOADER_UFS_SUPPORT?= yes
LOADER_CD9660_SUPPORT?= no
LOADER_EXT2FS_SUPPORT?= no
LOADER_NET_SUPPORT?= yes
==== //depot/projects/usb/src/sys/boot/arm/uboot/conf.c#2 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/arm/uboot/conf.c,v 1.1 2008/10/14 10:11:14 raj Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/arm/uboot/conf.c,v 1.2 2008/11/19 17:34:28 raj Exp $");
#include <stand.h>
#include "bootstrap.h"
@@ -38,7 +38,7 @@
struct devsw *devsw[] = {
#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT)
- &uboot_disk,
+ &uboot_storage,
#endif
#if defined(LOADER_NET_SUPPORT)
&netdev,
==== //depot/projects/usb/src/sys/boot/arm/uboot/version#2 (text+ko) ====
@@ -1,6 +1,7 @@
-$FreeBSD: src/sys/boot/arm/uboot/version,v 1.1 2008/10/14 10:11:14 raj Exp $
+$FreeBSD: src/sys/boot/arm/uboot/version,v 1.2 2008/11/19 17:34:28 raj Exp $
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important. Make sure the current version number is on line 6.
+1.0: Added storage support. Booting from HDD, USB, etc. is now possible.
0.5: Initial U-Boot/arm version (netbooting only).
==== //depot/projects/usb/src/sys/boot/common/interp.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/common/interp.c,v 1.29 2003/08/25 23:30:41 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/common/interp.c,v 1.30 2008/11/20 14:57:09 luigi Exp $");
/*
* Simple commandline interpreter, toplevel and misc.
@@ -92,7 +92,7 @@
void
interact(void)
{
- char input[256]; /* big enough? */
+ static char input[256]; /* big enough? */
#ifndef BOOT_FORTH
int argc;
char **argv;
@@ -178,14 +178,21 @@
return(res);
}
+/*
+ * Header prepended to each line. The text immediately follows the header.
+ * We try to make this short in order to save memory -- the loader has
+ * limited memory available, and some of the forth files are very long.
+ */
struct includeline
{
- char *text;
+ struct includeline *next;
+#ifndef BOOT_FORTH
int flags;
int line;
#define SL_QUIET (1<<0)
#define SL_IGNOREERR (1<<1)
- struct includeline *next;
+#endif
+ char text[0];
};
int
@@ -236,13 +243,14 @@
}
#endif
/* Allocate script line structure and copy line, flags */
+ if (*cp == '\0')
+ continue; /* ignore empty line, save memory */
sp = malloc(sizeof(struct includeline) + strlen(cp) + 1);
- sp->text = (char *)sp + sizeof(struct includeline);
strcpy(sp->text, cp);
#ifndef BOOT_FORTH
sp->flags = flags;
+ sp->line = line;
#endif
- sp->line = line;
sp->next = NULL;
if (script == NULL) {
==== //depot/projects/usb/src/sys/boot/i386/Makefile#5 (text+ko) ====
@@ -1,7 +1,7 @@
-# $FreeBSD: src/sys/boot/i386/Makefile,v 1.23 2008/11/17 20:49:29 pjd Exp $
+# $FreeBSD: src/sys/boot/i386/Makefile,v 1.26 2008/11/22 14:24:55 dfr Exp $
SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot zfsboot \
- kgzldr libi386 libfirewire loader
+ gptzfsboot kgzldr libi386 libfirewire loader
# special boot programs, 'self-extracting boot2+loader'
SUBDIR+= pxeldr
==== //depot/projects/usb/src/sys/boot/i386/libi386/biosdisk.c#6 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/biosdisk.c,v 1.55 2008/02/28 17:49:23 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/biosdisk.c,v 1.56 2008/11/19 16:04:07 dfr Exp $");
/*
* BIOS disk device handling.
@@ -969,8 +969,10 @@
od->od_boff = gp->gp_start;
out:
- if (error)
+ if (error) {
free(od->od_partitions);
+ od->od_flags &= ~BD_GPTOK;
+ }
return (error);
}
@@ -1058,7 +1060,7 @@
switch(rw){
case F_READ:
- DEBUG("read %d from %d to %p", blks, dblk, buf);
+ DEBUG("read %d from %lld to %p", blks, dblk, buf);
if (blks && bd_read(od, dblk, blks, buf)) {
DEBUG("read error");
==== //depot/projects/usb/src/sys/boot/i386/zfsboot/zfsboot.c#2 (text+ko) ====
@@ -14,11 +14,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/zfsboot/zfsboot.c,v 1.1 2008/11/17 20:49:29 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/zfsboot/zfsboot.c,v 1.2 2008/11/19 16:39:01 dfr Exp $");
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/diskmbr.h>
+#ifdef GPT
+#include <sys/gpt.h>
+#endif
#include <sys/reboot.h>
#include <sys/queue.h>
@@ -32,7 +35,9 @@
#include <btxv86.h>
+#ifndef GPT
#include "zfsboot.h"
+#endif
#include "lib.h"
#define IO_KEYBOARD 1
@@ -103,6 +108,9 @@
extern uint32_t _end;
+#ifdef GPT
+static const uuid_t freebsd_zfs_uuid = GPT_ENT_TYPE_FREEBSD_ZFS;
+#endif
static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */
static const unsigned char flags[NOPT] = {
RBX_DUAL,
@@ -408,6 +416,12 @@
static void
probe_drive(struct dsk *dsk, spa_t **spap)
{
+#ifdef GPT
+ struct gpt_hdr hdr;
+ struct gpt_ent *ent;
+ daddr_t slba, elba;
+ unsigned part, entries_per_sec;
+#endif
struct dos_partition *dp;
char *sec;
unsigned i;
@@ -424,6 +438,63 @@
sec = dmadat->secbuf;
dsk->start = 0;
+
+#ifdef GPT
+ /*
+ * First check for GPT.
+ */
+ if (drvread(dsk, sec, 1, 1)) {
+ return;
+ }
+ memcpy(&hdr, sec, sizeof(hdr));
+ if (memcmp(hdr.hdr_sig, GPT_HDR_SIG, sizeof(hdr.hdr_sig)) != 0 ||
+ hdr.hdr_lba_self != 1 || hdr.hdr_revision < 0x00010000 ||
+ hdr.hdr_entsz < sizeof(*ent) || DEV_BSIZE % hdr.hdr_entsz != 0) {
+ goto trymbr;
+ }
+
+ /*
+ * Probe all GPT partitions for the presense of ZFS pools. We
+ * return the spa_t for the first we find (if requested). This
+ * will have the effect of booting from the first pool on the
+ * disk.
+ */
+ entries_per_sec = DEV_BSIZE / hdr.hdr_entsz;
+ slba = hdr.hdr_lba_table;
+ elba = slba + hdr.hdr_entries / entries_per_sec;
+ while (slba < elba) {
+ if (drvread(dsk, sec, slba, 1))
+ return;
+ for (part = 0; part < entries_per_sec; part++) {
+ ent = (struct gpt_ent *)(sec + part * hdr.hdr_entsz);
+ if (memcmp(&ent->ent_type, &freebsd_zfs_uuid,
+ sizeof(uuid_t)) == 0) {
+ dsk->start = ent->ent_lba_start;
+ if (vdev_probe(vdev_read, dsk, spap) == 0) {
+ /*
+ * We record the first pool we find (we will try
+ * to boot from that one.
+ */
+ spap = 0;
+
+ /*
+ * This slice had a vdev. We need a new dsk
+ * structure now since the vdev now owns this one.
+ */
+ struct dsk *newdsk;
+ newdsk = malloc(sizeof(struct dsk));
+ *newdsk = *dsk;
+ dsk = newdsk;
+ }
+ break;
+ }
+ }
+ slba++;
+ }
+ return;
+trymbr:
+#endif
+
if (drvread(dsk, sec, DOSBBSECTOR, 1))
return;
dp = (void *)(sec + DOSPARTOFF);
@@ -441,7 +512,7 @@
/*
* This slice had a vdev. We need a new dsk structure now
- * sice the vdev now owns this one.
+ * since the vdev now owns this one.
*/
struct dsk *newdsk;
newdsk = malloc(sizeof(struct dsk));
@@ -859,9 +930,42 @@
xputc(c);
}
+#ifdef GPT
+static struct {
+ uint16_t len;
+ uint16_t count;
+ uint16_t seg;
+ uint16_t off;
+ uint64_t lba;
+} packet;
+#endif
+
static int
drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk)
{
+#ifdef GPT
+ static unsigned c = 0x2d5c7c2f;
+
+ if (!OPT_CHECK(RBX_QUIET))
+ printf("%c\b", c = c << 8 | c >> 24);
+ packet.len = 0x10;
+ packet.count = nblk;
+ packet.seg = VTOPOFF(buf);
+ packet.off = VTOPSEG(buf);
+ packet.lba = lba + dsk->start;
+ v86.ctl = V86_FLAGS;
+ v86.addr = 0x13;
+ v86.eax = 0x4200;
+ v86.edx = dsk->drive;
+ v86.ds = VTOPSEG(&packet);
+ v86.esi = VTOPOFF(&packet);
+ v86int();
+ if (V86_CY(v86.efl)) {
+ printf("error %u lba %u\n", v86.eax >> 8 & 0xff, lba);
+ return -1;
+ }
+ return 0;
+#else
static unsigned c = 0x2d5c7c2f;
lba += dsk->start;
@@ -881,6 +985,7 @@
return -1;
}
return 0;
+#endif
}
static int
==== //depot/projects/usb/src/sys/boot/uboot/lib/devicename.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/uboot/lib/devicename.c,v 1.2 2008/03/13 17:54:21 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/uboot/lib/devicename.c,v 1.3 2008/11/19 17:34:28 raj Exp $");
#include <sys/disklabel.h>
@@ -64,7 +64,7 @@
/*
* Try to parse the device name off the beginning of the devspec.
*/
- return(uboot_parsedev(dev, devspec, path));
+ return (uboot_parsedev(dev, devspec, path));
}
/*
@@ -78,7 +78,7 @@
*
* For disk-type devices, the syntax is:
*
- * disk<unit>[s<slice>][<partition>]:
+ * disk<unit>[<partition>]:
*
*/
static int
@@ -86,10 +86,10 @@
const char **path)
{
struct uboot_devdesc *idev;
- struct devsw *dv;
- char *cp;
- const char *np;
- int i, unit, slice, partition, err;
+ struct devsw *dv;
+ char *cp;
+ const char *np;
+ int i, unit, partition, err;
/* minimum length check */
if (strlen(devspec) < 2)
@@ -110,12 +110,11 @@
np = (devspec + strlen(dv->dv_name));
switch(dv->dv_type) {
- case DEVT_NONE: /* XXX what to do here? Do we care? */
+ case DEVT_NONE:
break;
case DEVT_DISK:
unit = -1;
- slice = -1;
partition = -1;
if (*np && (*np != ':')) {
/* next comes the unit number */
@@ -124,16 +123,8 @@
err = EUNIT;
goto fail;
}
- if (*cp == 's') { /* got a slice number */
- np = cp + 1;
- slice = strtol(np, &cp, 10);
- if (cp == np) {
- err = ESLICE;
- goto fail;
- }
- }
if (*cp && (*cp != ':')) {
- /* get a partition number */
+ /* get partition */
partition = *cp - 'a';
if ((partition < 0) ||
(partition >= MAXPARTITIONS)) {
@@ -145,12 +136,12 @@
}
if (*cp && (*cp != ':')) {
err = EINVAL;
- goto fail;
+ goto fail;
}
idev->d_unit = unit;
- idev->d_kind.disk.slice = slice;
- idev->d_kind.disk.partition = partition;
+ idev->d_disk.partition = partition;
+ idev->d_disk.data = NULL;
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
@@ -170,10 +161,8 @@
err = EINVAL;
goto fail;
}
+ idev->d_unit = unit;
- if (dv->dv_type == DEVT_NET)
- idev->d_unit = unit;
-
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
@@ -212,8 +201,6 @@
case DEVT_DISK:
cp = buf;
cp += sprintf(cp, "%s%d", dev->d_dev->dv_name, dev->d_unit);
- if (dev->d_kind.disk.slice > 0)
- cp += sprintf(cp, "s%d", dev->d_kind.disk.slice);
if (dev->d_kind.disk.partition >= 0)
cp += sprintf(cp, "%c", dev->d_kind.disk.partition +
'a');
==== //depot/projects/usb/src/sys/boot/uboot/lib/disk.c#2 (text+ko) ====
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2000 Benno Rice.
+ * Copyright (c) 2008 Semihalf, Rafal Jaworowski
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -11,99 +11,453 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/uboot/lib/disk.c,v 1.2 2008/03/13 17:54:21 obrien Exp $");
-
/*
- * Disk I/O routines using U-Boot - TODO
+ * Block storage I/O routines for U-Boot
*/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/boot/uboot/lib/disk.c,v 1.3 2008/11/19 17:34:28 raj Exp $");
+
#include <sys/param.h>
#include <sys/queue.h>
-
#include <netinet/in.h>
#include <machine/stdarg.h>
#include <stand.h>
+#include <uuid.h>
+
+#define FSTYPENAMES
+#include <sys/disklabel.h>
+#include "api_public.h"
#include "bootstrap.h"
+#include "glue.h"
+#include "libuboot.h"
+
+#define DEBUG
+#undef DEBUG
-static int d_init(void);
-static int d_strategy(void *devdata, int flag, daddr_t dblk,
- size_t size, char *buf, size_t *rsize);
-static int d_open(struct open_file *f, ...);
-static int d_close(struct open_file *f);
-static int d_ioctl(struct open_file *f, u_long cmd, void *data);
-static void d_print(int verbose);
+#define stor_printf(fmt, args...) do { \
+ printf("%s%d: ", dev->d_dev->dv_name, dev->d_unit); \
+ printf(fmt, ##args); \
+} while (0)
+
+#ifdef DEBUG
+#define debugf(fmt, args...) do { printf("%s(): ", __func__); \
+ printf(fmt,##args); } while (0)
+#else
+#define debugf(fmt, args...)
+#endif
-struct devsw uboot_disk = {
- "block",
- DEVT_DISK,
- d_init,
- d_strategy,
- d_open,
- d_close,
- d_ioctl,
- d_print
+struct gpt_part {
+ int gp_index;
+ uuid_t gp_type;
+ uint64_t gp_start;
+ uint64_t gp_end;
};
-struct opened_dev {
- u_int count;
- SLIST_ENTRY(opened_dev) link;
+struct open_dev {
+ int od_bsize; /* block size */
+ int od_bstart; /* start block offset from beginning of disk */
+ int od_type;
+#define OD_BSDLABEL 0x0001
+#define OD_GPT 0x0002
+ union {
+ struct {
+ struct disklabel bsdlabel;
+ } _bsd;
+ struct {
+ struct gpt_part *gpt_partitions;
+ int gpt_nparts;
+ } _gpt;
+ } _data;
};
-SLIST_HEAD(, opened_dev) opened_devs = SLIST_HEAD_INITIALIZER(opened_dev);
+#define od_bsdlabel _data._bsd.bsdlabel
+#define od_nparts _data._gpt.gpt_nparts
+#define od_partitions _data._gpt.gpt_partitions
+
+static int stor_info[UB_MAX_DEV];
+static int stor_info_no = 0;
+static int stor_opendev(struct open_dev **, struct uboot_devdesc *);
+static int stor_closedev(struct uboot_devdesc *);
+static int stor_readdev(struct uboot_devdesc *, daddr_t, size_t, char *);
+static int stor_open_count = 0;
+
+/* devsw I/F */
+static int stor_init(void);
+static int stor_strategy(void *, int, daddr_t, size_t, char *, size_t *);
+static int stor_open(struct open_file *, ...);
+static int stor_close(struct open_file *);
+static void stor_print(int);
+
+struct devsw uboot_storage = {
+ "disk",
+ DEVT_DISK,
+ stor_init,
+ stor_strategy,
+ stor_open,
+ stor_close,
+ noioctl,
+ stor_print
+};
static int
-d_init(void)
+stor_init(void)
{
+ struct device_info *di;
+ int i, found = 0;
+
+ if (devs_no == 0) {
+ printf("No U-Boot devices! Really enumerated?\n");
+ return (-1);
+ }
+
+ for (i = 0; i < devs_no; i++) {
+ di = ub_dev_get(i);
+ if ((di != NULL) && (di->type & DEV_TYP_STOR)) {
+ if (stor_info_no >= UB_MAX_DEV) {
+ printf("Too many storage devices: %d\n",
+ stor_info_no);
+ return (-1);
+ }
+ stor_info[stor_info_no++] = i;
+ found = 1;
+ }
+ }
+
+ if (!found) {
+ printf("No storage devices\n");
+ return (-1);
+ }
- return 0;
+ debugf("storage devices found: %d\n", stor_info_no);
+ return (0);
}
static int
-d_strategy(void *devdata, int flag, daddr_t dblk, size_t size, char *buf,
+stor_strategy(void *devdata, int rw, daddr_t blk, size_t size, char *buf,
size_t *rsize)
{
+ struct uboot_devdesc *dev = (struct uboot_devdesc *)devdata;
+ struct open_dev *od = (struct open_dev *)dev->d_disk.data;
+ int bcount, err;
+
+ debugf("od=%p, size=%d, bsize=%d\n", od, size, od->od_bsize);
+
+ if (rw != F_READ) {
+ stor_printf("write attempt, operation not supported!\n");
+ return (EROFS);
+ }
+
+ if (size % od->od_bsize) {
+ stor_printf("size=%d not multiple of device block size=%d\n",
+ size, od->od_bsize);
+ return (EIO);
+ }
+ bcount = size / od->od_bsize;
+
+ if (rsize)
+ *rsize = 0;
+
+ err = stor_readdev(dev, blk + od->od_bstart, bcount, buf);
+ if (!err && rsize)
+ *rsize = size;
+
+ return (err);
+}
+
+static int
+stor_open(struct open_file *f, ...)
+{
+ va_list ap;
+ struct open_dev *od;
+ struct uboot_devdesc *dev;
+ int err;
+
+ va_start(ap, f);
+ dev = va_arg(ap, struct uboot_devdesc *);
+ va_end(ap);
+
+ if ((err = stor_opendev(&od, dev)) != 0)
+ return (err);
+
+ ((struct uboot_devdesc *)(f->f_devdata))->d_disk.data = od;
+
+ return (0);
+}
+
+static int
+stor_close(struct open_file *f)
+{
+ struct uboot_devdesc *dev;
+
+ dev = (struct uboot_devdesc *)(f->f_devdata);
+
+ return (stor_closedev(dev));
+}
+
+static int
+stor_open_gpt(struct open_dev *od, struct uboot_devdesc *dev)
+{
+
+ /* TODO */
+ return (ENXIO);
+}
+
+static int
+stor_open_bsdlabel(struct open_dev *od, struct uboot_devdesc *dev)
+{
+ char *buf;
+ struct disklabel *dl;
+ int err = 0;
+
+ /* Allocate 1 block */
+ buf = malloc(od->od_bsize);
+ if (!buf) {
+ stor_printf("could not allocate memory for disklabel\n");
+ return (ENOMEM);
+ }
- return (EINVAL);
+ /* Read disklabel */
+ err = stor_readdev(dev, LABELSECTOR, 1, buf);
+ if (err) {
+ stor_printf("disklabel read error=%d\n", err);
+ err = ERDLAB;
+ goto out;
+ }
+ bcopy(buf + LABELOFFSET, &od->od_bsdlabel, sizeof(struct disklabel));
+ dl = &od->od_bsdlabel;
+
+ if (dl->d_magic != DISKMAGIC) {
+ stor_printf("no disklabel magic!\n");
+ err = EUNLAB;
+ goto out;
+ }
+ od->od_type = OD_BSDLABEL;
+ od->od_bstart = dl->d_partitions[dev->d_disk.partition].p_offset;
+
+ debugf("bstart=%d\n", od->od_bstart);
+
+out:
+ free(buf);
+ return (err);
}
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list