srpm imported for GoOSe Linux 6.0

This commit is contained in:
Clint Savage 2011-12-05 00:51:46 -06:00
commit 56d2c574d1
36 changed files with 6009 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
yaboot-1.3.14.tar.gz

25
Makefile Normal file
View File

@ -0,0 +1,25 @@
# This makefile is downloading any file found in
# the 'sources' file already existing in this directory
# and validating the sha256sum of the archive against it.
NAME := yaboot
define find-common-dir
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then echo "$$d"; break ; fi ; done
endef
COMMON_DIR := $(shell $(find-common-dir))
include $(COMMON_DIR)/Makefile.common
SOURCEFILES := $(shell cat sources 2>/dev/null | awk '{ print $$2 }' | awk -F'*' '{ print $$2 }')
sources: $(SOURCEFILES)
$(SOURCEFILES):
@for sourcefile in $(SOURCEFILES); do \
$(CLIENT) $(LOOKASIDE_URI)/$(NAME)/$${sourcefile}; \
done
sha256sum -c sources || ( echo 'SHA256 check failed' && rm $(SOURCEFILES); exit 1 )
clean:
rm $(SOURCEFILES)

336
efika.forth Normal file
View File

@ -0,0 +1,336 @@
\ FORTH
." Efika 5200B Device Tree Supplement 20071114" cr
." (c) 2007 Genesi USA, Inc." cr
." http://www.powerdeveloper.org/ for support" cr cr
\ headerless
s" /openprom" find-device
d# 20071114 encode-int s" device-tree-version" property
device-end
s" /builtin/ata" find-device
s" mpc5200-ata" encode-string
s" mpc5200b-ata" encode-string encode+
s" compatible" property
device-end
s" /builtin/sound" find-device
s" mpc5200-psc-ac97" encode-string
s" mpc5200b-psc-ac97" encode-string encode+
s" compatible" property
0x2 encode-int
0x2 encode-int encode+
0x3 encode-int encode+
s" interrupts" property
\ Audio is on PSC2, just for informational purposes
1 encode-int s" cell-index" property
device-end
\ Quick test to see if AC97 is enabled
0xf0000b00 dup dup l@ 0x20 and
0= if
." Enabling AC97" cr
dup l@ 0x20 or
swap l!
else
drop
then
\ SRAM compatibles
s" /builtin/sram" find-device
s" mpc5200-sram" encode-string
s" mpc5200b-sram" encode-string encode+
s" compatible" property
s" sram" device-type \ this is a contentious one
device-end
\ PIC compatibles
s" /builtin/pic" find-device
s" mpc5200-pic" encode-string
s" mpc5200b-pic" encode-string encode+
s" compatible" property
device-end
\ Serial compatibles. Also fix cell-index and port-number as per bindings
s" /builtin/serial" find-device
s" mpc5200-psc-uart" encode-string
s" mpc5200b-psc-uart" encode-string encode+
s" compatible" property
\ Serial port is PSC1 for informational purposes, Linux 0-indexes it
0 encode-int s" cell-index" property
\ Since this is the main, always there, preferred serial port..
0 encode-int s" port-number" property
device-end
\ Ethernet compatibles
s" /builtin/ethernet" find-device
s" mpc5200-fec" encode-string
s" mpc5200b-fec" encode-string encode+
s" compatible" property
device-end
\ BestComm compatibles, interrupt mess
s" /builtin/bestcomm" find-device
s" mpc5200-bestcomm" encode-string
s" mpc5200b-bestcomm" encode-string
encode+
s" compatible" property
\ make 16 interrupt property in a batch. We have to do the first one by
\ hand simply because of the way encode+ works.
0x3 encode-int 0x0 encode-int 0x3 encode-int encode+ encode+
0x10 1 do
0x3 encode-int encode+ i encode-int encode+ 0x3 encode-int encode+
loop
\ now we can store the damn thing
s" interrupts" property
device-end
\ New USB binding - change one of the numbers here to disable it for older kernels
\ as this is a destructive change
0 1 = if
s" /builtin/usb" find-device
s" usb-ohci" device-type
s" " encode-string s" big-endian" property
s" mpc5200-ohci" encode-string
s" mpc5200-usb-ohci" encode-string encode+
s" compatible" property
device-end
then
\ Go into the root node and kill off any mention of CHRP
s" /" find-device
s" efika" device-type
s" Efika 5200B" encode-string s" CODEGEN,board" property
s" Efika 5200B PowerPC System" encode-string s" CODEGEN,description" property
device-end
\ Fix the /builtin device-type for Linux
s" /builtin" find-device
s" soc" device-type
device-end
\ ADDING NEW ENTRIES TO THE DEVICE TREE
\
\ Clock Distribution Module - need this to change baud rates etc. and turn off
\ clocks for power management. Useful little thing. Needs an entry to find the
\ address without guessing (in case they change it in the 512X)
\ Clock Distribution Module
." Adding Clock Distribution Module" cr
s" /builtin" find-device
new-device
" cdm" 2dup device-name device-type
" MPC52xx Clock Distribution Module" encode-string " .description" property
0xf0000200 0x38 reg
" mpc5200-cdm" encode-string
" mpc5200b-cdm" encode-string
encode+
" compatible" property
finish-device
\ GPIO (Simple) Module
." Adding Simple GPIO Module" cr
s" /builtin" find-device
new-device
s" gpio" 2dup device-name device-type
s" MPC52xx Simple GPIO" encode-string s" .description" property
0xf0000b00 0x40 reg
s" mpc5200-gpio" encode-string
s" mpc5200b-gpio" encode-string encode+
s" compatible" property
0x10000000 encode-int s" gpio-mask" property
0x1 encode-int
0x7 encode-int
0x3 encode-int
encode+ encode+
s" interrupts" property
finish-device
\ GPIO (Wakeup) Module
." Adding Wakeup GPIO Module" cr
s" /builtin" find-device
new-device
s" gpio-wkup" 2dup device-name device-type
s" MPC52xx Wakeup GPIO" encode-string s" .description" property
0xf0000c00 0x28 reg
s" mpc5200-gpio-wkup" encode-string
s" mpc5200b-gpio-wkup" encode-string
encode+
s" compatible" property
0x30000000 encode-int s" gpio-mask" property
0x1 encode-int
0x8 encode-int encode+
0x3 encode-int encode+
0x1 encode-int encode+
0x3 encode-int encode+
0x3 encode-int encode+
s" interrupts" property
finish-device
\
\ High resolution (General Purpose and Slice) Timers
\
\ We ignore slice timer 0 since critical interrupt handling in Linux
\ is curiously missing
." Adding Slice Timer 1" cr
s" /builtin" find-device
new-device
s" slt" 2dup device-name device-type
s" MPC52xx Slice Timer 1" encode-string " .description" property
0xf0000710 0x10 reg
s" mpc5200-slt" encode-string
s" mpc5200b-slt" encode-string
encode+
s" compatible" property
1 encode-int " cell-index" property
\ The interrupt listed here is probably wrong
0x1 encode-int
0x0 encode-int encode+
0x3 encode-int encode+
s" interrupts" property
finish-device
\ Add all the GPTs to the device-tree
\ : gpt-add ( gpt-id -- )
\ depth
\ 1 > if
8 0 do i
dup 7 <= if
dup
0x9 +
swap dup
0x10 *
0xf0000600 +
swap dup
." Adding General Purpose Timer " .d cr
s" /builtin" find-device
new-device
s" gpt" 2dup device-name device-type
swap 0x10 reg
encode-int s" cell-index" property
s" MPC52xx General Purpose Timer X"
2dup + 1 - \ get the character position of the X
0x30 i + swap c! \ store ascii character of timer number
encode-string s" .description" property
s" mpc5200-gpt" encode-string
s" mpc5200b-gpt" encode-string encode+
s" fsl,mpc5200-gpt" encode-string encode+
s" fsl,mpc5200b-gpt" encode-string encode+
s" compatible" property
0x1 encode-int
2 pick encode-int encode+
0x3 encode-int encode+
s" interrupts" property
finish-device
then
loop
\ then
\ ;
\ Add watchdog marker to GPT0
s" /builtin/gpt@f0000600" find-device
s" " encode-string s" has-wdt" property
s" " encode-string s" fsl,has-wdt" property
device-end
\ PHY for ethernet. Thanks to Domen Puncer for this.
." Adding Ethernet PHY" cr
s" /builtin" find-device
new-device
1 encode-int s" #address-cells" property
0 encode-int s" #size-cells" property
s" mdio" 2dup device-name device-type
s" mpc5200b-fec-phy" encode-string s" compatible" property
0xf0003000 0x400 reg
0x2 encode-int
0x5 encode-int encode+
0x3 encode-int encode+
s" interrupts" property
new-device
s" ethernet-phy" 2dup device-name device-type
0x10 encode-int s" reg" property
my-self \ save our phandle to stack
ihandle>phandle
finish-device
finish-device
s" /builtin/ethernet" find-device
encode-int \ phy's phandle
s" phy-handle" property
device-end
\
\ HERE BE DRAGONS
\ SDRAM Controller (needed to enter deep sleep and turn off RAM clocks)
." Adding SDRAM Controller" cr
s" /builtin" find-device
new-device
s" sdram" device-name
s" memory-controller" device-type
0xf0000100 0x10 reg
s" MPC52xx SDRAM Memory Controller" encode-string s" .description" property
s" mpc5200b-sdram" encode-string
s" mpc5200-sdram" encode-string encode+
s" compatible" property
finish-device
\ XLB Arbiter (pipeline/bestcomm stuff enabled here)
." Adding XLB Arbiter" cr
s" /builtin" find-device
new-device
s" xlb" 2dup device-name device-type
0xf0001f00 0x100 reg
s" MPC52xx XLB Arbiter" encode-string s" .description" property
s" mpc5200-xlb" encode-string
s" mpc5200b-xlb" encode-string encode+
s" compatible" property
finish-device
\ Optionally uncomment and boot your Linux
\ s" hd:0 vmlinuz console= blah=" $boot

1
sources Normal file
View File

@ -0,0 +1 @@
b1b0ddc798e332dc03065bac871b05f700b6f8383951a05dee68a7438f644933 *yaboot-1.3.14.tar.gz

View File

@ -0,0 +1,27 @@
--- yaboot-1.3.10/ybin/yabootconfig.configfile 2003-06-19 17:33:50.000000000 -0400
+++ yaboot-1.3.10/ybin/yabootconfig 2003-06-19 17:39:26.000000000 -0400
@@ -103,6 +103,7 @@
default: determined from {chroot}/etc/fstab
-b, --boot set bootstrap partition, Example: /dev/hda2
default: first type: Apple_Bootstrap partition
+ -C, --config set config file name (Example: /etc/yaboot.conf)
--kernel-args add an append= line with specified arguments
-q, --quiet don't ask any questions/confirmation
--noinstall don't automatically run mkofboot
@@ -330,6 +331,16 @@
exit 1
fi
;;
+ -C|--config)
+ if [ -n "$2" ]; then
+ CONFIG="$2"
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
-q|--quiet)
QUIET=1
shift 1

11
yaboot-1.3.10-ext3.patch Normal file
View File

@ -0,0 +1,11 @@
--- yaboot-1.3.10/second/fs_ext2.c.ext3 2003-04-09 21:38:48.000000000 -0400
+++ yaboot-1.3.10/second/fs_ext2.c 2003-04-09 21:40:32.000000000 -0400
@@ -189,7 +189,7 @@
ofopened = 1;
/* Open the ext2 filesystem */
- result = ext2fs_open (buffer, EXT2_FLAG_RW, 0, 0, linux_io_manager, &fs);
+ result = ext2fs_open (buffer, EXT2_FLAG_DIRTY, 0, 0, linux_io_manager, &fs);
if (result) {
if(result == EXT2_ET_BAD_MAGIC)

View File

@ -0,0 +1,29 @@
--- yaboot-1.3.10/ybin/yabootconfig~ 2004-04-20 16:20:13.619375616 -0400
+++ yaboot-1.3.10/ybin/yabootconfig 2004-04-20 16:32:40.519829488 -0400
@@ -160,6 +160,8 @@
FDISK=mac-fdisk
elif (command -v pdisk > /dev/null 2>&1) ; then
FDISK=pdisk
+ elif (command -v parted > /dev/null 2>&1) ; then
+ FDISK=parted
else
echo 1>&2 "$PRG: Unable to locate mac-fdisk"
return 1
@@ -209,9 +211,16 @@
BOOT="${DISK}${BOOT}"
fi
debug "BOOT after fixup: $BOOT\n"
- else
+ elif [ "$FDISK" = mac-fdisk ] ; then
BOOT="$(v=`$FDISK -l "$DISK" 2>/dev/null | grep '\<Apple_Bootstrap\>'` ; echo ${v%%[ ]*})"
debug "BOOT=$BOOT\n"
+ else
+ BOOT="$(v=`$FDISK "$DISK" print 2>/dev/null | grep 'bootstrap'` ; echo ${v%%[ ]*})"
+ debug "BOOT before fixup: $BOOT\n"
+ if [ -n "$BOOT" ] ; then
+ BOOT="${DISK}${BOOT}"
+ fi
+ debug "BOOT after fixup: $BOOT\n"
fi
if [ -z "$BOOT" ] ; then
echo 1>&2 "$PRG: Unable to locate bootstrap partition on $DISK..."

View File

@ -0,0 +1,59 @@
--- yaboot-1.3.10/first/ofboot.name 2003-04-09 21:29:29.000000000 -0400
+++ yaboot-1.3.10/first/ofboot 2003-04-09 21:29:55.000000000 -0400
@@ -86,6 +86,13 @@
MENU=1
fi
+if [ -f /etc/redhat-release ]; then
+ PRODUCT=`sed "s/ release.*//g" /etc/redhat-release`
+else
+ PRODUCT="PowerPC GNU/Linux"
+fi
+
+
## create the variables.
##
## OSNAME="$1"
@@ -102,7 +109,7 @@
[ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file1: $5\n"
[ "$COUNT" = "$OSNUM" ] && c="."
BTYA=": boot$1 \" Loading second stage bootstrap...\" .printf 100 ms load-base release-load-area \" ${4}${5}\" \$boot ;"
- MENUYA="\" Press $3 for Red Hat Linux${c-,}\"(0d 0a)\" .printf"
+ MENUYA="\" Press $3 for $PRODUCT${c-,}\"(0d 0a)\" .printf"
GETYA=" ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
shift 5
COUNT="$(($COUNT + 1))"
@@ -315,7 +322,7 @@
MacRISC MacRISC3 MacRISC4
</COMPATIBLE>
<DESCRIPTION>
-Red Hat Linux First Stage Bootstrap
+$PRODUCT First Stage Bootstrap
</DESCRIPTION>
<BOOT-SCRIPT>
: .printf fb8-write drop ;
@@ -336,7 +343,7 @@
$BGCOLOR to background-color
\" \"(0C)\" .printf
-\" First Stage Red Hat Linux Bootstrap\"(0d 0a)\" .printf
+\" First Stage $PRODUCT Bootstrap\"(0d 0a)\" .printf
\" \"(0d 0a)\" .printf
$MENUOPTS
\" \"(0d 0a)\" .printf
--- yaboot-1.3.10/ybin/yabootconfig.name 2003-04-09 21:24:20.000000000 -0400
+++ yaboot-1.3.10/ybin/yabootconfig 2003-04-09 21:27:07.000000000 -0400
@@ -700,7 +700,12 @@
ENABLENETBOOT="enablenetboot\n"
fi
-MESG='"Welcome to Red Hat Linux!\\nHit <TAB> for boot options.\\n\\n"'
+if [ -f /etc/redhat-release ]; then
+ PRODUCT=`sed "s/ release.*//g" /etc/redhat-release`
+else
+ PRODUCT="PowerPC GNU/Linux"
+fi
+MESG="\"Welcome to $PRODUCT!\\nHit <TAB> for boot options.\\n\\n\""
## generate global section of yaboot.conf
GLOBAL="boot=${BOOT}${DEVICE:-}

View File

@ -0,0 +1,51 @@
--- yaboot-1.3.10/Makefile.sbindir 2003-04-28 18:14:43.000000000 -0400
+++ yaboot-1.3.10/Makefile 2003-04-28 18:15:44.000000000 -0400
@@ -9,6 +9,7 @@
ROOT =
PREFIX = usr/local
MANDIR = man
+SBINDIR= ${PREFIX}/sbin
# command used to get root (needed for tarball creation)
GETROOT = fakeroot
@@ -179,7 +180,7 @@
install: all strip
install -d -m 0755 ${ROOT}/etc/
- install -d -m 0755 ${ROOT}/${PREFIX}/sbin/
+ install -d -m 0755 ${ROOT}/${SBINDIR}
install -d -m 0755 ${ROOT}/${PREFIX}/lib
install -d -m 0755 ${ROOT}/${PREFIX}/lib/yaboot
install -d -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man5/
@@ -187,11 +188,11 @@
install -m 0644 second/yaboot ${ROOT}/$(PREFIX)/lib/yaboot
install -m 0755 util/addnote ${ROOT}/${PREFIX}/lib/yaboot/addnote
install -m 0644 first/ofboot ${ROOT}/${PREFIX}/lib/yaboot/ofboot
- install -m 0755 ybin/ofpath ${ROOT}/${PREFIX}/sbin/ofpath
- install -m 0755 ybin/ybin ${ROOT}/${PREFIX}/sbin/ybin
- install -m 0755 ybin/yabootconfig ${ROOT}/${PREFIX}/sbin/yabootconfig
- rm -f ${ROOT}/${PREFIX}/sbin/mkofboot
- ln -s ybin ${ROOT}/${PREFIX}/sbin/mkofboot
+ install -m 0755 ybin/ofpath ${ROOT}/${SBINDIR}/ofpath
+ install -m 0755 ybin/ybin ${ROOT}/${SBINDIR}/ybin
+ install -m 0755 ybin/yabootconfig ${ROOT}/${SBINDIR}/yabootconfig
+ rm -f ${ROOT}/${SBINDIR}/mkofboot
+ ln -s ybin ${ROOT}/${SBINDIR}/mkofboot
@gzip -9 man/*.[58]
install -m 0644 man/bootstrap.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/bootstrap.8.gz
install -m 0644 man/mkofboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/mkofboot.8.gz
@@ -216,10 +217,10 @@
@echo
deinstall:
- rm -f ${ROOT}/${PREFIX}/sbin/ofpath
- rm -f ${ROOT}/${PREFIX}/sbin/ybin
- rm -f ${ROOT}/${PREFIX}/sbin/yabootconfig
- rm -f ${ROOT}/${PREFIX}/sbin/mkofboot
+ rm -f ${ROOT}/${SBINDIR}/ofpath
+ rm -f ${ROOT}/${SBINDIR}/ybin
+ rm -f ${ROOT}/${SBINDIR}/yabootconfig
+ rm -f ${ROOT}/${SBINDIR}/mkofboot
rm -f ${ROOT}/${PREFIX}/lib/yaboot/yaboot
rm -f ${ROOT}/${PREFIX}/lib/yaboot/ofboot
rm -f ${ROOT}/${PREFIX}/lib/yaboot/addnote

View File

@ -0,0 +1,32 @@
--- yaboot-1.3.13/ybin/ybin~ 2005-08-10 15:09:32.000000000 +0100
+++ yaboot-1.3.13/ybin/ybin 2005-08-11 16:13:36.000000000 +0100
@@ -353,17 +353,19 @@ checkconf()
fi
## make sure $mntpoint is on $boot, this matters to nvram updating.
- if [ "$(v=`df "$mntpoint" 2> /dev/null | grep ^/dev/` ; echo ${v%%[ ]*})" != "$boot" -a -d "$mntpoint" ] ; then
- echo 1>&2 "$PRG: $mntpoint is not located on $boot"
- local CONFERR=1
- ## more then one subdirectory deep is not supported. no sed available on boot floppies ( / -> \ )
- elif [ "$mntpoint" != "$(v=`df "$mntpoint" 2> /dev/null | grep ^/dev/` ; echo ${v##*[ ]})" ] ; then
- echo "$(v=`df "$mntpoint" 2>/dev/null | grep ^/dev/`; m=${v##*[ ]}; echo "${mntpoint##*$m/}")" | grep -q /
- if [ $? = 0 ] ; then
- echo 1>&2 "$PRG:$ERR $mntpoint is more then one subdirectory deep from root of $boot"
+ if [ -n "$magicboot" -o "$nonvram" = 0 ]; then
+ if [ "$(v=`df "$mntpoint" 2> /dev/null | grep ^/dev/` ; echo ${v%%[ ]*})" != "$boot" -a -d "$mntpoint" ] ; then
+ echo 1>&2 "$PRG: $mntpoint is not located on $boot"
local CONFERR=1
- else
- OFDIR="$(v=`df "$mntpoint" 2>/dev/null | grep ^/dev/`; m=${v##*[ ]}; echo "${mntpoint##*$m/}")"
+ ## more than one subdirectory deep is not supported. no sed available on boot floppies ( / -> \ )
+ elif [ "$mntpoint" != "$(v=`df "$mntpoint" 2> /dev/null | grep ^/dev/` ; echo ${v##*[ ]})" ] ; then
+ echo "$(v=`df "$mntpoint" 2>/dev/null | grep ^/dev/`; m=${v##*[ ]}; echo "${mntpoint##*$m/}")" | grep -q /
+ if [ $? = 0 ] ; then
+ echo 1>&2 "$PRG:$ERR $mntpoint is more then one subdirectory deep from root of $boot"
+ local CONFERR=1
+ else
+ OFDIR="$(v=`df "$mntpoint" 2>/dev/null | grep ^/dev/`; m=${v##*[ ]}; echo "${mntpoint##*$m/}")"
+ fi
fi
fi

View File

@ -0,0 +1,13 @@
--- yaboot-1.3.13/ybin/ybin.dontwritehome 2006-08-10 14:33:06.000000000 -0400
+++ yaboot-1.3.13/ybin/ybin 2006-08-10 14:33:15.000000000 -0400
@@ -821,6 +821,10 @@
return 1
fi
+ ## N.B.: SELinux does not like bootloader executables writing to
+ ## root's homedir, so we lie about HOME here.
+ export HOME=/boot
+
## hmount is really more of a way to make sure we have a valid HFS
## filesystem before proceding, and hcopy requires it...
hmount "$boot" > /dev/null

View File

@ -0,0 +1,15 @@
--- yaboot-1.3.13/second/prom.c~ 2003-11-04 09:13:17.000000000 +0000
+++ yaboot-1.3.13/second/prom.c 2005-07-29 13:19:35.000000000 +0100
@@ -547,7 +547,11 @@ prom_sleep (int seconds)
void *
prom_claim (void *virt, unsigned int size, unsigned int align)
{
- return call_prom ("claim", 3, 1, virt, size, align);
+ void *ret = call_prom ("claim", 3, 1, virt, size, align);
+ /* Pegasos II SmartFirmware returns zero for failure, usefully */
+ if (virt && !ret)
+ ret = (void *)-1;
+ return ret;
}
void

View File

@ -0,0 +1,82 @@
--- yaboot-1.3.13/ybin/ybin.ext2 2005-07-29 13:22:40.000000000 +0100
+++ yaboot-1.3.13/ybin/ybin 2005-07-29 13:23:01.000000000 +0100
@@ -75,6 +75,8 @@ fi
usemount=no
if (cat /proc/cpuinfo 2> /dev/null | grep ^machine | grep -q 'CHRP IBM') ; then
fstype=raw
+elif (cat /proc/cpuinfo 2> /dev/null | grep ^machine | grep -q 'Pegasos') ; then
+ fstype=ext2
else
fstype=hfs
fi
@@ -277,13 +279,13 @@ checkconf()
fi
case "$fstype" in
- hfs|msdos|raw)
+ hfs|msdos|raw|ext2)
;;
*)
if [ "$ARGFS" = 1 ] ; then
- echo 1>&2 "$PRG: --filesystem must be either \`hfs', \`msdos', or \`raw'"
+ echo 1>&2 "$PRG: --filesystem must be either \`hfs', \`msdos', \`ext2' or \`raw'"
else
- echo 1>&2 "$PRG:$ERR \`fstype' must be either \`hfs', \`msdos', or \`raw'"
+ echo 1>&2 "$PRG:$ERR \`fstype' must be either \`hfs', \`msdos', \`ext2' or \`raw'"
fi
local CONFERR=1
;;
@@ -942,12 +944,16 @@ util_install()
## used by mnt_install so mntpoint= can be supported in a cleaner way.
mnt()
{
+ local mountopts="rw"
+
## we can even create bootstrap filesystem images directly if you
## ever wanted too.
if [ -f "$boot" ] ; then
- local loop=",loop"
+ mountopts="$mountopts,loop"
+ fi
+ if [ "$fstype" = "msdos" ] ; then
+ mountopts="$mountopts,umask=077"
fi
-
if [ -e "$TMP/bootstrap.$$" ] ; then
echo 1>&2 "$PRG: $TMP/bootstrap.$$ exists, aborting."
return 1
@@ -966,7 +972,7 @@ mnt()
fi
[ "$VERBOSE" = 1 ] && echo "$PRG: Mounting $boot..."
- mount -t "$fstype" -o rw,umask=077$loop "$boot" "$TMP/bootstrap.$$"
+ mount -t "$fstype" -o rw,$mountopts$loop "$boot" "$TMP/bootstrap.$$"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: An error occured mounting $boot"
return 1
@@ -1252,6 +1258,25 @@ mkoffs()
fi
return 0
;;
+ ext2)
+ if (command -v mkfs.ext2 > /dev/null 2>&1) ; then
+ [ -x `command -v mkfs.ext2` ] || FAIL=1 ; else FAIL=1 ; fi
+ if [ "$FAIL" = 1 ] ; then
+ echo 1>&2 "$PRG: mkfs.ext2 is not installed or cannot be found"
+ return 1
+ fi
+
+ [ "$VERBOSE" = 1 ] && echo "$PRG: Creating ext2 filesystem on $boot..."
+ if (command -v dd > /dev/null 2>&1) ; then
+ dd if=/dev/zero of="$boot" bs=512 count=1600 > /dev/null 2>&1
+ fi
+ mkfs.ext2 -L bootstrap "$boot" > /dev/null
+ if [ $? != 0 ] ; then
+ echo 1>&2 "$PRG: ext2 filesystem creation failed!"
+ return 1
+ fi
+ return 0
+ ;;
esac
}

View File

@ -0,0 +1,14 @@
--- yaboot-1.3.13/second/prom.c~ 2005-08-10 14:53:10.000000000 +0100
+++ yaboot-1.3.13/second/prom.c 2005-08-10 15:07:16.000000000 +0100
@@ -368,10 +368,8 @@ prom_getchar ()
char c[4];
int a;
- while ((a = (int)call_prom ("read", 3, 1, prom_stdin, c, 4)) == 0)
+ while ((a = (int)call_prom ("read", 3, 1, prom_stdin, c, 4)) <= 0)
;
- if (a == -1)
- prom_abort ("EOF on console\n");
if (a == 3 && c[0] == '\e' && c[1] == '[')
return 0x100 | c[2];
return c[0];

View File

@ -0,0 +1,249 @@
--- yaboot-1.3.13/ybin/yabootconfig.yabootconfig 2005-07-25 16:09:39.000000000 -0400
+++ yaboot-1.3.13/ybin/yabootconfig 2005-07-25 16:25:03.000000000 -0400
@@ -34,6 +34,7 @@
NOINSTALL=0
QUIET=0
DEBUG=0
+LABEL="Linux"
SIGINT="$PRG: Interrupt caught ... exiting"
export LC_COLLATE=C
@@ -319,6 +320,16 @@
exit 1
fi
;;
+ --kernel)
+ if [ -n "$2" ] ; then
+ KERNELIMAGE="$2"
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
--kernel-args)
if [ -n "$2" ] ; then
KERNARGS="$2"
@@ -347,10 +358,88 @@
NOINSTALL=1
shift 1
;;
+ --enablecdboot)
+ CDBOOT=1
+ shift 1
+ ;;
+ --enablenetboot)
+ NETBOOT=1
+ shift 1
+ ;;
--debug)
DEBUG=1
shift 1
;;
+ --delay)
+ if [ -n "$2" ] ; then
+ DELAY=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --label)
+ if [ -n "$2" ] ; then
+ LABEL=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --initrd)
+ if [ -n "$2" ] ; then
+ INITRDPATH=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --macosx)
+ if [ -n "$2" ] ; then
+ MACOSXDEV=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --macos)
+ if [ -n "$2" ] ; then
+ MACOSDEV=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --darwin)
+ if [ -n "$2" ] ; then
+ DARWINDEV=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
+ --defaultos)
+ if [ -n "$2" ] ; then
+ DEFOS=$2
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
"")
break
;;
@@ -474,7 +563,7 @@
READLINKKV=`readlink /usr/src/linux`
## find the kernel in the usual places and (if not --quiet) ask the
## user if we cannot find one.
-for k in "vmlinux" "vmlinux-`uname -r`" "vmlinux-`uname -r`" "$READLINKKV" ; do
+for k in "${KERNELIMAGE}" "vmlinux" "vmlinux-`uname -r`" "vmlinux-`uname -r`" "$READLINKKV" ; do
if [ -f "${CHROOT}${k}" ] ; then
KERNEL="${CHROOT}${k}"
break;
@@ -721,6 +812,36 @@
HEADER="## see also: /usr/share/doc/yaboot/examples for example configurations.\n"
fi
+## find the kernel in the usual places and (if not --quiet) ask the
+## user if we cannot find one.
+if [ -f "${CHROOT}${INITRDPATH}" ] ; then
+ REALINITRD="${CHROOT}${INITRDPATH}"
+
+ ## if there is a separate /boot partition we must strip off the /boot
+ ## mountpoint or else yaboot will not find the kernel.
+ if [ "$KERNDIR" != "$CHROOT" ] ; then
+ INITRD="${REALINITRD##*$KERNDIR}"
+ else
+ INITRD="$REALINITRD"
+ fi
+
+ ## fix chrooted path
+ if [ "$CHROOT" != / ] ; then
+ INITRD="${INITRD##*$CHROOT}"
+ fi
+
+ ## fix relative path (caused by chroot path fix)
+ case "$INITRD" in
+ /*)
+ true
+ ;;
+ *)
+ INITRD="/${INITRD}"
+ ;;
+ esac
+ INITRDLINE="\tinitrd=$INITRD\n"
+fi
+
## setup append line
if [ -n "$KERNARGS" ] ; then
APPEND="\tappend=\"${KERNARGS}\"\n"
@@ -731,24 +850,64 @@
INITRDIMGS="\tinitrd=$INITRDIMG\n\tinitrd-size=8192\n"
fi
+## setup default OS bits for ybin
+if [ -n "$DEFOS" ] ; then
+ if [ "$DEFOS" = "macosx" ] ; then
+ DEFAULTOS="defaultos=${DEFOS}\n"
+ elif [ "$DEFOS" = "macos" ] ; then
+ DEFAULTOS="defaultos=${DEFOS}\n"
+ elif [ "$DEFOS" = "darwin" ] ; then
+ DEFAULTOS="defaultos=${DEFOS}\n"
+ else
+ DEFAULTOS="defaultos=linux\n"
+ fi
+else
+ DEFAULTOS="defaultos=linux\n"
+fi
+if [ -n "$DELAY" ] ; then
+ MENUDELAY="delay=${DELAY}\n"
+fi
+
+## setup enabling cd or network boot from OF
+if [ -n "$CDBOOT" ] ; then
+ ENABLECDBOOT="enablecdboot\n"
+fi
+if [ -n "$NETBOOT" ] ; then
+ ENABLENETBOOT="enablenetboot\n"
+fi
+
+MESG='"Welcome to Red Hat Linux!\\nHit <TAB> for boot options.\\n\\n"'
+
## generate global section of yaboot.conf
-GLOBAL="## yaboot.conf generated by $PRG $VERSION
-##
-## run: \"man yaboot.conf\" for details. Do not make changes until you have!!
-${HEADER}##
-## For a dual-boot menu, add one or more of:
-## bsd=/dev/hdaX, macos=/dev/hdaY, macosx=/dev/hdaZ\n
-boot=${BOOT}${DEVICE:-}
+GLOBAL="boot=${BOOT}${DEVICE:-}
+init-message=$MESG
partition=$PARTITION
-root=$ROOT
timeout=30
-install=${INSTALL}${OFBOOT:-}\n"
+install=${INSTALL}${OFBOOT:-}
+default=$LABEL
+${DEFAULTOS:-}${MENUDELAY:-}${ENABLECDBOOT:-}${ENABLENETBOOT:-}"
## generate image= section
IMAGES="
image=$IMAGE
-\tlabel=Linux
-\tread-only\n${APPEND:-}${INITRDIMGS:-}"
+\tlabel=$LABEL
+\troot=$ROOT
+\tread-only\n
+${INITRDLINE-}${APPEND:-}"
+
+if [ -n "$MACOSXDEV" ] ; then
+ MACOSX="macosx=${MACOSXDEV}\n"
+fi
+
+if [ -n "$MACOSDEV" ] ; then
+ MACOS="macos=${MACOSDEV}\n"
+fi
+
+if [ -n "$DARWINDEV" ] ; then
+ DARWIN="darwin=${DARWINDEV}\n"
+fi
+
+OTHER="${MACOSX}${MACOS}${DARWIN}${BSD}"
## safely create a tmp file then move it into place after we are sure
## it was written.
@@ -767,7 +928,9 @@
exit 1
fi
-$PRINTF "${GLOBAL}${IMAGES}" > "$TMPCONF"
+printf "${GLOBAL}
+${IMAGES}
+${OTHER}" > "$TMPCONF"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to write temporary file ${TMPCONF}, aborting..."
exit 1

View File

@ -0,0 +1,99 @@
Index: yaboot-1.3.14-30/include/prom.h
===================================================================
--- yaboot-1.3.14-30.orig/include/prom.h 2010-05-25 14:37:24.309622517 +1000
+++ yaboot-1.3.14-30/include/prom.h 2010-05-25 14:37:27.803373148 +1000
@@ -158,5 +158,6 @@
struct bootp_packet * prom_get_netinfo (void);
char * prom_get_mac (struct bootp_packet * packet);
char * prom_get_ip (struct bootp_packet * packet);
+void *prom_rma_size(void);
#endif
Index: yaboot-1.3.14-30/second/prom.c
===================================================================
--- yaboot-1.3.14-30.orig/second/prom.c 2010-05-25 14:37:24.309622517 +1000
+++ yaboot-1.3.14-30/second/prom.c 2010-05-25 14:37:27.805375106 +1000
@@ -536,7 +536,16 @@
prom_claim_chunk(void *virt, unsigned int size, unsigned int align)
{
void *found, *addr;
- for(addr=virt; addr <= (void*)PROM_CLAIM_MAX_ADDR;
+ static void *claim_max_addr = -1;
+
+ if (claim_max_addr == (void*)-1) {
+ claim_max_addr = prom_rma_size();
+ if (claim_max_addr < PROM_CLAIM_MAX_ADDR)
+ claim_max_addr = PROM_CLAIM_MAX_ADDR;
+ DEBUG_F("Setting claim_max_addr to 0x%x\n", (int)claim_max_addr);
+ }
+
+ for(addr=virt; addr <= (void*)claim_max_addr;
addr+=(0x100000/sizeof(addr))) {
found = prom_claim(addr, size, 0);
if (found != (void *)-1) {
@@ -739,6 +748,32 @@
return conf_path;
}
+void *prom_rma_size(void)
+{
+ int rc;
+ ihandle n;
+ u64 *start, *end;
+ unsigned char buf[16]; /* This will store 2 64-bit values */
+
+ DEBUG_ENTER;
+
+ n = prom_finddevice("/memory@0");
+ DEBUG_F("n = %x\n", (int)n);
+ rc = prom_getprop(n, "reg", &buf, 16);
+ DEBUG_F("rc = %d\n", rc);
+
+ /* If the getprop() failed fill the buffer with some known value */
+ if (rc == -1)
+ memset(&buf[0], 0xff, 16);
+
+ start = (u64*)&buf[0];
+ end = (u64*)&buf[8];
+ DEBUG_F("start=0x%Lx, end=0x%Lx\n", *start, *end);
+
+ DEBUG_LEAVE(0);
+ return (void*)*end;
+}
+
/*
* Local variables:
* c-file-style: "k&r"
Index: yaboot-1.3.14-30/second/yaboot.c
===================================================================
--- yaboot-1.3.14-30.orig/second/yaboot.c 2010-05-25 14:37:20.729370528 +1000
+++ yaboot-1.3.14-30/second/yaboot.c 2010-05-25 14:37:27.810374623 +1000
@@ -121,6 +121,7 @@
struct boot_fspec_t boot;
int _machine = _MACH_Pmac;
int flat_vmlinux;
+u64 rma_size = 0;
#ifdef CONFIG_COLOR_TEXT
@@ -239,6 +240,9 @@
}
}
+ rma_size = (u64)prom_rma_size();
+ prom_printf("System has %Ld Mbytes in RMA\n", rma_size >> 20);
+
DEBUG_F("Running on _machine = %d\n", _machine);
DEBUG_SLEEP;
@@ -1258,8 +1262,8 @@
(unsigned long)(initrd_size));
/* Check to see if we're near the top of the RMA */
- /* Cheat and assume the RMA == 128Mb */
- if (initrd_end > 0x7000000) {
+ /* Cheat and assume RTAS will be ~16Mb */
+ if (initrd_end > rma_size - 0x1000000) {
unsigned long new_initrd_end, free_len;
unsigned long initrd_claim_len = initrd_end - (unsigned long)initrd_base;

View File

@ -0,0 +1,715 @@
diff -pur yaboot-1.3.14.orig/include/debug.h yaboot-1.3.14/include/debug.h
--- yaboot-1.3.14.orig/include/debug.h 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/include/debug.h 2010-02-08 13:07:31.954223039 +1100
@@ -32,8 +32,8 @@
prom_printf( fmt, ## args );\
}
# define DEBUG_OPEN DEBUG_F( "dev=%s, part=0x%p (%d), file_name=%s\n",\
- dev_name, part, part ? part->part_number : -1,\
- file_name)
+ fspec->dev, part, part ? part->part_number : -1,\
+ fspec->file)
# define DEBUG_SLEEP prom_sleep(3)
#else
#define DEBUG_ENTER
diff -pur yaboot-1.3.14.orig/include/file.h yaboot-1.3.14/include/file.h
--- yaboot-1.3.14.orig/include/file.h 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/include/file.h 2010-02-08 13:07:31.955220185 +1100
@@ -39,7 +39,13 @@ struct boot_file_t;
struct boot_fspec_t {
char* dev; /* OF device path */
int part; /* Partition number or -1 */
+ char* siaddr; /* Server address */
char* file; /* File path */
+ char* ciaddr; /* Client address */
+ char* giaddr; /* Gateway address */
+ char* bootp_retries; /* Bootp retries */
+ char* tftp_retries; /* TFTP retries */
+ char* addl_params; /* copy all additional parameters */
};
struct boot_file_t {
@@ -63,7 +69,7 @@ struct boot_file_t {
};
extern int
-open_file(const struct boot_fspec_t* spec,
+open_file(struct boot_fspec_t* spec,
struct boot_file_t* file);
extern int
diff -pur yaboot-1.3.14.orig/include/fs.h yaboot-1.3.14/include/fs.h
--- yaboot-1.3.14.orig/include/fs.h 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/include/fs.h 2010-02-08 13:07:31.958474719 +1100
@@ -27,14 +27,14 @@
#include "file.h"
int fserrorno;
+struct boot_fspec_t;
struct fs_t {
const char* name;
int (*open)( struct boot_file_t* file,
- const char* dev_name,
struct partition_t* part,
- const char* file_name);
+ struct boot_fspec_t* fspec);
int (*read)( struct boot_file_t* file,
unsigned int size,
@@ -49,7 +49,7 @@ struct fs_t {
extern const struct fs_t *fs_of;
extern const struct fs_t *fs_of_netboot;
-const struct fs_t *fs_open(struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name);
+const struct fs_t *fs_open(struct boot_file_t *file,
+ struct partition_t *part, struct boot_fspec_t *fspec);
#endif
diff -pur yaboot-1.3.14.orig/second/file.c yaboot-1.3.14/second/file.c
--- yaboot-1.3.14.orig/second/file.c 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/second/file.c 2010-02-08 13:07:31.960189430 +1100
@@ -38,19 +38,56 @@
extern char bootdevice[];
-static char *netdev_path_to_filename(const char *path)
+/* Convert __u32 into std, dotted quad string, leaks like a sive :( */
+static char *
+ipv4_to_str(__u32 ip)
{
- char *tmp, *args, *filename;
- size_t len;
+ char *buf = malloc(sizeof("000.000.000.000"));
- DEBUG_F("path = %s\n", path);
+ sprintf(buf,"%u.%u.%u.%u",
+ (ip & 0xff000000) >> 24, (ip & 0x00ff0000) >> 16,
+ (ip & 0x0000ff00) >> 8, (ip & 0x000000ff));
- if (!path)
+ return buf;
+}
+
+/*
+ * Copy the string from source to dest till newline or comma(,) is seen
+ * in the source.
+ * Move source and dest pointers respectively.
+ * Returns pointer to the start of the string that has just been copied.
+ */
+static char *
+scopy(char **dest, char **source)
+{
+ char *ret = *dest;
+
+ if (!**source)
return NULL;
- args = strrchr(path, ':');
+ while (**source != ',' && **source != '\0')
+ *(*dest)++ = *(*source)++;
+ if (**source != '\0')
+ *(*source)++;
+ **dest = '\0';
+ *(*dest)++;
+ return ret;
+}
+
+/*
+ * Extract all the ipv4 arguments from the bootpath provided and fill result
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_ipv4_args(char *imagepath, struct boot_fspec_t *result)
+{
+ char *tmp, *args, *str, *start;
+
+ args = strrchr(imagepath, ':');
if (!args)
- return NULL;
+ return 1;
+
+ start = args; /* used to see if we read any optional parameters */
/* The obp-tftp device arguments should be at the end of
* the argument list. Skip over any extra arguments (promiscuous,
@@ -77,46 +114,110 @@ static char *netdev_path_to_filename(con
if (tmp && tmp > args)
args = tmp + strlen("rarp");
- args = strchr(args, ',');
+ if (args != start) /* we read some parameters, so go past the next comma(,) */
+ args = strchr(args, ',');
if (!args)
- return NULL;
+ return 1;
+
+ str = malloc(strlen(args) + 1); /*long enough to hold all strings */
+ if (!str)
+ return 0;
+
+ if (args[-1] != ':')
+ args++; /* If comma(,) is not immediately followed by ':' then go past the , */
- tmp = args;
- tmp--;
- /* If the preceding character is ':' then there were no
- * non-obp-tftp arguments and we know we're right up to the
- * filename. Otherwise, we must advance args once more.
+ /*
+ * read the arguments in order: siaddr,filename,ciaddr,giaddr,
+ * bootp-retries,tftp-retries,addl_prameters
*/
- args++;
- if (*tmp != ':') {
- args = strchr(args, ',');
- if (!args)
- return NULL;
- args++;
+ result->siaddr = scopy(&str, &args);
+ result->file = scopy(&str, &args);
+ result->ciaddr = scopy(&str, &args);
+ result->giaddr = scopy(&str, &args);
+ result->bootp_retries = scopy(&str, &args);
+ result->tftp_retries = scopy(&str, &args);
+ if (*args) {
+ result->addl_params = strdup(args);
+ if (!result->addl_params)
+ return 0;
}
+ return 1;
+}
- /* filename may be empty; e.g. enet:192.168.1.1,,192.168.1.2 */
- if (*args == ',') {
- DEBUG_F("null filename\n");
- return NULL;
+/*
+ * Check netinfo for ipv4 parameters and add them to the fspec iff the
+ * fspec has no existing value.
+ *
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_netinfo_args(struct boot_fspec_t *result)
+{
+ struct bootp_packet *packet;
+
+ /* Check to see if we can get the [scyg]iaddr fields from netinfo */
+ packet = prom_get_netinfo();
+ if (packet == NULL)
+ return 0;
+
+ DEBUG_F("We have a boot packet\n");
+ DEBUG_F(" siaddr = <%x>\n", packet->siaddr);
+ DEBUG_F(" ciaddr = <%x>\n", packet->ciaddr);
+ DEBUG_F(" yiaddr = <%x>\n", packet->yiaddr);
+ DEBUG_F(" giaddr = <%x>\n", packet->giaddr);
+
+ /* Try to fallback to yiaddr if ciaddr is empty. Broken? */
+ if (packet->ciaddr == 0 && packet->yiaddr != 0)
+ packet->ciaddr = packet->yiaddr;
+
+ if ((result->siaddr == NULL || *(result->siaddr) == NULL)
+ && packet->siaddr != 0)
+ result->siaddr = ipv4_to_str(packet->siaddr);
+ if ((result->ciaddr == NULL || *(result->ciaddr) == NULL)
+ && packet->ciaddr != 0)
+ result->ciaddr = ipv4_to_str(packet->ciaddr);
+ if ((result->giaddr == NULL || *(result->giaddr) == NULL)
+ && packet->giaddr != 0)
+ result->giaddr = ipv4_to_str(packet->giaddr);
+
+ /* FIXME: Yck! if we /still/ do not have a gateway then "cheat" and use
+ * the server. This will be okay if the client and server are on
+ * the same IP network, if not then lets hope the server does ICMP
+ * redirections */
+ if (result->giaddr == NULL) {
+ result->giaddr = ipv4_to_str(packet->siaddr);
+ DEBUG_F("Forcing giaddr to siaddr <%s>\n", result->giaddr);
}
- /* Now see whether there are more args following the filename. */
- tmp = strchr(args, ',');
- if (!tmp)
- len = strlen(args) + 1;
- else
- len = tmp - args + 1;
+ return 1;
+}
- filename = malloc(len);
- if (!filename)
- return NULL;
+/*
+ * Extract all the arguments provided in the imagepath and fill it in result.
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_netboot_args(char *imagepath, struct boot_fspec_t *result)
+{
+ int ret;
+
+ DEBUG_F("imagepath = %s\n", imagepath);
- strncpy(filename, args, len);
- filename[len - 1] = '\0';
+ if (!imagepath)
+ return 1;
- DEBUG_F("filename = %s\n", filename);
- return filename;
+ ret = extract_ipv4_args(imagepath, result);
+ ret |= extract_netinfo_args(result);
+
+ DEBUG_F("siaddr = <%s>\n", result->siaddr);
+ DEBUG_F("file = <%s>\n", result->file);
+ DEBUG_F("ciaddr = <%s>\n", result->ciaddr);
+ DEBUG_F("giaddr = <%s>\n", result->giaddr);
+ DEBUG_F("bootp_retries = <%s>\n", result->bootp_retries);
+ DEBUG_F("tftp_retries = <%s>\n", result->tftp_retries);
+ DEBUG_F("addl_params = <%s>\n", result->addl_params);
+
+ return ret;
}
static char *netdev_path_to_dev(const char *path)
@@ -163,6 +264,10 @@ static char *netdev_path_to_dev(const ch
- enet:,/tftpboot/vmlinux
- enet:bootp
- enet:0
+ - arguments for obp-tftp open as specified in section 4.1 of
+ http://playground.sun.com/1275/practice/obp-tftp/tftp1_0.pdf
+ [bootp,]siaddr,filename,ciaddr,giaddr,bootp-retries,tftp-retries
+ ex: enet:bootp,10.0.0.11,bootme,10.0.0.12,10.0.0.1,5,5
Supported only if defdevice == NULL
- disc
- any other device path lacking a :
@@ -179,6 +284,9 @@ parse_device_path(char *imagepath, char
char *defdev = NULL;
int device_kind = -1;
+ DEBUG_F("imagepath = %s; defdevice %s; defpart %d, deffile %s\n",
+ imagepath, defdevice, defpart, deffile);
+
result->dev = NULL;
result->part = -1;
result->file = NULL;
@@ -247,10 +355,15 @@ parse_device_path(char *imagepath, char
}
if (device_kind == FILE_DEVICE_NET) {
- if (strchr(ipath, ':'))
- result->file = netdev_path_to_filename(ipath);
- else
+ if (strchr(ipath, ':')) {
+ if (extract_netboot_args(ipath, result) == 0)
+ return 0;
+ } else {
+ /* If we didn't get a ':' then look only in netinfo */
+ if (extract_netinfo_args(result) == 0)
+ return 0;
result->file = strdup(ipath);
+ }
if (!defdev)
result->dev = netdev_path_to_dev(ipath);
@@ -287,15 +400,14 @@ parse_device_path(char *imagepath, char
static int
file_block_open( struct boot_file_t* file,
- const char* dev_name,
- const char* file_name,
+ struct boot_fspec_t* fspec,
int partition)
{
struct partition_t* parts;
struct partition_t* p;
struct partition_t* found;
- parts = partitions_lookup(dev_name);
+ parts = partitions_lookup(fspec->dev);
found = NULL;
#if DEBUG
@@ -308,7 +420,7 @@ file_block_open( struct boot_file_t* fil
DEBUG_F("number: %02d, start: 0x%08lx, length: 0x%08lx\n",
p->part_number, p->part_start, p->part_size );
if (partition == -1) {
- file->fs = fs_open( file, dev_name, p, file_name );
+ file->fs = fs_open( file, p, fspec );
if (file->fs == NULL || fserrorno != FILE_ERR_OK)
continue;
else {
@@ -328,7 +440,7 @@ file_block_open( struct boot_file_t* fil
* cases, let OF figure out a default partition.
*/
DEBUG_F( "Using OF defaults.. (found = %p)\n", found );
- file->fs = fs_open( file, dev_name, found, file_name );
+ file->fs = fs_open( file, found, fspec );
done:
if (parts)
@@ -338,12 +450,10 @@ done:
}
static int
-file_net_open( struct boot_file_t* file,
- const char* dev_name,
- const char* file_name)
+file_net_open(struct boot_file_t* file, struct boot_fspec_t *fspec)
{
file->fs = fs_of_netboot;
- return fs_of_netboot->open(file, dev_name, NULL, file_name);
+ return fs_of_netboot->open(file, NULL, fspec);
}
static int
@@ -380,7 +490,7 @@ static struct fs_t fs_default =
};
-int open_file(const struct boot_fspec_t* spec, struct boot_file_t* file)
+int open_file(struct boot_fspec_t* spec, struct boot_file_t* file)
{
int result;
@@ -399,10 +509,10 @@ int open_file(const struct boot_fspec_t*
switch(file->device_kind) {
case FILE_DEVICE_BLOCK:
DEBUG_F("device is a block device\n");
- return file_block_open(file, spec->dev, spec->file, spec->part);
+ return file_block_open(file, spec, spec->part);
case FILE_DEVICE_NET:
DEBUG_F("device is a network device\n");
- return file_net_open(file, spec->dev, spec->file);
+ return file_net_open(file, spec);
}
return 0;
}
diff -pur yaboot-1.3.14.orig/second/fs.c yaboot-1.3.14/second/fs.c
--- yaboot-1.3.14.orig/second/fs.c 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/second/fs.c 2010-02-08 13:07:31.963189318 +1100
@@ -56,12 +56,12 @@ const struct fs_t *fs_of = &of_filesyste
const struct fs_t *fs_of_netboot = &of_net_filesystem; /* needed by file.c */
const struct fs_t *
-fs_open(struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name)
+fs_open(struct boot_file_t *file,
+ struct partition_t *part, struct boot_fspec_t *fspec)
{
const struct fs_t **fs;
for (fs = block_filesystems; *fs; fs++)
- if ((fserrorno = (*fs)->open(file, dev_name, part, file_name)) != FILE_ERR_BAD_FSYS)
+ if ((fserrorno = (*fs)->open(file, part, fspec)) != FILE_ERR_BAD_FSYS)
break;
return *fs;
diff -pur yaboot-1.3.14.orig/second/fs_ext2.c yaboot-1.3.14/second/fs_ext2.c
--- yaboot-1.3.14.orig/second/fs_ext2.c 2010-02-08 13:06:21.083438946 +1100
+++ yaboot-1.3.14/second/fs_ext2.c 2010-02-08 13:07:31.964188908 +1100
@@ -46,9 +46,8 @@ typedef int FILE;
#include "ext2fs/ext2fs.h"
static int ext2_open( struct boot_file_t* file,
- const char* dev_name,
struct partition_t* part,
- const char* file_name);
+ struct boot_fspec_t* fspec);
static int ext2_read( struct boot_file_t* file,
unsigned int size,
void* buffer);
@@ -123,14 +122,15 @@ void com_err (const char *a, long i, con
static int
ext2_open( struct boot_file_t* file,
- const char* dev_name,
struct partition_t* part,
- const char* file_name)
+ struct boot_fspec_t* fspec)
{
int result = 0;
int error = FILE_ERR_NOTFOUND;
static char buffer[1024];
int ofopened = 0;
+ char *dev_name = fspec->dev;
+ char *file_name = fspec->file;
DEBUG_ENTER;
DEBUG_OPEN;
diff -pur yaboot-1.3.14.orig/second/fs_iso.c yaboot-1.3.14/second/fs_iso.c
--- yaboot-1.3.14.orig/second/fs_iso.c 2007-08-18 00:29:26.000000000 +1000
+++ yaboot-1.3.14/second/fs_iso.c 2010-02-08 13:07:31.965185705 +1100
@@ -29,9 +29,8 @@
#include "errors.h"
static int iso_open( struct boot_file_t* file,
- const char* dev_name,
struct partition_t* part,
- const char* file_name);
+ struct boot_fspec_t* fspec);
static int iso_read( struct boot_file_t* file,
unsigned int size,
void* buffer);
@@ -50,9 +49,8 @@ struct fs_t iso_filesystem =
static int
iso_open( struct boot_file_t* file,
- const char* dev_name,
struct partition_t* part,
- const char* file_name)
+ struct boot_fspec_t* fspec)
{
return FILE_ERR_BAD_FSYS;
}
diff -pur yaboot-1.3.14.orig/second/fs_of.c yaboot-1.3.14/second/fs_of.c
--- yaboot-1.3.14.orig/second/fs_of.c 2010-02-08 13:06:21.058435316 +1100
+++ yaboot-1.3.14/second/fs_of.c 2010-02-08 13:08:27.845210705 +1100
@@ -45,17 +45,17 @@
#include "debug.h"
#define LOAD_BUFFER_POS 0x00000000
-#define LOAD_BUFFER_SIZE 0x01000000
+#define LOAD_BUFFER_SIZE 0x02000000
-static int of_open(struct boot_file_t* file, const char* dev_name,
- struct partition_t* part, const char* file_name);
+static int of_open(struct boot_file_t* file,
+ struct partition_t* part, struct boot_fspec_t* fspec);
static int of_read(struct boot_file_t* file, unsigned int size, void* buffer);
static int of_seek(struct boot_file_t* file, unsigned int newpos);
static int of_close(struct boot_file_t* file);
-static int of_net_open(struct boot_file_t* file, const char* dev_name,
- struct partition_t* part, const char* file_name);
+static int of_net_open(struct boot_file_t* file,
+ struct partition_t* part, struct boot_fspec_t* fspec);
static int of_net_read(struct boot_file_t* file, unsigned int size, void* buffer);
static int of_net_seek(struct boot_file_t* file, unsigned int newpos);
@@ -79,8 +79,8 @@ struct fs_t of_net_filesystem =
};
static int
-of_open(struct boot_file_t* file, const char* dev_name,
- struct partition_t* part, const char* file_name)
+of_open(struct boot_file_t* file,
+ struct partition_t* part, struct boot_fspec_t* fspec)
{
static char buffer[1024];
char *filename;
@@ -89,7 +89,7 @@ of_open(struct boot_file_t* file, const
DEBUG_ENTER;
DEBUG_OPEN;
- strncpy(buffer, dev_name, 768);
+ strncpy(buffer, fspec->dev, 768);
strcat(buffer, ":");
if (part) {
if (part->sys_ind == LINUX_RAID) {
@@ -101,10 +101,10 @@ of_open(struct boot_file_t* file, const
sprintf(pn, "%02d", part->part_number);
strcat(buffer, pn);
}
- if (file_name && strlen(file_name)) {
+ if (fspec->file && strlen(fspec->file)) {
if (part)
strcat(buffer, ",");
- filename = strdup(file_name);
+ filename = strdup(fspec->file);
for (p = filename; *p; p++)
if (*p == '/')
*p = '\\';
@@ -131,25 +131,47 @@ of_open(struct boot_file_t* file, const
}
static int
-of_net_open(struct boot_file_t* file, const char* dev_name,
- struct partition_t* part, const char* file_name)
+of_net_open(struct boot_file_t* file,
+ struct partition_t* part, struct boot_fspec_t* fspec)
{
static char buffer[1024];
- char *filename;
+ char *filename = NULL;
char *p;
DEBUG_ENTER;
DEBUG_OPEN;
- strncpy(buffer, dev_name, 768);
- if (file_name && strlen(file_name)) {
- strcat(buffer, ",");
- filename = strdup(file_name);
+ if (fspec->file && strlen(fspec->file)) {
+ filename = strdup(fspec->file);
for (p = filename; *p; p++)
if (*p == '/')
*p = '\\';
- strcat(buffer, filename);
- free(filename);
+ }
+
+ DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;\n",
+ fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr);
+ strncpy(buffer, fspec->dev, 768);
+ /* If we didn't get a ':' include one */
+ if (fspec->dev[strlen(fspec->dev)-1] != ':')
+ strcat(buffer, ":");
+ strcat(buffer, fspec->siaddr);
+ strcat(buffer, ",");
+ strcat(buffer, filename);
+ strcat(buffer, ",");
+ strcat(buffer, fspec->ciaddr);
+ strcat(buffer, ",");
+ strcat(buffer, fspec->giaddr);
+
+ /* If /packages/cas exists the we have a "new skool" tftp */
+ if (prom_finddevice("/packages/cas") != PROM_INVALID_HANDLE) {
+ strcat(buffer, ",");
+ strcat(buffer, fspec->bootp_retries);
+ strcat(buffer, ",");
+ strcat(buffer, fspec->tftp_retries);
+ strcat(buffer, ",");
+ strcat(buffer, fspec->addl_params);
+ } else {
+ DEBUG_F("No \"/packages/cas\" using simple args\n")
}
DEBUG_F("Opening: \"%s\"\n", buffer);
diff -pur yaboot-1.3.14.orig/second/fs_reiserfs.c yaboot-1.3.14/second/fs_reiserfs.c
--- yaboot-1.3.14.orig/second/fs_reiserfs.c 2010-02-08 13:06:21.058435316 +1100
+++ yaboot-1.3.14/second/fs_reiserfs.c 2010-02-08 13:07:31.970189661 +1100
@@ -33,8 +33,8 @@
#include "reiserfs/reiserfs.h"
/* Exported in struct fs_t */
-static int reiserfs_open( struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name );
+static int reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+ struct boot_fspec_t *fspec);
static int reiserfs_read( struct boot_file_t *file, unsigned int size,
void *buffer );
@@ -63,10 +63,12 @@ int errnum;
static int
-reiserfs_open( struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name )
+reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+ struct boot_fspec_t *fspec)
{
static char buffer[1024];
+ char *dev_name = fspec->dev;
+ char *file_name = fspec->file;
DEBUG_ENTER;
DEBUG_OPEN;
@@ -74,7 +76,7 @@ reiserfs_open( struct boot_file_t *file,
memset( INFO, 0, sizeof(struct reiserfs_state) );
INFO->file = file;
- if (part)
+ if (fspec->part)
{
DEBUG_F( "Determining offset for partition %d\n", part->part_number );
INFO->partition_offset = ((uint64_t)part->part_start) * part->blocksize;
diff -pur yaboot-1.3.14.orig/second/fs_xfs.c yaboot-1.3.14/second/fs_xfs.c
--- yaboot-1.3.14.orig/second/fs_xfs.c 2010-02-08 13:06:21.059432320 +1100
+++ yaboot-1.3.14/second/fs_xfs.c 2010-02-08 13:07:31.972189749 +1100
@@ -39,8 +39,8 @@ int xfs_read_data (char *buf, int len);
int xfs_dir (char *dirname);
/* Exported in struct fs_t */
-static int xfs_open(struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name);
+static int xfs_open(struct boot_file_t *file,
+ struct partition_t *part, struct boot_fspec_t *fspec);
static int xfs_read(struct boot_file_t *file, unsigned int size, void *buffer);
static int xfs_seek(struct boot_file_t *file, unsigned int newpos);
static int xfs_close(struct boot_file_t *file);
@@ -59,8 +59,8 @@ uint64_t partition_offset;
int errnum;
static int
-xfs_open(struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name)
+xfs_open(struct boot_file_t *file,
+ struct partition_t *part, struct boot_fspec_t *fspec)
{
static char buffer[1024];
@@ -78,11 +78,11 @@ xfs_open(struct boot_file_t *file, const
else
partition_offset = 0;
- strncpy(buffer, dev_name, 1020);
+ strncpy(buffer, fspec->dev, 1020);
if (_machine != _MACH_bplan)
strcat(buffer, ":0"); /* 0 is full disk in (non-buggy) OF */
DEBUG_F("Trying to open dev_name=%s; filename=%s; partition offset=%Lu\n",
- buffer, file_name, partition_offset);
+ buffer, fspec->file, partition_offset);
file->of_device = prom_open(buffer);
if (file->of_device == PROM_INVALID_HANDLE || file->of_device == NULL)
@@ -105,8 +105,8 @@ xfs_open(struct boot_file_t *file, const
return FILE_ERR_BAD_FSYS;
}
- DEBUG_F("Attempting to open %s\n", file_name);
- strcpy(buffer, file_name); /* xfs_dir modifies argument */
+ DEBUG_F("Attempting to open %s\n", fspec->file);
+ strcpy(buffer, fspec->file); /* xfs_dir modifies argument */
if(!xfs_dir(buffer))
{
DEBUG_F("xfs_dir() failed. errnum = %d\n", errnum);
@@ -116,7 +116,7 @@ xfs_open(struct boot_file_t *file, const
return errnum;
}
- DEBUG_F("Successfully opened %s\n", file_name);
+ DEBUG_F("Successfully opened %s\n", fspec->file);
DEBUG_LEAVE(FILE_ERR_OK);
return FILE_ERR_OK;
diff -pur yaboot-1.3.14.orig/second/yaboot.c yaboot-1.3.14/second/yaboot.c
--- yaboot-1.3.14.orig/second/yaboot.c 2010-02-08 13:06:21.115436698 +1100
+++ yaboot-1.3.14/second/yaboot.c 2010-02-08 13:07:31.975188101 +1100
@@ -300,6 +300,7 @@ void print_message_file(char *filename)
}
strncpy(msgpath, filename, sizeof(msgpath));
+ msgfile = boot; /* Copy all the original paramters */
if (!parse_device_path(msgpath, defdev, defpart, "/etc/yaboot.msg", &msgfile)) {
prom_printf("%s: Unable to parse\n", msgpath);
goto done;
@@ -988,6 +989,7 @@ int get_params(struct boot_param_t* para
if (!label && password)
check_password ("To boot a custom image you must enter the password.");
+ params->kernel = boot; /* Copy all the original paramters */
if (!parse_device_path(imagepath, defdevice, defpart,
"/vmlinux", &params->kernel)) {
prom_printf("%s: Unable to parse\n", imagepath);
@@ -1009,6 +1011,7 @@ int get_params(struct boot_param_t* para
strncpy(initrdpath, p, 1024);
DEBUG_F("Parsing initrd path <%s>\n", initrdpath);
+ params->rd = boot; /* Copy all the original paramters */
if (!parse_device_path(initrdpath, defdevice, defpart,
"/root.bin", &params->rd)) {
prom_printf("%s: Unable to parse\n", imagepath);
@@ -1019,6 +1022,7 @@ int get_params(struct boot_param_t* para
if (p && *p) {
DEBUG_F("Parsing sysmap path <%s>\n", p);
strncpy(sysmappath, p, 1024);
+ params->sysmap = boot; /* Copy all the original paramters */
if (!parse_device_path(sysmappath, defdevice, defpart,
"/boot/System.map", &params->sysmap)) {
prom_printf("%s: Unable to parse\n", imagepath);

View File

@ -0,0 +1,316 @@
diff -purN yaboot-1.3.14.orig/include/file.h yaboot-1.3.14/include/file.h
--- yaboot-1.3.14.orig/include/file.h 2009-10-15 11:39:01.112642471 +1100
+++ yaboot-1.3.14/include/file.h 2009-10-15 15:29:04.692654961 +1100
@@ -45,6 +45,7 @@ struct boot_fspec_t {
char* giaddr; /* Gateway address */
char* bootp_retries; /* Bootp retries */
char* tftp_retries; /* TFTP retries */
+ char* subnetmask; /* Subnet mask */
char* addl_params; /* copy all additional parameters */
/* Following fields are used only in ipv6 format */
diff -purN yaboot-1.3.14.orig/include/prom.h yaboot-1.3.14/include/prom.h
--- yaboot-1.3.14.orig/include/prom.h 2009-10-15 15:23:39.796944672 +1100
+++ yaboot-1.3.14/include/prom.h 2009-10-15 15:29:04.692654961 +1100
@@ -153,7 +153,7 @@ struct bootp_packet {
unsigned char chaddr[16];
unsigned char sname[64];
unsigned char file[128];
- /* vendor options go here if we need them */
+ unsigned char options[]; /* vendor options */
};
struct bootp_packet * prom_get_netinfo (void);
diff -purN yaboot-1.3.14.orig/second/cfg.c yaboot-1.3.14/second/cfg.c
--- yaboot-1.3.14.orig/second/cfg.c 2009-10-15 15:23:39.798647660 +1100
+++ yaboot-1.3.14/second/cfg.c 2009-10-15 15:29:04.693668247 +1100
@@ -597,6 +597,9 @@ int cfg_set_default_by_mac (char *mac_ad
char * label = NULL;
int haslabel = 0;
+ if (mac_addr == NULL)
+ return 0;
+
/* check if there is an image label equal to mac_addr */
for (tmp = images; tmp; tmp = tmp->next) {
label = cfg_get_strg_i (tmp->table, "label");
diff -purN yaboot-1.3.14.orig/second/file.c yaboot-1.3.14/second/file.c
--- yaboot-1.3.14.orig/second/file.c 2009-10-15 15:23:39.802647442 +1100
+++ yaboot-1.3.14/second/file.c 2009-10-15 15:29:04.694645423 +1100
@@ -51,6 +51,42 @@ ipv4_to_str(__u32 ip)
return buf;
}
+/* FIXME: COMMENT */
+static char * is_valid_ip_str(char *str)
+{
+ int i;
+ long tmp;
+ __u32 ip = 0;
+ char *ptr=str, *endptr;
+
+ if (str == NULL)
+ return NULL;
+
+ for (i=0; i<4; i++, ptr = ++endptr) {
+ tmp = strtol(ptr, &endptr, 10);
+ if ((tmp & 0xff) != tmp)
+ return NULL;
+
+ /* If we reach the end of the string but we're not in the 4th octet
+ * we have an invalid IP */
+ if (*endptr == '\x0' && i!=3)
+ return NULL;
+
+ /* If we have anything other than a NULL or '.' we have an invlaid
+ * IP */
+ if (*endptr != '\x0' && *endptr != '.')
+ return NULL;
+
+ ip += (tmp << (24-(i*8)));
+ }
+
+ if (ip == 0 || ip == ~0u)
+ return NULL;
+
+ return str;
+}
+
+
/*
* Copy the string from source to dest till newline or comma(,) is seen
* in the source.
@@ -130,12 +166,13 @@ extract_ipv4_args(char *imagepath, struc
* read the arguments in order: siaddr,filename,ciaddr,giaddr,
* bootp-retries,tftp-retries,addl_prameters
*/
- result->siaddr = scopy(&str, &args);
+ result->siaddr = is_valid_ip_str(scopy(&str, &args));
result->file = scopy(&str, &args);
- result->ciaddr = scopy(&str, &args);
- result->giaddr = scopy(&str, &args);
+ result->ciaddr = is_valid_ip_str(scopy(&str, &args));
+ result->giaddr = is_valid_ip_str(scopy(&str, &args));
result->bootp_retries = scopy(&str, &args);
result->tftp_retries = scopy(&str, &args);
+ result->subnetmask = scopy(&str, &args);
if (*args) {
result->addl_params = strdup(args);
if (!result->addl_params)
@@ -144,6 +181,82 @@ extract_ipv4_args(char *imagepath, struc
return 1;
}
+/* DHCP options */
+enum dhcp_options {
+ DHCP_PAD = 0,
+ DHCP_NETMASK = 1,
+ DHCP_ROUTERS = 3,
+ DHCP_DNS = 6,
+ DHCP_END = 255,
+};
+
+#define DHCP_COOKIE 0x63825363
+#define DHCP_COOKIE_SIZE 4
+
+/*
+ * FIXME: COMMENT
+ */
+static void
+extract_vendor_options(struct bootp_packet *packet, struct boot_fspec_t *result)
+{
+ int i = 0;
+ __u32 cookie;
+ __u8 *options = &packet->options[0];
+
+ memcpy(&cookie, &options[i], DHCP_COOKIE_SIZE);
+
+ if (cookie != DHCP_COOKIE) {
+ prom_printf("EEEK! cookie is fubar got %08x expected %08x\n",
+ cookie, DHCP_COOKIE);
+ return;
+ }
+
+ i += DHCP_COOKIE_SIZE;
+
+ /* FIXME: It may be possible to run off the end of a packet here /if/
+ * it's malformed. :( */
+ while (options[i] != DHCP_END) {
+ __u8 tag = options[i++], len;
+ __u32 value;
+
+ if (tag == DHCP_PAD)
+ continue;
+
+ len = options[i++];
+ memcpy(&value, &options[i], len);
+
+#if DEBUG
+{
+ DEBUG_F("tag=%2d, len=%2d, data=", tag, len);
+ int j;
+ for (j=0; j<len; j++)
+ prom_printf("%02x", options[i+j]);
+ prom_printf("\n");
+}
+#endif
+
+ switch (tag) {
+ case DHCP_NETMASK:
+ if ((result->subnetmask == NULL || *(result->subnetmask) == '\x0') && value != 0) {
+ result->subnetmask = ipv4_to_str(value);
+ DEBUG_F("Storing %s as subnetmask from options\n",
+ result->subnetmask);
+ }
+ /* FIXME: do we need to grok the subnet mask? */
+ break;
+ case DHCP_ROUTERS:
+ if ((result->giaddr == NULL || *(result->giaddr) == '\x0')
+ && value != 0) {
+ result->giaddr = ipv4_to_str(value);
+ DEBUG_F("Storing %s as gateway from options\n",
+ result->giaddr);
+ }
+ break;
+ }
+ i += len;
+ }
+}
+
/*
* Check netinfo for ipv4 parameters and add them to the fspec iff the
* fspec has no existing value.
@@ -170,16 +283,18 @@ extract_netinfo_args(struct boot_fspec_t
if (packet->ciaddr == 0 && packet->yiaddr != 0)
packet->ciaddr = packet->yiaddr;
- if ((result->siaddr == NULL || *(result->siaddr) == NULL)
+ if ((result->siaddr == NULL || *(result->siaddr) == '\x0')
&& packet->siaddr != 0)
result->siaddr = ipv4_to_str(packet->siaddr);
- if ((result->ciaddr == NULL || *(result->ciaddr) == NULL)
+ if ((result->ciaddr == NULL || *(result->ciaddr) == '\x0')
&& packet->ciaddr != 0)
result->ciaddr = ipv4_to_str(packet->ciaddr);
- if ((result->giaddr == NULL || *(result->giaddr) == NULL)
+ if ((result->giaddr == NULL || *(result->giaddr) == '\x0')
&& packet->giaddr != 0)
result->giaddr = ipv4_to_str(packet->giaddr);
+ extract_vendor_options(packet, result);
+
/* FIXME: Yck! if we /still/ do not have a gateway then "cheat" and use
* the server. This will be okay if the client and server are on
* the same IP network, if not then lets hope the server does ICMP
diff -purN yaboot-1.3.14.orig/second/fs_of.c yaboot-1.3.14/second/fs_of.c
--- yaboot-1.3.14.orig/second/fs_of.c 2009-10-15 15:23:39.805647069 +1100
+++ yaboot-1.3.14/second/fs_of.c 2009-10-15 15:29:04.695645439 +1100
@@ -137,6 +137,7 @@ of_net_open(struct boot_file_t* file,
static char buffer[1024];
char *filename = NULL;
char *p;
+ int new_tftp;
DEBUG_ENTER;
DEBUG_OPEN;
@@ -148,34 +149,47 @@ of_net_open(struct boot_file_t* file,
*p = '\\';
}
- DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>; ipv6 <%d>\n",
- fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr, fspec->is_ipv6);
+ DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;"
+ " ipv6 <%d>\n",
+ fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr,
+ fspec->is_ipv6);
+
strncpy(buffer, fspec->dev, 768);
if (fspec->is_ipv6)
strcat(buffer, TOK_IPV6 ",");
- /* If we didn't get a ':' include one */
- if (fspec->dev[strlen(fspec->dev)-1] != ':')
+ else if (fspec->dev[strlen(fspec->dev)-1] != ':')
strcat(buffer, ":");
- strcat(buffer, fspec->siaddr);
- strcat(buffer, ",");
- if (fspec->is_ipv6 && (strstr(filename, "filename=") == NULL))
- strcat(buffer, "filename=");
- strcat(buffer, filename);
- strcat(buffer, ",");
- strcat(buffer, fspec->ciaddr);
- strcat(buffer, ",");
- strcat(buffer, fspec->giaddr);
- /* If /packages/cas exists the we have a "new skool" tftp */
- if (prom_finddevice("/packages/cas") != PROM_INVALID_HANDLE) {
+ /* If /packages/cas exists the we have a "new skool" tftp.
+ * This means that siaddr is the tftp server and that we can add
+ * {tftp,bootp}_retrys, subnet mask and tftp block size to the load
+ * method */
+ new_tftp = (prom_finddevice("/packages/cas") != PROM_INVALID_HANDLE);
+ DEBUG_F("Using %s tftp style\n", (new_tftp? "new": "old"));
+
+ if (new_tftp) {
+ strcat(buffer, fspec->siaddr);
+ strcat(buffer, ",");
+
+ if (fspec->is_ipv6 && (strstr(filename, "filename=") == NULL))
+ strcat(buffer, "filename=");
+
+ strcat(buffer, filename);
+ strcat(buffer, ",");
+ strcat(buffer, fspec->ciaddr);
strcat(buffer, ",");
+ strcat(buffer, fspec->giaddr);
+ strcat(buffer, ",");
strcat(buffer, fspec->bootp_retries);
strcat(buffer, ",");
strcat(buffer, fspec->tftp_retries);
strcat(buffer, ",");
+ strcat(buffer, fspec->subnetmask);
+ strcat(buffer, ",");
strcat(buffer, fspec->addl_params);
} else {
- DEBUG_F("No \"/packages/cas\" using simple args\n")
+ strcat(buffer, ",");
+ strcat(buffer, filename);
}
DEBUG_F("Opening: \"%s\"\n", buffer);
diff -purN yaboot-1.3.14.orig/second/prom.c yaboot-1.3.14/second/prom.c
--- yaboot-1.3.14.orig/second/prom.c 2009-10-15 15:23:39.806647224 +1100
+++ yaboot-1.3.14/second/prom.c 2009-10-15 15:29:04.696645314 +1100
@@ -685,6 +685,10 @@ struct bootp_packet * prom_get_netinfo (
void *bootp_response = NULL;
char *propname;
struct bootp_packet *packet;
+ /* struct bootp_packet contains a VLA, so sizeof won't work.
+ the VLA /must/ be the last field in the structure so use it's
+ offset as a good estimate of the packet size */
+ size_t packet_size = offsetof(struct bootp_packet, options);
int i = 0, size, offset = 0;
prom_handle chosen;
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
@@ -709,7 +713,7 @@ struct bootp_packet * prom_get_netinfo (
if (size <= 0)
return NULL;
- if (sizeof(*packet) > size - offset) {
+ if (packet_size > size - offset) {
prom_printf("Malformed %s property?\n", propname);
return NULL;
}
diff -purN yaboot-1.3.14.orig/second/yaboot.c yaboot-1.3.14/second/yaboot.c
--- yaboot-1.3.14.orig/second/yaboot.c 2009-10-15 15:23:39.809646432 +1100
+++ yaboot-1.3.14/second/yaboot.c 2009-10-15 15:29:04.697642396 +1100
@@ -471,6 +471,10 @@ static int load_my_config_file(struct bo
int minlen;
packet = prom_get_netinfo();
+ if (packet == NULL) {
+ prom_printf("Failed to get netinfo data\n");
+ return 0;
+ }
/*
* First, try to match on mac address with the hardware type

View File

@ -0,0 +1,12 @@
diff -up yaboot-1.3.14/second/cfg.c.bigger-max-token yaboot-1.3.14/second/cfg.c
--- yaboot-1.3.14/second/cfg.c.bigger-max-token 2008-11-12 14:39:11.000000000 -0500
+++ yaboot-1.3.14/second/cfg.c 2008-11-12 14:39:17.000000000 -0500
@@ -41,7 +41,7 @@ typedef struct {
void *data;
} CONFIG;
-#define MAX_TOKEN 200
+#define MAX_TOKEN 511
#define MAX_VAR_NAME MAX_TOKEN
#define EOF -1

View File

@ -0,0 +1,15 @@
diff -urNp yaboot-1.3.14.orig/second/fs_of.c yaboot-1.3.14/second/fs_of.c
--- yaboot-1.3.14.orig/second/fs_of.c 2009-10-14 09:39:46.263661071 +1100
+++ yaboot-1.3.14/second/fs_of.c 2009-10-14 09:43:42.932691139 +1100
@@ -92,8 +92,8 @@ of_open(struct boot_file_t* file,
strncpy(buffer, fspec->dev, 768);
strcat(buffer, ":");
if (part) {
- if (part->sys_ind == LINUX_RAID) {
- DEBUG_F("skipping because partition is marked LINUX_RAID\n");
+ if (part->sys_ind == LINUX_RAID || part->sys_ind == LINUX_NATIVE) {
+ DEBUG_F("skipping because partition is marked %x\n", part->sys_ind);
DEBUG_LEAVE(FILE_ERR_BAD_FSYS);
return FILE_ERR_BAD_FSYS;
}
Binary files yaboot-1.3.14.orig/second/.fs_of.c.swp and yaboot-1.3.14/second/.fs_of.c.swp differ

View File

@ -0,0 +1,21 @@
diff -up yaboot-1.3.14/ybin/ybin.fix-bootonce-nvram yaboot-1.3.14/ybin/ybin
--- yaboot-1.3.14/ybin/ybin.fix-bootonce-nvram 2008-11-12 14:51:28.000000000 -0500
+++ yaboot-1.3.14/ybin/ybin 2008-11-13 12:15:21.000000000 -0500
@@ -1689,14 +1689,15 @@ checkconf || exit 1
if [ "x$bootonce" != "x" ]; then
foundlabel=`sed s/\#.*// $bootconf | grep "label=$bootonce$" | wc -l`
- if [ "$nonvram" = 0 ]; then
+ if [ "$nonvram" = 1 ]; then
echo 1>&2 "$PRG: --bootonce specified, but nvsetenv not available."
exit 1
fi
if [ "$foundlabel" = 1 ]; then
nvsetenv boot-once "$bootonce"
foundlabel=`nvsetenv boot-once`
- if [ "$foundlabel" != "boot-once=$bootonce" ]; then
+ if [ "$foundlabel" != "boot-once=$bootonce" -a \
+ "$foundlabel" != "$bootonce" ]; then
echo 1>&2 "$PRG: Could not nvsetenv boot-once $bootonce"
exit 1
fi

View File

@ -0,0 +1,725 @@
commit 37578220a9120f0a7770b0c6c6eae046ce72fc93
Author: David Woodhouse <dwmw2@infradead.org>
Date: Fri Mar 28 00:04:02 2008 +0000
Pegasos and partition numbering
The whole bplan partition numbering thing is a clusterfuck, but it
shouldn't be as crappy as it is.
We can _cope_ with the fact that firmware is broken and has an
off-by-one in its partition numbering. All we need to do in yaboot is
add 1 to the partition numbers we infer from in /chosen/boot-device, if
we detect that we're on an afflicted machine. That's all we need to do,
and all we ever _should_ have done. And is already in yaboot. Yaboot
does its own block device handling, including partitions, and doesn't
ever care about the firmware's problems (in that respect, at least).
It doesn't affect the installer at _all_, because the installer can't
set up the firmware's boot-device anyway and it has to be done by hand.
All it affects is the release notes telling the user how to make it
bootable.
Unfortunately, we didn't make it that simple when we first supported the
Pegasos. For reasons which aren't entirely clear to me, we ended up with
Amiga partition table support in yaboot with the _same_ off-by-one
error, to match the firmware. And thus we have hacks in the installer to
use amiga partitions for Pegasos, and to cope with the off-by-one crap.
It's only after avoiding all this crap purely by accident on Efika, by
using DOS partition tables, that I realise how stupid I was to blindly
copy the crap that other people were doing, and to believe that Pegasos
would only work with Amiga partition tables.
I'd like to get rid of the off-by-one bug in yaboot's Amiga partition
handling. At the moment, our simple 'if bplan, partition++' in
yaboot_main() is wrong when we have Amiga partitions, although it's fine
for other partition types.
Actually, I'd also like to make that same increment conditional on
!conf_given, so that if someone specifies 'conf=hd:1,/yaboot.conf' on
the command line, that partition number _isn't_ incremented.
So any time you see a proper path specified as 'dev:part,/path/name' you
know it's a real one with proper partition numbers. Remember, the bplan
firmware doesn't allow that form, and takes a space between the
'dev:part' bit and the filename:
boot hd:0 /yaboot/yaboot conf=hd:1,/yaboot/yaboot.conf
Fixing the off-by-one bug in the Amiga partition handling means that
upgrades might break. I suppose we could have a 'noamigaoffbyone'
configuration option which all newly-written yaboot.conf files would
have, which controls this behaviour. But to be honest I just don't think
it's worth it.
commit 0c0a18b7a1a6b44963da4469d21428e76f9c2b30
Author: Mike Wolf <mjw@linux.vnet.ibm.com>
Date: Tue Jan 15 14:33:51 2008 -0600
use public interface to detect CAS reboots (take 2)
This is the second pass of this patch. The fw variable name is changed
to use ibm,client-architecture-support-reboot field which is already present
in the firmware. Please disregard the previous patch.
The firmware field used to detect CAS reboots (ibm,fw-nbr-reboots) is
really a private field that could change without warning. A new field
ibm,#reconfig-reboots will be added as a public interface intended to
be used for this detection. The patch will first check for
ibm,client-architecture-support-reboot if that is not found it will see
if ibm,fw-nbr-reboots is present and will use that instead.
-------
commit 526b77920b050e1e37e842e8def4a5e7fb04cee6
Author: Paul Nasrat <pauln@truemesh.com>
Date: Fri Jan 4 13:00:19 2008 +0000
The CAS (Client-Architecture Support) call tells firmware what capabilities the
OS has. These capabilities result in different modes which the device-tree is
configured in, as well as what processor capabilities are presented. So, if
the capabilities are different from what was previously booted, firmware has to
reboot to reconfigure the device-tree. The second boot will have the updated
device-tree and we can boot as normal.
When this firmware initiated reboot occurs yaboot will now boot the same kernel
as the previous boot attempt with no action by the user needed. I have
successfully booted on POWER5 and POWER6 machines using various levels of the
kernel.
Patch from: Mike Wolf <mjw@linux.vnet.ibm.com>
commit f843e296a197cc94c0e0f80d49a67dc71c6785a2
Author: Paul Nasrat <pauln@truemesh.com>
Date: Thu Jan 3 19:21:44 2008 +0000
Revert "The attached patch adds support for writing the nvram using the nvram"
This reverts commit ac8fbd5ad52b43b820973f1828a29f85bed13a1d.
commit 50b58606fb2d11aa6548d1fec606275c33a930c7
Author: Paul Nasrat <pauln@truemesh.com>
Date: Thu Jan 3 19:21:22 2008 +0000
Revert "Fix shell syntax"
This reverts commit 24679e706305e0910f181a9640b8b88a30662d03.
commit 24679e706305e0910f181a9640b8b88a30662d03
Author: Paul Nasrat <pauln@truemesh.com>
Date: Thu Jan 3 19:07:50 2008 +0000
Fix shell syntax
commit ac8fbd5ad52b43b820973f1828a29f85bed13a1d
Author: Paul Nasrat <pauln@truemesh.com>
Date: Tue Dec 4 08:43:32 2007 +0000
The attached patch adds support for writing the nvram using the nvram
utility from the new powerpc-utils pkg from IBM; it also simplify a bit
the code.
Patch from: Emanuele Giaquinta (exg@gentoo.org)
commit 131e44d7e0bf592eaa8214e684fef38bf654410a
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 14:21:11 2007 +0000
Force build to be ppc32
commit ff0e80c9b39b18a907d1f1ffb8f836b13af4ebb1
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 14:14:42 2007 +0000
Fix typo
commit 66ffb9d32d2acb3613594ef492d341b5bacf02e5
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 14:13:54 2007 +0000
Fix typo in patch porting
commit 082b8310e3f92ea8da0b7011549bd86c9fd4ce95
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 14:05:48 2007 +0000
Fix partition numbering handling with bplan firmware
Patch based on Fedora patch by dwmw2@infradead.org
commit afaf577190536fe8e15fb5b2ed8372dbda82e7b1
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 13:17:33 2007 +0000
Try harder to allocate malloc region
Patch from dwmw2@infradead.org
commit 752525a7feb16e02b759ca7811fc9a0276712c3d
Author: Paul Nasrat <pauln@truemesh.com>
Date: Mon Dec 3 13:13:23 2007 +0000
Print version-release of yaboot
Patch from dwmw2@infradead.org
commit c8b04c614770870d75825c19bcd4729cc779b84a
Author: Paul Nasrat <pauln@enki.eridu>
Date: Mon Dec 3 13:04:19 2007 +0000
Let prom_claim_chunk do the work for tftp images to support larger images.
Patch from: Leonardo Rangel <lrangel@linux.vnet.ibm.com>
commit b6b70ff54df42432d58801ac69ba24e7d95e0426
Author: Paul Nasrat <pauln@enki.eridu>
Date: Mon Dec 3 12:41:42 2007 +0000
These patch provides the function of load a alternative initrd file
specified by the user via Yaboot prompt. To load the new file, just use
the "initrd=<name_of_file>" command. The <name_of_file> could include
all the directory path to the file.
Using only the "initrd" command, Yaboot will load the default kernel
specified in the configuration file and the initrd file specified by the
user. The user can, also, specify an initrd file to any other label of
the configuration file, just adding the "initrd" command before the
label's name.
Signed-off-by: Paulo Ricardo Paz Vital <vital@br.ibm.com>
commit 4ba173298fa8630628c9014028fccc22e511d48a
Author: Paul Nasrat <pauln@enki.eridu>
Date: Mon Dec 3 12:39:06 2007 +0000
move the tftp load space and use prom_claim_chunk to claim the memory.
Growing kernels mean that the 6MB that was allotted is not enough.
Patch from Scott Moser
commit f3d8af0e0ac4642499d5430c202ac57d1d4c5ceb
Author: Paul Nasrat <pauln@enki.eridu>
Date: Mon Dec 3 12:37:10 2007 +0000
The patch from Scott Moser moves the "search-for-prom_claim'able" routine that
was present in load_elf64 and load_elf32 to a function named
prom_claim_chunk. This reduces the code-snippit duplication and makes
the function available for of_net_open.
Scott Moser ssmoser@us.ibm.com
--------------------------------------------------------------------------------
diff --git a/Makefile b/Makefile
index ce0dc06..fe2f2fd 100644
--- a/Makefile
+++ b/Makefile
@@ -21,7 +21,7 @@ TEXTADDR = 0x200000
MALLOCADDR = 0x300000
MALLOCSIZE = 0x100000
# Load kernel and ramdisk at real-base. If there is overlap, will retry until find open space
-KERNELADDR = 0x00C00000
+KERNELADDR = 0x00000000
# Set this to the prefix of your cross-compiler, if you have one.
# Else leave it empty.
@@ -35,8 +35,8 @@ OBJCOPY := $(CROSS)objcopy
# The flags for the yaboot binary.
#
-YBCFLAGS = -Os $(CFLAGS) -nostdinc -Wall -isystem `$(CC) -print-file-name=include` -fsigned-char
-YBCFLAGS += -DVERSION=\"${VERSION}\" #"
+YBCFLAGS = -Os $(CFLAGS) -nostdinc -Wall -isystem `$(CC) -m32 -print-file-name=include` -fsigned-char
+YBCFLAGS += -DVERSION="\"${VERSION}${VERSIONEXTRA}\"" #"
YBCFLAGS += -DTEXTADDR=$(TEXTADDR) -DDEBUG=$(DEBUG)
YBCFLAGS += -DMALLOCADDR=$(MALLOCADDR) -DMALLOCSIZE=$(MALLOCSIZE)
YBCFLAGS += -DKERNELADDR=$(KERNELADDR)
@@ -64,7 +64,7 @@ endif
# Link flags
#
-LFLAGS = -Ttext $(TEXTADDR) -Bstatic
+LFLAGS = -Ttext $(TEXTADDR) -Bstatic -melf32ppclinux
# Libraries
#
@@ -99,7 +99,7 @@ OBJS += second/fs_reiserfs.o
endif
# compilation
-lgcc = `$(CC) -print-libgcc-file-name`
+lgcc = `$(CC) -m32 -print-libgcc-file-name`
all: yaboot addnote mkofboot
diff --git a/include/bootinfo.h b/include/bootinfo.h
index f61409a..7602e48 100644
--- a/include/bootinfo.h
+++ b/include/bootinfo.h
@@ -34,6 +34,7 @@
#define _MACH_classic 0x00000400 /* RPCG RPX-Classic 8xx board */
#define _MACH_oak 0x00000800 /* IBM "Oak" 403 eval. board */
#define _MACH_walnut 0x00001000 /* IBM "Walnut" 405GP eval. board */
+#define _MACH_bplan 0x00002000 /* Pegasos/Efika, broken partition #s */
struct bi_record {
unsigned long tag; /* tag ID */
@@ -51,6 +52,8 @@ struct bi_record {
#endif /* _PPC_BOOTINFO_H */
+extern int _machine;
+
/*
* Local variables:
* c-file-style: "k&r"
diff --git a/include/prom.h b/include/prom.h
index f5ee88f..eacee77 100644
--- a/include/prom.h
+++ b/include/prom.h
@@ -37,6 +37,9 @@ typedef void *phandle;
#define PROM_INVALID_HANDLE ((prom_handle)-1UL)
#define BOOTDEVSZ (2048) /* iscsi args can be in excess of 1040 bytes */
#define TOK_ISCSI "iscsi"
+#define PROM_CLAIM_MAX_ADDR 0x8000000
+#define BOOTLASTSZ 1024
+#define FW_NBR_REBOOTSZ 4
struct prom_args;
typedef int (*prom_entry)(struct prom_args *);
@@ -85,6 +88,7 @@ int prom_set_color(prom_handle device, int color, int r, int g, int b);
/* memory */
+void *prom_claim_chunk(void *virt, unsigned int size, unsigned int align);
void *prom_claim (void *virt, unsigned int size, unsigned int align);
void prom_release(void *virt, unsigned int size);
void prom_map (void *phys, void *virt, int size);
diff --git a/second/fs_ext2.c b/second/fs_ext2.c
index 3240ce2..67571f2 100644
--- a/second/fs_ext2.c
+++ b/second/fs_ext2.c
@@ -35,6 +35,7 @@
#include "fs.h"
#include "errors.h"
#include "debug.h"
+#include "bootinfo.h"
#define FAST_VERSION
#define MAX_READ_RANGE 256
@@ -170,7 +171,8 @@ ext2_open( struct boot_file_t* file,
/* Open the OF device for the entire disk */
strncpy(buffer, dev_name, 1020);
- strcat(buffer, ":0");
+ if (_machine != _MACH_bplan)
+ strcat(buffer, ":0");
DEBUG_F("<%s>\n", buffer);
diff --git a/second/fs_of.c b/second/fs_of.c
index 76474ee..0d554c5 100644
--- a/second/fs_of.c
+++ b/second/fs_of.c
@@ -44,9 +44,8 @@
#include "errors.h"
#include "debug.h"
-#define LOAD_BUFFER_POS 0x600000
-/* this cannot be safely increased any further */
-#define LOAD_BUFFER_SIZE 0x600000
+#define LOAD_BUFFER_POS 0x00000000
+#define LOAD_BUFFER_SIZE 0x01000000
static int of_open(struct boot_file_t* file, const char* dev_name,
struct partition_t* part, const char* file_name);
@@ -166,7 +165,9 @@ of_net_open(struct boot_file_t* file, const char* dev_name,
return FILE_ERR_BAD_FSYS;
}
- file->buffer = prom_claim((void *)LOAD_BUFFER_POS, LOAD_BUFFER_SIZE, 0);
+
+ file->buffer = prom_claim_chunk((void *)LOAD_BUFFER_POS,
+ LOAD_BUFFER_SIZE, 0);
if (file->buffer == (void *)-1) {
prom_printf("Can't claim memory for TFTP download\n");
prom_close(file->of_device);
diff --git a/second/fs_reiserfs.c b/second/fs_reiserfs.c
index 4ad1c2e..238f523 100644
--- a/second/fs_reiserfs.c
+++ b/second/fs_reiserfs.c
@@ -29,6 +29,7 @@
#include "fs.h"
#include "errors.h"
#include "debug.h"
+#include "bootinfo.h"
#include "reiserfs/reiserfs.h"
/* Exported in struct fs_t */
@@ -84,7 +85,10 @@ reiserfs_open( struct boot_file_t *file, const char *dev_name,
else
INFO->partition_offset = 0;
- sprintf( buffer, "%s:%d", dev_name, 0 ); /* 0 is full disk in OF */
+ strncpy(buffer, dev_name, 1020);
+ if (_machine != _MACH_bplan)
+ strcat(buffer, ":0"); /* 0 is full disk in (non-buggy) OF */
+
file->of_device = prom_open( buffer );
DEBUG_F( "Trying to open dev_name=%s; filename=%s; partition offset=%Lu\n",
buffer, file_name, INFO->partition_offset );
diff --git a/second/fs_xfs.c b/second/fs_xfs.c
index 9a2aaa6..04d6cf3 100644
--- a/second/fs_xfs.c
+++ b/second/fs_xfs.c
@@ -30,6 +30,7 @@
#include "xfs/xfs.h"
#include "errors.h"
#include "debug.h"
+#include "bootinfo.h"
#define SECTOR_BITS 9
@@ -77,7 +78,9 @@ xfs_open(struct boot_file_t *file, const char *dev_name,
else
partition_offset = 0;
- sprintf(buffer, "%s:%d", dev_name, 0); /* 0 is full disk in OF */
+ strncpy(buffer, dev_name, 1020);
+ if (_machine != _MACH_bplan)
+ strcat(buffer, ":0"); /* 0 is full disk in (non-buggy) OF */
DEBUG_F("Trying to open dev_name=%s; filename=%s; partition offset=%Lu\n",
buffer, file_name, partition_offset);
file->of_device = prom_open(buffer);
diff --git a/second/partition.c b/second/partition.c
index 0cb8ae8..d20a0ed 100644
--- a/second/partition.c
+++ b/second/partition.c
@@ -40,6 +40,7 @@
#include "linux/iso_fs.h"
#include "debug.h"
#include "errors.h"
+#include "bootinfo.h"
#include "byteorder.h"
/* We currently don't check the partition type, some users
@@ -286,7 +287,7 @@ partition_amiga_lookup( const char *dev_name, prom_handle disk,
for (i=0; i < possible; i++) used[i] = 0;
- for (part = amiga_block[AMIGA_PARTITIONS], partition = 0;
+ for (part = amiga_block[AMIGA_PARTITIONS], partition = 1;
part != AMIGA_END;
part = amiga_block[AMIGA_PART_NEXT], partition++)
{
@@ -337,7 +338,8 @@ partitions_lookup(const char *device)
unsigned int prom_blksize, iso_root_block;
strncpy(block_buffer, device, 2040);
- strcat(block_buffer, ":0");
+ if (_machine != _MACH_bplan)
+ strcat(block_buffer, ":0");
/* Open device */
disk = prom_open(block_buffer);
diff --git a/second/prom.c b/second/prom.c
index e9c5843..4ad7277 100644
--- a/second/prom.c
+++ b/second/prom.c
@@ -568,6 +568,25 @@ prom_sleep (int seconds)
while (prom_getms() <= end);
}
+/* if address given is claimed look for other addresses to get the needed
+ * space before giving up
+ */
+void *
+prom_claim_chunk(void *virt, unsigned int size, unsigned int align)
+{
+ void *found, *addr;
+ for(addr=virt; addr <= (void*)PROM_CLAIM_MAX_ADDR;
+ addr+=(0x100000/sizeof(addr))) {
+ found = prom_claim(addr, size, 0);
+ if (found != (void *)-1) {
+ DEBUG_F("claimed %i at 0x%x (0x%x)\n",size,(int)found,(int)virt);
+ return(found);
+ }
+ }
+ prom_printf("Claim error, can't allocate %x at 0x%x\n",size,(int)virt);
+ return((void*)-1);
+}
+
void *
prom_claim (void *virt, unsigned int size, unsigned int align)
{
diff --git a/second/yaboot.c b/second/yaboot.c
index 0232d33..d6e8017 100644
--- a/second/yaboot.c
+++ b/second/yaboot.c
@@ -114,6 +114,9 @@ int useconf = 0;
char bootdevice[BOOTDEVSZ];
char bootoncelabel[1024];
char bootargs[1024];
+char bootlastlabel[BOOTLASTSZ] = {0};
+char fw_nbr_reboots[FW_NBR_REBOOTSZ] = {0};
+long fw_reboot_cnt = 0;
char *password = NULL;
struct boot_fspec_t boot;
int _machine = _MACH_Pmac;
@@ -178,6 +181,7 @@ yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
{
int result;
void* malloc_base = NULL;
+ unsigned long addr;
prom_handle root;
/* OF seems to do it, but I'm not very confident */
@@ -196,7 +200,10 @@ yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
prom_init ((prom_entry) r5);
/* Allocate some memory for malloc'ator */
- malloc_base = prom_claim((void *)MALLOCADDR, MALLOCSIZE, 0);
+ for (addr = MALLOCADDR; addr <= MALLOCADDR * 16 ;addr+=0x100000) {
+ malloc_base = prom_claim((void *)addr, MALLOCSIZE, 0);
+ if (malloc_base != (void *)-1) break;
+ }
if (malloc_base == (void *)-1) {
prom_printf("Can't claim malloc buffer (%d bytes at 0x%08x)\n",
MALLOCSIZE, MALLOCADDR);
@@ -219,7 +226,10 @@ yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
root = prom_finddevice("/");
if (root != 0) {
static char model[256];
- if (prom_getprop(root, "device_type", model, 256 ) > 0 &&
+ if (prom_getprop(root, "CODEGEN,vendor", model, 256) > 0 &&
+ !strncmp("bplan", model, 5))
+ _machine = _MACH_bplan;
+ else if (prom_getprop(root, "device_type", model, 256 ) > 0 &&
!strncmp("chrp", model, 4))
_machine = _MACH_chrp;
else {
@@ -455,7 +465,7 @@ static int load_my_config_file(struct boot_fspec_t *orig_fspec)
struct bootp_packet *packet;
int rc = 0;
struct boot_fspec_t fspec = *orig_fspec;
- char *cfgpath = (_machine == _MACH_chrp) ? "/etc/" : "";
+ char *cfgpath = (_machine == _MACH_chrp || _machine == _MACH_bplan) ? "/etc/" : "";
int flen;
int minlen;
@@ -654,6 +664,8 @@ int get_params(struct boot_param_t* params)
static char imagepath[1024];
static char initrdpath[1024];
static char sysmappath[1024];
+ static char manualinitrd[1024];
+ static int definitrd = 1, hasarg = 0;
pause_after = 0;
memset(params, 0, sizeof(*params));
@@ -665,7 +677,7 @@ int get_params(struct boot_param_t* params)
cmdinit();
- if (first) {
+ if (first && !fw_reboot_cnt) {
first = 0;
imagename = bootargs;
word_split(&imagename, &params->args);
@@ -680,6 +692,13 @@ int get_params(struct boot_param_t* params)
timeout = simple_strtol(q, NULL, 0);
}
+ /* If this is a reboot due to FW detecting CAS changes then
+ * set timeout to 1. The last kernel booted will be booted
+ * again automatically. It should seem seamless to the user
+ */
+ if (fw_reboot_cnt)
+ timeout = 1;
+
prom_printf("boot: ");
c = -1;
if (timeout != -1) {
@@ -716,7 +735,9 @@ int get_params(struct boot_param_t* params)
if (!imagename) {
if (bootoncelabel[0] != 0)
imagename = bootoncelabel;
- else
+ else if (bootlastlabel[0] != 0)
+ imagename = bootlastlabel;
+ else
imagename = cfg_get_default();
}
if (imagename)
@@ -733,10 +754,53 @@ int get_params(struct boot_param_t* params)
word_split(&imagename, &params->args);
}
+ /* initrd setup via cmd console */
+ /* first, check if the user uses it with some label */
+ if (!strncmp(params->args, "initrd=", 7)) {
+ DEBUG_F("params->args: %s\n", params->args);
+ definitrd = 0;
+ }
+ /* after, check if there is the 'initrd=' in the imagename string */
+ if (!strncmp(imagename, "initrd=", 7) || !definitrd) {
+
+ /* return the value of definitrd to 1 */
+ if (!definitrd)
+ definitrd = 1;
+
+ /* args = "initrd=blah" */
+ char *args = NULL;
+
+ if (params->args) {
+ args = params->args;
+ params->args = NULL;
+ hasarg = 1;
+ } else
+ args = imagename;
+
+ if (strlen(args)){
+ /* copy the string after the '=' to manualinitrd */
+ strcpy(manualinitrd, args+7);
+ definitrd = 0;
+ prom_printf("New initrd file specified: %s\n", manualinitrd);
+ } else {
+ prom_printf("ERROR: no initrd specified!\n");
+ return 0;
+ }
+
+ /* set imagename with the default values of the config file */
+ if ((prom_get_devtype(boot.dev) == FILE_DEVICE_NET) && !hasarg)
+ imagename = cfg_get_default();
+ else
+ imagename = cfg_get_default();
+ }
+
/* chrp gets this wrong, force it -- Cort */
if ( useconf && (!imagename || imagename[0] == 0 ))
imagename = cfg_get_default();
+ /* write the imagename out so it can be reused on reboot if necessary */
+ prom_set_options("boot-last-label", imagename, strlen(imagename));
+
label = 0;
defdevice = boot.dev;
@@ -794,6 +858,12 @@ int get_params(struct boot_param_t* params)
"resides on, and \"partno\" is the partition number the image resides on.\n"
"Note that the comma (,) is only required if you specify an OpenFirmware\n"
"device, if you only specify a filename you should not start it with a \",\"\n\n"
+ "To boot a alternative initrd file rather than specified in the yaboot\n"
+ "configuration file, use the \"initrd\" command on Yaboot's prompt: \n"
+ "\"initrd=[name.img]\". This will load the \"name.img\" file after the default\n"
+ "kernel image. You can, also, specify a different initrd file to any other\n"
+ "label of the yaboot configuration file. Just type \"label initrd=[name.img]\"\n"
+ "and the specified initrd file will be loaded.\n\n"
"To load an alternative config file rather than /etc/yaboot.conf, enter\n"
"its device, partno and path, on Open Firmware Prompt:\n"
"boot conf=device:partno,/path/to/configfile\n."
@@ -923,14 +993,22 @@ int get_params(struct boot_param_t* params)
prom_printf("%s: Unable to parse\n", imagepath);
return 0;
}
- DEBUG_F("after parse_device_path: dev=%s part=%d file=%s\n", params->kernel.dev,
- params->kernel.part, params->kernel.file);
-
+ DEBUG_F("after parse_device_path: dev=%s part=%d file=%s\n", params->kernel.dev, params->kernel.part, params->kernel.file);
if (useconf) {
p = cfg_get_strg(label, "initrd");
if (p && *p) {
- DEBUG_F("Parsing initrd path <%s>\n", p);
- strncpy(initrdpath, p, 1024);
+
+ /* check if user seted to use a initrd file from boot console */
+ if (!definitrd && p != manualinitrd) {
+ if (manualinitrd[0] != "/" && (prom_get_devtype(defdevice_bak) != FILE_DEVICE_NET)) {
+ strcpy(initrdpath, "/");
+ strcat(initrdpath, manualinitrd);
+ } else
+ strncpy(initrdpath, manualinitrd, 1024);
+ } else
+ strncpy(initrdpath, p, 1024);
+
+ DEBUG_F("Parsing initrd path <%s>\n", initrdpath);
if (!parse_device_path(initrdpath, defdevice, defpart,
"/root.bin", &params->rd)) {
prom_printf("%s: Unable to parse\n", imagepath);
@@ -1233,7 +1311,7 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo)
Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
Elf32_Phdr *p, *ph;
int size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
+ unsigned long loadaddr;
/* Read the rest of the Elf header... */
if ((*(file->fs->read))(file, size, &e->e_version) < size) {
@@ -1321,13 +1399,7 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo)
loadaddr = loadinfo->load_loc;
}
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
+ loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0);
if (loadinfo->base == (void *)-1) {
prom_printf("Claim error, can't allocate kernel memory\n");
goto bail;
@@ -1377,7 +1449,7 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
Elf64_Phdr *p, *ph;
int size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
+ unsigned long loadaddr;
/* Read the rest of the Elf header... */
if ((*(file->fs->read))(file, size, &e->e_version) < size) {
@@ -1465,13 +1537,7 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
loadaddr = e->e_entry;
}
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
+ loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0);
if (loadinfo->base == (void *)-1) {
prom_printf("Claim error, can't allocate kernel memory\n");
goto bail;
@@ -1625,6 +1691,7 @@ int
yaboot_main(void)
{
char *ptype;
+ char *endp;
int conf_given = 0;
char conf_path[1024];
@@ -1635,6 +1702,11 @@ yaboot_main(void)
DEBUG_F("/chosen/bootargs = %s\n", bootargs);
prom_get_chosen("bootpath", bootdevice, BOOTDEVSZ);
DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
+ if (prom_get_options("ibm,client-architecture-support-reboot",fw_nbr_reboots, FW_NBR_REBOOTSZ) == -1 )
+ prom_get_options("ibm,fw-nbr-reboots",fw_nbr_reboots, FW_NBR_REBOOTSZ);
+ fw_reboot_cnt = simple_strtol(fw_nbr_reboots,&endp,10);
+ if (fw_reboot_cnt > 0L)
+ prom_get_options("boot-last-label", bootlastlabel, BOOTLASTSZ);
/* If conf= specified on command line, it overrides
Usage: conf=device:partition,/path/to/conffile
@@ -1678,11 +1750,13 @@ yaboot_main(void)
prom_printf("%s: Unable to parse\n", bootdevice);
return -1;
}
+ if (_machine == _MACH_bplan && !conf_given)
+ boot.part++;
DEBUG_F("After parse_device_path: dev=%s, part=%d, file=%s\n",
boot.dev, boot.part, boot.file);
if (!conf_given) {
- if (_machine == _MACH_chrp)
+ if (_machine == _MACH_chrp || _machine == _MACH_bplan)
boot.file = "/etc/";
else if (strlen(boot.file)) {
if (!strncmp(boot.file, "\\\\", 2))

129
yaboot-1.3.14-ipv6.patch Normal file
View File

@ -0,0 +1,129 @@
diff -up yaboot-1.3.14/include/file.h.ipv6 yaboot-1.3.14/include/file.h
--- yaboot-1.3.14/include/file.h.ipv6 2010-02-12 07:57:43.000000000 +0100
+++ yaboot-1.3.14/include/file.h 2010-02-12 07:57:43.000000000 +0100
@@ -46,6 +46,11 @@ struct boot_fspec_t {
char* bootp_retries; /* Bootp retries */
char* tftp_retries; /* TFTP retries */
char* addl_params; /* copy all additional parameters */
+
+ /* Following fields are used only in ipv6 format */
+ int is_ipv6; /* is ipv6 specified ? */
+ char* dhcpv6; /* dhcpv6 string */
+ char* blksize; /* blksize string */
};
struct boot_file_t {
diff -up yaboot-1.3.14/include/prom.h.ipv6 yaboot-1.3.14/include/prom.h
--- yaboot-1.3.14/include/prom.h.ipv6 2010-02-12 07:57:42.000000000 +0100
+++ yaboot-1.3.14/include/prom.h 2010-02-12 08:01:12.000000000 +0100
@@ -40,6 +40,7 @@ typedef void *phandle;
#define PROM_CLAIM_MAX_ADDR 0x8000000
#define BOOTLASTSZ 1024
#define FW_NBR_REBOOTSZ 4
+#define TOK_IPV6 "ipv6"
struct prom_args;
typedef int (*prom_entry)(struct prom_args *);
diff -up yaboot-1.3.14/second/file.c.ipv6 yaboot-1.3.14/second/file.c
--- yaboot-1.3.14/second/file.c.ipv6 2010-02-12 07:57:43.000000000 +0100
+++ yaboot-1.3.14/second/file.c 2010-02-12 07:57:43.000000000 +0100
@@ -193,6 +193,50 @@ extract_netinfo_args(struct boot_fspec_t
}
/*
+ * Extract all the ipv6 arguments from the bootpath provided and fill result
+ * Syntax: ipv6,[dhcpv6[=diaddr,]]ciaddr=c_iaddr,giaddr=g_iaddr,siaddr=s_iaddr,
+ * filename=file_name,tftp-retries=tftp_retries,blksize=block_size
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_ipv6_args(char *imagepath, struct boot_fspec_t *result)
+{
+ char *str, *tmp;
+ int total_len;
+
+ result->is_ipv6 = 1;
+
+ /* Just allocate the max required size */
+ total_len = strlen(imagepath) + 1;
+ str = malloc(total_len);
+ if (!str)
+ return 0;
+
+ if ((tmp = strstr(imagepath, "dhcpv6=")) != NULL)
+ result->dhcpv6 = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "ciaddr=")) != NULL)
+ result->ciaddr = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "giaddr=")) != NULL)
+ result->giaddr = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "siaddr=")) != NULL)
+ result->siaddr = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "filename=")) != NULL)
+ result->file = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "tftp-retries=")) != NULL)
+ result->tftp_retries = scopy(&str, &tmp);
+
+ if ((tmp = strstr(imagepath, "blksize=")) != NULL)
+ result->blksize = scopy(&str, &tmp);
+
+ return 1;
+}
+
+/*
* Extract all the arguments provided in the imagepath and fill it in result.
* Returns 1 on success, 0 on failure.
*/
@@ -206,9 +250,14 @@ extract_netboot_args(char *imagepath, st
if (!imagepath)
return 1;
- ret = extract_ipv4_args(imagepath, result);
+ if (strstr(imagepath, TOK_IPV6))
+ ret = extract_ipv6_args(imagepath, result);
+ else
+ ret = extract_ipv4_args(imagepath, result);
+
ret |= extract_netinfo_args(result);
+ DEBUG_F("ipv6 = <%d>\n", result->is_ipv6);
DEBUG_F("siaddr = <%s>\n", result->siaddr);
DEBUG_F("file = <%s>\n", result->file);
DEBUG_F("ciaddr = <%s>\n", result->ciaddr);
@@ -216,6 +265,8 @@ extract_netboot_args(char *imagepath, st
DEBUG_F("bootp_retries = <%s>\n", result->bootp_retries);
DEBUG_F("tftp_retries = <%s>\n", result->tftp_retries);
DEBUG_F("addl_params = <%s>\n", result->addl_params);
+ DEBUG_F("dhcpv6 = <%s>\n", result->dhcpv6);
+ DEBUG_F("blksize = <%s>\n", result->blksize);
return ret;
}
diff -up yaboot-1.3.14/second/fs_of.c.ipv6 yaboot-1.3.14/second/fs_of.c
--- yaboot-1.3.14/second/fs_of.c.ipv6 2010-02-12 07:57:43.000000000 +0100
+++ yaboot-1.3.14/second/fs_of.c 2010-02-12 07:57:43.000000000 +0100
@@ -148,14 +148,18 @@ of_net_open(struct boot_file_t* file,
*p = '\\';
}
- DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;\n",
- fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr);
+ DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>; ipv6 <%d>\n",
+ fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr, fspec->is_ipv6);
strncpy(buffer, fspec->dev, 768);
+ if (fspec->is_ipv6)
+ strcat(buffer, TOK_IPV6 ",");
/* If we didn't get a ':' include one */
if (fspec->dev[strlen(fspec->dev)-1] != ':')
strcat(buffer, ":");
strcat(buffer, fspec->siaddr);
strcat(buffer, ",");
+ if (fspec->is_ipv6 && (strstr(filename, "filename=") == NULL))
+ strcat(buffer, "filename=");
strcat(buffer, filename);
strcat(buffer, ",");
strcat(buffer, fspec->ciaddr);

55
yaboot-1.3.14-iscsi.patch Normal file
View File

@ -0,0 +1,55 @@
Index: b/second/file.c
===================================================================
--- a/second/file.c
+++ b/second/file.c
@@ -671,6 +671,9 @@
case FILE_DEVICE_BLOCK:
DEBUG_F("device is a block device\n");
return file_block_open(file, spec, spec->part);
+ case FILE_DEVICE_ISCSI:
+ DEBUG_F("device is a iSCSI device\n");
+ return file_block_open(file, spec, spec->part);
case FILE_DEVICE_NET:
DEBUG_F("device is a network device\n");
return file_net_open(file, spec);
Index: b/second/partition.c
===================================================================
--- a/second/partition.c
+++ b/second/partition.c
@@ -400,7 +400,8 @@
struct partition_t* found;
char *type = NULL;
- if (prom_get_devtype(device) != FILE_DEVICE_BLOCK)
+ int device_kind = prom_get_devtype(device);
+ if (device_kind != FILE_DEVICE_BLOCK && device_kind != FILE_DEVICE_ISCSI)
return NULL;
parts = partitions_lookup(device);
Index: b/second/prom.c
===================================================================
--- a/second/prom.c
+++ b/second/prom.c
@@ -196,7 +196,7 @@
char tmp[64];
if (strstr(device, TOK_ISCSI))
- device = strcpy(tmp, "/vdevice/gscsi/disk");
+ return FILE_DEVICE_ISCSI;
/* Find OF device phandle */
dev = prom_finddevice(device);
Index: b/second/fs_ext2.c
===================================================================
--- a/second/fs_ext2.c
+++ b/second/fs_ext2.c
@@ -139,7 +139,8 @@
DEBUG_LEAVE(FILE_ERR_FSBUSY);
return FILE_ERR_FSBUSY;
}
- if (file->device_kind != FILE_DEVICE_BLOCK) {
+ if (file->device_kind != FILE_DEVICE_BLOCK
+ && file->device_kind != FILE_DEVICE_ISCSI) {
DEBUG_LEAVE(FILE_ERR_BADDEV);
return FILE_ERR_BADDEV;
}

View File

@ -0,0 +1,192 @@
diff -ur yaboot-1.3.14.orig/include/fs.h yaboot-1.3.14/include/fs.h
--- yaboot-1.3.14.orig/include/fs.h 2010-08-03 15:28:29.886806113 -0500
+++ yaboot-1.3.14/include/fs.h 2010-08-03 15:47:40.274304966 -0500
@@ -44,6 +44,8 @@
unsigned int newpos);
int (*close)( struct boot_file_t* file);
+
+ unsigned int (*ino_size)(struct boot_file_t *file);
};
extern const struct fs_t *fs_of;
diff -ur yaboot-1.3.14.orig/include/prom.h yaboot-1.3.14/include/prom.h
--- yaboot-1.3.14.orig/include/prom.h 2010-08-03 15:28:29.916805885 -0500
+++ yaboot-1.3.14/include/prom.h 2010-08-03 15:47:40.274304966 -0500
@@ -37,7 +37,7 @@
#define PROM_INVALID_HANDLE ((prom_handle)-1UL)
#define BOOTDEVSZ (2048) /* iscsi args can be in excess of 1040 bytes */
#define TOK_ISCSI "iscsi"
-#define PROM_CLAIM_MAX_ADDR 0x8000000
+#define PROM_CLAIM_MAX_ADDR 0x10000000
#define BOOTLASTSZ 1024
#define FW_NBR_REBOOTSZ 4
#define TOK_IPV6 "ipv6"
@@ -89,6 +89,7 @@
/* memory */
void *prom_claim_chunk(void *virt, unsigned int size, unsigned int align);
+void *prom_claim_chunk_top(unsigned int size, unsigned int align);
void *prom_claim (void *virt, unsigned int size, unsigned int align);
void prom_release(void *virt, unsigned int size);
void prom_map (void *phys, void *virt, int size);
diff -ur yaboot-1.3.14.orig/second/fs_ext2.c yaboot-1.3.14/second/fs_ext2.c
--- yaboot-1.3.14.orig/second/fs_ext2.c 2010-08-03 15:28:29.916805885 -0500
+++ yaboot-1.3.14/second/fs_ext2.c 2010-08-03 15:47:40.274304966 -0500
@@ -54,6 +54,7 @@
static int ext2_seek( struct boot_file_t* file,
unsigned int newpos);
static int ext2_close( struct boot_file_t* file);
+static unsigned int ext2_ino_size(struct boot_file_t *file);
struct fs_t ext2_filesystem =
{
@@ -61,7 +62,8 @@
ext2_open,
ext2_read,
ext2_seek,
- ext2_close
+ ext2_close,
+ ext2_ino_size,
};
/* IO manager structure for the ext2 library */
@@ -565,6 +567,16 @@
return 0;
}
+static unsigned int ext2_ino_size(struct boot_file_t *file)
+{
+ struct ext2_inode ei;
+
+ if (ext2fs_read_inode(fs, file->inode, &ei))
+ return 0;
+
+ return ei.i_size;
+}
+
static errcode_t linux_open (const char *name, int flags, io_channel * channel)
{
io_channel io;
diff -ur yaboot-1.3.14.orig/second/fs_of.c yaboot-1.3.14/second/fs_of.c
--- yaboot-1.3.14.orig/second/fs_of.c 2010-08-03 15:28:29.896804336 -0500
+++ yaboot-1.3.14/second/fs_of.c 2010-08-03 15:47:40.274304966 -0500
@@ -44,7 +44,6 @@
#include "errors.h"
#include "debug.h"
-#define LOAD_BUFFER_POS 0x00000000
#define LOAD_BUFFER_SIZE 0x02000000
static int of_open(struct boot_file_t* file,
@@ -58,6 +57,7 @@
struct partition_t* part, struct boot_fspec_t* fspec);
static int of_net_read(struct boot_file_t* file, unsigned int size, void* buffer);
static int of_net_seek(struct boot_file_t* file, unsigned int newpos);
+static unsigned int of_net_ino_size(struct boot_file_t* file);
struct fs_t of_filesystem =
@@ -75,7 +75,8 @@
of_net_open,
of_net_read,
of_net_seek,
- of_close
+ of_close,
+ of_net_ino_size,
};
static int
@@ -206,8 +207,7 @@
}
- file->buffer = prom_claim_chunk((void *)LOAD_BUFFER_POS,
- LOAD_BUFFER_SIZE, 0);
+ file->buffer = prom_claim_chunk_top(LOAD_BUFFER_SIZE, 0);
if (file->buffer == (void *)-1) {
prom_printf("Can't claim memory for TFTP download\n");
prom_close(file->of_device);
@@ -284,6 +284,12 @@
return 0;
}
+static unsigned int
+of_net_ino_size(struct boot_file_t* file)
+{
+ return file->len;
+}
+
/*
* Local variables:
* c-file-style: "k&r"
diff -ur yaboot-1.3.14.orig/second/prom.c yaboot-1.3.14/second/prom.c
--- yaboot-1.3.14.orig/second/prom.c 2010-08-03 15:28:29.916805885 -0500
+++ yaboot-1.3.14/second/prom.c 2010-08-03 15:48:08.934304926 -0500
@@ -548,6 +548,23 @@
return((void*)-1);
}
+/* Start from top of memory and work down to get the needed space */
+void *
+prom_claim_chunk_top(unsigned int size, unsigned int align)
+{
+ void *found, *addr;
+ for(addr=(void*)PROM_CLAIM_MAX_ADDR; addr >= (void *)size;
+ addr-=(0x100000/sizeof(addr))) {
+ found = call_prom("claim", 3, 1, addr, size, 0);
+ if (found != (void *)-1) {
+ prom_printf("claim of 0x%x at 0x%x returned 0x%x\n", size, (int)addr, (int)found);
+ return(found);
+ }
+ }
+ prom_printf("ERROR: claim of 0x%x in range 0x0-0x%x failed\n", size, PROM_CLAIM_MAX_ADDR);
+ return((void*)-1);
+}
+
void *
prom_claim (void *virt, unsigned int size, unsigned int align)
{
diff -ur yaboot-1.3.14.orig/second/yaboot.c yaboot-1.3.14/second/yaboot.c
--- yaboot-1.3.14.orig/second/yaboot.c 2010-08-03 15:28:29.906805706 -0500
+++ yaboot-1.3.14/second/yaboot.c 2010-08-03 15:47:40.274304966 -0500
@@ -1211,25 +1211,33 @@
}
else {
#define INITRD_CHUNKSIZE 0x100000
- initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, INITRD_CHUNKSIZE, 0);
+ unsigned int len = INITRD_CHUNKSIZE;
+
+ /* We add a bit to the actual size so the loop below doesn't think
+ * there is more to load.
+ */
+ if (file.fs->ino_size && file.fs->ino_size(&file) > 0)
+ len = file.fs->ino_size(&file) + 0x1000;
+
+ initrd_base = prom_claim_chunk(loadinfo.base+loadinfo.memsize, len, 0);
if (initrd_base == (void *)-1) {
prom_printf("Claim failed for initrd memory\n");
initrd_base = 0;
} else {
- initrd_size = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_base);
+ initrd_size = file.fs->read(&file, len, initrd_base);
if (initrd_size == 0)
initrd_base = 0;
initrd_read = initrd_size;
initrd_more = initrd_base;
- while (initrd_read == INITRD_CHUNKSIZE ) { /* need to read more? */
- initrd_want = (void *)((unsigned long)initrd_more+INITRD_CHUNKSIZE);
- initrd_more = prom_claim(initrd_want, INITRD_CHUNKSIZE, 0);
+ while (initrd_read == len ) { /* need to read more? */
+ initrd_want = (void *)((unsigned long)initrd_more+len);
+ initrd_more = prom_claim(initrd_want, len, 0);
if (initrd_more != initrd_want) {
prom_printf("Claim failed for initrd memory at %p rc=%p\n",initrd_want,initrd_more);
prom_pause();
break;
}
- initrd_read = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_more);
+ initrd_read = file.fs->read(&file, len, initrd_more);
DEBUG_F(" block at %p rc=%lu\n",initrd_more,initrd_read);
initrd_size += initrd_read;
initrd_end = initrd_more+INITRD_CHUNKSIZE;

View File

@ -0,0 +1,118 @@
diff --git a/Makefile b/Makefile
index 8f2b1c4..3603c7d 100644
--- a/Makefile
+++ b/Makefile
@@ -121,6 +121,9 @@ mkofboot:
false; \
fi
+%.i: %.c
+ $(CC) $(YBCFLAGS) -E -o $@ $<
+
%.o: %.c
$(CC) $(YBCFLAGS) -c -o $@ $<
diff --git a/include/file.h b/include/file.h
index b2d9c63..9990f4b 100644
--- a/include/file.h
+++ b/include/file.h
@@ -68,6 +68,7 @@ struct boot_file_t {
ino_t inode;
__u64 pos;
unsigned char* buffer;
+ __u64 buffer_sz;
__u64 len;
// unsigned int dev_blk_size;
// unsigned int part_start;
diff --git a/second/fs_of.c b/second/fs_of.c
index 1f48f4f..d2e7434 100644
--- a/second/fs_of.c
+++ b/second/fs_of.c
@@ -214,6 +214,7 @@ of_net_open(struct boot_file_t* file,
DEBUG_LEAVE(FILE_IOERR);
return FILE_IOERR;
}
+ file->buffer_sz = LOAD_BUFFER_SIZE;
memset(file->buffer, 0, LOAD_BUFFER_SIZE);
DEBUG_F("TFP...\n");
diff --git a/second/yaboot.c b/second/yaboot.c
index 0ccfed5..1241eec 100644
--- a/second/yaboot.c
+++ b/second/yaboot.c
@@ -1052,6 +1052,7 @@ yaboot_text_ui(void)
static struct boot_param_t params;
void *initrd_base;
unsigned long initrd_size;
+ unsigned long initrd_end;
void *sysmap_base;
unsigned long sysmap_size;
kernel_entry_t kernel_entry;
@@ -1227,8 +1228,67 @@ yaboot_text_ui(void)
initrd_read = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_more);
DEBUG_F(" block at %p rc=%lu\n",initrd_more,initrd_read);
initrd_size += initrd_read;
+ initrd_end = initrd_more+INITRD_CHUNKSIZE;
}
}
+ /* If we netbooted and got this far, we may have filled the
+ * RMA. We're about the free the TFTP load buffer to we
+ * can "shuffle" things around so that the booted kernel
+ * has some memory to run with */
+ if (!is_elf64(&loadinfo)) {
+ DEBUG_F("Not running a 64-kernel\n");
+ /* Is this check enough? */
+ } else if (loadinfo.base == file.buffer + file.buffer_sz) {
+ DEBUG_F("file->buffer %lx -> %lx (%lx)\n",
+ (unsigned long)(file.buffer),
+ (unsigned long)(file.buffer+file.buffer_sz),
+ (unsigned long)(file.buffer_sz));
+ DEBUG_F("vmlinux %lx -> %lx (%lx)\n",
+ (unsigned long)(loadinfo.base),
+ (unsigned long)(loadinfo.base+loadinfo.memsize),
+ (unsigned long)(loadinfo.memsize));
+ DEBUG_F("initrd %lx -> %lx (%lx)\n",
+ (unsigned long)(initrd_base),
+ (unsigned long)(initrd_base+initrd_size),
+ (unsigned long)(initrd_size));
+
+ /* Check to see if we're near the top of the RMA */
+ /* Cheat and assume the RMA == 128Mb */
+ if (initrd_end > 0x7000000) {
+ unsigned long new_initrd_end, free_len;
+ unsigned long initrd_claim_len = initrd_end - (unsigned long)initrd_base;
+
+ memmove(file.buffer, loadinfo.base,
+ loadinfo.memsize+initrd_size);
+ loadinfo.base = file.buffer;
+ initrd_base = loadinfo.base+loadinfo.memsize;
+
+ new_initrd_end = (unsigned long)initrd_base+initrd_claim_len;
+ free_len = initrd_end - (unsigned long)new_initrd_end;
+ file.buffer = NULL;
+ file.buffer_sz = 0;
+ memset((void*)new_initrd_end, 0x0, free_len);
+ prom_release((void*)new_initrd_end, free_len);
+
+ DEBUG_F("Releaseing from 0x%08lx -> 0x%08lx\n",
+ new_initrd_end, free_len);
+
+ DEBUG_F("file->buffer %lx -> %lx (%lx)\n",
+ (unsigned long)(file.buffer),
+ (unsigned long)(file.buffer+file.buffer_sz),
+ (unsigned long)(file.buffer_sz));
+ DEBUG_F("vmlinux %lx -> %lx (%lx)\n",
+ (unsigned long)(loadinfo.base),
+ (unsigned long)(loadinfo.base+loadinfo.memsize),
+ (unsigned long)(loadinfo.memsize));
+ DEBUG_F("initrd %lx -> %lx (%lx)\n",
+ (unsigned long)(initrd_base),
+ (unsigned long)(initrd_base+initrd_size),
+ (unsigned long)(initrd_size));
+ } else {
+ DEBUG_F("Looks like we do not need to move the kernel\n");
+ }
+ }
file.fs->close(&file);
memset(&file, 0, sizeof(file));
}

View File

@ -0,0 +1,66 @@
extract_netinfo_args() should be a void function.
If there is no "netinfo" packet, extract_netinfo_args() will fail and cause
parse_device_path() to abort. This basically meant that yaboot will fail to
load any kernel/initrd under those circumstances.
This fix changes extract_netinfo_args() to be a void function.
Signed-off-by: Tony Breeds <tonyb@au1.ibm.com>
---
I'll talk to FW about /why/ there is no netinfo data, but even if that is a FW bug we need to work around it.
second/file.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
--- yaboot-1.3.14.orig/second/file.c 2010-03-06 09:23:12.174204856 +0800
+++ yaboot-1.3.14/second/file.c 2010-03-06 11:59:04.045205260 +0800
@@ -260,10 +260,8 @@ extract_vendor_options(struct bootp_pack
/*
* Check netinfo for ipv4 parameters and add them to the fspec iff the
* fspec has no existing value.
- *
- * Returns 1 on success, 0 on failure.
*/
-static int
+static void
extract_netinfo_args(struct boot_fspec_t *result)
{
struct bootp_packet *packet;
@@ -271,7 +269,7 @@ extract_netinfo_args(struct boot_fspec_t
/* Check to see if we can get the [scyg]iaddr fields from netinfo */
packet = prom_get_netinfo();
if (packet == NULL)
- return 0;
+ return;
DEBUG_F("We have a boot packet\n");
DEBUG_F(" siaddr = <%x>\n", packet->siaddr);
@@ -303,8 +301,6 @@ extract_netinfo_args(struct boot_fspec_t
result->giaddr = ipv4_to_str(packet->siaddr);
DEBUG_F("Forcing giaddr to siaddr <%s>\n", result->giaddr);
}
-
- return 1;
}
/*
@@ -370,7 +366,7 @@ extract_netboot_args(char *imagepath, st
else
ret = extract_ipv4_args(imagepath, result);
- ret |= extract_netinfo_args(result);
+ extract_netinfo_args(result);
DEBUG_F("ipv6 = <%d>\n", result->is_ipv6);
DEBUG_F("siaddr = <%s>\n", result->siaddr);
@@ -526,8 +522,7 @@ parse_device_path(char *imagepath, char
return 0;
} else {
/* If we didn't get a ':' then look only in netinfo */
- if (extract_netinfo_args(result) == 0)
- return 0;
+ extract_netinfo_args(result);
result->file = strdup(ipath);
}

View File

@ -0,0 +1,11 @@
--- yaboot-1.3.14/second/yaboot.c~ 2009-06-07 08:57:58.000000000 +0100
+++ yaboot-1.3.14/second/yaboot.c 2009-06-07 09:02:03.000000000 +0100
@@ -1243,7 +1243,7 @@ yaboot_text_ui(void)
flush_icache_range ((long)loadinfo.base, (long)loadinfo.base+loadinfo.memsize);
DEBUG_F(" done\n");
- if (flat_vmlinux) {
+ if (0 && flat_vmlinux) {
/*
* Fill new boot infos (only if booting a vmlinux).
*

View File

@ -0,0 +1,95 @@
Date: Sun, 11 Apr 2010 14:05:59 +1000
From: Anton Blanchard <anton@samba.org>
Subject: prom_getchar eats characters
This bug has been annoying me for a long time. If you copy and paste a
string into the yaboot prompt, or even type too fast, characters get
dropped.
It turns out we were asking OF for 4 characters, but only using the first one.
There is strange logic to look for \e[, and then oring the third character with
0x100. I haven't been able to find anyone that knows why that was there in the
first place, so just remove it and fix this bug once and for all.
Automated test infrastructures the world over will thank us for fixing this
bug!
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Tony Breeds <tony@bakeyournoodle.com>
---
diff -purN yaboot-1.3.14.orig/include/prom.h yaboot-1.3.14/include/prom.h
--- yaboot-1.3.14.orig/include/prom.h 2010-05-13 22:32:41.363286396 -0500
+++ yaboot-1.3.14/include/prom.h 2010-05-15 22:45:20.057035750 -0500
@@ -84,7 +84,6 @@ void prom_printf (char *fmt, ...);
#endif
void prom_perror (int error, char *filename);
-void prom_readline (char *prompt, char *line, int len);
int prom_set_color(prom_handle device, int color, int r, int g, int b);
/* memory */
diff -purN yaboot-1.3.14.orig/second/prom.c yaboot-1.3.14/second/prom.c
--- yaboot-1.3.14.orig/second/prom.c 2010-05-13 22:32:41.383286111 -0500
+++ yaboot-1.3.14/second/prom.c 2010-05-15 22:45:43.615473125 -0500
@@ -389,14 +389,12 @@ prom_readblocks (prom_handle dev, int bl
int
prom_getchar ()
{
- char c[4];
+ char c;
int a;
- while ((a = (int)call_prom ("read", 3, 1, prom_stdin, c, 4)) <= 0)
- ;
- if (a == 3 && c[0] == '\e' && c[1] == '[')
- return 0x100 | c[2];
- return c[0];
+ while ((a = (int)call_prom ("read", 3, 1, prom_stdin, &c, 1)) <= 0)
+ continue;
+ return c;
}
int
@@ -500,41 +498,6 @@ prom_perror (int error, char *filename)
prom_printf("%s: Unknown error\n", filename);
}
-void
-prom_readline (char *prompt, char *buf, int len)
-{
- int i = 0;
- int c;
-
- if (prompt)
- prom_puts (prom_stdout, prompt);
-
- while (i < len-1 && (c = prom_getchar ()) != '\r')
- {
- if (c >= 0x100)
- continue;
- if (c == 8)
- {
- if (i > 0)
- {
- prom_puts (prom_stdout, "\b \b");
- i--;
- }
- else
- prom_putchar ('\a');
- }
- else if (isprint (c))
- {
- prom_putchar (c);
- buf[i++] = c;
- }
- else
- prom_putchar ('\a');
- }
- prom_putchar ('\n');
- buf[i] = 0;
-}
-
#ifdef CONFIG_SET_COLORMAP
int prom_set_color(prom_handle device, int color, int r, int g, int b)
{

View File

@ -0,0 +1,11 @@
--- yaboot-1.3.14/ybin/ybin.orig 2009-08-07 11:08:04.000000000 +1000
+++ yaboot-1.3.14/ybin/ybin 2009-08-07 11:08:09.000000000 +1000
@@ -1164,6 +1164,8 @@
fi
sync ; sync
[ "$VERBOSE" = 1 ] && echo "$PRG: Installation successful"
+
+ return 0
}
## make sure the first stage ofboot generator is compatible.

132
yaboot-1.3.3-man.patch Normal file
View File

@ -0,0 +1,132 @@
diff -urN -X CVS man/mkofboot.8 man.deb/mkofboot.8
--- man/mkofboot.8 Thu May 24 04:32:54 2001
+++ man.deb/mkofboot.8 Tue Sep 25 05:38:42 2001
@@ -94,7 +94,7 @@
.TP
.BR \-i ,\ \-\-install\ \fIboot-file
Use \fIboot-file\fR as the primary boot loader executable, instead of
-the default\fI/usr/local/lib/yaboot/yaboot\fR(8).
+the default\fI/usr/lib/yaboot/yaboot\fR(8).
.TP
.BR \-C ,\ \-\-config\ \fIconfig-file
Use \fIconfig-file\fR as the \fBmkofboot\fR/\fByaboot\fR(8) configuration
@@ -200,8 +200,8 @@
Print out the version number and exit.
.SH FILES
.nf
-/usr/local/lib/yaboot/yaboot \- boot loader executable
-/usr/local/lib/yaboot/ofboot \- OpenFirmware boot script
+/usr/lib/yaboot/yaboot \- boot loader executable
+/usr/lib/yaboot/ofboot \- OpenFirmware boot script
/etc/yaboot.conf \- boot loader/mkofboot configuration file
.fi
.SH ENVIRONMENT
@@ -218,7 +218,7 @@
program otherwise \fBmkofboot\fR will be vulnerable to race conditions.
The Debian mktemp is derived from OpenBSD and thus should be secure.
-\fI/usr/local/lib/yaboot/ofboot\fR now contains code executed by /bin/sh (by
+\fI/usr/lib/yaboot/ofboot\fR now contains code executed by /bin/sh (by
\fBmkofboot\fR) it is thus critical that it not be writable by anyone
but root. It is also critical that \fI/etc/yaboot.conf\fR not be
writable by anyone but root since a different \fIofboot\fR script could be
diff -urN -X CVS man/yaboot.conf.5 man.deb/yaboot.conf.5
--- man/yaboot.conf.5 Tue Sep 25 05:20:03 2001
+++ man.deb/yaboot.conf.5 Tue Sep 25 05:38:42 2001
@@ -136,7 +136,7 @@
boot=/dev/hda2
device=hd:
partition=3
- magicboot=/usr/local/lib/yaboot/ofboot
+ magicboot=/usr/lib/yaboot/ofboot
timeout=50
root=/dev/hda3
read-only
@@ -228,7 +228,7 @@
magicboot script will be executed by OF automatically at boot (instead
of the \fBinstall\fR file.) See man \fBbootstrap\fR(8) for more
information on this. As of ybin 0.22 you should set this to
-/usr/local/lib/yaboot/ofboot which is a autoconfiguring first stage
+/usr/lib/yaboot/ofboot which is a autoconfiguring first stage
loader for yaboot. It is capable of presenting a dual boot menu for
GNU/Linux, MacOS and MacOSX. If dual booting is not required or
configured it will simply load yaboot directly. You must specify this
@@ -301,7 +301,7 @@
When you define this option you will be presented with a simple menu at
bootup allowing you to hit L to boot GNU/Linux or B to boot BSD (along
with other choices if configured). This will only work if you are
-using the new \fI/usr/local/lib/yaboot/ofboot\fR script. When this is
+using the new \fI/usr/lib/yaboot/ofboot\fR script. When this is
set to a unix device node (ie \fI/dev/hda11\fR) then ybin will use the
\fBofpath\fR(8) utility to determine the OpenFirmware device path.
.TP
@@ -310,7 +310,7 @@
partition. When you define this option you will be presented with a
simple menu at bootup allowing you to hit L to boot GNU/Linux or M to
boot MacOS (along with other choices if configured). This will only
-work if you are using the new \fI/usr/local/lib/yaboot/ofboot\fR
+work if you are using the new \fI/usr/lib/yaboot/ofboot\fR
script. When this is set to a unix device node (ie \fI/dev/hda11\fR)
then ybin will use the \fBofpath\fR(8) utility to determine the
OpenFirmware device path.
@@ -320,7 +320,7 @@
When you define this option you will be presented with a simple menu
at bootup allowing you to hit L to boot GNU/Linux or X to boot MacOSX
(along with other choices if configured). This will only work if you
-are using the new \fI/usr/local/lib/yaboot/ofboot\fR script. When
+are using the new \fI/usr/lib/yaboot/ofboot\fR script. When
this is set to a unix device node (ie \fI/dev/hda11\fR) then ybin will
use the \fBofpath\fR(8) utility to determine the OpenFirmware device
path.
@@ -341,7 +341,7 @@
When you define this option you will be presented with a simple menu
at bootup allowing you to hit L to boot GNU/Linux or D to boot Darwin
(along with other choices if configured). This will only work if you
-are using the new \fI/usr/local/lib/yaboot/ofboot\fR script. When
+are using the new \fI/usr/lib/yaboot/ofboot\fR script. When
this is set to a unix device node (ie \fI/dev/hda11\fR) then ybin will
use the \fBofpath\fR(8) utility to determine the OpenFirmware device
path.
@@ -589,8 +589,8 @@
root=/dev/hda3
partition=3
timeout=20
-install=/usr/local/lib/yaboot/yaboot
-magicboot=/usr/local/lib/yaboot/ofboot
+install=/usr/lib/yaboot/yaboot
+magicboot=/usr/lib/yaboot/ofboot
fgcolor=black
bgcolor=green
default=Linux
diff -urN -X CVS man/ybin.8 man.deb/ybin.8
--- man/ybin.8 Thu May 24 04:33:16 2001
+++ man.deb/ybin.8 Tue Sep 25 05:38:42 2001
@@ -109,7 +109,7 @@
.TP
.BR \-i ,\ \-\-install\ \fIboot-file
Use \fIboot-file\fR as the primary boot loader executable, instead of
-the default \fI/usr/local/lib/yaboot/yaboot\fR.
+the default \fI/usr/lib/yaboot/yaboot\fR.
.TP
.BR \-C ,\ \-\-config\ \fIconfig-file
Use \fIconfig-file\fR as the \fBybin\fR/\fByaboot\fR(8) configuration
@@ -214,8 +214,8 @@
Print out the version number and exit.
.SH FILES
.nf
-/usr/local/lib/yaboot/yaboot \- boot loader executable
-/usr/local/lib/yaboot/ofboot \- OpenFirmware boot script
+/usr/lib/yaboot/yaboot \- boot loader executable
+/usr/lib/yaboot/ofboot \- OpenFirmware boot script
/etc/yaboot.conf \- boot loader/ybin configuration file
.fi
.SH ENVIRONMENT
@@ -232,7 +232,7 @@
program, otherwise \fBybin\fR will be vulnerable to race conditions.
The Debian mktemp is derived from OpenBSD and thus should be secure.
-\fI/usr/local/lib/yaboot/ofboot\fR now contains code executed by /bin/sh (by
+\fI/usr/lib/yaboot/ofboot\fR now contains code executed by /bin/sh (by
\fBybin\fR). It is thus critical that it not be writable by anyone but
root. It is also critical that \fI/etc/yaboot.conf\fR not be writable
by anyone but root since a different \fIofboot\fR script could be

29
yaboot-1.3.6-ofboot.patch Normal file
View File

@ -0,0 +1,29 @@
--- yaboot-1.3.6/first/ofboot.orig Thu Mar 7 04:19:09 2002
+++ yaboot-1.3.6/first/ofboot Thu Mar 7 04:21:49 2002
@@ -102,7 +102,7 @@
[ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file1: $5\n"
[ "$COUNT" = "$OSNUM" ] && c="."
BTYA=": boot$1 \" Loading second stage bootstrap...\" .printf 100 ms load-base release-load-area \" ${4}${5}\" \$boot ;"
- MENUYA="\" Press $3 for GNU/Linux${c-,}\"(0d 0a)\" .printf"
+ MENUYA="\" Press $3 for Red Hat Linux${c-,}\"(0d 0a)\" .printf"
GETYA=" ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
shift 5
COUNT="$(($COUNT + 1))"
@@ -315,7 +315,7 @@
MacRISC MacRISC3 MacRISC4
</COMPATIBLE>
<DESCRIPTION>
-PowerPC GNU/Linux First Stage Bootstrap
+Red Hat Linux First Stage Bootstrap
</DESCRIPTION>
<BOOT-SCRIPT>
: .printf fb8-write drop ;
@@ -336,7 +336,7 @@
$BGCOLOR to background-color
\" \"(0C)\" .printf
-\" First Stage GNU/Linux Bootstrap\"(0d 0a)\" .printf
+\" First Stage Red Hat Linux Bootstrap\"(0d 0a)\" .printf
\" \"(0d 0a)\" .printf
$MENUOPTS
\" \"(0d 0a)\" .printf

94
yaboot-1.3.6-rh.patch Normal file
View File

@ -0,0 +1,94 @@
--- yaboot-1.3.6/Makefile.rh Fri May 17 15:08:25 2002
+++ yaboot-1.3.6/Makefile Fri May 17 15:09:32 2002
@@ -178,32 +178,32 @@
strip --remove-section=.comment --remove-section=.note util/addnote
install: all strip
- install -d -o root -g root -m 0755 ${ROOT}/etc/
- install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/sbin/
- install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/lib
- install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/lib/yaboot
- install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man5/
- install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man8/
- install -o root -g root -m 0644 second/yaboot ${ROOT}/$(PREFIX)/lib/yaboot
- install -o root -g root -m 0755 util/addnote ${ROOT}/${PREFIX}/lib/yaboot/addnote
- install -o root -g root -m 0644 first/ofboot ${ROOT}/${PREFIX}/lib/yaboot/ofboot
- install -o root -g root -m 0755 ybin/ofpath ${ROOT}/${PREFIX}/sbin/ofpath
- install -o root -g root -m 0755 ybin/ybin ${ROOT}/${PREFIX}/sbin/ybin
- install -o root -g root -m 0755 ybin/yabootconfig ${ROOT}/${PREFIX}/sbin/yabootconfig
+ install -d -m 0755 ${ROOT}/etc/
+ install -d -m 0755 ${ROOT}/${PREFIX}/sbin/
+ install -d -m 0755 ${ROOT}/${PREFIX}/lib
+ install -d -m 0755 ${ROOT}/${PREFIX}/lib/yaboot
+ install -d -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man5/
+ install -d -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man8/
+ install -m 0644 second/yaboot ${ROOT}/$(PREFIX)/lib/yaboot
+ install -m 0755 util/addnote ${ROOT}/${PREFIX}/lib/yaboot/addnote
+ install -m 0644 first/ofboot ${ROOT}/${PREFIX}/lib/yaboot/ofboot
+ install -m 0755 ybin/ofpath ${ROOT}/${PREFIX}/sbin/ofpath
+ install -m 0755 ybin/ybin ${ROOT}/${PREFIX}/sbin/ybin
+ install -m 0755 ybin/yabootconfig ${ROOT}/${PREFIX}/sbin/yabootconfig
rm -f ${ROOT}/${PREFIX}/sbin/mkofboot
ln -s ybin ${ROOT}/${PREFIX}/sbin/mkofboot
@gzip -9 man/*.[58]
- install -o root -g root -m 0644 man/bootstrap.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/bootstrap.8.gz
- install -o root -g root -m 0644 man/mkofboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/mkofboot.8.gz
- install -o root -g root -m 0644 man/ofpath.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ofpath.8.gz
- install -o root -g root -m 0644 man/yaboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yaboot.8.gz
- install -o root -g root -m 0644 man/yabootconfig.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yabootconfig.8.gz
- install -o root -g root -m 0644 man/ybin.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ybin.8.gz
- install -o root -g root -m 0644 man/yaboot.conf.5.gz ${ROOT}/${PREFIX}/${MANDIR}/man5/yaboot.conf.5.gz
+ install -m 0644 man/bootstrap.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/bootstrap.8.gz
+ install -m 0644 man/mkofboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/mkofboot.8.gz
+ install -m 0644 man/ofpath.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ofpath.8.gz
+ install -m 0644 man/yaboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yaboot.8.gz
+ install -m 0644 man/yabootconfig.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yabootconfig.8.gz
+ install -m 0644 man/ybin.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ybin.8.gz
+ install -m 0644 man/yaboot.conf.5.gz ${ROOT}/${PREFIX}/${MANDIR}/man5/yaboot.conf.5.gz
@gunzip man/*.gz
@if [ ! -e ${ROOT}/etc/yaboot.conf ] ; then \
- echo "install -o root -g root -m 0644 etc/yaboot.conf ${ROOT}/etc/yaboot.conf"; \
- install -o root -g root -m 0644 etc/yaboot.conf ${ROOT}/etc/yaboot.conf; \
+ echo "install -m 0644 etc/yaboot.conf ${ROOT}/etc/yaboot.conf"; \
+ install -m 0644 etc/yaboot.conf ${ROOT}/etc/yaboot.conf; \
else \
echo "/etc/yaboot.conf already exists, leaving it alone"; \
fi
--- yaboot-1.3.6/etc/yaboot.conf.fhs Thu May 23 15:56:11 2002
+++ yaboot-1.3.6/etc/yaboot.conf Thu May 23 15:57:29 2002
@@ -10,7 +10,7 @@
## specify a partition number for this! On IBM hardware you can
## generally comment this out.
-device=hd:
+## device=hd:
## partition is the partition number where the kernel images are
## located. The kernel images should be on your root filesystem, so
@@ -20,7 +20,7 @@
## option can be either set globally as shown here, or per image in
## the image= sections
-partition=3
+partition=2
## delay is the amount of time in seconds the dual boot menu (if one
## is configured, by the presense of macos, macosx, etc options here)
@@ -35,13 +35,13 @@
## section in this config file or the value of default=).
timeout=40
-install=/usr/local/lib/yaboot/yaboot
-magicboot=/usr/local/lib/yaboot/ofboot
+install=/usr/lib/yaboot/yaboot
+magicboot=/usr/lib/yaboot/ofboot
## Change the default colors, fgcolor is the text color, bgcolor is
## the screen background color. (default: fgcolor=white, bgcolor=black)
-#fgcolor=black
-#bgcolor=green
+fgcolor=white
+bgcolor=black
## Password supplied in plaintext, required for yaboot to boot, unless
## restricted is also present (see below). Be sure to

View File

@ -0,0 +1,21 @@
PPC64 relocatable kernels (built with CONFIG_RELOCATABLE=y) have the type of
ET_DYN. But yaboot code won't load the kernel if the ELF type is not
ET_EXEC. Attached patch adds support to yaboot to load relocatable kernels
also (ie load ET_DYN type also)
Signed-off-by: M. Mohan Kumar <mohan at in.ibm.com>
---
second/yaboot.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- yaboot-1.3.14.orig/second/yaboot.c
+++ yaboot-1.3.14/second/yaboot.c
@@ -1606,7 +1606,7 @@ is_elf64(loadinfo_t *loadinfo)
e->e_ident[EI_MAG3] == ELFMAG3 &&
e->e_ident[EI_CLASS] == ELFCLASS64 &&
e->e_ident[EI_DATA] == ELFDATA2MSB &&
- e->e_type == ET_EXEC &&
+ (e->e_type == ET_EXEC || e->e_type == ET_DYN) &&
e->e_machine == EM_PPC64);
}

1687
yaboot-sha2.patch Normal file

File diff suppressed because it is too large Load Diff

521
yaboot.spec Normal file
View File

@ -0,0 +1,521 @@
Summary: Linux bootloader for Power Macintosh "New World" computers
Name: yaboot
Version: 1.3.14
Release: 35%{?dist}
License: GPLv2+
Group: System Environment/Base
Source: http://yaboot.ozlabs.org/releases/yaboot-%{version}.tar.gz
Source1: efika.forth
# include various git patches that have been there
# Patches were included directly in tarball. This is not ok, because
# tarball was different then upstream. So do the changes in patch
Patch0: yaboot-1.3.14-gitpatches.patch
Patch1: yaboot-1.3.3-man.patch
Patch2: yaboot-1.3.6-ofboot.patch
Patch3: yaboot-1.3.6-rh.patch
Patch4: yaboot-1.3.13-yabootconfig.patch
Patch6: yaboot-1.3.10-proddiscover.patch
Patch7: yaboot-1.3.10-ext3.patch
Patch8: yaboot-1.3.10-sbindir.patch
Patch9: yaboot-1.3.10-configfile.patch
Patch10: yaboot-1.3.10-parted.patch
Patch17: yaboot-1.3.13-pegasos-claim.patch
Patch18: yaboot-1.3.13-pegasos-ext2.patch
Patch21: yaboot-1.3.13-pegasos-serial.patch
Patch22: yaboot-1.3.13-allow-deep-mntpoint.patch
Patch28: yaboot-1.3.13-dontwritehome.patch
Patch30: yaboot-1.3.14-fix-bootonce-nvram.patch
Patch31: yaboot-1.3.14-bigger-max-token.patch
Patch32: yaboot-relocatable-kernel.patch
Patch33: yaboot-1.3.14-better_netboot.patch
Patch34: yaboot-1.3.14-no-birecs.patch
# mkofboot in verbose mode returns bad value
Patch35: yaboot-1.3.14-returns.patch
# ipv6 support
Patch36: yaboot-1.3.14-ipv6.patch
# Do not open LINUX_NATIVE parttions with OF, as badness happens
Patch37: yaboot-1.3.14-dont_of_open_native_partitions.patch
# Try #2 at better netboot now with DHCP parseing
Patch38: yaboot-1.3.14-better_netboot2.patch
# When netbooting, move the kernel onto the load buffer, sure it's a hack
Patch39: yaboot-1.3.14-move_kernel.patch
# SHA-2 support
Patch40: yaboot-sha2.patch
# Solves the situation, when there is no netinfo packet
Patch41: yaboot-1.3.14-netinfo.patch
# Better ISCSI boot
Patch42: yaboot-1.3.14-iscsi.patch
# prom_getchar eats characters
Patch43: yaboot-1.3.14-prom_getchars.patch
# Allow yaboot to allocate up to 256MB of memory
Patch44: yaboot-1.3.14-256-RMA.patch
# 621598, better memory management
Patch45: yaboot-1.3.14-memory_management.patch
URL: http://yaboot.ozlabs.org/
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
ExclusiveArch: ppc
# hfsutils will not be in RHEL6.
# hfsutils is needed only for non-IBM ppc machines
%if 0%{?fedora} || 0%{?rhel} < 6
Requires: hfsutils
%endif
BuildRequires: e2fsprogs-devel
# yaboot is bootloader. It contains ELF object, but it is not Linux or MacOS
# executable file. Yaboot is meant to be executed only by OpenFirmware.
# So debuginfo rpm is nonsense
%global debug_package %{nil}
%description
yaboot is a bootloader for PowerPC machines which works on New World ROM
machines (Rev. A iMac and newer) and runs directly from Open Firmware,
eliminating the need for Mac OS.
yaboot can also bootload IBM pSeries machines.
%prep
%setup -q
%patch0 -p1 -b .gitpatches
%patch1 -p0 -b .man
%patch2 -p1 -b .ofboot
%patch3 -p1 -b .rh
%patch4 -p1 -b .yabootconfig
%patch6 -p1 -b .proddisc
%patch7 -p1 -b .ext3
%patch8 -p1 -b .sbin
%patch9 -p1 -b .config
%patch10 -p1 -b .parted
%patch17 -p1 -b .pegasos
%patch18 -p1 -b .ext2
%patch21 -p1 -b .pegasos-serial
%patch22 -p1 -b .deepmnt
%patch28 -p1 -b .bootwrite
%patch30 -p1 -b .bootonce
%patch31 -p1 -b .maxtoken
%patch32 -p1 -b .relocatable
%patch33 -p1 -b .netboot
%patch34 -p1 -b .birecs
%patch35 -p1 -b .returns
%patch36 -p1 -b .ipv6
%patch37 -p1 -b .partitions
%patch38 -p1 -b .netboot2
%patch39 -p1 -b .movekernel
%patch40 -p1 -b .sha2
%patch41 -p1 -b .netinfo
%patch42 -p1 -b .iscsi
%patch43 -p1 -b .prom_getchars
%patch44 -p1 -b .256-RMA
%patch45 -p1 -b .memory_management
%build
iconv -f ISO88592 -t utf-8 -o doc/yaboot-howto.de.try.sgml \
doc/yaboot-howto.de.sgml && mv -f doc/yaboot-howto.de.try.sgml \
doc/yaboot-howto.de.sgml
make CFLAGS=-fno-strict-aliasing VERSIONEXTRA='\ (Red Hat %version-%release)' DEBUG=1
cp -a second/yaboot{,.debug}
make clean
make CFLAGS=-fno-strict-aliasing VERSIONEXTRA='\ (Red Hat %version-%release)'
%install
rm -rf $RPM_BUILD_ROOT
%makeinstall ROOT=$RPM_BUILD_ROOT PREFIX=%{_prefix} MANDIR=share/man SBINDIR=/sbin
rm -f $RPM_BUILD_ROOT/etc/yaboot.conf
touch $RPM_BUILD_ROOT/etc/yaboot.conf
mkdir -p $RPM_BUILD_ROOT/boot
install -m0644 %{SOURCE1} $RPM_BUILD_ROOT/boot/efika.forth
install -m0644 second/yaboot.debug $RPM_BUILD_ROOT/usr/lib/yaboot/
rm -f $RPM_BUILD_ROOT/usr/share/doc/yaboot-1.3.14/README.man.patch
rm -f $RPM_BUILD_ROOT/usr/share/doc/yaboot-1.3.14/Makefile
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%doc COPYING README* doc/*
/boot/efika.forth
/sbin/ofpath
/sbin/ybin
/sbin/yabootconfig
/sbin/mkofboot
%dir /usr/lib/yaboot/
/usr/lib/yaboot/addnote
/usr/lib/yaboot/ofboot
/usr/lib/yaboot/yaboot
/usr/lib/yaboot/yaboot.debug
%{_mandir}/man8/bootstrap.8.gz
%{_mandir}/man8/mkofboot.8.gz
%{_mandir}/man8/ofpath.8.gz
%{_mandir}/man8/yaboot.8.gz
%{_mandir}/man8/yabootconfig.8.gz
%{_mandir}/man8/ybin.8.gz
%{_mandir}/man5/yaboot.conf.5.gz
%ghost %config(noreplace) %{_sysconfdir}/yaboot.conf
%changelog
* Fri Aug 06 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-35
- Better memory management
Resolves: #621598
* Fri Jun 11 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-34
- Use -fno-strict-aliasing CFLAG and mark /usr/lib/yaboot as a dir in files
section
Resolves: #599403
* Wed May 26 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-33
- Allow yaboot to allocate up to 256MB of memory
Resolves: #596299
* Wed May 26 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-32
- Get back #ExlusiveArch
Resolves: #593377
* Wed May 26 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-31
- Allow copy&paste
Resolves: #593377
* Tue Mar 18 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-30
- Better iSCSI booting
Resolves: #553748
* Tue Mar 16 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-29
- Added missing yaboot-1.3.14-netinfo.patch
Resolves: #553061
* Tue Mar 16 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-28
- Don't fail when there is no netinfo packet
Resolves: #553061
* Fri Feb 26 2010 Roman Rakus <rrakus@redhat.com> - 1.3.14-27
- Update to include various changes from git that have been Fedora since .14
was added.
- Don't end summary with dot.
* Fri Jan 22 2010 Roman Rakus rrakus@redhat.com 1.3.14-26
- SHA2 support
Resolves: #555093
* Tue Jan 12 2010 rrakus@redhat.com 1.3.14-25
- Use correct upstream source tarball
- Patch changed for that source
Resolves: #554676
* Tue Jan 12 2010 rrakus@redhat.com 1.3.14-24
- Fixed summary, buildroot
- Converted doc/yaboot-howto.de.sgml to utf8
- Clear buildroot before install
- Removed README.man.patch and Makefile from doc dir
- Own /usr/lib/yaboot/
- defattr(-,root,root,-)
Resolves: #554676
* Mon Nov 30 2009 Dennis Gregorovic <dgregor@redhat.com> - 1.3.14-23.1
- Rebuilt for RHEL 6
* Thu Oct 29 2009 Roman Rakus <rrakus@redhat.com> - 1.3.14-23
- When netbooting "clobber" the LOAD_BUFFER and move the kernel into it to make
room for RTAS (#530330)
- Adding better netboot support more work on (#458438)
* Mon Oct 19 2009 Tony Breed <tony@bakeyournoodle.com> - 1.3.14-22
- Calling of_open() on a LINUX_NATIVE parttions seesm to work but end up with a
garbage file. Add check to of_open to skip these parttions (#526021).
* Mon Oct 19 2009 Tony Breed <tony@bakeyournoodle.com> - 1.3.14-21
- Explicitly build a DEBUG=1 version of yaboot to aid in debugging
* Mon Oct 19 2009 Tony Breed <tony@bakeyournoodle.com> - 1.3.14-20
- Only require hfsutils on fedora and rhel <= 5
* Thu Sep 09 2009 Roman Rakus <rrakus@redhat.com> - 1.3.14-19
- Increase TFTP buffer to 32MB
* Wed Sep 09 2009 Roman Rakus <rrakus@redhat.com> - 1.3.14-18
- Do not require hfsutils on RHEL 6
* Fri Aug 14 2009 Roman Rakus <rrakus@redhat.com> - 1.3.14-17
- ipv6 support
- don't build debuginfo package
* Fri Aug 07 2009 Bill Nottingham <notting@redhat.com> - 1.3.14-16
- fix patch file for (#515555)
* Fri Aug 07 2009 Roman Rakus <rrakus@redhat.com> - 1.3.14-15
- Fix bad return code in verbose mode (#515555)
* Mon Jul 27 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.14-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
* Sun Jun 07 2009 David Woodhouse <David.Woodhouse@intel.com> - 1.3.14-13
- Don't set up bi_recs. Especially not in the middle of the kernel text.
* Mon Apr 06 2009 tony@bakeyournoodle.com - 1.3.14-12
- Increase the TFTP load buffer from 20MiB to 25MiB. (#483051)
* Fri Mar 13 2009 tony@bakeyournoodle.com - 1.3.14-11
- Adding better netboot support (#458438)
- Allocate more buffer space for larger kernels and initrds (#472225)
* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.14-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
* Thu Jan 22 2009 Josh Boyer <jwboyer@gmail.com> - 1.3.14-9
- Add patch to handle relocatable kernels
* Thu Nov 27 2008 Roman Rakus <rrakus@redhat.com> - 1.3.14-8
- Bumped release, so preupgrade is now silent and go through
* Fri Nov 21 2008 David Woodhouse <David.Woodhouse@intel.com> - 1.3.14-7
- Fix 'ybin --bootonce' (#471425)
- Fix maximum token length, to fix preupgrade (#471321)
* Wed Nov 05 2008 Roman Rakus <rrakus@redhat.com> - 1.3.14-6
- Changed kernel load base address
Resolves: #468492
* Mon Aug 11 2008 Roman Rakus <rrakus@redhat.com> - 1.3.14-5
- Clearing in specfile
- Fixed patches for --fuzz=0
* Wed May 28 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 1.3.14-4
- fix license tag
* Wed Apr 16 2008 Roman Rakus <rrakus@redhat.com> - 1.3.14-3
- Upstream 1.3.14
* Thu Mar 27 2008 David Woodhouse <dwmw2@redhat.com> - 1.3.13-11
- Correct off-by-one error in Amiga partition numbers
* Thu Mar 27 2008 David Woodhouse <dwmw2@redhat.com> - 1.3.13-10
- Don't increment partition number to work around bplan firmware
brokenness when the config file was specified on the command line
* Fri Feb 08 2008 David Cantrell <dcantrell@redhat.com> - 1.3.13-9
- Rebuild for gcc-4.3
* Wed Nov 28 2007 David Woodhouse <dwmw2@redhat.com> - 1.3.13-8
- Correct default config file location on Efika
- Disable new USB bindings in efika.forth for now
* Tue Nov 27 2007 David Woodhouse <dwmw2@redhat.com> - 1.3.13-7
- Add efika.forth for fixing up Efika device-tree
* Tue Nov 27 2007 David Woodhouse <dwmw2@redhat.com> - 1.3.13-6
- Detect broken bplan firmware and don't add ":0" to block device names
* Tue Aug 21 2007 David Cantrell <dcantrell@redhat.com> - 1.3.13-5
- Rebuild
* Thu Nov 16 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-4
- Add support for usb/firewire from Alex Kanavin (#208768)
* Thu Nov 09 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-3
- Apply addnote patch (#184714)
* Wed Aug 23 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-2
- Fix ybin with SELinux (#201414)
* Mon Aug 21 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-1
- Fix multi disk G5 patch for all cases
* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 1.3.13-0.18.1
- rebuild
* Tue Feb 21 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.18
- Drop telnet console patch for now (#182180)
* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 1.3.13-0.17.1
- bump again for double-long bug on ppc(64)
* Thu Feb 09 2006 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.17
- Fix ofpath for multi-disk G5 (#180182)
* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 1.3.13-0.16.2
- rebuilt for new gcc4.1 snapshot and glibc changes
* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
- rebuilt
* Wed Sep 14 2005 Jeremy Katz <katzj@redhat.com> - 1.3.13-0.16
- fix paths
* Wed Sep 14 2005 Jeremy Katz <katzj@redhat.com> - 1.3.13-0.15
- fix build on ppc64
* Wed Sep 14 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.14
- New netboot patch handling device=alias: for non network case
* Tue Sep 13 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.13
- Print version-release of yaboot
* Mon Sep 12 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.12
- reworking of netboot patch (Nathan Lynch)
* Sat Aug 20 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.11
- drop netboot patch as mac cds fail to load yaboot.conf
* Wed Aug 17 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.10
- No colours on unsupported consoles (eg telnet)
- Improved pSeries netbooting (Nathan Lynch)
* Sun Aug 14 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.9
- Try harder to allocate malloc region
* Thu Aug 11 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.8
- Allow mntpoint to be more than one directory into the partition
as long as magicboot and nvram are not being used.
* Thu Aug 11 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.7
- Fix error in swraid2 patch -- don't dereference NULL pointer.
* Tue Aug 9 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.6
- Fix handling of prom 'read' method, to make Pegasos serial work
* Tue Aug 9 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.5
- Fix Pegasos partition hack
* Tue Aug 9 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.4
- Make default boot after timeout work again
- Pegasos disagrees about partition numbering
* Sat Jul 30 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.3
- Accept config file path on command line
- Make ofpath work on Pegasos
* Fri Jul 29 2005 David Woodhouse <dwmw2@redhat.com> - 1.3.13-0.2
- Workaround claim bug in Pegasos SmartFirmware
- Handle ext2 boot partition
* Fri Jul 22 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.13-0.1
- Upstream 1.3.13
- Add patches on yaboot-1.3.x tree
- Try dropping ppc64 initrd patch
* Tue Mar 15 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.12-9
- GCC 4 rebuild
* Wed Feb 02 2005 Paul Nasrat <pnasrat@redhat.com> - 1.3.12-8
- addnote support for IBM,RPA-Client-Config note (#145739)
- Patch to recognise l-lan as a network device
* Wed Jul 28 2004 Paul Nasrat <pnasrat@redhat.com> - 1.3.12-7
- Add yaboot.conf as ghost
* Sat Jul 10 2004 Paul Nasrat <pnasrat@redhat.com> - 1.3.12-6
- Rebuild
* Sat Jul 10 2004 Paul Nasrat <pnasrat@redhat.com> - 1.3.12-5
- Added hfsutils requires for pmac
* Wed Jun 23 2004 David Woodhouse <dwmw2@redhat.com> - 1.3.12-4
- Increase TFTP load buffer size to 8MiB.
* Fri Jun 18 2004 Jeremy Katz <katzj@redhat.com> - 1.3.12-3
- s/Copyright/License/
- fix build with gcc 3.4
* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
- rebuilt
* Mon May 24 2004 Paul Nasrat <pnasrat@redhat.com> 1.3.12-1
- update to 1.3.12
* Tue Apr 20 2004 David Woodhouse <dwmw2@redhat.com> 1.3.10-10
- make yabootconfig use parted if available
* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
- rebuilt
* Fri Aug 22 2003 Elliot Lee <sopwith@redhat.com> 1.3.10-8
- Build for rawhide
* Fri Jun 20 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-7
- allow passing configfile name to yabootconfig with -C
* Wed Jun 18 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-6
- don't ship (invalid) default yaboot.conf
- update to newer version of ppc64 initrd patch
* Mon Apr 28 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-5
- clean up how yabootconfig adds stuff, do some rediff'ing
- install ybin, etc in /sbin instead of /usr/sbin (#83229)
* Wed Apr 23 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-4
- make sure there's a newline at the end of yaboot.conf generated by
yabootconfig
* Wed Apr 9 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-3
- try to read product name from /etc/redhat-release instead of hard coding
- add patch (from silo) to allow mounting dirty fs's instead of mounting
read-write
* Thu Apr 3 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-2
- add patch from Peter Bergner <bergner@vnet.ibm.com> to add support for
ppc64 initrds (warning: breaks ppc32 initrds)
* Thu Mar 20 2003 Jeremy Katz <katzj@redhat.com> 1.3.10-1
- update to 1.3.10
- fix ofboot patch to use Red Hat Linux instead of Yellow Dog Linux
- include patch from Dan Burcaw for yabootconfig so that it can be used
from the installer
* Tue Jan 21 2003 Elliot Lee <sopwith@redhat.com> 1.3.8-1
- Update to new version
* Wed Dec 11 2002 Tim Powers <timp@redhat.com> 1.3.6-1b.2rh
- rebuild
- added ExclusiveArch
* Wed Mar 06 2002 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- modify for YDL 2.2
* Fri Dec 07 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- update to 1.3.6
* Sat Oct 06 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- update to 1.3.4
* Sun Sep 30 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- updated to yaboot 1.3.3
* Tue Sep 25 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- add makefile patch
* Sun Sep 23 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- update to 1.3.1
- obsoletes ybin
* Thu Aug 08 2001 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- updated to 1.2.3 per Ben H's urgent announcement
- removed obsoleted patches
* Tue Jan 16 2001 Hollis Blanchard <hollis@terrasoftsolutions.com>
- hacked out bug preventing manual boot from yaboot prompt (may break CHRP)
- removed ybin's man pages
- moved to /usr/lib/yaboot for ybin, FHS compliance
- changed permissions to 644 (can't run yaboot under Linux)
* Sat Nov 18 2000 Hollis Blanchard <hollis@terrasoftsolutions.com>
- updated to yaboot 0.9
- added man pages from ybin
- added sample yaboot.conf and bootscript (and README's)
* Sun Feb 27 2000 Dan Burcaw <dburcaw@terrasoftsolutions.com>
- modified for YDL
* Wed Jan 18 2000 Tom Rini <trini@kernel.crashing.org>
- created