diff options
-rw-r--r-- | loader2/cdinstall.c | 2 | ||||
-rw-r--r-- | loader2/linuxrc.s390 | 522 | ||||
-rw-r--r-- | loader2/loader.c | 2 | ||||
-rw-r--r-- | loader2/method.c | 2 | ||||
-rwxr-xr-x | scripts/mk-images | 1 | ||||
-rw-r--r-- | scripts/mk-images.s390 | 8 | ||||
-rw-r--r-- | utils/Makefile | 10 | ||||
-rw-r--r-- | utils/mk-s390-cdboot.c | 156 |
8 files changed, 453 insertions, 250 deletions
diff --git a/loader2/cdinstall.c b/loader2/cdinstall.c index 3dab63c37..6806f3600 100644 --- a/loader2/cdinstall.c +++ b/loader2/cdinstall.c @@ -445,9 +445,7 @@ char * mountCdromImage(struct installMethod * method, void setKickstartCD(struct loaderData_s * loaderData, int argc, char ** argv) { logMessage(INFO, "kickstartFromCD"); -#if !defined(__s390__) && !defined(__s390x__) loaderData->method = METHOD_CDROM; -#endif } int kickstartFromCD(char *kssrc) { diff --git a/loader2/linuxrc.s390 b/loader2/linuxrc.s390 index f9e1de9ee..6454becf4 100644 --- a/loader2/linuxrc.s390 +++ b/loader2/linuxrc.s390 @@ -247,269 +247,307 @@ mount -t ramfs none /tmp ifconfig lo 127.0.0.1 netmask 255.0.0.0 route add -host 127.0.0.1 dev lo 2>/dev/null +# make sure we have an /etc/hosts file (required for telnetd) +echo -e "127.0.0.1\tlocalhost.localdomain localhost" > /etc/hosts +echo -e "::1\t\tlocalhost6.localdomain6 localhost6" >> /etc/hosts + LO="" [ -L /sbin/insmod ] && LO=".ko" +# Parse configuration if [ -n "$CMSDASD" -a -n "$CMSCONFFILE" ]; then readcmsfile $CMSDASD $CMSCONFFILE source /tmp/$CMSCONFFILE #2>/dev/null fi -# Parse configuration -# Check for missing parameters, prompt for them if necessary -while [ -z "$NETTYPE" ]; do - echo $"Which kind of network device do you intend to use" - echo $" (e.g. ctc, iucv, qeth, lcs)." - echo $"Enter 'qeth' for OSA-Express Fast Ethernet, Gigabit Ethernet" - echo $" (including 1000Base-T), High Speed Token Ring, and ATM " - echo $" (running Ethernet LAN emulation) features in QDIO mode." - echo $"Enter 'lcs' for OSA2 Ethernet/Token Ring, OSA-Express Fast Ethernet in" - echo $" non-QDIO mode, OSA-Express High Speed Token Ring in non-QDIO mode and" - echo $" Gigabit Ethernet in non-QDIO mode." - read NETTYPE -done -if [ "$NETTYPE" != "iucv" ]; then # iucv is the only interface without ccw config - if [ -n "$CHANDEV" ]; then - echo - echo $"The CHANDEV variable isn't used anymore, please update your " - echo $".parm or the .conf file" - echo +do_net_install="yes" + +if [ -r /sys/firmware/ipl/ipl_type ]; then + if [ "`cat /sys/firmware/ipl/ipl_type`" = "fcp" ]; then + while [ 1 ]; do + echo $"Your IPL device is set to FCP." + echo $"Would you like to perform a CD-ROM/DVD-ROM installation? (y/n)" + read do_cd_install + case $do_cd_install in + y|Y|[Yy][Ee][Ss]) + # set up FCP cdrom here + CD_DEVICE="`cat /sys/firmware/ipl/device`" + WWPN="`cat /sys/firmware/ipl/wwpn`" + LUN="`cat /sys/firmware/ipl/lun`" + echo 1 > /sys/bus/ccw/drivers/zfcp/$CD_DEVICE/online + echo $WWPN > /sys/bus/ccw/drivers/zfcp/$CD_DEVICE/port_add + echo $LUN > /sys/bus/ccw/drivers/zfcp/$CD_DEVICE/$WWPN/unit_add + do_net_install="no" + break + ;; + n|N|[Nn][Oo]) + do_net_install="yes" + break + ;; + *) + echo + echo $"*** INVALID ANSWER: $do_cd_install" + echo + unset do_cd_install + ;; + esac + done fi - while [ -z "$SUBCHANNELS" ]; do - echo $"Enter the bus ID and the device number of your CCW devices." - echo $"CTC/ESCON and LCS need two subchannels:" - echo $"(e.g. \"0.0.0600,0.0.0601\" will configure the CTC or ESCON interface" - echo $"with the subchannels 0x600 and 0x601)" - echo $"QETH needs three subchannels p.e. 0.0.0300,0.0.0301,0.0.0302" - read SUBCHANNELS - done - SUBCHANNELS=`echo $SUBCHANNELS | /sbin/busybox tr ABCDEF abcdef` - if [ "$NETTYPE" = "qeth" ]; then - if [ -z "$PORTNAME" ]; then - echo $"Portname of the OSA-Express feature in QDIO mode and z/VM Guest LAN" - echo $"This parameter is optional with z/VM 4.4.0 or z/VM 4.3.0 with" - echo $"APARs VM63308 and PQ73878" - echo $"Press enter if you don't want to enter a portname" - read PORTNAME - fi - if [ -z "$LAYER2" ]; then - echo $"Enter the mode of operation for the OSA device" - echo $"0 for layer 3 mode (default)" - echo $"1 for layer 2 mode" - read LAYER2 - fi - fi fi - -while [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; do - echo $"Enter the FQDN of your new Linux guest (e.g. s390.redhat.com):" - read HOSTNAME -done -while [ -z "$IPADDR" ]; do - echo $"Enter a valid IP address of your new Linux guest:" - read IPADDR - checkip $IPADDR - ret=$? - if [ $ret -eq 1 ]; then - echo -n "Invalid IP address format. " - unset IPADDR - fi -done -while [ -z "$NETWORK" ]; do - echo $"Enter a valid network address of the new Linux guest:" - read NETWORK - checkip $NETWORK - ret=$? - if [ $ret -eq 1 ]; then - echo -n "Invalid network address format. " - unset NETWORK - fi -done -if [ "$NETTYPE" = "qeth" ] || [ "$NETTYPE" = "lcs" ]; then - while [ -z "$NETMASK" ]; do - echo $"Enter the netmask for the new Linux guest (e.g. 255.255.255.0):" - read NETMASK - checkip $NETMASK - ret=$? - if [ $ret -eq 1 ]; then - echo -n "Invalid netmask format. " - unset NETMASK - fi - done - while [ -z "$BROADCAST" ]; do - echo $"Enter the broadcast address for the new Linux guest:" - read BROADCAST - checkip $BROADCAST - ret=$? - if [ $ret -eq 1 ]; then - echo -n "Invalid broadcast address format. " - unset BROADCAST - fi - done - while [ -z "$GATEWAY" ]; do - echo $"Enter your default gateway:" - read GATEWAY - checkip $GATEWAY - ret=$? - if [ $ret -eq 1 ]; then - echo -n "Invalid gateway address format. " - unset GATEWAY - fi - done - if [ ":$NETTYPE" = ":lcs" ]; then - if [ -n "$RUNKS" -a -z "$PORTNAME" ]; then - PORTNAME=0 - fi - while [ -z "$PORTNAME" ]; do - echo $"Enter the relative port number of your LCS device" - echo $"(required for OSA-Express ATM cards only):" - read PORTNAME - done - fi -else # ctc0, iucv0 - if [ -z "$NETMASK" ]; then - # If the user did not supply netmask, we add the right one. - # Netmask MUST be present, or pumpSetupInterface() blows routes. - NETMASK="255.255.255.255" - fi - while [ -z "$GATEWAY" ]; do - echo $"Enter the IP of your CTC / ESCON / IUCV point-to-point partner:" - read GATEWAY - done - - if [ "$NETTYPE" = "ctc" ]; then - if [ -z "$MTU" ]; then - MTU="1500" - fi - if [ -z "$RUNKS" ]; then - if [ -n "$CTCPROT" ]; then - validprot=1 - else - validprot=0 - fi - while [ "$validprot" = "0" ]; do - echo $"Select which protocol should be used for the CTC interface" - echo $"0 for compatibility with p.e. VM TCP service machine (default)" - echo $"1 for enhanced package checking for Linux peers" - echo $"3 for compatibility with OS/390 or z/OS peers" - read CTCPROT - case "x$CTCPROT" in - x|x0) - validprot=1 - unset CTCPROT - ;; - x1|x3) - validprot=1 - ;; - x2) - echo $"CTC tty's are not usable for this installation" - ;; - *) - echo $"Invalid selection" - ;; - esac - done + +if [ "$do_net_install" = "yes" ]; then + # Check for missing parameters, prompt for them if necessary + while [ -z "$NETTYPE" ]; do + echo $"Which kind of network device do you intend to use" + echo $" (e.g. ctc, iucv, qeth, lcs)." + echo $"Enter 'qeth' for OSA-Express Fast Ethernet, Gigabit Ethernet" + echo $" (including 1000Base-T), High Speed Token Ring, and ATM " + echo $" (running Ethernet LAN emulation) features in QDIO mode." + echo $"Enter 'lcs' for OSA2 Ethernet/Token Ring, OSA-Express Fast Ethernet in" + echo $" non-QDIO mode, OSA-Express High Speed Token Ring in non-QDIO mode and" + echo $" Gigabit Ethernet in non-QDIO mode." + read NETTYPE + done + if [ "$NETTYPE" != "iucv" ]; then # iucv is the only interface without ccw config + if [ -n "$CHANDEV" ]; then + echo + echo $"The CHANDEV variable isn't used anymore, please update your " + echo $".parm or the .conf file" + echo + fi + while [ -z "$SUBCHANNELS" ]; do + echo $"Enter the bus ID and the device number of your CCW devices." + echo $"CTC/ESCON and LCS need two subchannels:" + echo $"(e.g. \"0.0.0600,0.0.0601\" will configure the CTC or ESCON interface" + echo $"with the subchannels 0x600 and 0x601)" + echo $"QETH needs three subchannels p.e. 0.0.0300,0.0.0301,0.0.0302" + read SUBCHANNELS + done + SUBCHANNELS=`echo $SUBCHANNELS | /sbin/busybox tr ABCDEF abcdef` + if [ "$NETTYPE" = "qeth" ]; then + if [ -z "$PORTNAME" ]; then + echo $"Portname of the OSA-Express feature in QDIO mode and z/VM Guest LAN" + echo $"This parameter is optional with z/VM 4.4.0 or z/VM 4.3.0 with" + echo $"APARs VM63308 and PQ73878" + echo $"Press enter if you don't want to enter a portname" + read PORTNAME + fi + if [ -z "$LAYER2" ]; then + echo $"Enter the mode of operation for the OSA device" + echo $"0 for layer 3 mode (default)" + echo $"1 for layer 2 mode" + read LAYER2 + fi + fi + fi + + while [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; do + echo $"Enter the FQDN of your new Linux guest (e.g. s390.redhat.com):" + read HOSTNAME + done + while [ -z "$IPADDR" ]; do + echo $"Enter a valid IP address of your new Linux guest:" + read IPADDR + checkip $IPADDR + ret=$? + if [ $ret -eq 1 ]; then + echo -n "Invalid IP address format. " + unset IPADDR + fi + done + while [ -z "$NETWORK" ]; do + echo $"Enter a valid network address of the new Linux guest:" + read NETWORK + checkip $NETWORK + ret=$? + if [ $ret -eq 1 ]; then + echo -n "Invalid network address format. " + unset NETWORK + fi + done + if [ "$NETTYPE" = "qeth" ] || [ "$NETTYPE" = "lcs" ]; then + while [ -z "$NETMASK" ]; do + echo $"Enter the netmask for the new Linux guest (e.g. 255.255.255.0):" + read NETMASK + checkip $NETMASK + ret=$? + if [ $ret -eq 1 ]; then + echo -n "Invalid netmask format. " + unset NETMASK + fi + done + while [ -z "$BROADCAST" ]; do + echo $"Enter the broadcast address for the new Linux guest:" + read BROADCAST + checkip $BROADCAST + ret=$? + if [ $ret -eq 1 ]; then + echo -n "Invalid broadcast address format. " + unset BROADCAST + fi + done + while [ -z "$GATEWAY" ]; do + echo $"Enter your default gateway:" + read GATEWAY + checkip $GATEWAY + ret=$? + if [ $ret -eq 1 ]; then + echo -n "Invalid gateway address format. " + unset GATEWAY + fi + done + if [ ":$NETTYPE" = ":lcs" ]; then + if [ -n "$RUNKS" -a -z "$PORTNAME" ]; then + PORTNAME=0 + fi + while [ -z "$PORTNAME" ]; do + echo $"Enter the relative port number of your LCS device" + echo $"(required for OSA-Express ATM cards only):" + read PORTNAME + done fi - fi - if [ ":$NETTYPE" = ":iucv" ]; then - while [ -z "$PEERID" ]; do - echo $"Enter the peer id of the VM guest you want to" - echo $"connect to (in capital letters)." - read PEERID - done - fi -fi -# don't ask for MTU, but use it if it has been set in the .parm file -# don't overwrite MMTU if it has been set for CTC -if [ -n "$MTU" -a -z "$MMTU" ]; then - MMTU="mtu $MTU" -fi + else # ctc0, iucv0 + if [ -z "$NETMASK" ]; then + # If the user did not supply netmask, we add the right one. + # Netmask MUST be present, or pumpSetupInterface() blows routes. + NETMASK="255.255.255.255" + fi + while [ -z "$GATEWAY" ]; do + echo $"Enter the IP of your CTC / ESCON / IUCV point-to-point partner:" + read GATEWAY + done + + if [ "$NETTYPE" = "ctc" ]; then + if [ -z "$MTU" ]; then + MTU="1500" + fi + if [ -z "$RUNKS" ]; then + if [ -n "$CTCPROT" ]; then + validprot=1 + else + validprot=0 + fi + while [ "$validprot" = "0" ]; do + echo $"Select which protocol should be used for the CTC interface" + echo $"0 for compatibility with p.e. VM TCP service machine (default)" + echo $"1 for enhanced package checking for Linux peers" + echo $"3 for compatibility with OS/390 or z/OS peers" + read CTCPROT + case "x$CTCPROT" in + x|x0) + validprot=1 + unset CTCPROT + ;; + x1|x3) + validprot=1 + ;; + x2) + echo $"CTC tty's are not usable for this installation" + ;; + *) + echo $"Invalid selection" + ;; + esac + done + fi + fi + if [ ":$NETTYPE" = ":iucv" ]; then + while [ -z "$PEERID" ]; do + echo $"Enter the peer id of the VM guest you want to" + echo $"connect to (in capital letters)." + read PEERID + done + fi + fi + # don't ask for MTU, but use it if it has been set in the .parm file + # don't overwrite MMTU if it has been set for CTC + if [ -n "$MTU" -a -z "$MMTU" ]; then + MMTU="mtu $MTU" + fi -# configure network-interface -if [ ":$NETTYPE" = ":ctc" ]; then - insmod ccwgroup$LO - insmod cu3088$LO - insmod fsm$LO - insmod ctc$LO - setupdevice - DEVICE=${NETTYPE}0 - ifconfig $DEVICE $IPADDR $MMTU pointopoint $GATEWAY - echo "alias $DEVICE ctc" >> /tmp/modprobe.conf -elif [ ":$NETTYPE" = ":iucv" ]; then - insmod fsm$LO - insmod iucv$LO - insmod netiucv$LO - sysecho /sys/bus/iucv/drivers/netiucv/connection $PEERID - DEVICE=${NETTYPE}0 - ifconfig $DEVICE $IPADDR $MMTU pointopoint $GATEWAY - echo "alias $DEVICE netiucv" >> /tmp/modprobe.conf -elif [ "$NETTYPE" = "lcs" ]; then - insmod ccwgroup$LO - insmod cu3088$LO - insmod lcs$LO - setupdevice -# KH FIXME: Workaround for missing sysfs interface -# DEVICE=`cat /sys/devices/lcs/${SUBCHANNELS//,*/}/if_name` - getlcsifname ${SUBCHANNELS//,*/} - ifconfig $DEVICE $IPADDR $MMTU netmask $NETMASK broadcast $BROADCAST - route add -net $NETWORK netmask $NETMASK dev $DEVICE 2>/dev/null - echo "alias $DEVICE lcs" >> /tmp/modprobe.conf -elif [ "$NETTYPE" = "qeth" ]; then - insmod ccwgroup$LO - insmod qdio$LO - insmod ipv6$LO - insmod qeth$LO - setupdevice - DEVICE=`cat /sys/devices/qeth/${SUBCHANNELS//,*/}/if_name` - ifconfig $DEVICE $IPADDR $MMTU netmask $NETMASK broadcast $BROADCAST - route add -net $NETWORK netmask $NETMASK dev $DEVICE 2>/dev/null - echo "alias $DEVICE qeth" >> /tmp/modprobe.conf -else - echo $"Unknown network device, aborting installation" - exit 1 -fi + # configure network-interface + if [ ":$NETTYPE" = ":ctc" ]; then + insmod ccwgroup$LO + insmod cu3088$LO + insmod fsm$LO + insmod ctc$LO + setupdevice + DEVICE=${NETTYPE}0 + ifconfig $DEVICE $IPADDR $MMTU pointopoint $GATEWAY + echo "alias $DEVICE ctc" >> /tmp/modprobe.conf + elif [ ":$NETTYPE" = ":iucv" ]; then + insmod fsm$LO + insmod iucv$LO + insmod netiucv$LO + sysecho /sys/bus/iucv/drivers/netiucv/connection $PEERID + DEVICE=${NETTYPE}0 + ifconfig $DEVICE $IPADDR $MMTU pointopoint $GATEWAY + echo "alias $DEVICE netiucv" >> /tmp/modprobe.conf + elif [ "$NETTYPE" = "lcs" ]; then + insmod ccwgroup$LO + insmod cu3088$LO + insmod lcs$LO + setupdevice + # KH FIXME: Workaround for missing sysfs interface + # DEVICE=`cat /sys/devices/lcs/${SUBCHANNELS//,*/}/if_name` + getlcsifname ${SUBCHANNELS//,*/} + ifconfig $DEVICE $IPADDR $MMTU netmask $NETMASK broadcast $BROADCAST + route add -net $NETWORK netmask $NETMASK dev $DEVICE 2>/dev/null + echo "alias $DEVICE lcs" >> /tmp/modprobe.conf + elif [ "$NETTYPE" = "qeth" ]; then + insmod ccwgroup$LO + insmod qdio$LO + insmod ipv6$LO + insmod qeth$LO + setupdevice + DEVICE=`cat /sys/devices/qeth/${SUBCHANNELS//,*/}/if_name` + ifconfig $DEVICE $IPADDR $MMTU netmask $NETMASK broadcast $BROADCAST + route add -net $NETWORK netmask $NETMASK dev $DEVICE 2>/dev/null + echo "alias $DEVICE qeth" >> /tmp/modprobe.conf + else + echo $"Unknown network device, aborting installation" + exit 1 + fi -route add default gw $GATEWAY dev $DEVICE 2>/dev/null + route add default gw $GATEWAY dev $DEVICE 2>/dev/null -if [ -z "$DNS" ]; then - echo $"Enter your DNS server(s), separated by colons (:):" - read DNS -fi -if [ -z "$DNS" ]; then - echo $"You might encounter problems without a nameserver, especially" - echo $"with FTP installs" -fi + if [ -z "$DNS" ]; then + echo $"Enter your DNS server(s), separated by colons (:):" + read DNS + fi + if [ -z "$DNS" ]; then + echo $"You might encounter problems without a nameserver, especially" + echo $"with FTP installs" + fi -if [ -n "$DNS" -a -z "$SEARCHDNS" ]; then - echo $"Enter your DNS search domain(s) (if any), separated by colons (:):" - read SEARCHDNS -fi + if [ -n "$DNS" -a -z "$SEARCHDNS" ]; then + echo $"Enter your DNS search domain(s) (if any), separated by colons (:):" + read SEARCHDNS + fi -[ -n "$HOSTNAME" ] && hostname $HOSTNAME + [ -n "$HOSTNAME" ] && hostname $HOSTNAME -# show interfaces and routing table -ifconfig -a -route -n + # show interfaces and routing table + ifconfig -a + route -n -#echo $"Starting portmap." -#portmap + #echo $"Starting portmap." + #portmap -# convert to space-separated lists -if [ -n "$SEARCHDNS" ]; then - SEARCHDNS=`echo $SEARCHDNS |sed -e 's/:/ /g'` - for i in "$SEARCHDNS"; do echo "search $i"; done >> /etc/resolv.conf -fi -if [ -n "$DNS" ]; then - RESOLVDNS=`echo $DNS |sed -e 's/:/ /g'` - for i in $RESOLVDNS; do echo "nameserver $i"; done >> /etc/resolv.conf -fi + # convert to space-separated lists + if [ -n "$SEARCHDNS" ]; then + SEARCHDNS=`echo $SEARCHDNS |sed -e 's/:/ /g'` + for i in "$SEARCHDNS"; do echo "search $i"; done >> /etc/resolv.conf + fi + if [ -n "$DNS" ]; then + RESOLVDNS=`echo $DNS |sed -e 's/:/ /g'` + for i in $RESOLVDNS; do echo "nameserver $i"; done >> /etc/resolv.conf + fi -# make sure we have an /etc/hosts file (required for telnetd) -echo -e "127.0.0.1\tlocalhost.localdomain localhost" > /etc/hosts -echo -e "::1\t\tlocalhost6.localdomain6 localhost6" >> /etc/hosts -if [ ! -z "$HOSTNAME" -a ! -z "$IPADDR" ]; then - echo -e "$IPADDR\t$HOSTNAME `echo $HOSTNAME | cut -d '.' -f 1`" >> /etc/hosts + if [ ! -z "$HOSTNAME" -a ! -z "$IPADDR" ]; then + echo -e "$IPADDR\t$HOSTNAME `echo $HOSTNAME | cut -d '.' -f 1`" >> /etc/hosts + fi fi if [ -z "$DASD" ]; then diff --git a/loader2/loader.c b/loader2/loader.c index 3599571a0..3b68a939b 100644 --- a/loader2/loader.c +++ b/loader2/loader.c @@ -119,9 +119,7 @@ int num_link_checks = 5; int post_link_sleep = 0; static struct installMethod installMethods[] = { -#if !defined(__s390__) && !defined(__s390x__) { N_("Local CD/DVD"), 0, DEVICE_CDROM, mountCdromImage }, -#endif { N_("Hard drive"), 0, DEVICE_DISK, mountHardDrive }, { N_("NFS directory"), 1, DEVICE_NETWORK, mountNfsImage }, { "URL", 1, DEVICE_NETWORK, mountUrlImage }, diff --git a/loader2/method.c b/loader2/method.c index 5ed42b300..d5bda571f 100644 --- a/loader2/method.c +++ b/loader2/method.c @@ -524,10 +524,8 @@ void setStage2LocFromCmdline(char * arg, struct loaderData_s * ld) { ld->method = METHOD_URL; ld->stage2Data = calloc(sizeof(struct urlInstallData *), 1); ((struct urlInstallData *)ld->stage2Data)->url = strdup(arg); -#if !defined(__s390__) && !defined(__s390x__) } else if (!strncmp(arg, "cdrom:", 6)) { ld->method = METHOD_CDROM; -#endif } else if (!strncmp(arg, "harddrive:", 10) || !strncmp(arg, "hd:", 3)) { ld->method = METHOD_HD; diff --git a/scripts/mk-images b/scripts/mk-images index 96410f456..e21bb0c0c 100755 --- a/scripts/mk-images +++ b/scripts/mk-images @@ -165,6 +165,7 @@ INITRDMODS="$USBMODS $FIREWIREMODS $IDEMODS $SCSIMODS $FSMODS $LVMMODS $RAIDMODS TRIMPCIIDS=$IMGPATH/usr/lib/anaconda-runtime/trimpciids GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps GENINITRDSZ=$IMGPATH/usr/lib/anaconda-runtime/geninitrdsz + MKS390CDBOOT=$IMGPATH/usr/lib/anaconda-runtime/mk-s390-cdboot GENMODINFO=$IMGPATH/usr/lib/anaconda-runtime/genmodinfo KEYMAPS=$TMPDIR/keymaps-$BUILDARCH.$$ SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${BASEARCH}.gz diff --git a/scripts/mk-images.s390 b/scripts/mk-images.s390 index efe849030..7e11aca70 100644 --- a/scripts/mk-images.s390 +++ b/scripts/mk-images.s390 @@ -33,6 +33,13 @@ makeBootImages() { cp -v $BOOTDISKDIR/generic.prm $TOPDESTPATH/images/generic.prm cp -v $BOOTDISKDIR/generic.ins $TOPDESTPATH/generic.ins + + $MKS390CDBOOT \ + -i $TOPDESTPATH/images/kernel.img \ + -r $TOPDESTPATH/images/initrd.img \ + -p $TOPDESTPATH/images/generic.prm \ + -o $TOPDESTPATH/images/cdboot.img + cat << __EOT__ >> $TOPDESTPATH/.treeinfo [images-$KERNELARCH] kernel = images/kernel.img @@ -40,6 +47,7 @@ initrd = images/initrd.img initrd.size = images/initrd.size generic.prm = images/generic.prm generic.ins = generic.ins +cdboot.img = images/cdboot.img __EOT__ } diff --git a/utils/Makefile b/utils/Makefile index 78acd770a..fcd6efc1e 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -31,10 +31,10 @@ RPMCFLAGS = $(CFLAGS) -I/usr/include/rpm UTILS = modlist snarffont mapshdr readmap ifeq (s390, $(ARCH)) -UTILS += geninitrdsz +UTILS += geninitrdsz mk-s390-cdboot endif ifeq (s390x, $(ARCH)) -UTILS += geninitrdsz +UTILS += geninitrdsz mk-s390-cdboot endif ifeq (.depend,$(wildcard .depend)) @@ -67,6 +67,9 @@ hash.o : hash.c geninitrdsz: geninitrdsz.c $(CC) $(CFLAGS) -o $@ $< +mk-s390-cdboot: mk-s390-cdboot.c + $(CC) $(CFLAGS) -o $@ $< + depends: install: all @@ -80,6 +83,9 @@ install: all if [ -x geninitrdsz ]; then \ install -m755 geninitrdsz $(DESTDIR)/$(RUNTIMEDIR) ; \ fi + if [ -x mk-s390-cdboot ]; then \ + install -m755 mk-s390-cdboot $(DESTDIR)/$(RUNTIMEDIR) ; \ + fi clean: rm -f modlist snarffont mapshdr readmap geninitrdsz \ diff --git a/utils/mk-s390-cdboot.c b/utils/mk-s390-cdboot.c new file mode 100644 index 000000000..45e5cf845 --- /dev/null +++ b/utils/mk-s390-cdboot.c @@ -0,0 +1,156 @@ +/* + * mk-s390-cdboot -- creates one big image using a kernel, a ramdisk and + * a parmfile + * + * + * 2003-07-24 Volker Sameske <sameske@de.ibm.com> + * + * compile with: + * gcc -Wall -o mk-s390-cdboot mk-s390-cdboot.c + */ + +#include <stdio.h> +#include <stdlib.h> +#include <getopt.h> +#include <string.h> +#include <stdarg.h> + +#define BUFFER_LEN 1024 +#define INITRD_START 0x0000000000800000LL +#define START_PSW_ADDRESS 0x80010000 +#define PARAMETER_BUFFER_LEN 80 + +static struct option getopt_long_options[]= +{ + { "image", 1, 0, 'i'}, + { "ramdisk", 1, 0, 'r'}, + { "parmfile", 1, 0, 'p'}, + { "outfile", 1, 0, 'o'}, + { "help", 0, 0, 'h'}, + {0, 0, 0, 0} +}; + + +static void usage(char *cmd) +{ + printf("%s [-h] [-v] -i <kernel> -r <ramdisk> -p <parmfile> -o <outfile>\n", cmd); +} + + +int main (int argc, char **argv) +{ + char *cmd = basename(argv[0]); + FILE *fd1; + FILE *fd2; + FILE *fd3; + FILE *fd4; + char buffer[BUFFER_LEN]; + int rc, oc, index; + unsigned long long initrd_start = INITRD_START; + unsigned long long initrd_size; + char image[PARAMETER_BUFFER_LEN]; + char ramdisk[PARAMETER_BUFFER_LEN]; + char parmfile[PARAMETER_BUFFER_LEN]; + char outfile[PARAMETER_BUFFER_LEN]; + int image_specified = 0; + int ramdisk_specified = 0; + int parmfile_specified = 0; + int outfile_specified = 0; + int start_psw_address = START_PSW_ADDRESS; + + opterr=0; + while (1) + { + oc = getopt_long(argc, argv, "i:r:p:o:h?", getopt_long_options, &index); + if (oc==-1) break; + + switch (oc) + { + case '?': + case 'h': + usage(cmd); + exit(0); + case 'i': + strcpy(image, optarg); + image_specified = 1; + break; + case 'r': + strcpy(ramdisk, optarg); + ramdisk_specified = 1; + break; + case 'p': + strcpy(parmfile, optarg); + parmfile_specified = 1; + break; + case 'o': + strcpy(outfile, optarg); + outfile_specified = 1; + break; + default: + usage(cmd); + exit(0); + } + } + + if (!image_specified || !ramdisk_specified || + !parmfile_specified || !outfile_specified) { + usage(cmd); + exit(0); + } + + printf("Creating bootable CD-ROM image...\n"); + printf("kernel is : %s\n", image); + printf("ramdisk is : %s\n", ramdisk); + printf("parmfile is: %s\n", parmfile); + printf("outfile is : %s\n", outfile); + + fd1 = fopen(outfile, "w"); + fd2 = fopen(image, "r"); + fd3 = fopen(ramdisk, "r"); + fd4 = fopen(parmfile, "r"); + + printf("writing kernel...\n"); + while (1) { + rc = fread(buffer, BUFFER_LEN, 1, fd2); + fwrite(buffer, BUFFER_LEN, 1, fd1); + if (rc == 0) break; + } + + printf("writing initrd...\n"); + fseek(fd1, initrd_start, SEEK_SET); + while (1) { + rc = fread(buffer, BUFFER_LEN, 1, fd3); + fwrite(buffer, BUFFER_LEN, 1, fd1); + if (rc == 0) break; + } + + fseek(fd3, 0 ,SEEK_END); + initrd_size = ftell(fd3); + + printf("changing start PSW address to 0x%08x...\n", start_psw_address); + fseek(fd1, 0x4, SEEK_SET); + fwrite(&start_psw_address, 4, 1, fd1); + + printf("writing initrd address and size...\n"); + printf("INITRD start: 0x%016llx\n", initrd_start); + printf("INITRD size : 0x%016llx\n", initrd_size); + + fseek(fd1, 0x10408, SEEK_SET); + fwrite(&initrd_start, 8, 1, fd1); + fseek(fd1, 0x10410, SEEK_SET); + fwrite(&initrd_size, 8, 1, fd1); + + printf("writing parmfile...\n"); + fseek(fd1, 0x10480, SEEK_SET); + while (1) { + rc = fread(buffer, 1, 1, fd4); + fwrite(buffer, 1, 1, fd1); + if (rc == 0) break; + } + + fclose(fd1); + fclose(fd2); + fclose(fd3); + fclose(fd4); + return 0; +} |