Updating fc7 with all RHEL5 work
This commit is contained in:
parent
a5a9abd60f
commit
d3c4b95f8a
367
firstboot_kdump.py
Executable file
367
firstboot_kdump.py
Executable file
@ -0,0 +1,367 @@
|
|||||||
|
#
|
||||||
|
# firstboot_kdump.py - kdump configuration page for firstboot
|
||||||
|
# Copyright 2006 Red Hat, Inc.
|
||||||
|
# Author: Jarod Wilson <jwilson@redhat.com>
|
||||||
|
# Contributors:
|
||||||
|
# Neil Horman <nhorman@redhat.com>
|
||||||
|
# Dave Lehman <dlehman@redhat.com>
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
sys.path.append('/usr/share/system-config-kdump/')
|
||||||
|
|
||||||
|
from gtk import *
|
||||||
|
import string
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import time
|
||||||
|
import gtk
|
||||||
|
import gobject
|
||||||
|
import functions
|
||||||
|
import commands
|
||||||
|
import rhpl.executil as executil
|
||||||
|
from firstboot import start_process
|
||||||
|
|
||||||
|
from rhpl.translate import _, N_
|
||||||
|
from rhpl import translate
|
||||||
|
translate.textdomain("firstboot")
|
||||||
|
|
||||||
|
|
||||||
|
class childWindow:
|
||||||
|
# runPriority determines the order in which this module runs in firstboot
|
||||||
|
runPriority = 70
|
||||||
|
moduleName = _("Kdump")
|
||||||
|
windowName = moduleName
|
||||||
|
needsReboot = False
|
||||||
|
|
||||||
|
# possible bootloaders we'll need to adjust
|
||||||
|
# bootloader : (config file, kdump offset)
|
||||||
|
bootloaders = { "grub" : ("/boot/grub/grub.conf", 16),
|
||||||
|
"yaboot" : ("/boot/etc/yaboot.conf", 32),
|
||||||
|
"elilo" : ("/boot/efi/EFI/redhat/elilo.conf", 256) }
|
||||||
|
bootloader = None
|
||||||
|
offset = 0
|
||||||
|
|
||||||
|
# list of architectures without kdump support
|
||||||
|
unsupportedArches = [ "ppc", "s390", "s390x", "i386", "i586" ]
|
||||||
|
|
||||||
|
# list of platforms that have a separate kernel-kdump
|
||||||
|
kernelKdumpArches = [ "ppc64" ]
|
||||||
|
kernelKdumpInstalled = False
|
||||||
|
|
||||||
|
# toggle sensitivity of kdump config bits
|
||||||
|
def showHide(self, status):
|
||||||
|
self.totalMem.set_sensitive(status)
|
||||||
|
self.kdumpMem.set_sensitive(status)
|
||||||
|
self.systemUsableMem.set_sensitive(status)
|
||||||
|
self.labelTotal.set_sensitive(status)
|
||||||
|
self.labelKdump.set_sensitive(status)
|
||||||
|
self.labelSys.set_sensitive(status)
|
||||||
|
self.kdumpEnabled = status
|
||||||
|
|
||||||
|
def on_enableKdumpCheck_toggled(self, *args):
|
||||||
|
showHideStatus = self.enableKdumpCheck.get_active()
|
||||||
|
self.showHide(showHideStatus)
|
||||||
|
|
||||||
|
def updateAvail(self, widget, spin):
|
||||||
|
self.remMem = self.availMem - spin.get_value_as_int()
|
||||||
|
self.systemUsableMem.set_text("%s" % self.remMem)
|
||||||
|
|
||||||
|
def getBootloader(self):
|
||||||
|
for (name, (conf, offset)) in self.bootloaders.items():
|
||||||
|
if os.access(conf, os.W_OK):
|
||||||
|
self.bootloader = name
|
||||||
|
return self.bootloader
|
||||||
|
|
||||||
|
def launch(self, doDebug = None):
|
||||||
|
self.doDebug = doDebug
|
||||||
|
|
||||||
|
if doDebug:
|
||||||
|
print "initializing kdump module"
|
||||||
|
|
||||||
|
# What kernel are we running?
|
||||||
|
self.runningKernel = os.popen("/bin/uname -r").read().strip()
|
||||||
|
|
||||||
|
# What arch are we running on?
|
||||||
|
self.arch = os.popen("/bin/uname -m").read().strip()
|
||||||
|
|
||||||
|
# Check for a xen kernel, kdump doesn't work w/xen just yet...
|
||||||
|
self.xenKernel = self.runningKernel.find("xen")
|
||||||
|
|
||||||
|
# Fedora or RHEL?
|
||||||
|
releaseFile = '/etc/redhat-release'
|
||||||
|
self.distro = 'rhel'
|
||||||
|
lines = open(releaseFile).readlines()
|
||||||
|
for line in lines:
|
||||||
|
if line.find("Fedora") != -1:
|
||||||
|
self.distro = 'fedora'
|
||||||
|
kernelKdumpArchesFC = [ "i686", "x86_64" ]
|
||||||
|
self.kernelKdumpArches.extend(kernelKdumpArchesFC)
|
||||||
|
break
|
||||||
|
|
||||||
|
# If we need kernel-kdump, check to see if its already installed
|
||||||
|
if self.arch in self.kernelKdumpArches:
|
||||||
|
self.kernelKdump = "/boot/vmlinux-%skdump" % self.runningKernel
|
||||||
|
if os.access(self.kernelKdump, os.R_OK):
|
||||||
|
self.kernelKdumpInstalled = True
|
||||||
|
|
||||||
|
# Ascertain how much memory is in the system
|
||||||
|
memInfo = open("/proc/meminfo").readlines()
|
||||||
|
self.availMem = 0
|
||||||
|
for line in memInfo:
|
||||||
|
if line.startswith("MemTotal:"):
|
||||||
|
self.availMem = int(line.split()[1]) / 1024
|
||||||
|
break
|
||||||
|
|
||||||
|
# Fix up memory calculations if kdump is already on
|
||||||
|
cmdLine = open("/proc/cmdline").read()
|
||||||
|
self.kdumpMem = 0
|
||||||
|
self.kdumpOffset = 0
|
||||||
|
self.origCrashKernel = ""
|
||||||
|
chkConfigStatus=commands.getoutput('/sbin/chkconfig --list kdump')
|
||||||
|
if chkConfigStatus.find("on") > -1:
|
||||||
|
self.kdumpEnabled = True
|
||||||
|
self.kdumpMemInitial = 0
|
||||||
|
if cmdLine.find("crashkernel") > -1:
|
||||||
|
crashString = filter(lambda t: t.startswith("crashkernel="),
|
||||||
|
cmdLine.split())[0].split("=")[1]
|
||||||
|
if self.doDebug:
|
||||||
|
print "crashString is %s" % crashString
|
||||||
|
(self.kdumpMem, self.kdumpOffset) = [int(m[:-1]) for m in crashString.split("@")]
|
||||||
|
self.availMem += self.kdumpMem
|
||||||
|
self.origCrashKernel = "%dM@%dM" % (self.kdumpMem, self.kdumpOffset)
|
||||||
|
self.kdumpMemInitial = self.kdumpMem
|
||||||
|
else:
|
||||||
|
self.kdumpEnabled = False
|
||||||
|
self.kdumpMemInitial = 0
|
||||||
|
self.initialState = self.kdumpEnabled
|
||||||
|
|
||||||
|
# Do some sanity-checking and try to present only sane options.
|
||||||
|
#
|
||||||
|
# Defaults
|
||||||
|
lowerBound = 128
|
||||||
|
minUsable = 256
|
||||||
|
step = 64
|
||||||
|
self.enoughMem = True
|
||||||
|
if self.arch == 'ia64':
|
||||||
|
# ia64 usually needs at *least* 256M, page-aligned... :(
|
||||||
|
lowerBound = 256
|
||||||
|
minUsable = 512
|
||||||
|
step = 256
|
||||||
|
elif self.arch == 'ppc64':
|
||||||
|
# ppc64 often fails w/128M lately, and we want at least 1G
|
||||||
|
# of RAM for normal use, due to 64k page size... :\
|
||||||
|
lowerBound = 256
|
||||||
|
minUsable = 1024
|
||||||
|
|
||||||
|
upperBound = (self.availMem - minUsable) - (self.availMem % step)
|
||||||
|
|
||||||
|
if upperBound < lowerBound:
|
||||||
|
self.enoughMem = False
|
||||||
|
|
||||||
|
# Set spinner to lowerBound unless already set on kernel command line
|
||||||
|
if self.kdumpMem == 0:
|
||||||
|
self.kdumpMem = lowerBound
|
||||||
|
else:
|
||||||
|
# round down to a multiple of step value
|
||||||
|
self.kdumpMem = self.kdumpMem - (self.kdumpMem % step)
|
||||||
|
|
||||||
|
# kdump enable/disable checkbox
|
||||||
|
self.enableKdumpCheck = gtk.CheckButton("Enable kdump?")
|
||||||
|
self.enableKdumpCheck.set_alignment(xalign=0, yalign=0)
|
||||||
|
|
||||||
|
# detected total amount of system memory
|
||||||
|
self.totalMem = gtk.Label(_("%s" % self.availMem))
|
||||||
|
self.labelTotal = gtk.Label(_("_Total System Memory (MB):"))
|
||||||
|
self.labelTotal.set_use_underline(True)
|
||||||
|
self.labelTotal.set_mnemonic_widget(self.totalMem)
|
||||||
|
self.labelTotal.set_alignment(0.0, 0.5)
|
||||||
|
self.labelTotal.set_width_chars(32)
|
||||||
|
|
||||||
|
# how much ram to reserve for kdump
|
||||||
|
self.memSpin = gtk.Adjustment(self.kdumpMem, lowerBound, upperBound, step, step, 64)
|
||||||
|
self.kdumpMem = gtk.SpinButton(self.memSpin, 0, 0)
|
||||||
|
self.kdumpMem.set_update_policy(gtk.UPDATE_IF_VALID)
|
||||||
|
self.kdumpMem.set_numeric(True)
|
||||||
|
self.memSpin.connect("value_changed", self.updateAvail, self.kdumpMem)
|
||||||
|
self.labelKdump = gtk.Label(_("_Kdump Memory (MB):"))
|
||||||
|
self.labelKdump.set_use_underline(True)
|
||||||
|
self.labelKdump.set_mnemonic_widget(self.kdumpMem)
|
||||||
|
self.labelKdump.set_alignment(0.0, 0.5)
|
||||||
|
|
||||||
|
# remaining usable system memory
|
||||||
|
self.resMem = eval(string.strip(self.kdumpMem.get_text()))
|
||||||
|
self.remMem = self.availMem - self.resMem
|
||||||
|
self.systemUsableMem = gtk.Label(_("%s" % self.remMem))
|
||||||
|
self.labelSys = gtk.Label(_("_Usable System Memory (MB):"))
|
||||||
|
self.labelSys.set_use_underline(True)
|
||||||
|
self.labelSys.set_mnemonic_widget(self.systemUsableMem)
|
||||||
|
self.labelSys.set_alignment(0.0, 0.5)
|
||||||
|
|
||||||
|
self.vbox = gtk.VBox()
|
||||||
|
self.vbox.set_size_request(400, 200)
|
||||||
|
|
||||||
|
title_pix = functions.imageFromFile("workstation.png")
|
||||||
|
|
||||||
|
internalVBox = gtk.VBox()
|
||||||
|
internalVBox.set_border_width(10)
|
||||||
|
internalVBox.set_spacing(10)
|
||||||
|
|
||||||
|
label = gtk.Label(_("Kdump is a kernel crash dumping mechanism. In the event of a "
|
||||||
|
"system crash, kdump will capture information from your system "
|
||||||
|
"that can be invaluable in determining the cause of the crash. "
|
||||||
|
"Note that kdump does require reserving a portion of system "
|
||||||
|
"memory that will be unavailable for other uses."))
|
||||||
|
|
||||||
|
label.set_line_wrap(True)
|
||||||
|
label.set_alignment(0.0, 0.5)
|
||||||
|
label.set_size_request(500, -1)
|
||||||
|
internalVBox.pack_start(label, False, True)
|
||||||
|
|
||||||
|
table = gtk.Table(2, 4)
|
||||||
|
|
||||||
|
table.attach(self.enableKdumpCheck, 0, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
|
||||||
|
|
||||||
|
table.attach(self.labelTotal, 0, 1, 1, 2, gtk.FILL)
|
||||||
|
table.attach(self.totalMem, 1, 2, 1, 2, gtk.SHRINK, gtk.FILL, 5, 5)
|
||||||
|
|
||||||
|
table.attach(self.labelKdump, 0, 1, 2, 3, gtk.FILL)
|
||||||
|
table.attach(self.kdumpMem, 1, 2, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
|
||||||
|
|
||||||
|
table.attach(self.labelSys, 0, 1, 3, 4, gtk.FILL)
|
||||||
|
table.attach(self.systemUsableMem, 1, 2, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
|
||||||
|
|
||||||
|
# disable until user clicks check box, if not already enabled
|
||||||
|
if self.initialState is False:
|
||||||
|
self.showHide(False)
|
||||||
|
else:
|
||||||
|
self.enableKdumpCheck.set_active(True)
|
||||||
|
|
||||||
|
internalVBox.pack_start(table, True, 15)
|
||||||
|
|
||||||
|
# toggle sensitivity of Mem items
|
||||||
|
self.enableKdumpCheck.connect("toggled", self.on_enableKdumpCheck_toggled)
|
||||||
|
|
||||||
|
self.vbox.pack_start(internalVBox, False, 15)
|
||||||
|
|
||||||
|
return self.vbox, title_pix, self.moduleName
|
||||||
|
|
||||||
|
def grabFocus(self):
|
||||||
|
self.enableKdumpCheck.grab_focus()
|
||||||
|
|
||||||
|
def apply(self, *args):
|
||||||
|
if self.kdumpEnabled:
|
||||||
|
totalSysMem = self.totalMem.get_text()
|
||||||
|
totalSysMem = eval(string.strip(totalSysMem))
|
||||||
|
reservedMem = self.kdumpMem.get_value_as_int()
|
||||||
|
remainingMem = totalSysMem - reservedMem
|
||||||
|
else:
|
||||||
|
reservedMem = self.kdumpMemInitial
|
||||||
|
|
||||||
|
if self.doDebug:
|
||||||
|
print "Running kernel %s on %s architecture" % (self.runningKernel, self.arch)
|
||||||
|
if self.enableKdumpCheck.get_active():
|
||||||
|
print "System Mem: %s MB Kdump Mem: %s MB Avail Mem: %s MB" % (totalSysMem, reservedMem, remainingMem)
|
||||||
|
else:
|
||||||
|
print "Kdump will be disabled"
|
||||||
|
|
||||||
|
# If the user simply doesn't have enough memory for kdump to be viable/supportable, tell 'em
|
||||||
|
if self.enoughMem is False and self.kdumpEnabled:
|
||||||
|
self.showErrorMessage(_("Sorry, your system does not have enough memory for kdump to be viable!"))
|
||||||
|
self.enableKdumpCheck.set_active(False)
|
||||||
|
self.showHide(False)
|
||||||
|
return 0
|
||||||
|
# Alert user that we're not going to turn on kdump if they're running a xen kernel
|
||||||
|
elif self.xenKernel != -1 and self.kdumpEnabled:
|
||||||
|
self.showErrorMessage(_("Sorry, Xen kernels do not support kdump at this time!"))
|
||||||
|
self.enableKdumpCheck.set_active(False)
|
||||||
|
self.showHide(False)
|
||||||
|
return 0
|
||||||
|
# If there's no kdump support on this arch, let the user know and don't configure
|
||||||
|
elif self.arch in self.unsupportedArches:
|
||||||
|
self.showErrorMessage(_("Sorry, the %s architecture does not support kdump at this time!" % self.arch))
|
||||||
|
self.enableKdumpCheck.set_active(False)
|
||||||
|
self.showHide(False)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# If running on an arch w/a separate kernel-kdump (i.e., non-relocatable kernel), check to
|
||||||
|
# see that its installed, otherwise, alert the user they need to install it, and give them
|
||||||
|
# the chance to abort configuration.
|
||||||
|
if self.arch in self.kernelKdumpArches and self.kernelKdumpInstalled is False:
|
||||||
|
kernelKdumpNote = "\n\nNote that the %s architecture does not feature a relocatable kernel at this time, and thus requires a separate kernel-kdump package to be installed for kdump to function. This can be installed via 'yum install kernel-kdump' at your convenience.\n\n" % self.arch
|
||||||
|
else:
|
||||||
|
kernelKdumpNote = ""
|
||||||
|
|
||||||
|
# Don't alert if nothing has changed
|
||||||
|
if self.initialState != self.kdumpEnabled or reservedMem != self.kdumpMemInitial:
|
||||||
|
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
|
||||||
|
gtk.BUTTONS_YES_NO,
|
||||||
|
_("Changing Kdump settings requires rebooting the "
|
||||||
|
"system to reallocate memory accordingly. %sWould you "
|
||||||
|
"like to continue with this change and reboot the "
|
||||||
|
"system after firstboot is complete?" % kernelKdumpNote))
|
||||||
|
dlg.set_position(gtk.WIN_POS_CENTER)
|
||||||
|
dlg.show_all()
|
||||||
|
rc = dlg.run()
|
||||||
|
dlg.destroy()
|
||||||
|
|
||||||
|
if rc == gtk.RESPONSE_NO:
|
||||||
|
self.needsReboot = False
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
self.needsReboot = True
|
||||||
|
|
||||||
|
# Find bootloader if it exists, and update accordingly
|
||||||
|
if self.getBootloader() == None:
|
||||||
|
self.showErrorMessage(_("Error! No bootloader config file found, aborting configuration!"))
|
||||||
|
self.enableKdumpCheck.set_active(False)
|
||||||
|
self.showHide(False)
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
self.offset = self.bootloaders[self.bootloader][1]
|
||||||
|
|
||||||
|
# Are we adding or removing the crashkernel param?
|
||||||
|
if self.kdumpEnabled:
|
||||||
|
grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --args=crashkernel=%iM@%iM" \
|
||||||
|
% (self.bootloader, self.runningKernel, reservedMem, self.offset)
|
||||||
|
chkconfigStatus = "on"
|
||||||
|
else:
|
||||||
|
grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --remove-args=crashkernel=%s" \
|
||||||
|
% (self.bootloader, self.runningKernel, self.origCrashKernel)
|
||||||
|
chkconfigStatus = "off"
|
||||||
|
|
||||||
|
if self.doDebug:
|
||||||
|
print "Using %s bootloader with %iM offset" % (self.bootloader, self.offset)
|
||||||
|
print "Grubby command would be:\n %s" % grubbyCmd
|
||||||
|
else:
|
||||||
|
os.system(grubbyCmd)
|
||||||
|
os.system("/sbin/chkconfig kdump %s" % chkconfigStatus)
|
||||||
|
if self.bootloader == 'yaboot':
|
||||||
|
os.system('/sbin/ybin')
|
||||||
|
else:
|
||||||
|
self.needsReboot = False
|
||||||
|
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def showErrorMessage(self, text):
|
||||||
|
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, text)
|
||||||
|
dlg.set_position(gtk.WIN_POS_CENTER)
|
||||||
|
dlg.set_modal(True)
|
||||||
|
rc = dlg.run()
|
||||||
|
dlg.destroy()
|
||||||
|
return None
|
82
kdump.conf
82
kdump.conf
@ -2,31 +2,67 @@
|
|||||||
#
|
#
|
||||||
# This file contains a series of commands to perform (in order) when a
|
# This file contains a series of commands to perform (in order) when a
|
||||||
# kernel crash has happened and the kdump kernel has been loaded
|
# kernel crash has happened and the kdump kernel has been loaded
|
||||||
#
|
#
|
||||||
# The commands are chained together to allow redundancy in case the
|
# Currently only one dump target and path may be configured at once
|
||||||
# primary choice is not available at crash time
|
# if the configured dump target fails, the default action will be preformed
|
||||||
|
# the default action may be configured with the default directive below
|
||||||
#
|
#
|
||||||
# Basics commands supported are:
|
# Basics commands supported are:
|
||||||
# raw <partition> - will dd /proc/vmcore into <partition>
|
# raw <partition> - Will dd /proc/vmcore into <partition>.
|
||||||
# <nfs mount> - will mount fs and copy /proc/vmcore to
|
#
|
||||||
# <mnt>/var/crash/%DATE/ , supports DNS
|
# net <nfs mount> - Will mount fs and copy /proc/vmcore to
|
||||||
# <user@location> - will scp /proc/vmcore to
|
# <mnt>/var/crash/%HOST-%DATE/, supports DNS.
|
||||||
# <user@location>:/var/crash/%DATE/, supports DNS
|
#
|
||||||
# <fs type> - will mount -t <fs type> /mnt and copy /proc/vmcore to
|
# net <user@server> - Will scp /proc/vmcore to
|
||||||
# /mnt/var/crash/%DATE/
|
# <user@server>:/var/crash/%HOST-%DATE/, supports DNS
|
||||||
# ifc <interface> - instead of bringing up the interface that is normally associated
|
# NOTE: make sure user has necessary write
|
||||||
# with the next hop of the ip address you plan to use with scp or nfs
|
# permissions on server
|
||||||
# activate this interface instead. This is sometimes needed in the event
|
#
|
||||||
# that the kdump kernel assigns your interface a different name, given
|
# <fs type> <partition> - Will mount -t <fs type> <partition> /mnt and copy
|
||||||
# that it only loads the driver needed for the specific interface you are
|
# /proc/vmcore to /mnt/var/crash/%DATE/.
|
||||||
# going to use
|
# NOTE: <partition> can be a device node, label or uuid.
|
||||||
# default reboot - if all of the above fail, then reboot the system
|
#
|
||||||
# and accept the /proc/vmcore is lost, else
|
# path <path> - Append path to the filesystem device which you are
|
||||||
# comment out 'default' to fall through and fix
|
# dumping to. Ignored for raw device dumps.
|
||||||
# the system (if the disk is available)
|
# If unset, will default to /var/crash.
|
||||||
|
#
|
||||||
|
# core_collector makedumpfile <options>
|
||||||
|
# This directive allows you to use the dump filtering
|
||||||
|
# program makedumpfile to retrieve your core, which on
|
||||||
|
# some arches can drastically reduce core file size.
|
||||||
|
# See /sbin/makedumpfile --help for a list of options.
|
||||||
|
# Note that the -i and -g options are not needed here,
|
||||||
|
# as the initrd will automatically be populated with
|
||||||
|
# a config file appropriate for the running kernel.
|
||||||
|
#
|
||||||
|
# link_delay <seconds>
|
||||||
|
# Some network cards take a long time to initialize, and
|
||||||
|
# some spanning tree enabled networks do not transmit
|
||||||
|
# user traffic for long periods after a link state
|
||||||
|
# changes. This optional parameter defines a wait
|
||||||
|
# period after a link is activated in which the
|
||||||
|
# initramfs will wait before attempting to transmit
|
||||||
|
# user data.
|
||||||
|
# default <reboot | shell>
|
||||||
|
# if all of the above fail, do the default action.
|
||||||
|
# reboot: If the default action is reboot simply reboot
|
||||||
|
# the system and loose the core that you are
|
||||||
|
# trying to retrieve.
|
||||||
|
# shell: If the default action is shell, then drop to
|
||||||
|
# an msh session inside the initramfs from
|
||||||
|
# where you can try to record the core manually.
|
||||||
|
# Exiting this shell reboots the system.
|
||||||
|
# NOTE: If no default action is specified, the initramfs
|
||||||
|
# will mount the root file system and run init.
|
||||||
|
|
||||||
#raw /dev/sda5
|
#raw /dev/sda5
|
||||||
#ext3 /dev/sda3
|
#ext3 /dev/sda3
|
||||||
#my.server.com:/export/tmp
|
#ext3 LABEL=/boot
|
||||||
#user@my.server.com
|
#ext3 UUID=03138356-5e61-4ab3-b58e-27507ac41937
|
||||||
#default reboot
|
#net my.server.com:/export/tmp
|
||||||
|
#net user@my.server.com
|
||||||
|
#path /var/crash
|
||||||
|
#core_collector makedumpfile -c
|
||||||
|
#link_delay 60
|
||||||
|
#default shell
|
||||||
|
|
||||||
|
289
kdump.init
289
kdump.init
@ -9,7 +9,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright 2005 Red Hat, Inc.
|
# Copyright 2005 Red Hat, Inc.
|
||||||
#
|
#
|
||||||
# chkconfig: 2345 20 80
|
# chkconfig: - 20 80
|
||||||
#
|
#
|
||||||
# Author: Jeff Moyer <jmoyer@redhat.com>
|
# Author: Jeff Moyer <jmoyer@redhat.com>
|
||||||
|
|
||||||
@ -28,7 +28,9 @@ KDUMP_COMMANDLINE=""
|
|||||||
KEXEC_ARGS=""
|
KEXEC_ARGS=""
|
||||||
KDUMP_CONFIG_FILE="/etc/kdump.conf"
|
KDUMP_CONFIG_FILE="/etc/kdump.conf"
|
||||||
|
|
||||||
standard_kexec_args="-p --args-linux"
|
LOGGER="/usr/bin/logger -p info -t kdump"
|
||||||
|
|
||||||
|
standard_kexec_args="-p"
|
||||||
|
|
||||||
if [ -f /etc/sysconfig/kdump ]; then
|
if [ -f /etc/sysconfig/kdump ]; then
|
||||||
. /etc/sysconfig/kdump
|
. /etc/sysconfig/kdump
|
||||||
@ -39,7 +41,13 @@ function save_core()
|
|||||||
coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
|
coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
|
||||||
|
|
||||||
mkdir -p $coredir
|
mkdir -p $coredir
|
||||||
cp /proc/vmcore $coredir/vmcore
|
cp /proc/vmcore $coredir/vmcore-incomplete
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
mv $coredir/vmcore-incomplete $coredir/vmcore
|
||||||
|
$LOGGER "saved a vmcore to $coredir"
|
||||||
|
else
|
||||||
|
$LOGGER "failed to save a vmcore to $coredir"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function check_config()
|
function check_config()
|
||||||
@ -48,24 +56,29 @@ function check_config()
|
|||||||
local running_kernel=`uname -r`
|
local running_kernel=`uname -r`
|
||||||
|
|
||||||
kdump_kver=`echo $running_kernel | sed 's/smp//g'`
|
kdump_kver=`echo $running_kernel | sed 's/smp//g'`
|
||||||
kdump_kver="${kdump_kver}kdump"
|
|
||||||
else
|
else
|
||||||
kdump_kver=$KDUMP_KERNELVER
|
kdump_kver=$KDUMP_KERNELVER
|
||||||
fi
|
fi
|
||||||
|
|
||||||
kdump_kernel="${BOOTDIR}/vmlinux-${kdump_kver}"
|
kdump_kernel="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${kdump_kver}${KDUMP_IMG_EXT}"
|
||||||
kdump_initrd="${BOOTDIR}/initrd-${kdump_kver}.img"
|
kdump_initrd="${KDUMP_BOOTDIR}/initrd-${kdump_kver}kdump.img"
|
||||||
|
|
||||||
if [ ! -f $kdump_kernel ]; then
|
if [ ! -f $kdump_kernel ]; then
|
||||||
echo -n "No kdump kernel image found."; warning; echo
|
echo -n "No kdump kernel image found."; warning; echo
|
||||||
echo "Tried to locate ${kdump_kernel}"
|
echo "Tried to locate ${kdump_kernel}"
|
||||||
exit 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f $kdump_initrd ]; then
|
if [ ! -f $kdump_initrd ]; then
|
||||||
echo -n "No kdump initial ramdisk found."; warning; echo
|
echo -n "No kdump initial ramdisk found."; warning; echo
|
||||||
echo "Tried to locate ${kdump_initrd}"
|
echo "Rebuilding $kdump_initrd"
|
||||||
return 1
|
/sbin/mkdumprd -d -f $kdump_initrd $kdump_kver
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "Failed to run mkdumprd"
|
||||||
|
$LOGGER "mkdumprd: failed to make kdump initrd"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#check to see if config file has been modified after
|
#check to see if config file has been modified after
|
||||||
@ -82,17 +95,52 @@ function check_config()
|
|||||||
echo "Detected $KDUMP_CONFIG_FILE or $kdump_kernel change"
|
echo "Detected $KDUMP_CONFIG_FILE or $kdump_kernel change"
|
||||||
echo "Rebuilding $kdump_initrd"
|
echo "Rebuilding $kdump_initrd"
|
||||||
/sbin/mkdumprd -d -f $kdump_initrd $kdump_kver
|
/sbin/mkdumprd -d -f $kdump_initrd $kdump_kver
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "Failed to run mkdumprd"
|
||||||
|
$LOGGER "mkdumprd: failed to make kdump initrd"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#hack until we stop making initrd for kdump during rpm install
|
}
|
||||||
#allow initrd 120 seconds to be created before considering it new
|
|
||||||
module_time=`stat -c "%Y" /lib/modules/${kdump_kver}`
|
# This function check iomem and determines if we have more than
|
||||||
let module_time=module_time+120
|
# 4GB of ram available. Returns 1 if we do, 0 if we dont
|
||||||
if [ ! "$image_time" -gt "$module_time" ]; then
|
function need_64bit_headers()
|
||||||
echo "Detected initial rpm install"
|
{
|
||||||
echo "Rebuilding $kdump_initrd"
|
|
||||||
/sbin/mkdumprd -d -f $kdump_initrd $kdump_kver
|
MEMSZ=`sed -e's/\(^[0-9]\+.*\)/0x\1/' -e's/\(-\)\(.*\)/ 0x\2/' /proc/iomem | \
|
||||||
|
awk 'BEGIN {
|
||||||
|
totalmem=0;
|
||||||
|
segmentmem=0;
|
||||||
|
}
|
||||||
|
/.*RAM.*/ {
|
||||||
|
start = strtonum($1);
|
||||||
|
end = strtonum($2);
|
||||||
|
segmentmem=end-start;
|
||||||
|
totalmem=totalmem+(segmentmem/1024);
|
||||||
|
if (end >= 4194304) {
|
||||||
|
totalmem=totalmem+4194304;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END {
|
||||||
|
printf "%d", (totalmem+1);
|
||||||
|
}'`
|
||||||
|
|
||||||
|
#The AWK script above computes the total number of KB
|
||||||
|
#in the RAM areas of /proc/iomem
|
||||||
|
#Note also that we set totalmem to 4GB in the event that
|
||||||
|
#any physical address is larger than 4GB. This lets us
|
||||||
|
#default to 64 bit ELF headers for PAE kernels, which
|
||||||
|
#need then to access those higher addresses.
|
||||||
|
|
||||||
|
#This comparison tells us if the above amount is more than
|
||||||
|
#4GB (4096 KB). I do the funny math to avoid overflow
|
||||||
|
if [ $MEMSZ -ge 4194304 ]
|
||||||
|
then
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Load the kdump kerel specified in /etc/sysconfig/kdump
|
# Load the kdump kerel specified in /etc/sysconfig/kdump
|
||||||
@ -100,54 +148,215 @@ function check_config()
|
|||||||
# as the currently running kernel.
|
# as the currently running kernel.
|
||||||
function load_kdump()
|
function load_kdump()
|
||||||
{
|
{
|
||||||
if [ -z "$KDUMP_COMMANDLINE" ]; then
|
|
||||||
|
if [ -z "$KDUMP_COMMANDLINE" ]
|
||||||
|
then
|
||||||
KDUMP_COMMANDLINE=`cat /proc/cmdline`
|
KDUMP_COMMANDLINE=`cat /proc/cmdline`
|
||||||
KDUMP_COMMANDLINE=`echo $KDUMP_COMMANDLINE | sed -e 's/crashkernel=[0-9]\+M@[0-9]\+M//g'`
|
|
||||||
KDUMP_COMMANDLINE="${KDUMP_COMMANDLINE} irqpoll"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ARCH=`uname -m`
|
||||||
|
if [ "$ARCH" == "i686" -o "$ARCH" == "i386" ]
|
||||||
|
then
|
||||||
|
|
||||||
|
need_64bit_headers
|
||||||
|
if [ $? == 1 ]
|
||||||
|
then
|
||||||
|
FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf32-core-headers`
|
||||||
|
if [ -n "$FOUND_ELF_ARGS" ]
|
||||||
|
then
|
||||||
|
echo -n "Warning: elf32-core-headers overrides correct elf64 setting"
|
||||||
|
warning
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
KEXEC_ARGS="$KEXEC_ARGS --elf64-core-headers"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf64-core-headers`
|
||||||
|
if [ -z "$FOUND_ELF_ARGS" ]
|
||||||
|
then
|
||||||
|
KEXEC_ARGS="$KEXEC_ARGS --elf32-core-headers"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
KDUMP_COMMANDLINE=`echo $KDUMP_COMMANDLINE | sed -e 's/crashkernel=[0-9]\+M@[0-9]\+M//g'`
|
||||||
|
KDUMP_COMMANDLINE="${KDUMP_COMMANDLINE} ${KDUMP_COMMANDLINE_APPEND}"
|
||||||
|
|
||||||
$KEXEC $KEXEC_ARGS $standard_kexec_args \
|
$KEXEC $KEXEC_ARGS $standard_kexec_args \
|
||||||
--command-line="$KDUMP_COMMANDLINE" \
|
--command-line="$KDUMP_COMMANDLINE" \
|
||||||
--initrd=$kdump_initrd $kdump_kernel
|
--initrd=$kdump_initrd $kdump_kernel 2>/dev/null
|
||||||
|
|
||||||
if [ $? == 0 ]; then
|
if [ $? == 0 ]; then
|
||||||
touch /var/run/kdump.status
|
$LOGGER "kexec: loaded kdump kernel"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
$LOGGER "kexec: failed to load kdump kernel"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function propagate_ssh_key()
|
||||||
|
{
|
||||||
|
#Check if selinux is on... must flip to permissive mode
|
||||||
|
#for the moment to create key, then flip back...
|
||||||
|
se_enforce=`/usr/sbin/sestatus | grep -c "^Current mode.*enforcing"`
|
||||||
|
if [ "$se_enforce" -ge 1 ]; then
|
||||||
|
/usr/sbin/setenforce 0 2>&1 > /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#Use dedicated key for kdump
|
||||||
|
if [ ! -d /root/.ssh ]; then
|
||||||
|
mkdir /root/.ssh
|
||||||
|
chmod 700 /root/.ssh
|
||||||
|
fi
|
||||||
|
if [ ! -e /root/.ssh/config ]; then
|
||||||
|
echo "IdentityFile ~/.ssh/kdump_id_rsa" >> /root/.ssh/config
|
||||||
|
elif [ `grep -c kdump_id_rsa /root/.ssh/config` -eq 0 ]; then
|
||||||
|
echo "IdentityFile ~/.ssh/kdump_id_rsa" >> /root/.ssh/config
|
||||||
|
fi
|
||||||
|
local KEYFILE=/root/.ssh/kdump_id_rsa.pub
|
||||||
|
local errmsg="Failed to propagate ssh key"
|
||||||
|
|
||||||
|
#make sure they've configured kdump.conf for ssh dumps
|
||||||
|
local SSH_TARGET=`awk '/^\ *net.*@.*$/ {print $0}' $KDUMP_CONFIG_FILE`
|
||||||
|
if [ -z "$SSH_TARGET" ]; then
|
||||||
|
echo "No ssh config specified in $KDUMP_CONFIG_FILE. Can't propagate"
|
||||||
|
$LOGGER "$errmsg, no ssh config specified in $KDUMP_CONFIG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Check to see if we already created key, if not, create it.
|
||||||
|
if [ -f $KEYFILE ]; then
|
||||||
|
echo "Using existing keys..."
|
||||||
|
else
|
||||||
|
echo -n "Generating new ssh keys... "
|
||||||
|
/usr/bin/ssh-keygen -t rsa -f /root/.ssh/kdump_id_rsa -N "" 2>&1 > /dev/null
|
||||||
|
echo "done."
|
||||||
|
fi
|
||||||
|
|
||||||
|
#If necessary, flip selinux back to enforcing
|
||||||
|
if [ "$se_enforce" -ge 1 ]; then
|
||||||
|
/usr/sbin/setenforce 1 2>&1 > /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
#now find the target ssh user and server to contact.
|
||||||
|
SSH_USER=`echo $SSH_TARGET | cut -d\ -f2 | cut -d@ -f1`
|
||||||
|
SSH_SERVER=`echo $SSH_TARGET | sed -e's/\(.*@\)\(.*$\)/\2/'`
|
||||||
|
|
||||||
|
#now send the found key to the found server
|
||||||
|
cat $KEYFILE | ssh -x $SSH_USER@$SSH_SERVER "mkdir -p ~$SSH_USER/.ssh; chmod 700 ~$SSH_USER/.ssh; cat >> ~$SSH_USER/.ssh/authorized_keys2"
|
||||||
|
RET=$?
|
||||||
|
if [ $RET == 0 ]; then
|
||||||
|
echo $KEYFILE has been added to ~$SSH_USER/.ssh/authorized_keys2 on $SSH_SERVER
|
||||||
|
$LOGGER "propagated ssh key (ssh server: $SSH_SERVER)"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo $KEYFILE failed in transfer to $SSH_SERVER
|
||||||
|
$LOGGER "$errmsg, unable to transfer $KEYFILE to $SSH_SERVER"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function status()
|
||||||
|
{
|
||||||
|
if [ ! -e /sys/kernel/kexec_crash_loaded ]
|
||||||
|
then
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
rc=`cat /sys/kernel/kexec_crash_loaded`
|
||||||
|
if [ $rc == 1 ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function start()
|
||||||
|
{
|
||||||
|
#TODO check raw partition for core dump image
|
||||||
|
status
|
||||||
|
rc=$?
|
||||||
|
if [ $rc == 2 ]; then
|
||||||
|
echo -n "Kdump is not supported on this kernel"; failure; echo
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
if [ $rc == 0 ]; then
|
||||||
|
echo -n "Kdump already running"; success; echo
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
check_config
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo -n "Starting kdump:"; failure; echo
|
||||||
|
$LOGGER "failed to start up, config file incorrect"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
load_kdump
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo -n "Starting kdump:"; failure; echo
|
||||||
|
$LOGGER "failed to start up"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "Starting kdump:"; success; echo
|
||||||
|
$LOGGER "started up"
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop()
|
||||||
|
{
|
||||||
|
$KEXEC -p -u 2>/dev/null
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
$LOGGER "kexec: unloaded kdump kernel"
|
||||||
|
echo -n "Stopping kdump:"; success; echo
|
||||||
|
$LOGGER "stopped"
|
||||||
|
else
|
||||||
|
$LOGGER "kexec: failed to unload kdump kernel"
|
||||||
|
echo -n "Stopping kdump:"; failure; echo
|
||||||
|
$LOGGER "failed to stop"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
start)
|
start)
|
||||||
if [ -f /proc/vmcore ]; then
|
if [ -s /proc/vmcore ]; then
|
||||||
save_core
|
save_core
|
||||||
reboot
|
reboot
|
||||||
else
|
else
|
||||||
#TODO check raw partition for core dump image
|
start
|
||||||
check_config
|
|
||||||
load_kdump
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
stop)
|
stop)
|
||||||
$KEXEC -p -u
|
stop
|
||||||
rm -f /var/run/kdump.status
|
|
||||||
;;
|
;;
|
||||||
status)
|
status)
|
||||||
if [ -a /var/run/kdump.status ]; then
|
EXIT_CODE=0
|
||||||
|
status
|
||||||
|
case "$?" in
|
||||||
|
0)
|
||||||
echo "Kdump is operational"
|
echo "Kdump is operational"
|
||||||
else
|
;;
|
||||||
|
1)
|
||||||
echo "Kdump is not operational"
|
echo "Kdump is not operational"
|
||||||
fi
|
EXIT_CODE=1
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "Kdump is unsupported on this kernel"
|
||||||
|
EXIT_CODE=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit $EXIT_CODE
|
||||||
;;
|
;;
|
||||||
restart)
|
restart)
|
||||||
$KEXEC -p -u
|
stop
|
||||||
rm -f /var/run/kdump.status
|
start
|
||||||
check_config
|
|
||||||
load_kdump
|
|
||||||
;;
|
;;
|
||||||
condrestart)
|
condrestart)
|
||||||
;;
|
;;
|
||||||
|
propagate)
|
||||||
|
propagate_ssh_key
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo $"Usage: $0 {start|stop|status|restart}"
|
echo $"Usage: $0 {start|stop|status|restart|propagate}"
|
||||||
exit 1
|
exit 1
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -11,6 +11,10 @@ KDUMP_KERNELVER=""
|
|||||||
# /proc/cmdline
|
# /proc/cmdline
|
||||||
KDUMP_COMMANDLINE=""
|
KDUMP_COMMANDLINE=""
|
||||||
|
|
||||||
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
|
# As taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1"
|
||||||
|
|
||||||
# Any additional kexec arguments required. In most situations, this should
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
# be left empty
|
# be left empty
|
||||||
#
|
#
|
||||||
|
32
kdump.sysconfig.i386
Normal file
32
kdump.sysconfig.i386
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||||
|
# If no version is specified, then the init script will try to find a
|
||||||
|
# kdump kernel with the same version number as the running kernel.
|
||||||
|
KDUMP_KERNELVER=""
|
||||||
|
|
||||||
|
# The kdump commandline is the command line that needs to be passed off to
|
||||||
|
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||||
|
# line. For example:
|
||||||
|
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||||
|
# If a command line is not specified, the default will be taken from
|
||||||
|
# /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE=""
|
||||||
|
|
||||||
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
|
# As taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1"
|
||||||
|
|
||||||
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
|
# be left empty
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
|
KEXEC_ARGS=" --args-linux"
|
||||||
|
|
||||||
|
#Where to find the boot image
|
||||||
|
KDUMP_BOOTDIR="/boot"
|
||||||
|
|
||||||
|
#What is the image type used for kdump
|
||||||
|
KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
|
KDUMP_IMG_EXT=""
|
32
kdump.sysconfig.ia64
Normal file
32
kdump.sysconfig.ia64
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||||
|
# If no version is specified, then the init script will try to find a
|
||||||
|
# kdump kernel with the same version number as the running kernel.
|
||||||
|
KDUMP_KERNELVER=""
|
||||||
|
|
||||||
|
# The kdump commandline is the command line that needs to be passed off to
|
||||||
|
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||||
|
# line. For example:
|
||||||
|
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||||
|
# If a command line is not specified, the default will be taken from
|
||||||
|
# /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE=""
|
||||||
|
|
||||||
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
|
# As taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1"
|
||||||
|
|
||||||
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
|
# be left empty
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
|
KEXEC_ARGS=""
|
||||||
|
|
||||||
|
#Where to find the boot image
|
||||||
|
KDUMP_BOOTDIR="/boot/efi/efi/redhat"
|
||||||
|
|
||||||
|
#What is the image type used for kdump
|
||||||
|
KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
|
KDUMP_IMG_EXT=""
|
32
kdump.sysconfig.ppc64
Normal file
32
kdump.sysconfig.ppc64
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||||
|
# If no version is specified, then the init script will try to find a
|
||||||
|
# kdump kernel with the same version number as the running kernel.
|
||||||
|
KDUMP_KERNELVER=""
|
||||||
|
|
||||||
|
# The kdump commandline is the command line that needs to be passed off to
|
||||||
|
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||||
|
# line. For example:
|
||||||
|
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||||
|
# If a command line is not specified, the default will be taken from
|
||||||
|
# /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE=""
|
||||||
|
|
||||||
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
|
# As taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib"
|
||||||
|
|
||||||
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
|
# be left empty
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
|
KEXEC_ARGS=""
|
||||||
|
|
||||||
|
#Where to find the boot image
|
||||||
|
KDUMP_BOOTDIR="/boot"
|
||||||
|
|
||||||
|
#What is the image type used for kdump
|
||||||
|
KDUMP_IMG="vmlinux"
|
||||||
|
|
||||||
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
|
KDUMP_IMG_EXT="kdump"
|
32
kdump.sysconfig.x86_64
Normal file
32
kdump.sysconfig.x86_64
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||||
|
# If no version is specified, then the init script will try to find a
|
||||||
|
# kdump kernel with the same version number as the running kernel.
|
||||||
|
KDUMP_KERNELVER=""
|
||||||
|
|
||||||
|
# The kdump commandline is the command line that needs to be passed off to
|
||||||
|
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||||
|
# line. For example:
|
||||||
|
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||||
|
# If a command line is not specified, the default will be taken from
|
||||||
|
# /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE=""
|
||||||
|
|
||||||
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
|
# As taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
|
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1"
|
||||||
|
|
||||||
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
|
# be left empty
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
|
KEXEC_ARGS=" --args-linux"
|
||||||
|
|
||||||
|
#Where to find the boot image
|
||||||
|
KDUMP_BOOTDIR="/boot"
|
||||||
|
|
||||||
|
#What is the image type used for kdump
|
||||||
|
KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
|
KDUMP_IMG_EXT=""
|
@ -1,8 +1,8 @@
|
|||||||
--- kexec-tools-1.101/Makefile.orig 2006-07-05 15:42:41.000000000 -0400
|
--- kexec-tools-1.101/Makefile.orig 2006-10-20 13:42:52.000000000 -0400
|
||||||
+++ kexec-tools-1.101/Makefile 2006-07-05 15:43:09.000000000 -0400
|
+++ kexec-tools-1.101/Makefile 2006-10-20 13:43:22.000000000 -0400
|
||||||
@@ -44,7 +44,7 @@ PKGINCLUDEIR=$(INCLUDEDIR)/$(PACKAGE)
|
@@ -45,7 +45,7 @@
|
||||||
|
|
||||||
MAN_PAGES:= kexec/kexec.8
|
MAN_PAGES:= kexec/kexec.8
|
||||||
|
MAN_PAGES+= kdump/kdump.8
|
||||||
BINARIES_i386:= $(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test $(SBINDIR)/kdump
|
BINARIES_i386:= $(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test $(SBINDIR)/kdump
|
||||||
-BINARIES_x86_64:=$(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test
|
-BINARIES_x86_64:=$(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test
|
||||||
+BINARIES_x86_64:= $(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test $(SBINDIR)/kdump
|
+BINARIES_x86_64:= $(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test $(SBINDIR)/kdump
|
||||||
|
11
kexec-tools-1.101-elf-core-type.patch
Normal file
11
kexec-tools-1.101-elf-core-type.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/i386/kexec-x86.c.orig 2006-11-15 16:28:04.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/i386/kexec-x86.c 2006-11-15 16:28:13.000000000 -0500
|
||||||
|
@@ -145,7 +145,7 @@
|
||||||
|
.serial_baud = 0,
|
||||||
|
.console_vga = 0,
|
||||||
|
.console_serial = 0,
|
||||||
|
- .core_header_type = CORE_TYPE_ELF64,
|
||||||
|
+ .core_header_type = CORE_TYPE_ELF32,
|
||||||
|
};
|
||||||
|
|
||||||
|
int arch_process_options(int argc, char **argv)
|
22
kexec-tools-1.101-elf-format.patch
Normal file
22
kexec-tools-1.101-elf-format.patch
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/x86_64/kexec-elf-x86_64.c.fix 2006-08-29 20:07:34.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/x86_64/kexec-elf-x86_64.c 2006-08-29 20:08:03.000000000 -0400
|
||||||
|
@@ -120,7 +120,7 @@ int elf_x86_64_load(int argc, char **arg
|
||||||
|
/*
|
||||||
|
* Parse the command line arguments
|
||||||
|
*/
|
||||||
|
- arg_style = ARG_STYLE_ELF;
|
||||||
|
+ arg_style = ARG_STYLE_LINUX;
|
||||||
|
command_line = 0;
|
||||||
|
modified_cmdline = 0;
|
||||||
|
modified_cmdline_len = 0;
|
||||||
|
--- kexec-tools-1.101/kexec/arch/i386/kexec-elf-x86.c.fix 2006-08-29 20:07:14.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/i386/kexec-elf-x86.c 2006-08-29 20:07:24.000000000 -0400
|
||||||
|
@@ -121,7 +121,7 @@ int elf_x86_load(int argc, char **argv,
|
||||||
|
/*
|
||||||
|
* Parse the command line arguments
|
||||||
|
*/
|
||||||
|
- arg_style = ARG_STYLE_ELF;
|
||||||
|
+ arg_style = ARG_STYLE_LINUX;
|
||||||
|
command_line = 0;
|
||||||
|
modified_cmdline = 0;
|
||||||
|
modified_cmdline_len = 0;
|
281
kexec-tools-1.101-ia64-EFI.patch
Normal file
281
kexec-tools-1.101-ia64-EFI.patch
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/entry.S.orig1 2006-10-12 14:25:54.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/entry.S 2006-10-12 14:48:04.000000000 -0400
|
||||||
|
@@ -46,6 +46,8 @@
|
||||||
|
br.call.sptk.many b0=ia64_env_setup
|
||||||
|
movl r10=__kernel_entry;;
|
||||||
|
ld8 r14=[r10];;
|
||||||
|
+ movl r10=__boot_param_base;;
|
||||||
|
+ ld8 r28=[r10];;
|
||||||
|
mov b6=r14;;
|
||||||
|
mov ar.lc=r0
|
||||||
|
mov ar.ec=r0
|
||||||
|
@@ -61,6 +63,7 @@
|
||||||
|
DECLARE_DATA8(__command_line_len)
|
||||||
|
DECLARE_DATA8(__efi_memmap_base)
|
||||||
|
DECLARE_DATA8(__efi_memmap_size)
|
||||||
|
+DECLARE_DATA8(__boot_param_base)
|
||||||
|
DECLARE_DATA8(__loaded_segments)
|
||||||
|
DECLARE_DATA8(__loaded_segments_num)
|
||||||
|
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c.orig1 2006-10-12 14:25:54.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c 2006-10-12 14:48:04.000000000 -0400
|
||||||
|
@@ -123,11 +123,12 @@
|
||||||
|
uint64_t command_line_len;
|
||||||
|
uint64_t efi_memmap_base;
|
||||||
|
uint64_t efi_memmap_size;
|
||||||
|
+ uint64_t boot_param_base;
|
||||||
|
struct loaded_segment *loaded_segments;
|
||||||
|
unsigned long loaded_segments_num;
|
||||||
|
};
|
||||||
|
|
||||||
|
-void
|
||||||
|
+void
|
||||||
|
setup_arch(void)
|
||||||
|
{
|
||||||
|
reset_vga();
|
||||||
|
@@ -138,11 +139,11 @@
|
||||||
|
return addr - PAGE_OFFSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-patch_efi_memmap(struct kexec_boot_params *params,
|
||||||
|
+void
|
||||||
|
+patch_efi_memmap(struct kexec_boot_params *params,
|
||||||
|
struct ia64_boot_param *boot_param)
|
||||||
|
{
|
||||||
|
- void *dest = (void *)params->efi_memmap_base;
|
||||||
|
+ void *dest = (void *)params->efi_memmap_base;
|
||||||
|
void *src = (void *)boot_param->efi_memmap;
|
||||||
|
unsigned long len = boot_param->efi_memmap_size;
|
||||||
|
unsigned long memdesc_size = boot_param->efi_memdesc_size;
|
||||||
|
@@ -150,15 +151,15 @@
|
||||||
|
efi_memory_desc_t *md1, *md2;
|
||||||
|
void *p1, *p2, *src_end = src + len;
|
||||||
|
int i;
|
||||||
|
- for (p1 = src, p2 = dest; p1 < src_end;
|
||||||
|
+ for (p1 = src, p2 = dest; p1 < src_end;
|
||||||
|
p1 += memdesc_size, p2 += memdesc_size) {
|
||||||
|
unsigned long mstart, mend;
|
||||||
|
md1 = p1;
|
||||||
|
md2 = p2;
|
||||||
|
- if (md1->num_pages == 0)
|
||||||
|
+ if (md1->num_pages == 0)
|
||||||
|
continue;
|
||||||
|
mstart = md1->phys_addr;
|
||||||
|
- mend = md1->phys_addr + (md1->num_pages
|
||||||
|
+ mend = md1->phys_addr + (md1->num_pages
|
||||||
|
<< EFI_PAGE_SHIFT);
|
||||||
|
switch (md1->type) {
|
||||||
|
case EFI_LOADER_DATA:
|
||||||
|
@@ -168,7 +169,7 @@
|
||||||
|
default:
|
||||||
|
*md2 = *md1;
|
||||||
|
}
|
||||||
|
- // segments are already sorted and aligned to 4K
|
||||||
|
+ // segments are already sorted and aligned to 4K
|
||||||
|
orig_type = md2->type;
|
||||||
|
for (i = 0; i < params->loaded_segments_num; i++) {
|
||||||
|
struct loaded_segment *seg;
|
||||||
|
@@ -177,50 +178,50 @@
|
||||||
|
unsigned long start_pages, mid_pages, end_pages;
|
||||||
|
if (seg->end > mend) {
|
||||||
|
p1 += memdesc_size;
|
||||||
|
- for(; p1 < src_end;
|
||||||
|
+ for(; p1 < src_end;
|
||||||
|
p1 += memdesc_size) {
|
||||||
|
md1 = p1;
|
||||||
|
/* TODO check contig and attribute here */
|
||||||
|
- mend = md1->phys_addr
|
||||||
|
+ mend = md1->phys_addr
|
||||||
|
+ (md1->num_pages << EFI_PAGE_SHIFT);
|
||||||
|
if (seg->end < mend)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- start_pages = (seg->start - mstart)
|
||||||
|
+ start_pages = (seg->start - mstart)
|
||||||
|
>> EFI_PAGE_SHIFT;
|
||||||
|
mid_pages = (seg->end - seg->start)
|
||||||
|
>> EFI_PAGE_SHIFT;
|
||||||
|
- end_pages = (mend - seg->end)
|
||||||
|
+ end_pages = (mend - seg->end)
|
||||||
|
>> EFI_PAGE_SHIFT;
|
||||||
|
if (start_pages) {
|
||||||
|
md2->num_pages = start_pages;
|
||||||
|
- p2 += memdesc_size;
|
||||||
|
+ p2 += memdesc_size;
|
||||||
|
md2 = p2;
|
||||||
|
*md2 = *md1;
|
||||||
|
}
|
||||||
|
md2->phys_addr = seg->start;
|
||||||
|
md2->num_pages = mid_pages;
|
||||||
|
- md2->type = seg->reserved ?
|
||||||
|
+ md2->type = seg->reserved ?
|
||||||
|
EFI_UNUSABLE_MEMORY:EFI_LOADER_DATA;
|
||||||
|
if (end_pages) {
|
||||||
|
- p2 += memdesc_size;
|
||||||
|
+ p2 += memdesc_size;
|
||||||
|
md2 = p2;
|
||||||
|
*md2 = *md1;
|
||||||
|
md2->phys_addr = seg->end;
|
||||||
|
md2->num_pages = end_pages;
|
||||||
|
md2->type = orig_type;
|
||||||
|
mstart = seg->end;
|
||||||
|
- } else
|
||||||
|
+ } else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+
|
||||||
|
boot_param->efi_memmap_size = p2 - dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
+void
|
||||||
|
flush_icache_range(char *start, unsigned long len)
|
||||||
|
{
|
||||||
|
unsigned long i;
|
||||||
|
@@ -233,7 +234,7 @@
|
||||||
|
extern char __dummy_efi_function[], __dummy_efi_function_end[];
|
||||||
|
|
||||||
|
|
||||||
|
-void
|
||||||
|
+void
|
||||||
|
ia64_env_setup(struct ia64_boot_param *boot_param,
|
||||||
|
struct kexec_boot_params *params)
|
||||||
|
{
|
||||||
|
@@ -243,13 +244,15 @@
|
||||||
|
unsigned long *set_virtual_address_map;
|
||||||
|
char *command_line = (char *)params->command_line;
|
||||||
|
uint64_t command_line_len = params->command_line_len;
|
||||||
|
-
|
||||||
|
+ struct ia64_boot_param *new_boot_param =
|
||||||
|
+ (struct ia64_boot_param *) params->boot_param_base;
|
||||||
|
+ memcpy(new_boot_param, boot_param, 4096);
|
||||||
|
// patch efi_runtime->set_virtual_address_map to a
|
||||||
|
// dummy function
|
||||||
|
len = __dummy_efi_function_end - __dummy_efi_function;
|
||||||
|
- memcpy(command_line + command_line_len,
|
||||||
|
+ memcpy(command_line + command_line_len,
|
||||||
|
__dummy_efi_function, len);
|
||||||
|
- systab = (efi_system_table_t *)boot_param->efi_systab;
|
||||||
|
+ systab = (efi_system_table_t *)new_boot_param->efi_systab;
|
||||||
|
runtime = (efi_runtime_services_t *)PA(systab->runtime);
|
||||||
|
set_virtual_address_map =
|
||||||
|
(unsigned long *)PA(runtime->set_virtual_address_map);
|
||||||
|
@@ -257,15 +260,14 @@
|
||||||
|
(unsigned long)(command_line + command_line_len);
|
||||||
|
flush_icache_range(command_line + command_line_len, len);
|
||||||
|
|
||||||
|
- patch_efi_memmap(params, boot_param);
|
||||||
|
-
|
||||||
|
- boot_param->efi_memmap = params->efi_memmap_base;
|
||||||
|
+ patch_efi_memmap(params, new_boot_param);
|
||||||
|
|
||||||
|
- boot_param->command_line = params->command_line;
|
||||||
|
- boot_param->console_info.orig_x = 0;
|
||||||
|
- boot_param->console_info.orig_y = 0;
|
||||||
|
- boot_param->initrd_start = params->ramdisk_base;
|
||||||
|
- boot_param->initrd_size = params->ramdisk_size;
|
||||||
|
+ new_boot_param->efi_memmap = params->efi_memmap_base;
|
||||||
|
+ new_boot_param->command_line = params->command_line;
|
||||||
|
+ new_boot_param->console_info.orig_x = 0;
|
||||||
|
+ new_boot_param->console_info.orig_y = 0;
|
||||||
|
+ new_boot_param->initrd_start = params->ramdisk_base;
|
||||||
|
+ new_boot_param->initrd_size = params->ramdisk_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function can be used to execute after the SHA256 verification. */
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c.orig1 2006-10-12 14:25:54.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c 2006-10-12 14:47:57.000000000 -0400
|
||||||
|
@@ -36,6 +36,38 @@
|
||||||
|
|
||||||
|
static struct memory_range memory_range[MAX_MEMORY_RANGES];
|
||||||
|
|
||||||
|
+/* Reserve range for EFI memmap and Boot parameter */
|
||||||
|
+static int split_range(int range, unsigned long start, unsigned long end)
|
||||||
|
+{
|
||||||
|
+ unsigned long ram_end = memory_range[range - 1].end;
|
||||||
|
+ unsigned int type = memory_range[range - 1].type;
|
||||||
|
+ int i;
|
||||||
|
+ //align end and start to page size of EFI
|
||||||
|
+ start = start & ~((1UL<<12) - 1);
|
||||||
|
+ end = (end + (1UL<<12) - 1)& ~((1UL<<12) - 1);
|
||||||
|
+ for (i = 0; i < range; i++)
|
||||||
|
+ if(memory_range[i].start <= start && memory_range[i].end >=end)
|
||||||
|
+ break;
|
||||||
|
+ if (i >= range)
|
||||||
|
+ return range;
|
||||||
|
+ range = i;
|
||||||
|
+ if (memory_range[range].start < start) {
|
||||||
|
+ memory_range[range].end = start;
|
||||||
|
+ range++;
|
||||||
|
+ }
|
||||||
|
+ memory_range[range].start = start;
|
||||||
|
+ memory_range[range].end = end;
|
||||||
|
+ memory_range[range].type = RANGE_RESERVED;
|
||||||
|
+ range++;
|
||||||
|
+ if (end < ram_end) {
|
||||||
|
+ memory_range[range].start = end;
|
||||||
|
+ memory_range[range].end = ram_end;
|
||||||
|
+ memory_range[range].type = type;
|
||||||
|
+ range++;
|
||||||
|
+ }
|
||||||
|
+ return range;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Return a sorted list of available memory ranges. */
|
||||||
|
int get_memory_ranges(struct memory_range **range, int *ranges,
|
||||||
|
unsigned long kexec_flags)
|
||||||
|
@@ -85,6 +117,12 @@
|
||||||
|
mem_max = end;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
+ } else if (memcmp(str, "Boot parameter\n", 14) == 0) {
|
||||||
|
+ memory_ranges = split_range(memory_ranges, start, end);
|
||||||
|
+ continue;
|
||||||
|
+ } else if (memcmp(str, "EFI Memory Map\n", 14) == 0) {
|
||||||
|
+ memory_ranges = split_range(memory_ranges, start, end);
|
||||||
|
+ continue;
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
@@ -125,7 +163,7 @@
|
||||||
|
{
|
||||||
|
static const struct option options[] = {
|
||||||
|
KEXEC_ARCH_OPTIONS
|
||||||
|
- { 0, 0, NULL, 0 },
|
||||||
|
+ { 0, 0, NULL, 0 },
|
||||||
|
};
|
||||||
|
static const char short_options[] = KEXEC_ARCH_OPT_STR;
|
||||||
|
int opt;
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c.orig1 2006-10-12 14:25:54.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-10-12 14:48:04.000000000 -0400
|
||||||
|
@@ -115,9 +115,10 @@
|
||||||
|
unsigned long entry, max_addr, gp_value;
|
||||||
|
unsigned long command_line_base, ramdisk_base;
|
||||||
|
unsigned long efi_memmap_base, efi_memmap_size;
|
||||||
|
+ unsigned long boot_param_base;
|
||||||
|
int result;
|
||||||
|
int opt;
|
||||||
|
- char *efi_memmap_buf;
|
||||||
|
+ char *efi_memmap_buf, *boot_param;
|
||||||
|
#define OPT_APPEND (OPT_ARCH_MAX+0)
|
||||||
|
#define OPT_RAMDISK (OPT_ARCH_MAX+1)
|
||||||
|
static const struct option options[] = {
|
||||||
|
@@ -191,6 +192,13 @@
|
||||||
|
&command_line) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ // reverve 4k for ia64_boot_param
|
||||||
|
+ boot_param = xmalloc(4096);
|
||||||
|
+ boot_param_base = add_buffer(info, boot_param, 4096, 4096, 4096, 0,
|
||||||
|
+ max_addr, -1);
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__boot_param_base",
|
||||||
|
+ &boot_param_base, sizeof(long));
|
||||||
|
+
|
||||||
|
// reserve 8k for efi_memmap
|
||||||
|
efi_memmap_size = 1UL<<14;
|
||||||
|
efi_memmap_buf = xmalloc(efi_memmap_size);
|
125
kexec-tools-1.101-ia64-dash-l-fix.patch
Normal file
125
kexec-tools-1.101-ia64-dash-l-fix.patch
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.h.orig 2006-12-01 14:36:39.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.h 2006-12-01 14:49:13.000000000 -0500
|
||||||
|
@@ -7,6 +7,10 @@
|
||||||
|
int elf_ia64_load(int argc, char **argv, const char *buf, off_t len,
|
||||||
|
struct kexec_info *info);
|
||||||
|
void elf_ia64_usage(void);
|
||||||
|
+int update_loaded_segments(struct kexec_info *info, struct mem_ehdr *ehdr);
|
||||||
|
+void move_loaded_segments(struct kexec_info *info, struct mem_ehdr *ehdr,
|
||||||
|
+ unsigned long addr);
|
||||||
|
+
|
||||||
|
#define MAX_MEMORY_RANGES 1024
|
||||||
|
#define EFI_PAGE_SIZE (1UL<<12)
|
||||||
|
#define ELF_PAGE_SIZE (1UL<<16)
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c.orig 2006-12-01 14:36:39.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c 2006-12-01 14:55:16.000000000 -0500
|
||||||
|
@@ -28,14 +28,16 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <sched.h>
|
||||||
|
+#include <limits.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include "../../kexec.h"
|
||||||
|
#include "../../kexec-syscall.h"
|
||||||
|
+#include "elf.h"
|
||||||
|
#include "kexec-ia64.h"
|
||||||
|
#include <arch/options.h>
|
||||||
|
|
||||||
|
static struct memory_range memory_range[MAX_MEMORY_RANGES];
|
||||||
|
-
|
||||||
|
+static int memory_ranges;
|
||||||
|
/* Reserve range for EFI memmap and Boot parameter */
|
||||||
|
static int split_range(int range, unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
@@ -73,7 +75,6 @@
|
||||||
|
unsigned long kexec_flags)
|
||||||
|
{
|
||||||
|
const char iomem[]= "/proc/iomem";
|
||||||
|
- int memory_ranges = 0;
|
||||||
|
char line[MAX_LINE];
|
||||||
|
FILE *fp;
|
||||||
|
fp = fopen(iomem, "r");
|
||||||
|
@@ -209,6 +210,45 @@
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int update_loaded_segments(struct kexec_info *info, struct mem_ehdr *ehdr)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ struct mem_phdr *phdr;
|
||||||
|
+ unsigned long start_addr = ULONG_MAX, end_addr = 0;
|
||||||
|
+ unsigned long align = 1UL<<26; // 64M
|
||||||
|
+ for(i = 0; i < ehdr->e_phnum; i++) {
|
||||||
|
+ phdr = &ehdr->e_phdr[i];
|
||||||
|
+ if (phdr->p_type == PT_LOAD) {
|
||||||
|
+ if (phdr->p_paddr < start_addr)
|
||||||
|
+ start_addr = phdr->p_paddr;
|
||||||
|
+ if ((phdr->p_paddr + phdr->p_memsz) > end_addr)
|
||||||
|
+ end_addr = phdr->p_paddr + phdr->p_memsz;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < memory_ranges
|
||||||
|
+ && memory_range[i].start <= start_addr; i++) {
|
||||||
|
+ if (memory_range[i].type == RANGE_RAM &&
|
||||||
|
+ memory_range[i].end > end_addr)
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < memory_ranges; i++) {
|
||||||
|
+ if (memory_range[i].type == RANGE_RAM) {
|
||||||
|
+ unsigned long start =
|
||||||
|
+ (memory_range[i].start + align - 1)&~(align - 1);
|
||||||
|
+ unsigned long end = memory_range[i].end;
|
||||||
|
+ if (end > start &&
|
||||||
|
+ (end - start) > (end_addr - start_addr)) {
|
||||||
|
+ move_loaded_segments(info, ehdr, start);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void arch_update_purgatory(struct kexec_info *info)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c.orig 2006-12-01 14:36:39.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-12-01 14:59:29.000000000 -0500
|
||||||
|
@@ -84,7 +84,8 @@
|
||||||
|
|
||||||
|
/* Move the crash kerenl physical offset to reserved region
|
||||||
|
*/
|
||||||
|
-static void move_loaded_segments(struct kexec_info *info, struct mem_ehdr *ehdr)
|
||||||
|
+void move_loaded_segments(struct kexec_info *info, struct mem_ehdr *ehdr,
|
||||||
|
+ unsigned long addr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
long offset;
|
||||||
|
@@ -92,7 +93,7 @@
|
||||||
|
for(i = 0; i < ehdr->e_phnum; i++) {
|
||||||
|
phdr = &ehdr->e_phdr[i];
|
||||||
|
if (phdr->p_type == PT_LOAD) {
|
||||||
|
- offset = mem_min - phdr->p_paddr;
|
||||||
|
+ offset = addr - phdr->p_paddr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -174,8 +175,14 @@
|
||||||
|
fprintf(stderr, "Failed to find crash kernel region in /proc/iomem\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- move_loaded_segments(info, &ehdr);
|
||||||
|
- }
|
||||||
|
+ move_loaded_segments(info, &ehdr, mem_min);
|
||||||
|
+ } else {
|
||||||
|
+ if (update_loaded_segments(info, &ehdr)) {
|
||||||
|
+ fprintf(stderr, "Failed to place kernel\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
|
||||||
|
entry = ehdr.e_entry;
|
||||||
|
max_addr = elf_max_addr(&ehdr);
|
13
kexec-tools-1.101-ia64-icache-align.patch
Normal file
13
kexec-tools-1.101-ia64-icache-align.patch
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c.orig 2006-10-20 13:45:49.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c 2006-10-20 13:46:56.000000000 -0400
|
||||||
|
@@ -224,7 +224,9 @@
|
||||||
|
void
|
||||||
|
flush_icache_range(char *start, unsigned long len)
|
||||||
|
{
|
||||||
|
- unsigned long i;
|
||||||
|
+ unsigned long i,addr;
|
||||||
|
+ addr = (unsigned long)start & ~31UL;
|
||||||
|
+ len += (unsigned long)start - addr;
|
||||||
|
for (i = 0;i < len; i += 32)
|
||||||
|
asm volatile("fc.i %0"::"r"(start + i):"memory");
|
||||||
|
asm volatile (";;sync.i;;":::"memory");
|
1251
kexec-tools-1.101-ia64-kdump.patch
Normal file
1251
kexec-tools-1.101-ia64-kdump.patch
Normal file
File diff suppressed because it is too large
Load Diff
11
kexec-tools-1.101-ia64-load-offset.patch
Normal file
11
kexec-tools-1.101-ia64-load-offset.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/crashdump-ia64.c.orig 2006-12-01 14:16:07.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/crashdump-ia64.c 2006-12-01 14:18:34.000000000 -0500
|
||||||
|
@@ -28,7 +28,7 @@
|
||||||
|
#include "crashdump-ia64.h"
|
||||||
|
|
||||||
|
int memory_ranges = 0;
|
||||||
|
-#define LOAD_OFFSET (0xa000000000000000UL + 0x100000000UL - (1UL<<26))
|
||||||
|
+#define LOAD_OFFSET (0xa000000000000000UL + 0x100000000UL - kernel_code_start)
|
||||||
|
#define MAX_LINE 160
|
||||||
|
/* Stores a sorted list of RAM memory ranges for which to create elf headers.
|
||||||
|
* A separate program header is created for backup region */
|
11
kexec-tools-1.101-ia64-noio-eat.patch
Normal file
11
kexec-tools-1.101-ia64-noio-eat.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c.orig 2006-12-01 14:30:59.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-12-01 14:31:04.000000000 -0500
|
||||||
|
@@ -128,7 +128,7 @@
|
||||||
|
{"command-line", 1, 0, OPT_APPEND},
|
||||||
|
{"append", 1, 0, OPT_APPEND},
|
||||||
|
{"initrd", 1, 0, OPT_RAMDISK},
|
||||||
|
- {"noio", 1, 0, OPT_NOIO},
|
||||||
|
+ {"noio", 0, 0, OPT_NOIO},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
};
|
||||||
|
|
252
kexec-tools-1.101-ia64-noio.patch
Normal file
252
kexec-tools-1.101-ia64-noio.patch
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
On Thu, Sep 21, 2006 at 01:06:08PM +0800, Zou Nan hai wrote:
|
||||||
|
> SN platform support PIO in a different way to generic IA64 platform. It
|
||||||
|
> does not support most of the legacy I/O ports.
|
||||||
|
>
|
||||||
|
> Give an --noio option to kexec-tools to disable I/O in purgatory code.
|
||||||
|
>
|
||||||
|
> This patch also removed an unused io.h in kexec-tools.
|
||||||
|
>
|
||||||
|
> Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
|
||||||
|
|
||||||
|
I have merged the following into kexec-tools-test.
|
||||||
|
|
||||||
|
--
|
||||||
|
Horms
|
||||||
|
H: http://www.vergenet.net/~horms/
|
||||||
|
W: http://www.valinux.co.jp/en/
|
||||||
|
|
||||||
|
From: Zou Nan hai <nanhai.zou@intel.com>
|
||||||
|
Date: 21 Sep 2006 13:06:08 +0800
|
||||||
|
Subject: kexec-tools: --noio option to disable I/O in purgatory code.
|
||||||
|
|
||||||
|
SN platform support PIO in a different way to generic IA64 platform. It
|
||||||
|
does not support most of the legacy I/O ports.
|
||||||
|
|
||||||
|
Give an --noio option to kexec-tools to disable I/O in purgatory code.
|
||||||
|
|
||||||
|
This patch also removed an unused io.h in kexec-tools.
|
||||||
|
|
||||||
|
Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
|
||||||
|
|
||||||
|
Edited to consistently use tabs instead of spaces for intentation,
|
||||||
|
remove one instance of trailing whitespace, and fix indentation
|
||||||
|
of noio line in options[].
|
||||||
|
|
||||||
|
Signed-off-by: Simon Horman <horms@verge.net.au>
|
||||||
|
|
||||||
|
diff -Nraup kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c
|
||||||
|
kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-09-20 15:30:40.000000000 +0800
|
||||||
|
+++ kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c 2006-09-21 15:12:20.000000000 +0800
|
||||||
|
@@ -116,16 +116,19 @@ int elf_ia64_load(int argc, char **argv,
|
||||||
|
unsigned long command_line_base, ramdisk_base;
|
||||||
|
unsigned long efi_memmap_base, efi_memmap_size;
|
||||||
|
unsigned long boot_param_base;
|
||||||
|
+ unsigned long noio=0;
|
||||||
|
int result;
|
||||||
|
int opt;
|
||||||
|
char *efi_memmap_buf, *boot_param;
|
||||||
|
#define OPT_APPEND (OPT_ARCH_MAX+0)
|
||||||
|
#define OPT_RAMDISK (OPT_ARCH_MAX+1)
|
||||||
|
+#define OPT_NOIO (OPT_ARCH_MAX+2)
|
||||||
|
static const struct option options[] = {
|
||||||
|
KEXEC_ARCH_OPTIONS
|
||||||
|
{"command-line", 1, 0, OPT_APPEND},
|
||||||
|
{"append", 1, 0, OPT_APPEND},
|
||||||
|
{"initrd", 1, 0, OPT_RAMDISK},
|
||||||
|
+ {"noio", 1, 0, OPT_NOIO},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -148,6 +151,9 @@ int elf_ia64_load(int argc, char **argv,
|
||||||
|
case OPT_RAMDISK:
|
||||||
|
ramdisk = optarg;
|
||||||
|
break;
|
||||||
|
+ case OPT_NOIO: /* disable PIO and MMIO in purgatory code*/
|
||||||
|
+ noio = 1;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
command_line_len = 0;
|
||||||
|
@@ -196,6 +202,10 @@ int elf_ia64_load(int argc, char **argv,
|
||||||
|
boot_param = xmalloc(4096);
|
||||||
|
boot_param_base = add_buffer(info, boot_param, 4096, 4096, 4096, 0,
|
||||||
|
max_addr, -1);
|
||||||
|
+
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__noio",
|
||||||
|
+ &noio, sizeof(long));
|
||||||
|
+
|
||||||
|
elf_rel_set_symbol(&info->rhdr, "__boot_param_base",
|
||||||
|
&boot_param_base, sizeof(long));
|
||||||
|
|
||||||
|
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/entry.S
|
||||||
|
kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/entry.S 2006-09-20 15:30:40.000000000 +0800
|
||||||
|
+++ kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S 2006-09-21 15:11:36.000000000 +0800
|
||||||
|
@@ -68,3 +68,4 @@ DECLARE_DATA8(__loaded_segments)
|
||||||
|
DECLARE_DATA8(__loaded_segments_num)
|
||||||
|
|
||||||
|
DECLARE_DATA8(__gp_value)
|
||||||
|
+DECLARE_DATA8(__noio)
|
||||||
|
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h
|
||||||
|
kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h 2006-09-20 15:29:29.000000000 +0800
|
||||||
|
+++ kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h 1970-01-01 08:00:00.000000000 +0800
|
||||||
|
@@ -1,25 +0,0 @@
|
||||||
|
-#ifndef ARCH_IO_H
|
||||||
|
-#define ARCH_IO_H
|
||||||
|
-
|
||||||
|
-#include <stdint.h>
|
||||||
|
-/* Helper functions for directly doing I/O */
|
||||||
|
-
|
||||||
|
-extern inline uint8_t inb(void *port)
|
||||||
|
-{
|
||||||
|
- volatile unsigned char *addr = (unsigned char *)port;
|
||||||
|
- uint8_t result;
|
||||||
|
-
|
||||||
|
- result = *addr;
|
||||||
|
- asm volatile ("mf.a"::: "memory");
|
||||||
|
- return result;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-extern inline void outb (uint8_t value, void *port)
|
||||||
|
-{
|
||||||
|
- volatile unsigned char *addr = (unsigned char *)port;
|
||||||
|
-
|
||||||
|
- *addr = value;
|
||||||
|
- asm volatile ("mf.a"::: "memory");
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-#endif /* ARCH_IO_H */
|
||||||
|
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/io.h
|
||||||
|
kexec-tools-1.101-fix/purgatory/arch/ia64/io.h
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/io.h 2006-09-20 15:29:29.000000000 +0800
|
||||||
|
+++ kexec-tools-1.101-fix/purgatory/arch/ia64/io.h 2006-09-21 15:11:19.000000000 +0800
|
||||||
|
@@ -3,7 +3,7 @@
|
||||||
|
#define UNCACHED(x) (void *)((x)|(1UL<<63))
|
||||||
|
#define MF() asm volatile ("mf.a" ::: "memory")
|
||||||
|
#define IO_SPACE_ENCODING(p) ((((p) >> 2) << 12) | (p & 0xfff))
|
||||||
|
-
|
||||||
|
+extern long __noio;
|
||||||
|
static inline void *io_addr (unsigned long port)
|
||||||
|
{
|
||||||
|
unsigned long offset;
|
||||||
|
@@ -16,28 +16,34 @@ static inline void *io_addr (unsigned lo
|
||||||
|
static inline unsigned int inb (unsigned long port)
|
||||||
|
{
|
||||||
|
volatile unsigned char *addr = io_addr(port);
|
||||||
|
- unsigned char ret;
|
||||||
|
- ret = *addr;
|
||||||
|
- MF();
|
||||||
|
+ unsigned char ret = 0;
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ ret = *addr;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int inw (unsigned long port)
|
||||||
|
{
|
||||||
|
volatile unsigned short *addr = io_addr(port);
|
||||||
|
- unsigned short ret;
|
||||||
|
+ unsigned short ret = 0;
|
||||||
|
|
||||||
|
- ret = *addr;
|
||||||
|
- MF();
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ ret = *addr;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static inline unsigned int ia64_inl (unsigned long port)
|
||||||
|
+static inline unsigned int inl (unsigned long port)
|
||||||
|
{
|
||||||
|
- volatile unsigned int *addr = __ia64_mk_io_addr(port);
|
||||||
|
- unsigned int ret;
|
||||||
|
- ret = *addr;
|
||||||
|
- MF();
|
||||||
|
+ volatile unsigned int *addr = io_addr(port);
|
||||||
|
+ unsigned int ret ;
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ ret = *addr;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -45,50 +51,58 @@ static inline void outb (unsigned char v
|
||||||
|
{
|
||||||
|
volatile unsigned char *addr = io_addr(port);
|
||||||
|
|
||||||
|
- *addr = val;
|
||||||
|
- MF();
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ *addr = val;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outw (unsigned short val, unsigned long port)
|
||||||
|
{
|
||||||
|
volatile unsigned short *addr = io_addr(port);
|
||||||
|
|
||||||
|
- *addr = val;
|
||||||
|
- MF();
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ *addr = val;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outl (unsigned int val, unsigned long port)
|
||||||
|
{
|
||||||
|
volatile unsigned int *addr = io_addr(port);
|
||||||
|
|
||||||
|
- *addr = val;
|
||||||
|
- MF();
|
||||||
|
+ if (!__noio) {
|
||||||
|
+ *addr = val;
|
||||||
|
+ MF();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
static inline unsigned char readb(const volatile void *addr)
|
||||||
|
{
|
||||||
|
- return *(volatile unsigned char *) addr;
|
||||||
|
+ return __noio ? 0 :*(volatile unsigned char *) addr;
|
||||||
|
}
|
||||||
|
static inline unsigned short readw(const volatile void *addr)
|
||||||
|
{
|
||||||
|
- return *(volatile unsigned short *) addr;
|
||||||
|
+ return __noio ? 0 :*(volatile unsigned short *) addr;
|
||||||
|
}
|
||||||
|
static inline unsigned int readl(const volatile void *addr)
|
||||||
|
{
|
||||||
|
- return *(volatile unsigned int *) addr;
|
||||||
|
+ return __noio ? 0 :*(volatile unsigned int *) addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void writeb(unsigned char b, volatile void *addr)
|
||||||
|
{
|
||||||
|
- *(volatile unsigned char *) addr = b;
|
||||||
|
+ if (!__noio)
|
||||||
|
+ *(volatile unsigned char *) addr = b;
|
||||||
|
}
|
||||||
|
static inline void writew(unsigned short b, volatile void *addr)
|
||||||
|
{
|
||||||
|
- *(volatile unsigned short *) addr = b;
|
||||||
|
+ if (!__noio)
|
||||||
|
+ *(volatile unsigned short *) addr = b;
|
||||||
|
}
|
||||||
|
static inline void writel(unsigned int b, volatile void *addr)
|
||||||
|
{
|
||||||
|
- *(volatile unsigned int *) addr = b;
|
||||||
|
+ if (!__noio)
|
||||||
|
+ *(volatile unsigned int *) addr = b;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
19
kexec-tools-1.101-ia64-phdr-malloc.patch
Normal file
19
kexec-tools-1.101-ia64-phdr-malloc.patch
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/crashdump-ia64.c.orig 2006-11-14 13:38:45.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/crashdump-ia64.c 2006-11-14 14:52:34.000000000 -0500
|
||||||
|
@@ -316,10 +316,14 @@
|
||||||
|
int nr_ranges;
|
||||||
|
size_t size;
|
||||||
|
void *tmp;
|
||||||
|
+ long int nr_cpus;
|
||||||
|
+ if ((nr_cpus = sysconf(_SC_NPROCESSORS_CONF)) < 0)
|
||||||
|
+ return -1;
|
||||||
|
if (info->kexec_flags & KEXEC_ON_CRASH ) {
|
||||||
|
if (get_crash_memory_ranges(&mem_range, &nr_ranges) == 0) {
|
||||||
|
- size = sizeof(Elf64_Ehdr) +
|
||||||
|
- (nr_ranges + 1) * sizeof(Elf64_Phdr);
|
||||||
|
+ size = (sizeof(Elf64_Ehdr) +
|
||||||
|
+ ((nr_cpus +1) * sizeof(Elf64_Phdr)) +
|
||||||
|
+ ((nr_ranges + 1) * sizeof(Elf64_Phdr)));
|
||||||
|
size = (size + EFI_PAGE_SIZE - 1) & ~(EFI_PAGE_SIZE - 1);
|
||||||
|
tmp = xmalloc(size);
|
||||||
|
memset(tmp, 0, size);
|
808
kexec-tools-1.101-ia64-tools.patch
Normal file
808
kexec-tools-1.101-ia64-tools.patch
Normal file
@ -0,0 +1,808 @@
|
|||||||
|
--- kexec-tools-1.101/Makefile.orig 2006-10-20 13:38:53.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/Makefile 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -43,6 +43,7 @@
|
||||||
|
PKGINCLUDEIR=$(INCLUDEDIR)/$(PACKAGE)
|
||||||
|
|
||||||
|
MAN_PAGES:= kexec/kexec.8
|
||||||
|
+MAN_PAGES+= kdump/kdump.8
|
||||||
|
BINARIES_i386:= $(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test $(SBINDIR)/kdump
|
||||||
|
BINARIES_x86_64:=$(SBINDIR)/kexec $(PKGLIBDIR)/kexec_test
|
||||||
|
BINARIES:=$(SBINDIR)/kexec $(BINARIES_$(ARCH))
|
||||||
|
--- /dev/null 2006-10-19 09:27:39.770809345 -0400
|
||||||
|
+++ kexec-tools-1.101/kdump/kdump.8 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -0,0 +1,39 @@
|
||||||
|
+.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
+.\" First parameter, NAME, should be all caps
|
||||||
|
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
+.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
+.TH KDUMP 8 "Jul 27, 2005"
|
||||||
|
+.\" Please adjust this date whenever revising the manpage.
|
||||||
|
+.\"
|
||||||
|
+.\" Some roff macros, for reference:
|
||||||
|
+.\" .nh disable hyphenation
|
||||||
|
+.\" .hy enable hyphenation
|
||||||
|
+.\" .ad l left justify
|
||||||
|
+.\" .ad b justify to both left and right margins
|
||||||
|
+.\" .nf disable filling
|
||||||
|
+.\" .fi enable filling
|
||||||
|
+.\" .br insert line break
|
||||||
|
+.\" .sp <n> insert n+1 empty lines
|
||||||
|
+.\" for manpage-specific macros, see man(7)
|
||||||
|
+.SH NAME
|
||||||
|
+kdump \- This is just a placeholder until real man page has been written
|
||||||
|
+.SH SYNOPSIS
|
||||||
|
+.B kdump
|
||||||
|
+.RI [ options ] " start_address" ...
|
||||||
|
+.SH DESCRIPTION
|
||||||
|
+.PP
|
||||||
|
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
+.\" respectively.
|
||||||
|
+\fBkdump\fP does not have a man page yet.
|
||||||
|
+.SH OPTIONS
|
||||||
|
+.\"These programs follow the usual GNU command line syntax, with long
|
||||||
|
+.\"options starting with two dashes (`-').
|
||||||
|
+.\"A summary of options is included below.
|
||||||
|
+.\"For a complete description, see the Info files.
|
||||||
|
+.SH SEE ALSO
|
||||||
|
+.SH AUTHOR
|
||||||
|
+kdump was written by Eric Biederman.
|
||||||
|
+.PP
|
||||||
|
+This manual page was written by Khalid Aziz <khalid.aziz@hp.com>,
|
||||||
|
+for the Debian project (but may be used by others).
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/Makefile.orig 2004-12-20 17:44:22.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/Makefile 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -1,8 +1,8 @@
|
||||||
|
#
|
||||||
|
# Purgatory ia64
|
||||||
|
#
|
||||||
|
-
|
||||||
|
-PURGATORY_S_SRCS+=
|
||||||
|
+PCFLAGS += -ffixed-r28
|
||||||
|
+PURGATORY_S_SRCS+= purgatory/arch/ia64/entry.S
|
||||||
|
PURGATORY_C_SRCS+= purgatory/arch/ia64/purgatory-ia64.c
|
||||||
|
PURGATORY_C_SRCS+= purgatory/arch/ia64/console-ia64.c
|
||||||
|
PURGATORY_C_SRCS+=
|
||||||
|
--- /dev/null 2006-10-19 09:27:39.770809345 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+#ifndef ARCH_IO_H
|
||||||
|
+#define ARCH_IO_H
|
||||||
|
+
|
||||||
|
+#include <stdint.h>
|
||||||
|
+/* Helper functions for directly doing I/O */
|
||||||
|
+
|
||||||
|
+extern inline uint8_t inb(void *port)
|
||||||
|
+{
|
||||||
|
+ volatile unsigned char *addr = (unsigned char *)port;
|
||||||
|
+ uint8_t result;
|
||||||
|
+
|
||||||
|
+ result = *addr;
|
||||||
|
+ asm volatile ("mf.a"::: "memory");
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+extern inline void outb (uint8_t value, void *port)
|
||||||
|
+{
|
||||||
|
+ volatile unsigned char *addr = (unsigned char *)port;
|
||||||
|
+
|
||||||
|
+ *addr = value;
|
||||||
|
+ asm volatile ("mf.a"::: "memory");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* ARCH_IO_H */
|
||||||
|
--- /dev/null 2006-10-19 09:27:39.770809345 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/entry.S 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -0,0 +1,85 @@
|
||||||
|
+/*
|
||||||
|
+ * purgatory: setup code
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2005 Zou Nan hai (nanhai.zou@intel.com)
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation (version 2 of the License).
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+.global __dummy_efi_function
|
||||||
|
+.align 32
|
||||||
|
+.proc __dummy_efi_function
|
||||||
|
+__dummy_efi_function:
|
||||||
|
+ mov r8=r0;;
|
||||||
|
+ br.ret.sptk.many rp;;
|
||||||
|
+.global __dummy_efi_function_end
|
||||||
|
+__dummy_efi_function_end:
|
||||||
|
+.endp __dummy_efi_function
|
||||||
|
+
|
||||||
|
+.global purgatory_start
|
||||||
|
+.align 32
|
||||||
|
+.proc purgatory_start
|
||||||
|
+purgatory_start:
|
||||||
|
+ movl r2=__gp_value;;
|
||||||
|
+ ld8 gp=[r2];;
|
||||||
|
+ br.call.sptk.many b0=purgatory
|
||||||
|
+ ;;
|
||||||
|
+ alloc r2 = ar.pfs, 0, 0, 5, 0
|
||||||
|
+ ;;
|
||||||
|
+ mov out0=r28
|
||||||
|
+
|
||||||
|
+ movl r2=__command_line;;
|
||||||
|
+ ld8 out1=[r2];;
|
||||||
|
+ movl r2=__command_line_len;;
|
||||||
|
+ ld8 out2=[r2];;
|
||||||
|
+ movl r2=__ramdisk_base;;
|
||||||
|
+ ld8 out3=[r2];;
|
||||||
|
+ movl r2=__ramdisk_size;;
|
||||||
|
+ ld8 out4=[r2];;
|
||||||
|
+ br.call.sptk.many b0=ia64_env_setup
|
||||||
|
+ movl r10=__kernel_entry;;
|
||||||
|
+ ld8 r14=[r10];;
|
||||||
|
+ mov b6=r14;;
|
||||||
|
+ mov ar.lc=r0
|
||||||
|
+ mov ar.ec=r0
|
||||||
|
+ cover;;
|
||||||
|
+ invala;;
|
||||||
|
+ br.call.sptk.many b0=b6
|
||||||
|
+.endp purgatory_start
|
||||||
|
+
|
||||||
|
+.align 32
|
||||||
|
+.global __kernel_entry
|
||||||
|
+.size __kernel_entry, 8
|
||||||
|
+__kernel_entry:
|
||||||
|
+ data8 0x0
|
||||||
|
+.global __command_line
|
||||||
|
+.size __command_line, 8
|
||||||
|
+__command_line:
|
||||||
|
+ data8 0x0
|
||||||
|
+.global __command_line_len
|
||||||
|
+.size __command_line_len, 8
|
||||||
|
+__command_line_len:
|
||||||
|
+ data8 0x0
|
||||||
|
+.global __ramdisk_base
|
||||||
|
+.size __ramdisk_base, 8
|
||||||
|
+__ramdisk_base:
|
||||||
|
+ data8 0x0
|
||||||
|
+.global __ramdisk_size
|
||||||
|
+.size __ramdisk_size, 8
|
||||||
|
+__ramdisk_size:
|
||||||
|
+ data8 0x0
|
||||||
|
+.global __gp_value
|
||||||
|
+.size __gp_value, 8
|
||||||
|
+__gp_value:
|
||||||
|
+ data8 0x0
|
||||||
|
--- kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c.orig 2006-10-20 13:38:53.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/purgatory/arch/ia64/purgatory-ia64.c 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -1,10 +1,116 @@
|
||||||
|
#include <purgatory.h>
|
||||||
|
+#include <stdint.h>
|
||||||
|
+#include <string.h>
|
||||||
|
#include "purgatory-ia64.h"
|
||||||
|
|
||||||
|
+#define PAGE_OFFSET 0xe000000000000000
|
||||||
|
+
|
||||||
|
+typedef struct {
|
||||||
|
+ uint64_t signature;
|
||||||
|
+ uint32_t revision;
|
||||||
|
+ uint32_t headersize;
|
||||||
|
+ uint32_t crc32;
|
||||||
|
+ uint32_t reserved;
|
||||||
|
+} efi_table_hdr_t;
|
||||||
|
+
|
||||||
|
+typedef struct {
|
||||||
|
+ efi_table_hdr_t hdr;
|
||||||
|
+ unsigned long get_time;
|
||||||
|
+ unsigned long set_time;
|
||||||
|
+ unsigned long get_wakeup_time;
|
||||||
|
+ unsigned long set_wakeup_time;
|
||||||
|
+ unsigned long set_virtual_address_map;
|
||||||
|
+ unsigned long convert_pointer;
|
||||||
|
+ unsigned long get_variable;
|
||||||
|
+ unsigned long get_next_variable;
|
||||||
|
+ unsigned long set_variable;
|
||||||
|
+ unsigned long get_next_high_mono_count;
|
||||||
|
+ unsigned long reset_system;
|
||||||
|
+} efi_runtime_services_t;
|
||||||
|
+
|
||||||
|
+typedef struct {
|
||||||
|
+ efi_table_hdr_t hdr;
|
||||||
|
+ unsigned long fw_vendor; /* physical addr of CHAR16 vendor string
|
||||||
|
+ */
|
||||||
|
+ uint32_t fw_revision;
|
||||||
|
+ unsigned long con_in_handle;
|
||||||
|
+ unsigned long con_in;
|
||||||
|
+ unsigned long con_out_handle;
|
||||||
|
+ unsigned long con_out;
|
||||||
|
+ unsigned long stderr_handle;
|
||||||
|
+ unsigned long stderr;
|
||||||
|
+ unsigned long runtime;
|
||||||
|
+ unsigned long boottime;
|
||||||
|
+ unsigned long nr_tables;
|
||||||
|
+ unsigned long tables;
|
||||||
|
+} efi_system_table_t;
|
||||||
|
+
|
||||||
|
+struct ia64_boot_param {
|
||||||
|
+ uint64_t command_line; /* physical address of command line arguments */
|
||||||
|
+ uint64_t efi_systab; /* physical address of EFI system table */
|
||||||
|
+ uint64_t efi_memmap; /* physical address of EFI memory map */
|
||||||
|
+ uint64_t efi_memmap_size; /* size of EFI memory map */
|
||||||
|
+ uint64_t efi_memdesc_size; /* size of an EFI memory map descriptor */
|
||||||
|
+ uint32_t efi_memdesc_version; /* memory descriptor version */
|
||||||
|
+ struct {
|
||||||
|
+ uint16_t num_cols; /* number of columns on console output device */
|
||||||
|
+ uint16_t num_rows; /* number of rows on console output device */
|
||||||
|
+ uint16_t orig_x; /* cursor's x position */
|
||||||
|
+ uint16_t orig_y; /* cursor's y position */
|
||||||
|
+ } console_info;
|
||||||
|
+ uint64_t fpswa; /* physical address of the fpswa interface */
|
||||||
|
+ uint64_t initrd_start;
|
||||||
|
+ uint64_t initrd_size;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
void setup_arch(void)
|
||||||
|
{
|
||||||
|
/* Nothing for now */
|
||||||
|
}
|
||||||
|
+inline unsigned long PA(unsigned long addr)
|
||||||
|
+{
|
||||||
|
+ return addr - PAGE_OFFSET;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void flush_icache_range(char *start, unsigned long len)
|
||||||
|
+{
|
||||||
|
+ unsigned long i;
|
||||||
|
+ for (i = 0;i < len; i += 32)
|
||||||
|
+ asm volatile("fc.i %0"::"r"(start+i):"memory");
|
||||||
|
+ asm volatile (";;sync.i;;":::"memory");
|
||||||
|
+ asm volatile ("srlz.i":::"memory");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+extern char __dummy_efi_function[], __dummy_efi_function_end[];
|
||||||
|
+
|
||||||
|
+void ia64_env_setup(struct ia64_boot_param *boot_param,
|
||||||
|
+ uint64_t command_line, uint64_t command_line_len,
|
||||||
|
+ uint64_t ramdisk_base, uint64_t ramdisk_size)
|
||||||
|
+{
|
||||||
|
+ unsigned long len;
|
||||||
|
+ efi_system_table_t *systab;
|
||||||
|
+ efi_runtime_services_t *runtime;
|
||||||
|
+ unsigned long *set_virtual_address_map;
|
||||||
|
+
|
||||||
|
+ // patch efi_runtime->set_virtual_address_map to a
|
||||||
|
+ // dummy function
|
||||||
|
+ len = __dummy_efi_function_end - __dummy_efi_function;
|
||||||
|
+ memcpy((char *)command_line + command_line_len, __dummy_efi_function,
|
||||||
|
+ len);
|
||||||
|
+ systab = (efi_system_table_t *)boot_param->efi_systab;
|
||||||
|
+ runtime = (efi_runtime_services_t *)PA(systab->runtime);
|
||||||
|
+ set_virtual_address_map =
|
||||||
|
+ (unsigned long *)PA(runtime->set_virtual_address_map);
|
||||||
|
+ *(set_virtual_address_map)=
|
||||||
|
+ (unsigned long)((char *)command_line + command_line_len);
|
||||||
|
+ flush_icache_range((char *)command_line+command_line_len, len);
|
||||||
|
+
|
||||||
|
+ boot_param->command_line = command_line;
|
||||||
|
+ boot_param->console_info.orig_x = 0;
|
||||||
|
+ boot_param->console_info.orig_y = 0;
|
||||||
|
+ boot_param->initrd_start = ramdisk_base;
|
||||||
|
+ boot_param->initrd_size = ramdisk_size;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* This function can be used to execute after the SHA256 verification. */
|
||||||
|
void post_verification_setup_arch(void)
|
||||||
|
--- kexec-tools-1.101/kexec/Makefile.orig 2006-10-20 13:38:53.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/Makefile 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
KEXEC_OBJS:= $(KEXEC_C_OBJS) $(KEXEC_S_OBJS)
|
||||||
|
KEXEC_DEPS:= $(KEXEC_C_DEPS) $(KEXEC_S_DEPS)
|
||||||
|
KEXEC:= $(SBINDIR)/kexec
|
||||||
|
+KEXEC_MANPAGE:= $(MANDIR)/man8/kexec.8
|
||||||
|
|
||||||
|
include $(KEXEC_DEPS)
|
||||||
|
|
||||||
|
@@ -51,6 +52,9 @@
|
||||||
|
mkdir -p $(@D)
|
||||||
|
$(CC) $(KCFLAGS) -o $@ $(KEXEC_OBJS) $(UTIL_LIB) $(LIBS)
|
||||||
|
|
||||||
|
+$(KEXEC_MANPAGE): kexec/kexec.8
|
||||||
|
+ $(MKDIR) -p $(MANDIR)/man8
|
||||||
|
+ cp kexec/kexec.8 $(KEXEC_MANPAGE)
|
||||||
|
echo::
|
||||||
|
@echo "KEXEC_C_SRCS $(KEXEC_C_SRCS)"
|
||||||
|
@echo "KEXEC_C_DEPS $(KEXEC_C_DEPS)"
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.h.orig 2004-12-19 18:52:38.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.h 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -1,6 +1,8 @@
|
||||||
|
#ifndef KEXEC_IA64_H
|
||||||
|
#define KEXEC_IA64_H
|
||||||
|
|
||||||
|
+#define MAX_MEMORY_RANGES 1024
|
||||||
|
+
|
||||||
|
int elf_ia64_probe(const char *buf, off_t len);
|
||||||
|
int elf_ia64_load(int argc, char **argv, const char *buf, off_t len,
|
||||||
|
struct kexec_info *info);
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-rel-ia64.c.orig 2004-12-20 17:43:23.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-elf-rel-ia64.c 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -1,8 +1,14 @@
|
||||||
|
+/* Most of the code in this file is
|
||||||
|
+ * based on arch/ia64/kernel/module.c in Linux kernel
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include "../../kexec.h"
|
||||||
|
#include "../../kexec-elf.h"
|
||||||
|
|
||||||
|
+#define MAX_LTOFF ((uint64_t) (1 << 22))
|
||||||
|
+
|
||||||
|
int machine_verify_elf_rel(struct mem_ehdr *ehdr)
|
||||||
|
{
|
||||||
|
if (ehdr->ei_data != ELFDATA2LSB) {
|
||||||
|
@@ -17,12 +23,40 @@
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+ia64_patch (uint64_t insn_addr, uint64_t mask, uint64_t val)
|
||||||
|
+{
|
||||||
|
+ uint64_t m0, m1, v0, v1, b0, b1, *b = (uint64_t *) (insn_addr & -16);
|
||||||
|
+# define insn_mask ((1UL << 41) - 1)
|
||||||
|
+ unsigned long shift;
|
||||||
|
+
|
||||||
|
+ b0 = b[0]; b1 = b[1];
|
||||||
|
+ shift = 5 + 41 * (insn_addr % 16); /* 5 bits of template, then 3 x 41-bit instructions */
|
||||||
|
+ if (shift >= 64) {
|
||||||
|
+ m1 = mask << (shift - 64);
|
||||||
|
+ v1 = val << (shift - 64);
|
||||||
|
+ } else {
|
||||||
|
+ m0 = mask << shift; m1 = mask >> (64 - shift);
|
||||||
|
+ v0 = val << shift; v1 = val >> (64 - shift);
|
||||||
|
+ b[0] = (b0 & ~m0) | (v0 & m0);
|
||||||
|
+ }
|
||||||
|
+ b[1] = (b1 & ~m1) | (v1 & m1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline uint64_t
|
||||||
|
+bundle (const uint64_t insn)
|
||||||
|
+{
|
||||||
|
+ return insn & ~0xfUL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void machine_apply_elf_rel(struct mem_ehdr *ehdr, unsigned long r_type,
|
||||||
|
void *location, unsigned long address, unsigned long value)
|
||||||
|
{
|
||||||
|
+ uint64_t gp_value = ehdr->rel_addr + 0x200000;
|
||||||
|
switch(r_type) {
|
||||||
|
case R_IA64_NONE:
|
||||||
|
break;
|
||||||
|
+ case R_IA64_SEGREL64LSB:
|
||||||
|
case R_IA64_DIR64LSB:
|
||||||
|
*((uint64_t *)location) = value;
|
||||||
|
break;
|
||||||
|
@@ -31,15 +65,67 @@
|
||||||
|
if (value != *((uint32_t *)location))
|
||||||
|
goto overflow;
|
||||||
|
break;
|
||||||
|
- case R_IA64_PCREL21B:
|
||||||
|
+ case R_IA64_IMM64:
|
||||||
|
+ ia64_patch((uint64_t)location, 0x01fffefe000UL,
|
||||||
|
+ /* bit 63 -> 36 */
|
||||||
|
+ (((value & 0x8000000000000000UL) >> 27)
|
||||||
|
+ /* bit 21 -> 21 */
|
||||||
|
+ | ((value & 0x0000000000200000UL) << 0)
|
||||||
|
+ /* bit 16 -> 22 */
|
||||||
|
+ | ((value & 0x00000000001f0000UL) << 6)
|
||||||
|
+ /* bit 7 -> 27 */
|
||||||
|
+ | ((value & 0x000000000000ff80UL) << 20)
|
||||||
|
+ /* bit 0 -> 13 */
|
||||||
|
+ | ((value & 0x000000000000007fUL) << 13)));
|
||||||
|
+ ia64_patch((uint64_t)location - 1, 0x1ffffffffffUL, value>>22);
|
||||||
|
+ break;
|
||||||
|
+ case R_IA64_IMM22:
|
||||||
|
+ if (value + (1 << 21) >= (1 << 22))
|
||||||
|
+ die("value out of IMM22 range\n");
|
||||||
|
+ ia64_patch((uint64_t)location, 0x01fffcfe000UL,
|
||||||
|
+ /* bit 21 -> 36 */
|
||||||
|
+ (((value & 0x200000UL) << 15)
|
||||||
|
+ /* bit 16 -> 22 */
|
||||||
|
+ | ((value & 0x1f0000UL) << 6)
|
||||||
|
+ /* bit 7 -> 27 */
|
||||||
|
+ | ((value & 0x00ff80UL) << 20)
|
||||||
|
+ /* bit 0 -> 13 */
|
||||||
|
+ | ((value & 0x00007fUL) << 13) ));
|
||||||
|
+ break;
|
||||||
|
+ case R_IA64_PCREL21B: {
|
||||||
|
+ uint64_t delta = ((int64_t)value - (int64_t)address)/16;
|
||||||
|
+ if (delta + (1 << 20) >= (1 << 21))
|
||||||
|
+ die("value out of IMM21B range\n");
|
||||||
|
+ value = ((int64_t)(value - bundle(address)))/16;
|
||||||
|
+ ia64_patch((uint64_t)location, 0x11ffffe000UL,
|
||||||
|
+ (((value & 0x100000UL) << 16) /* bit 20 -> 36 */
|
||||||
|
+ | ((value & 0x0fffffUL) << 13) /* bit 0 -> 13 */));
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ case R_IA64_LTOFF22X:
|
||||||
|
+ if (value - gp_value + MAX_LTOFF/2 >= MAX_LTOFF)
|
||||||
|
+ die("value out of gp relative range");
|
||||||
|
+ value -= gp_value;
|
||||||
|
+ ia64_patch((uint64_t)location, 0x01fffcfe000UL,
|
||||||
|
+ (((value & 0x200000UL) << 15) /* bit 21 -> 36 */
|
||||||
|
+ |((value & 0x1f0000UL) << 6) /* bit 16 -> 22 */
|
||||||
|
+ |((value & 0x00ff80UL) << 20) /* bit 7 -> 27 */
|
||||||
|
+ |((value & 0x00007fUL) << 13) /* bit 0 -> 13 */));
|
||||||
|
+ break;
|
||||||
|
+ case R_IA64_LDXMOV:
|
||||||
|
+ if (value - gp_value + MAX_LTOFF/2 >= MAX_LTOFF)
|
||||||
|
+ die("value out of gp relative range");
|
||||||
|
+ ia64_patch((uint64_t)location, 0x1fff80fe000UL, 0x10000000000UL);
|
||||||
|
+ break;
|
||||||
|
case R_IA64_LTOFF22:
|
||||||
|
- case R_IA64_SEGREL64LSB:
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
- die("Unknown rela relocation: %lu\n", r_type);
|
||||||
|
+ die("Unknown rela relocation: 0x%lx 0x%lx\n",
|
||||||
|
+ r_type, address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
- overflow:
|
||||||
|
+overflow:
|
||||||
|
die("overflow in relocation type %lu val %Lx\n",
|
||||||
|
- r_type, value);
|
||||||
|
+ r_type, value);
|
||||||
|
}
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c.orig 2004-12-21 15:01:37.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
* Copyright (C) 2004 Silicon Graphics, Inc.
|
||||||
|
* Jesse Barnes <jbarnes@sgi.com>
|
||||||
|
* Copyright (C) 2004 Khalid Aziz <khalid.aziz@hp.com> Hewlett Packard Co
|
||||||
|
+ * Copyright (C) 2005 Zou Nan hai <nanhai.zou@intel.com> Intel Corp
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@@ -34,6 +35,7 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
+#include <limits.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <boot/elf_boot.h>
|
||||||
|
#include <ip_checksum.h>
|
||||||
|
@@ -74,23 +76,29 @@
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
" --command-line=STRING Set the kernel command line to STRING.\n"
|
||||||
|
- " --append=STRING Set the kernel command line to STRING.\n");
|
||||||
|
+ " --append=STRING Set the kernel command line to STRING.\n"
|
||||||
|
+ " --initrd=FILE Use FILE as the kernel's initial ramdisk.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int elf_ia64_load(int argc, char **argv, const char *buf, off_t len,
|
||||||
|
struct kexec_info *info)
|
||||||
|
{
|
||||||
|
struct mem_ehdr ehdr;
|
||||||
|
- const char *command_line;
|
||||||
|
- int command_line_len;
|
||||||
|
- unsigned long entry, max_addr;
|
||||||
|
+ const char *command_line, *ramdisk=0;
|
||||||
|
+ char *ramdisk_buf = NULL;
|
||||||
|
+ off_t ramdisk_size = 0;
|
||||||
|
+ unsigned long command_line_len;
|
||||||
|
+ unsigned long entry, max_addr, gp_value;
|
||||||
|
+ unsigned command_line_base, ramdisk_base;
|
||||||
|
int result;
|
||||||
|
int opt;
|
||||||
|
#define OPT_APPEND (OPT_ARCH_MAX+0)
|
||||||
|
+#define OPT_RAMDISK (OPT_ARCH_MAX+1)
|
||||||
|
static const struct option options[] = {
|
||||||
|
KEXEC_ARCH_OPTIONS
|
||||||
|
{"command-line", 1, 0, OPT_APPEND},
|
||||||
|
{"append", 1, 0, OPT_APPEND},
|
||||||
|
+ {"initrd", 1, 0, OPT_RAMDISK},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -110,11 +118,14 @@
|
||||||
|
case OPT_APPEND:
|
||||||
|
command_line = optarg;
|
||||||
|
break;
|
||||||
|
+ case OPT_RAMDISK:
|
||||||
|
+ ramdisk = optarg;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
command_line_len = 0;
|
||||||
|
if (command_line) {
|
||||||
|
- command_line_len = strlen(command_line) + 1;
|
||||||
|
+ command_line_len = strlen(command_line) + 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the Elf file */
|
||||||
|
@@ -129,13 +140,46 @@
|
||||||
|
|
||||||
|
/* Load the Elf data */
|
||||||
|
result = elf_exec_load(&ehdr, info);
|
||||||
|
- free_elf_info(&ehdr);
|
||||||
|
if (result < 0) {
|
||||||
|
fprintf(stderr, "ELF load failed\n");
|
||||||
|
+ free_elf_info(&ehdr);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ /* Load the setup code */
|
||||||
|
+ elf_rel_build_load(info, &info->rhdr, purgatory, purgatory_size,
|
||||||
|
+ 0x80000, ULONG_MAX, 1);
|
||||||
|
+
|
||||||
|
+ if (command_line_len) {
|
||||||
|
+ char *cmdline = xmalloc(command_line_len);
|
||||||
|
+ strcpy(cmdline, command_line);
|
||||||
|
+ command_line_len = (command_line_len + 15)&(~15);
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__command_line_len",
|
||||||
|
+ &command_line_len, sizeof(long));
|
||||||
|
+ command_line_base = add_buffer(info, cmdline,
|
||||||
|
+ command_line_len, command_line_len,
|
||||||
|
+ 16, 0, max_addr, 1);
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__command_line",
|
||||||
|
+ &command_line_base, sizeof(long));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* For now we don't have arguments to pass :( */
|
||||||
|
- info->entry = (void *)entry;
|
||||||
|
+ if (ramdisk) {
|
||||||
|
+ ramdisk_buf = slurp_file(ramdisk, &ramdisk_size);
|
||||||
|
+ ramdisk_base = add_buffer(info, ramdisk_buf, ramdisk_size,
|
||||||
|
+ ramdisk_size,
|
||||||
|
+ getpagesize(), 0, max_addr, 1);
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__ramdisk_base",
|
||||||
|
+ &ramdisk_base, sizeof(long));
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__ramdisk_size",
|
||||||
|
+ &ramdisk_size, sizeof(long));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gp_value = info->rhdr.rel_addr + 0x200000;
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__gp_value", &gp_value,
|
||||||
|
+ sizeof(gp_value));
|
||||||
|
+
|
||||||
|
+ elf_rel_set_symbol(&info->rhdr, "__kernel_entry", &entry, sizeof(entry));
|
||||||
|
+ free_elf_info(&ehdr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c.orig 2006-10-20 13:38:53.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/ia64/kexec-ia64.c 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -27,42 +27,87 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
+#include <sched.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include "../../kexec.h"
|
||||||
|
#include "../../kexec-syscall.h"
|
||||||
|
#include "kexec-ia64.h"
|
||||||
|
#include <arch/options.h>
|
||||||
|
|
||||||
|
-#define MAX_MEMORY_RANGES 64
|
||||||
|
static struct memory_range memory_range[MAX_MEMORY_RANGES];
|
||||||
|
|
||||||
|
/* Return a sorted list of available memory ranges. */
|
||||||
|
int get_memory_ranges(struct memory_range **range, int *ranges,
|
||||||
|
unsigned long kexec_flags)
|
||||||
|
{
|
||||||
|
- int memory_ranges;
|
||||||
|
- /*
|
||||||
|
- * /proc/iomem on ia64 does not show where all memory is. If
|
||||||
|
- * that is fixed up, we can make use of that to validate
|
||||||
|
- * the memory range kernel will be loade din. Until then.....
|
||||||
|
- * -- Khalid Aziz
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- /* Note that the ia64 architecture mandates all systems will
|
||||||
|
- * have at least 64MB at 0-64M. The SGI altix does not follow
|
||||||
|
- * that restriction, but a reasonable guess is better than nothing
|
||||||
|
- * at all.
|
||||||
|
- * -- Eric Biederman
|
||||||
|
- */
|
||||||
|
- fprintf(stderr, "Warning assuming memory at 0-64MB is present\n");
|
||||||
|
- memory_ranges = 0;
|
||||||
|
- memory_range[memory_ranges].start = 0x00010000;
|
||||||
|
- memory_range[memory_ranges].end = 0x10000000;
|
||||||
|
- memory_range[memory_ranges].type = RANGE_RAM;
|
||||||
|
- memory_ranges++;
|
||||||
|
- *range = memory_range;
|
||||||
|
- *ranges = memory_ranges;
|
||||||
|
- return 0;
|
||||||
|
+ const char iomem[]= "/proc/iomem";
|
||||||
|
+ int memory_ranges = 0;
|
||||||
|
+ char line[MAX_LINE];
|
||||||
|
+ FILE *fp;
|
||||||
|
+ fp = fopen(iomem, "r");
|
||||||
|
+ if (!fp) {
|
||||||
|
+ fprintf(stderr, "Cannot open %s: %s\n",
|
||||||
|
+ iomem, strerror(errno));
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while(fgets(line, sizeof(line), fp) != 0) {
|
||||||
|
+ unsigned long start, end;
|
||||||
|
+ char *str;
|
||||||
|
+ int type;
|
||||||
|
+ int consumed;
|
||||||
|
+ int count;
|
||||||
|
+ if (memory_ranges >= MAX_MEMORY_RANGES)
|
||||||
|
+ break;
|
||||||
|
+ count = sscanf(line, "%lx-%lx : %n",
|
||||||
|
+ &start, &end, &consumed);
|
||||||
|
+ if (count != 2)
|
||||||
|
+ continue;
|
||||||
|
+ str = line + consumed;
|
||||||
|
+ end = end + 1;
|
||||||
|
+ if (memcmp(str, "System RAM\n", 11) == 0) {
|
||||||
|
+ type = RANGE_RAM;
|
||||||
|
+ }
|
||||||
|
+ else if (memcmp(str, "reserved\n", 9) == 0) {
|
||||||
|
+ type = RANGE_RESERVED;
|
||||||
|
+ }
|
||||||
|
+ else if (memcmp(str, "Crash kernel\n", 13) == 0) {
|
||||||
|
+ /* Redefine the memory region boundaries if kernel
|
||||||
|
+ * exports the limits and if it is panic kernel.
|
||||||
|
+ * Override user values only if kernel exported
|
||||||
|
+ * values are subset of user defined values.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ if (kexec_flags & KEXEC_ON_CRASH) {
|
||||||
|
+ if (start > mem_min)
|
||||||
|
+ mem_min = start;
|
||||||
|
+ if (end < mem_max)
|
||||||
|
+ mem_max = end;
|
||||||
|
+ }
|
||||||
|
+ continue;
|
||||||
|
+ } else
|
||||||
|
+ continue;
|
||||||
|
+ /*
|
||||||
|
+ * Check if this memory range can be coalesced with
|
||||||
|
+ * the previous range
|
||||||
|
+ */
|
||||||
|
+ if ((memory_ranges > 0) &&
|
||||||
|
+ (start == memory_range[memory_ranges-1].end) &&
|
||||||
|
+ (type == memory_range[memory_ranges-1].type)) {
|
||||||
|
+ memory_range[memory_ranges-1].end = end;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ memory_range[memory_ranges].start = start;
|
||||||
|
+ memory_range[memory_ranges].end = end;
|
||||||
|
+ memory_range[memory_ranges].type = type;
|
||||||
|
+ memory_ranges++;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ fclose(fp);
|
||||||
|
+ *range = memory_range;
|
||||||
|
+ *ranges = memory_ranges;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Supported file types and callbacks */
|
||||||
|
@@ -76,9 +121,6 @@
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct {
|
||||||
|
-} arch_options = {
|
||||||
|
-};
|
||||||
|
int arch_process_options(int argc, char **argv)
|
||||||
|
{
|
||||||
|
static const struct option options[] = {
|
||||||
|
@@ -88,6 +130,12 @@
|
||||||
|
static const char short_options[] = KEXEC_ARCH_OPT_STR;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
+ /* execute from monarch processor */
|
||||||
|
+ cpu_set_t affinity;
|
||||||
|
+ CPU_ZERO(&affinity);
|
||||||
|
+ CPU_SET(0, &affinity);
|
||||||
|
+ sched_setaffinity(0, sizeof(affinity), &affinity);
|
||||||
|
+
|
||||||
|
opterr = 0; /* Don't complain about unrecognized options here */
|
||||||
|
while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1) {
|
||||||
|
switch(opt) {
|
||||||
|
@@ -113,10 +161,7 @@
|
||||||
|
}
|
||||||
|
if (strcmp(utsname.machine, "ia64") == 0)
|
||||||
|
{
|
||||||
|
- /* For compatibility with older patches
|
||||||
|
- * use KEXEC_ARCH_DEFAULT instead of KEXEC_ARCH_IA64 here.
|
||||||
|
- */
|
||||||
|
- info->kexec_flags |= KEXEC_ARCH_DEFAULT;
|
||||||
|
+ info->kexec_flags |= KEXEC_ARCH_IA_64;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Unsupported machine type: %s\n",
|
||||||
|
--- kexec-tools-1.101/kexec/kexec.8.orig 2004-12-19 17:27:31.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/kexec.8 2006-10-20 13:39:08.000000000 -0400
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.\" First parameter, NAME, should be all caps
|
||||||
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
-.TH KEXEC-TOOLS 8 "October 13, 2004"
|
||||||
|
+.TH KEXEC 8 "October 13, 2004"
|
||||||
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
|
.\"
|
||||||
|
.\" Some roff macros, for reference:
|
||||||
|
@@ -16,30 +16,60 @@
|
||||||
|
.\" .sp <n> insert n+1 empty lines
|
||||||
|
.\" for manpage-specific macros, see man(7)
|
||||||
|
.SH NAME
|
||||||
|
-kexec-tools \- Tool to load a kernel for warm reboot and initiate a warm reboot
|
||||||
|
+kexec \- Tool to load a kernel for warm reboot and initiate a warm reboot
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B kexec-tools
|
||||||
|
+.B kexec
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
.\" respectively.
|
||||||
|
-\fBkexec-tools\fP does not have a man page yet. Please use "kexec -h" for help.
|
||||||
|
+\fBkexec\fP allows one to load another kernel from the currently running
|
||||||
|
+Linux kernel. Normally one would load a kernel, and possibly an initial
|
||||||
|
+ramdisk, into the currently running kernel using kexec and then initiate
|
||||||
|
+a warm reboot by executing kexec again with appropriate option.
|
||||||
|
.SH OPTIONS
|
||||||
|
These programs follow the usual GNU command line syntax, with long
|
||||||
|
options starting with two dashes (`-').
|
||||||
|
A summary of options is included below.
|
||||||
|
-For a complete description, see the Info files.
|
||||||
|
.TP
|
||||||
|
.B \-h, \-\-help
|
||||||
|
Show summary of options.
|
||||||
|
.TP
|
||||||
|
.B \-v, \-\-version
|
||||||
|
Show version of program.
|
||||||
|
-.SH SEE ALSO
|
||||||
|
+.TP
|
||||||
|
+.B \-f, \-\-force
|
||||||
|
+Force an immediate kexec without calling shutdown.
|
||||||
|
+.TP
|
||||||
|
+.B \-x, \-\-no-ifdown
|
||||||
|
+Don't bring down network interfaces. (if used, must be last option specified)
|
||||||
|
+.TP
|
||||||
|
+.B \-l, \-\-load
|
||||||
|
+Load the new kernel into the current kernel.
|
||||||
|
+.TP
|
||||||
|
+.B \-p, \-\-load-panic
|
||||||
|
+Load the new kernel for use on panic.
|
||||||
|
+.TP
|
||||||
|
+.B \-u, \-\-unload
|
||||||
|
+Unload the current kexec target kernel.
|
||||||
|
+.TP
|
||||||
|
+.B \-e, \-\-exec
|
||||||
|
+Execute a currently loaded kernel.
|
||||||
|
+.TP
|
||||||
|
+.B \-t, \-\-type=TYPE
|
||||||
|
+Specify the new kernel is of this type.
|
||||||
|
+.TP
|
||||||
|
+.B \-\-mem\-min=<addr>
|
||||||
|
+Specify the lowest memory addres to load code into.
|
||||||
|
+.TP
|
||||||
|
+.B \-\-mem\-max=<addr>
|
||||||
|
+Specify the highest memory addres to load code into.
|
||||||
|
+.TP
|
||||||
|
+There may be additional options supported on individual architectures. Use --help option to see those options.
|
||||||
|
.SH AUTHOR
|
||||||
|
-kexec-tools was written by Eric Biederman.
|
||||||
|
+kexec was written by Eric Biederman.
|
||||||
|
.PP
|
||||||
|
-This manual page was written by Khalid Aziz <khalid_aziz@hp.com>,
|
||||||
|
+This manual page was written by Khalid Aziz <khalid.aziz@hp.com>,
|
||||||
|
for the Debian project (but may be used by others).
|
33
kexec-tools-1.101-ifdown.patch
Normal file
33
kexec-tools-1.101-ifdown.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/kexec.c.orig1 2006-10-13 14:01:39.000000000 -0400
|
||||||
|
+++ kexec-tools-1.101/kexec/kexec.c 2006-10-13 14:10:28.000000000 -0400
|
||||||
|
@@ -698,6 +698,19 @@ void usage(void)
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int kexec_loaded(void)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ FILE *fp;
|
||||||
|
+
|
||||||
|
+ fp = fopen("/sys/kernel/kexec_loaded", "r");
|
||||||
|
+ if (fp == NULL)
|
||||||
|
+ return -1;
|
||||||
|
+ fscanf(fp, "%d", &ret);
|
||||||
|
+ fclose(fp);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int do_load = 1;
|
||||||
|
@@ -801,6 +814,10 @@ int main(int argc, char *argv[])
|
||||||
|
if (do_load && (result == 0)) {
|
||||||
|
result = my_load(type, fileind, argc, argv, kexec_flags);
|
||||||
|
}
|
||||||
|
+ /* Don't shutdown unless there is something to reboot to! */
|
||||||
|
+ if ((result == 0) && (do_shutdown || do_exec) && !kexec_loaded()) {
|
||||||
|
+ die("Nothing has been loaded!\n");
|
||||||
|
+ }
|
||||||
|
if ((result == 0) && do_shutdown) {
|
||||||
|
result = my_shutdown();
|
||||||
|
}
|
111
kexec-tools-1.101-ppc64-64k-pages.patch
Normal file
111
kexec-tools-1.101-ppc64-64k-pages.patch
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
Signed-off-by: Sachin Sant <sachinp@in.ibm.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff -Naurp kexec-tools-rh/kexec/arch/ppc64/crashdump-ppc64.c kexec-tools-rh-fix/kexec/arch/ppc64/crashdump-ppc64.c
|
||||||
|
--- kexec-tools-rh/kexec/arch/ppc64/crashdump-ppc64.c 2006-09-08 07:29:52.000000000 +0530
|
||||||
|
+++ kexec-tools-rh-fix/kexec/arch/ppc64/crashdump-ppc64.c 2006-09-08 07:32:19.000000000 +0530
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <elf.h>
|
||||||
|
@@ -85,8 +86,8 @@ static int get_crash_memory_ranges(struc
|
||||||
|
unsigned long long start, end, cstart, cend;
|
||||||
|
|
||||||
|
/* create a separate program header for the backup region */
|
||||||
|
- crash_memory_range[0].start = 0x0000000000000000;
|
||||||
|
- crash_memory_range[0].end = 0x0000000000008000;
|
||||||
|
+ crash_memory_range[0].start = BACKUP_START;
|
||||||
|
+ crash_memory_range[0].end = BACKUP_END;
|
||||||
|
crash_memory_range[0].type = RANGE_RAM;
|
||||||
|
memory_ranges++;
|
||||||
|
|
||||||
|
@@ -125,8 +126,8 @@ static int get_crash_memory_ranges(struc
|
||||||
|
break;
|
||||||
|
start = ((unsigned long long *)buf)[0];
|
||||||
|
end = start + ((unsigned long long *)buf)[1];
|
||||||
|
- if (start == 0 && end >= 0x8000)
|
||||||
|
- start = 0x8000;
|
||||||
|
+ if (start == 0 && end >= BACKUP_END)
|
||||||
|
+ start = BACKUP_END;
|
||||||
|
match = 0;
|
||||||
|
sort_regions(&exclude_rgns);
|
||||||
|
|
||||||
|
@@ -420,8 +421,8 @@ void add_usable_mem_rgns(unsigned long l
|
||||||
|
unsigned long long end = base + size;
|
||||||
|
unsigned long long ustart, uend;
|
||||||
|
|
||||||
|
- base = _ALIGN_DOWN(base, PAGE_SIZE);
|
||||||
|
- end = _ALIGN_UP(end, PAGE_SIZE);
|
||||||
|
+ base = _ALIGN_DOWN(base, getpagesize());
|
||||||
|
+ end = _ALIGN_UP(end, getpagesize());
|
||||||
|
|
||||||
|
for (i=0; i < usablemem_rgns.size; i++) {
|
||||||
|
ustart = usablemem_rgns.ranges[i].start;
|
||||||
|
diff -Naurp kexec-tools-rh/kexec/arch/ppc64/crashdump-ppc64.h kexec-tools-rh-fix/kexec/arch/ppc64/crashdump-ppc64.h
|
||||||
|
--- kexec-tools-rh/kexec/arch/ppc64/crashdump-ppc64.h 2006-09-08 07:29:52.000000000 +0530
|
||||||
|
+++ kexec-tools-rh-fix/kexec/arch/ppc64/crashdump-ppc64.h 2006-09-08 07:33:38.000000000 +0530
|
||||||
|
@@ -6,28 +6,24 @@ int load_crashdump_segments(struct kexec
|
||||||
|
void add_usable_mem_rgns(unsigned long long base, unsigned long long size);
|
||||||
|
void add_exclude_rgns(unsigned long long base, unsigned long long size);
|
||||||
|
|
||||||
|
-#define PAGE_OFFSET 0xC000000000000000
|
||||||
|
+#define PAGE_OFFSET 0xC000000000000000
|
||||||
|
#define KERNELBASE PAGE_OFFSET
|
||||||
|
#define VMALLOCBASE 0xD000000000000000
|
||||||
|
|
||||||
|
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
|
||||||
|
-
|
||||||
|
-#define MAXMEM (-KERNELBASE-VMALLOCBASE)
|
||||||
|
+#define MAXMEM (-KERNELBASE-VMALLOCBASE)
|
||||||
|
|
||||||
|
#define CRASH_MAX_MEMORY_RANGES (MAX_MEMORY_RANGES + 6)
|
||||||
|
|
||||||
|
#define COMMAND_LINE_SIZE 512 /* from kernel */
|
||||||
|
-/* Backup Region, First 32K of System RAM. */
|
||||||
|
+/* Backup Region, First 64K of System RAM. */
|
||||||
|
#define BACKUP_START 0x0000
|
||||||
|
-#define BACKUP_END 0x8000
|
||||||
|
+#define BACKUP_END 0x10000
|
||||||
|
#define BACKUP_SIZE (BACKUP_END - BACKUP_START + 1)
|
||||||
|
|
||||||
|
-#define KDUMP_BACKUP_LIMIT 0x8000
|
||||||
|
+#define KDUMP_BACKUP_LIMIT BACKUP_END
|
||||||
|
#define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1)))
|
||||||
|
#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
|
||||||
|
-#ifndef PAGE_SIZE
|
||||||
|
-#define PAGE_SIZE 4096
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
extern unsigned long long crash_base;
|
||||||
|
extern unsigned long long crash_size;
|
||||||
|
diff -Naurp kexec-tools-rh/purgatory/arch/ppc64/crashdump_backup.c kexec-tools-rh-fix/purgatory/arch/ppc64/crashdump_backup.c
|
||||||
|
--- kexec-tools-rh/purgatory/arch/ppc64/crashdump_backup.c 2006-09-08 07:29:52.000000000 +0530
|
||||||
|
+++ kexec-tools-rh-fix/purgatory/arch/ppc64/crashdump_backup.c 2006-09-08 08:42:27.000000000 +0530
|
||||||
|
@@ -21,9 +21,7 @@
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
-
|
||||||
|
-#define BACKUP_REGION_SOURCE 0x0
|
||||||
|
-#define BACKUP_REGION_SIZE 32*1024
|
||||||
|
+#include "../../../kexec/arch/ppc64/crashdump-ppc64.h"
|
||||||
|
|
||||||
|
extern unsigned long backup_start;
|
||||||
|
|
||||||
|
@@ -32,10 +30,10 @@ void crashdump_backup_memory(void)
|
||||||
|
{
|
||||||
|
void *dest, *src;
|
||||||
|
|
||||||
|
- src = (void *)BACKUP_REGION_SOURCE;
|
||||||
|
+ src = (void *)BACKUP_START;
|
||||||
|
|
||||||
|
if (backup_start) {
|
||||||
|
dest = (void *)(backup_start);
|
||||||
|
- memcpy(dest, src, BACKUP_REGION_SIZE);
|
||||||
|
+ memcpy(dest, src, BACKUP_SIZE);
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,6 @@
|
|||||||
Index: kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c
|
--- kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c.orig 2006-10-20 11:10:39.000000000 -0400
|
||||||
===================================================================
|
+++ kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c 2006-10-20 11:11:22.000000000 -0400
|
||||||
--- kexec-tools-1.101.orig/kexec/arch/ppc64/kexec-ppc64.c
|
@@ -577,6 +577,10 @@
|
||||||
+++ kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c
|
|
||||||
@@ -552,6 +552,10 @@ int file_types = sizeof(file_type) / siz
|
|
||||||
|
|
||||||
void arch_usage(void)
|
void arch_usage(void)
|
||||||
{
|
{
|
||||||
|
1051
kexec-tools-1.101-reloc-update.patch
Normal file
1051
kexec-tools-1.101-reloc-update.patch
Normal file
File diff suppressed because it is too large
Load Diff
21
kexec-tools-1.101-x86_64-exactmap.patch
Normal file
21
kexec-tools-1.101-x86_64-exactmap.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
--- kexec-tools-1.101/kexec/arch/x86_64/crashdump-x86_64.c.orig 2006-11-14 12:15:45.000000000 -0500
|
||||||
|
+++ kexec-tools-1.101/kexec/arch/x86_64/crashdump-x86_64.c 2006-11-14 12:16:04.000000000 -0500
|
||||||
|
@@ -113,6 +113,8 @@
|
||||||
|
* initializing acpi tables in second kernel.
|
||||||
|
*/
|
||||||
|
type = RANGE_ACPI;
|
||||||
|
+ } else if(memcmp(str,"ACPI Non-volatile Storage\n",26) == 0 ) {
|
||||||
|
+ type = RANGE_ACPI_NVS;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -645,7 +647,8 @@
|
||||||
|
/* Inform second kernel about the presence of ACPI tables. */
|
||||||
|
for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
|
||||||
|
unsigned long start, end;
|
||||||
|
- if (mem_range[i].type != RANGE_ACPI)
|
||||||
|
+ if ( !( mem_range[i].type == RANGE_ACPI
|
||||||
|
+ || mem_range[i].type == RANGE_ACPI_NVS) )
|
||||||
|
continue;
|
||||||
|
start = mem_range[i].start;
|
||||||
|
end = mem_range[i].end;
|
145
kexec-tools.spec
145
kexec-tools.spec
@ -1,36 +1,55 @@
|
|||||||
Name: kexec-tools
|
Name: kexec-tools
|
||||||
Version: 1.101
|
Version: 1.101
|
||||||
Release: 54%{?dist}
|
Release: 55%{?dist}
|
||||||
License: GPL
|
License: GPL
|
||||||
Group: Applications/System
|
Group: Applications/System
|
||||||
Summary: The kexec/kdump userspace component.
|
Summary: The kexec/kdump userspace component.
|
||||||
Source0: %{name}-%{version}.tar.gz
|
Source0: %{name}-%{version}.tar.gz
|
||||||
Source1: kdump.init
|
Source1: kdump.init
|
||||||
Source2: kdump.sysconfig
|
Source2: kdump.sysconfig
|
||||||
Source3: mkdumprd
|
Source3: kdump.sysconfig.x86_64
|
||||||
Source4: kdump.conf
|
Source4: kdump.sysconfig.i386
|
||||||
Source5: kcp.c
|
Source5: kdump.sysconfig.ppc64
|
||||||
Source6: Makefile.kcp
|
Source6: kdump.sysconfig.ia64
|
||||||
Source7: makedumpfile.tar.gz
|
Source7: mkdumprd
|
||||||
Source8: kexec-kdump-howto.txt
|
Source8: kdump.conf
|
||||||
|
Source9: makedumpfile-1.0.7.tar.gz
|
||||||
|
Source10: kexec-kdump-howto.txt
|
||||||
|
Source11: firstboot_kdump.py
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
Requires(pre): coreutils chkconfig sed busybox ethtool
|
Requires(pre): coreutils chkconfig sed
|
||||||
BuildRequires: zlib-devel elfutils-libelf-devel glib2-devel pkgconfig
|
Requires: busybox >= 1.2.0
|
||||||
|
BuildRequires: zlib-devel elfutils-libelf-devel glib2-devel pkgconfig elfutils-libelf-devel elfutils-devel
|
||||||
|
ExcludeArch: ppc
|
||||||
|
%ifarch %{ix86} x86_64 ppc64 ia64
|
||||||
|
Obsoletes: diskdumputils netdump
|
||||||
|
%endif
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 0 through 100 are meant for x86 kexec-tools enablement
|
# Patches 0 through 100 are meant for x86 kexec-tools enablement
|
||||||
#
|
#
|
||||||
Patch1: kexec-tools-1.101-kdump.patch
|
Patch1: kexec-tools-1.101-kdump.patch
|
||||||
|
Patch2: kexec-tools-1.101-elf-core-type.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
|
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
|
||||||
#
|
#
|
||||||
Patch101: kexec-tools-1.101-disable-kdump-x8664.patch
|
Patch101: kexec-tools-1.101-disable-kdump-x8664.patch
|
||||||
|
Patch102: kexec-tools-1.101-x86_64-exactmap.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 201 through 300 are meant for ia64 kexec-tools enablement
|
# Patches 201 through 300 are meant for ia64 kexec-tools enablement
|
||||||
#
|
#
|
||||||
Patch201: kexec-tools-1.101-ia64-fixup.patch
|
Patch201: kexec-tools-1.101-ia64-fixup.patch
|
||||||
|
Patch202: kexec-tools-1.101-ia64-tools.patch
|
||||||
|
Patch203: kexec-tools-1.101-ia64-kdump.patch
|
||||||
|
Patch204: kexec-tools-1.101-ia64-EFI.patch
|
||||||
|
Patch205: kexec-tools-1.101-ia64-icache-align.patch
|
||||||
|
Patch206: kexec-tools-1.101-ia64-noio.patch
|
||||||
|
Patch207: kexec-tools-1.101-ia64-phdr-malloc.patch
|
||||||
|
Patch208: kexec-tools-1.101-ia64-load-offset.patch
|
||||||
|
Patch209: kexec-tools-1.101-ia64-noio-eat.patch
|
||||||
|
Patch210: kexec-tools-1.101-ia64-dash-l-fix.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
|
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
|
||||||
@ -39,6 +58,7 @@ Patch301: kexec-tools-1.101-ppc64-ignore-args.patch
|
|||||||
Patch302: kexec-tools-1.101-ppc64-usage.patch
|
Patch302: kexec-tools-1.101-ppc64-usage.patch
|
||||||
Patch303: kexec-tools-1.101-ppc64-cliargs.patch
|
Patch303: kexec-tools-1.101-ppc64-cliargs.patch
|
||||||
Patch304: kexec-tools-1.101-ppc64-platform-fix.patch
|
Patch304: kexec-tools-1.101-ppc64-platform-fix.patch
|
||||||
|
Patch305: kexec-tools-1.101-ppc64-64k-pages.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 401 through 500 are meant for s390 kexec-tools enablement
|
# Patches 401 through 500 are meant for s390 kexec-tools enablement
|
||||||
@ -54,12 +74,11 @@ Patch501: kexec-tools-1.101-ppc-fixup.patch
|
|||||||
# Patches 601 onward are generic patches
|
# Patches 601 onward are generic patches
|
||||||
#
|
#
|
||||||
Patch601: kexec-tools-1.101-Makefile.patch
|
Patch601: kexec-tools-1.101-Makefile.patch
|
||||||
Patch602: kexec-tools-1.101-Makefile-kcp.patch
|
Patch602: kexec-tools-1.101-et-dyn.patch
|
||||||
Patch603: kexec-tools-1.101-et-dyn.patch
|
Patch603: kexec-tools-1.101-page_h.patch
|
||||||
Patch604: kexec-tools-1.101-add-makedumpfile1.patch
|
Patch604: kexec-tools-1.101-elf-format.patch
|
||||||
Patch605: kexec-tools-1.101-add-makedumpfile2.patch
|
Patch605: kexec-tools-1.101-ifdown.patch
|
||||||
Patch606: kexec-tools-1.101-makedumpfile-archbuild.patch
|
Patch606: kexec-tools-1.101-reloc-update.patch
|
||||||
Patch607: kexec-tools-1.101-page_h.patch
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
kexec-tools provides /sbin/kexec binary that facilitates a new
|
kexec-tools provides /sbin/kexec binary that facilitates a new
|
||||||
@ -72,28 +91,36 @@ component of the kernel's kexec feature.
|
|||||||
%setup -q -n %{name}-%{version}
|
%setup -q -n %{name}-%{version}
|
||||||
rm -f ../kexec-tools-1.101.spec
|
rm -f ../kexec-tools-1.101.spec
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
%patch101 -p1
|
%patch101 -p1
|
||||||
|
%patch102 -p1
|
||||||
%patch201 -p1
|
%patch201 -p1
|
||||||
|
%patch202 -p1
|
||||||
|
%patch203 -p1
|
||||||
|
%patch204 -p1
|
||||||
|
%patch205 -p1
|
||||||
|
%patch206 -p1
|
||||||
|
%patch207 -p1
|
||||||
|
%patch208 -p1
|
||||||
|
%patch209 -p1
|
||||||
|
%patch210 -p1
|
||||||
%patch301 -p1
|
%patch301 -p1
|
||||||
%patch302 -p1
|
%patch302 -p1
|
||||||
%patch303 -p1
|
%patch303 -p1
|
||||||
%patch304 -p1
|
%patch304 -p1
|
||||||
|
%patch305 -p1
|
||||||
%patch401 -p1
|
%patch401 -p1
|
||||||
%patch501 -p1
|
%patch501 -p1
|
||||||
%patch601 -p1
|
%patch601 -p1
|
||||||
%patch602 -p1
|
%patch602 -p1
|
||||||
%patch603 -p1
|
|
||||||
|
|
||||||
mkdir -p -m755 kcp
|
mkdir -p -m755 kcp
|
||||||
cp %{SOURCE5} kcp/kcp.c
|
tar -z -x -v -f %{SOURCE9}
|
||||||
cp %{SOURCE6} kcp/Makefile
|
|
||||||
mkdir makedumpfile
|
|
||||||
tar -C makedumpfile -z -x -v -f %{SOURCE7}
|
|
||||||
|
|
||||||
|
%patch603 -p1
|
||||||
%patch604 -p1
|
%patch604 -p1
|
||||||
%patch605 -p1
|
%patch605 -p1
|
||||||
%patch606 -p1
|
%patch606 -p1
|
||||||
%patch607 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure \
|
%configure \
|
||||||
@ -103,9 +130,9 @@ tar -C makedumpfile -z -x -v -f %{SOURCE7}
|
|||||||
%endif
|
%endif
|
||||||
--sbindir=/sbin
|
--sbindir=/sbin
|
||||||
rm -f kexec-tools.spec.in
|
rm -f kexec-tools.spec.in
|
||||||
cp %{SOURCE8} .
|
cp %{SOURCE10} .
|
||||||
make
|
make
|
||||||
%ifarch %{ix86} x86_64
|
%ifarch %{ix86} x86_64 ia64 ppc64
|
||||||
make -C makedumpfile
|
make -C makedumpfile
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
@ -116,21 +143,41 @@ mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d
|
|||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_docdir}
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_datadir}/kdump
|
||||||
install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/kdump
|
install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/kdump
|
||||||
install -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
if [ -f $RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu} ]; then
|
||||||
install -m 755 %{SOURCE3} $RPM_BUILD_ROOT/sbin/mkdumprd
|
install -m 644 $RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
||||||
install -m 755 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
|
else
|
||||||
|
install -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
||||||
|
fi
|
||||||
|
install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/sbin/mkdumprd
|
||||||
|
install -m 755 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
|
||||||
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
|
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
|
||||||
%ifarch %{ix86} x86_64
|
install -m 755 %{SOURCE11} $RPM_BUILD_ROOT%{_datadir}/kdump/firstboot_kdump.py
|
||||||
|
%ifarch %{ix86} x86_64 ia64 ppc64
|
||||||
install -m 755 makedumpfile/makedumpfile $RPM_BUILD_ROOT/sbin/makedumpfile
|
install -m 755 makedumpfile/makedumpfile $RPM_BUILD_ROOT/sbin/makedumpfile
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
rm -rf $RPM_BUILD_ROOT
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
|
||||||
%post
|
%post
|
||||||
touch /etc/kdump.conf
|
touch /etc/kdump.conf
|
||||||
/sbin/chkconfig --add kdump
|
/sbin/chkconfig --add kdump
|
||||||
|
#This portion of the script is temporary. Its only here
|
||||||
|
#to fix up broken boxes that require special settings
|
||||||
|
#in /etc/sysconfig/kdump. It will be removed when
|
||||||
|
#These systems are fixed.
|
||||||
|
|
||||||
|
#This is for HP zx1 machines
|
||||||
|
#They require machvec=dig on the kernel command line
|
||||||
|
if [ -d /proc/bus/mckinley ]
|
||||||
|
then
|
||||||
|
sed -e's/\(^KDUMP_COMMANDLINE_APPEND.*\)\("$\)/\1 machvec=dig"/' \
|
||||||
|
/etc/sysconfig/kdump > /etc/sysconfig/kdump.new
|
||||||
|
mv /etc/sysconfig/kdump.new /etc/sysconfig/kdump
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
%postun
|
%postun
|
||||||
|
|
||||||
@ -145,9 +192,20 @@ if [ "$1" = 0 ]; then
|
|||||||
fi
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
%triggerin -- firstboot
|
||||||
|
if [ ! -e %{_datadir}/firstboot/modules/firstboot_kdump.py ]
|
||||||
|
then
|
||||||
|
ln -s %{_datadir}/kdump/firstboot_kdump.py %{_datadir}/firstboot/modules/firstboot_kdump.py
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
%triggerun -- firstboot
|
||||||
|
rm -f %{_datadir}/firstboot/modules/firstboot_kdump.py
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
/sbin/*
|
/sbin/*
|
||||||
|
%{_datadir}/kdump
|
||||||
%config(noreplace,missingok) %{_sysconfdir}/sysconfig/kdump
|
%config(noreplace,missingok) %{_sysconfdir}/sysconfig/kdump
|
||||||
%config(noreplace,missingok) %{_sysconfdir}/kdump.conf
|
%config(noreplace,missingok) %{_sysconfdir}/kdump.conf
|
||||||
%config %{_sysconfdir}/rc.d/init.d/kdump
|
%config %{_sysconfdir}/rc.d/init.d/kdump
|
||||||
@ -162,22 +220,24 @@ exit 0
|
|||||||
%doc kexec-kdump-howto.txt
|
%doc kexec-kdump-howto.txt
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Thu Sep 28 2006 Neil Horman <nhorman@redhat.com> - 1.101-54%{dist}
|
* Fri Dec 15 2006 Neil Horman <nhorman@redhat.com> - 1.101-5%{dist}
|
||||||
- update mkdumprd to use busybox ifup/down infrastructure
|
- Wholesale update of RHEL5 revisions 55-147
|
||||||
- update initscript file to use chkconfig properly
|
|
||||||
|
|
||||||
* Fri Sep 22 2006 Neil Horman <nhorman@redhat.com> - 1.101-52%{dist}
|
* Tue Aug 29 2006 Neil Horman <nhorman@redhat.com> - 1.101-54%{dist}
|
||||||
- rewrote mkdumprd to use busybox
|
- integrate default elf format patch
|
||||||
|
|
||||||
* Tue Sep 19 2006 Neil Horman <nhorman@redhat.com> - 1.101-52%{dist}
|
* Tue Aug 29 2006 Neil Horman <nhorman@redhat.com> - 1.101-53%{dist}
|
||||||
- added kdump howto documentation
|
- Taking Viveks x86_64 crashdump patch (rcv. via email)
|
||||||
|
|
||||||
* Thu Aug 31 2006 Neil Horman <nhorman@redhat.com> - 1.101-51%{dist}
|
* Tue Aug 29 2006 Neil Horman <nhorman@redhat.com> - 1.101-52%{dist}
|
||||||
- update mkdumprd to properly do scp and nfs based dumps
|
- Taking ia64 tools patch for bz 181358
|
||||||
- update docs in kdump.conf to reflect new ifc parameter
|
|
||||||
|
|
||||||
* Mon Aug 28 2006 Neil Horman <nhorman@redhat.com> - 1.101-50%{dist}
|
* Mon Aug 28 2006 Neil Horman <nhorman@redhat.com> - 1.101-51%{dist}
|
||||||
- updating to build without need for asm/page.h on x86_64
|
- more doc updates
|
||||||
|
- added patch to fix build break from kernel headers change
|
||||||
|
|
||||||
|
* Thu Aug 24 2006 Neil Horman <nhorman@redhat.com> - 1.101-50%{dist}
|
||||||
|
- repo patch to enable support for relocatable kernels.
|
||||||
|
|
||||||
* Thu Aug 24 2006 Neil Horman <nhorman@redhat.com> - 1.101-49%{dist}
|
* Thu Aug 24 2006 Neil Horman <nhorman@redhat.com> - 1.101-49%{dist}
|
||||||
- rewriting kcp to properly do ssh and scp
|
- rewriting kcp to properly do ssh and scp
|
||||||
@ -251,11 +311,6 @@ exit 0
|
|||||||
- rebuild
|
- rebuild
|
||||||
|
|
||||||
* Wed Jul 07 2006 Neil Horman <nhorman@redhat.com> 1.101-27.fc6
|
* Wed Jul 07 2006 Neil Horman <nhorman@redhat.com> 1.101-27.fc6
|
||||||
- Modify spec/sysconfig to not autobuild kdump kernel command line
|
|
||||||
- Add dist to revision tag
|
|
||||||
- Build for all arches
|
|
||||||
|
|
||||||
* Wed Jun 28 2006 Karsten Hopp <karsten@redhat.de> 1.101-20
|
|
||||||
- Buildrequire zlib-devel
|
- Buildrequire zlib-devel
|
||||||
|
|
||||||
* Thu Jun 22 2006 Neil Horman <nhorman@redhat.com> -1.101-19
|
* Thu Jun 22 2006 Neil Horman <nhorman@redhat.com> -1.101-19
|
||||||
|
504
mkdumprd
504
mkdumprd
@ -25,6 +25,8 @@
|
|||||||
# Guillaume Cottenceau <gc@mandrakesoft.com>
|
# Guillaume Cottenceau <gc@mandrakesoft.com>
|
||||||
# Peter Jones <pjones@redhat.com>
|
# Peter Jones <pjones@redhat.com>
|
||||||
# Neil Horman <nhorman@redhat.com>
|
# Neil Horman <nhorman@redhat.com>
|
||||||
|
cmdname=`basename $0`
|
||||||
|
|
||||||
umask 0022
|
umask 0022
|
||||||
|
|
||||||
export MALLOC_PERTURB_=204
|
export MALLOC_PERTURB_=204
|
||||||
@ -66,7 +68,8 @@ fstab="/etc/fstab"
|
|||||||
|
|
||||||
vg_list=""
|
vg_list=""
|
||||||
net_list=""
|
net_list=""
|
||||||
USING_METHOD="raw"
|
USING_METHOD="local_fs"
|
||||||
|
SAVE_PATH=/var/crash
|
||||||
|
|
||||||
vecho()
|
vecho()
|
||||||
{
|
{
|
||||||
@ -95,14 +98,14 @@ usage () {
|
|||||||
cmd=error
|
cmd=error
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$cmd "usage: `basename $0` [--version] [--help] [-v] [-d] [-f] [--preload <module>]"
|
$cmd "usage: $cmdname [--version] [--help] [-v] [-d] [-f] [--preload <module>]"
|
||||||
$cmd " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]"
|
$cmd " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]"
|
||||||
$cmd " [--image-version] [--force-scsi-probe | --omit-raid-modules]"
|
$cmd " [--image-version] [--force-scsi-probe | --omit-raid-modules]"
|
||||||
$cmd " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]"
|
$cmd " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]"
|
||||||
$cmd " [--builtin=<module>] [--omit-dmraid]"
|
$cmd " [--builtin=<module>] [--omit-dmraid]"
|
||||||
$cmd " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>"
|
$cmd " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>"
|
||||||
$cmd ""
|
$cmd ""
|
||||||
$cmd " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)"
|
$cmd " (ex: $cmdname /boot/initrd-2.2.5-15.img 2.2.5-15)"
|
||||||
|
|
||||||
if [ "$1" == "-n" ]; then
|
if [ "$1" == "-n" ]; then
|
||||||
exit 0
|
exit 0
|
||||||
@ -233,31 +236,6 @@ findmodule() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
finddmmods() {
|
|
||||||
line=$(/sbin/dmsetup table "$1" 2>/dev/null)
|
|
||||||
[ -z "$line" ] && return 1
|
|
||||||
type=$(echo "$line" | awk '{ print $3 }')
|
|
||||||
[ -z "$type" ] && return 1
|
|
||||||
case "$type" in
|
|
||||||
mirror)
|
|
||||||
findmodule -dm-mirror
|
|
||||||
;;
|
|
||||||
emc)
|
|
||||||
findmodule -dm-emc
|
|
||||||
findmodule -dm-round-robin
|
|
||||||
;;
|
|
||||||
multipath)
|
|
||||||
findmodule -dm-multipath
|
|
||||||
findmodule -dm-round-robin
|
|
||||||
;;
|
|
||||||
crypt)
|
|
||||||
findmodule -dm-crypt
|
|
||||||
;;
|
|
||||||
zero)
|
|
||||||
findmodule -dm-zero
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
inst() {
|
inst() {
|
||||||
if [ "$#" != "2" ];then
|
if [ "$#" != "2" ];then
|
||||||
@ -320,7 +298,23 @@ findnetdriver() {
|
|||||||
continue ;;
|
continue ;;
|
||||||
*) handleddevices="$handleddevices $device" ;;
|
*) handleddevices="$handleddevices $device" ;;
|
||||||
esac
|
esac
|
||||||
modalias=$(cat /sys/class/net/$device/device/modalias)
|
|
||||||
|
case "$device" in
|
||||||
|
bond*)
|
||||||
|
modalias=bonding
|
||||||
|
;;
|
||||||
|
eth*.*)
|
||||||
|
modalias=8021q
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ -f /sys/class/net/$device/device/modalias ]
|
||||||
|
then
|
||||||
|
modalias=$(cat /sys/class/net/$device/device/modalias)
|
||||||
|
else
|
||||||
|
modalias=$(ethtool -i $device | awk '/^driver:/ { print $2 }')
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
for driver in $(modprobe --set-version $kernel --show-depends $modalias 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }') ; do
|
for driver in $(modprobe --set-version $kernel --show-depends $modalias 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }') ; do
|
||||||
findmodule ${driver%%.ko}
|
findmodule ${driver%%.ko}
|
||||||
done
|
done
|
||||||
@ -367,6 +361,9 @@ handleraid() {
|
|||||||
|
|
||||||
handlelvordev() {
|
handlelvordev() {
|
||||||
local vg=`lvs --noheadings -o vg_name $1 2>/dev/null`
|
local vg=`lvs --noheadings -o vg_name $1 2>/dev/null`
|
||||||
|
if [ -z "$vg" ]; then
|
||||||
|
vg=`lvs --noheadings -o vg_name $(echo $1 | sed -e 's#^/dev/mapper/\([^-]*\)-\(.*\)$#/dev/\1/\2#') 2>/dev/null`
|
||||||
|
fi
|
||||||
if [ -n "$vg" ]; then
|
if [ -n "$vg" ]; then
|
||||||
vg=`echo $vg` # strip whitespace
|
vg=`echo $vg` # strip whitespace
|
||||||
case " $vg_list " in
|
case " $vg_list " in
|
||||||
@ -387,29 +384,56 @@ handlelvordev() {
|
|||||||
handlenetdev() {
|
handlenetdev() {
|
||||||
local dev=$1
|
local dev=$1
|
||||||
cp /etc/sysconfig/network-scripts/ifcfg-$dev $MNTIMAGE/etc
|
cp /etc/sysconfig/network-scripts/ifcfg-$dev $MNTIMAGE/etc
|
||||||
|
BOOTPROTO=""
|
||||||
|
VLAN=""
|
||||||
|
MASTER=""
|
||||||
|
SLAVE=""
|
||||||
. $MNTIMAGE/etc/ifcfg-$dev
|
. $MNTIMAGE/etc/ifcfg-$dev
|
||||||
|
|
||||||
findnetdriver $dev
|
findnetdriver $dev
|
||||||
|
|
||||||
if [ "$MASTER" == "yes" ]
|
|
||||||
then
|
|
||||||
#put code here to handle subdevs for a bond
|
|
||||||
echo "BUS_ID=\"Bonding\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
|
||||||
elif [ "$VLAN" == "yes" ]
|
|
||||||
then
|
|
||||||
#put code to handle vlan devices
|
|
||||||
echo "BUS+Id=\"Vlan\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
|
||||||
else
|
|
||||||
BUS_ID=`/sbin/ethtool -i $dev | grep bus-info`
|
|
||||||
echo "BUS_ID=\"$BUS_ID\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$BOOTPROTO" == "dhcp" ]
|
if [ "$BOOTPROTO" == "dhcp" ]
|
||||||
then
|
then
|
||||||
echo iface $dev inet dhcp >> $MNTIMAGE/etc/network/interfaces
|
echo iface $dev inet dhcp >> $MNTIMAGE/etc/network/interfaces
|
||||||
else
|
else
|
||||||
echo iface $dev inet static address $IPADDR netmask $NETMASK >> $MNTIMAGE/etc/network/interfaces
|
echo iface $dev inet static >> $MNTIMAGE/etc/network/interfaces
|
||||||
|
if [ -n "$IPADDR" ]
|
||||||
|
then
|
||||||
|
echo " " address $IPADDR >> $MNTIMAGE/etc/network/interfaces
|
||||||
|
fi
|
||||||
|
if [ -n "$NETMASK" ]
|
||||||
|
then
|
||||||
|
echo " " netmask $NETMASK >> $MNTIMAGE/etc/network/interfaces
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#This lets us recursively handle stacked devices
|
||||||
|
case "$dev" in
|
||||||
|
bond*)
|
||||||
|
#This is a bond, pick up its slaves
|
||||||
|
for j in `cat /sys/class/net/$dev/bonding/slaves`
|
||||||
|
do
|
||||||
|
handlenetdev $j
|
||||||
|
done
|
||||||
|
echo "BUS_ID=\"Bonding\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
|
||||||
|
if [ "$VLAN" == "yes" ]
|
||||||
|
then
|
||||||
|
#put code to handle vlan devices
|
||||||
|
echo "BUS_ID=\"Vlan\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
||||||
|
#now make sure we pick up the driver to support the
|
||||||
|
#underlying interface
|
||||||
|
BASE_IFC=`echo $dev | cut -d"." -f1`
|
||||||
|
handlenetdev $BASE_IFC
|
||||||
|
else
|
||||||
|
BUS_ID=`ls -l /sys/class/net/$dev/device | sed -e's/\(.*\/\)\(.*$\)/\2/'`
|
||||||
|
echo "BUS_ID=\"$BUS_ID\"" >> $MNTIMAGE/etc/ifcfg-$dev
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
@ -453,7 +477,7 @@ while [ $# -gt 0 ]; do
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
--version)
|
--version)
|
||||||
echo "mkinitrd: version $VERSION"
|
echo "$cmdname: version $VERSION"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@ -574,7 +598,7 @@ if [ ! -d /lib/modules/$kernel ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $UID != 0 ]; then
|
if [ $UID != 0 ]; then
|
||||||
error "mkinitrd must be run as root."
|
error "$cmdname must be run as root."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -759,8 +783,6 @@ for n in $CONFMODS; do
|
|||||||
findmodule $n
|
findmodule $n
|
||||||
done
|
done
|
||||||
|
|
||||||
finddmmods
|
|
||||||
|
|
||||||
vecho "Using modules:$MODULES"
|
vecho "Using modules:$MODULES"
|
||||||
|
|
||||||
MNTIMAGE=`mktemp -d ${TMPDIR}/initrd.XXXXXX`
|
MNTIMAGE=`mktemp -d ${TMPDIR}/initrd.XXXXXX`
|
||||||
@ -789,7 +811,7 @@ emitdm()
|
|||||||
if [ -n "$UUID" ]; then
|
if [ -n "$UUID" ]; then
|
||||||
UUID="--uuid $UUID"
|
UUID="--uuid $UUID"
|
||||||
fi
|
fi
|
||||||
emit dm create "$1" $UUID $(/sbin/dmsetup table "$1")
|
emit "echo \"$(/sbin/dmsetup table $1)\" | /sbin/dmsetup.static create \"$1\" $UUID"
|
||||||
}
|
}
|
||||||
|
|
||||||
emitdms()
|
emitdms()
|
||||||
@ -805,7 +827,7 @@ emitdms()
|
|||||||
emitdm "$NAME"
|
emitdm "$NAME"
|
||||||
;;
|
;;
|
||||||
part)
|
part)
|
||||||
emit dm partadd "$NAME"
|
emit /sbin/kpartx.static -pp -a \"/dev/mapper/$NAME\"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@ -833,7 +855,7 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
|
|
||||||
#find ethernet device used to route to remote host, ie eth0
|
#find ethernet device used to route to remote host, ie eth0
|
||||||
netdev=`/sbin/ip route get to $rhost 2>&1`
|
netdev=`/sbin/ip route get to $rhost 2>&1`
|
||||||
[ $? != 0 ] && echo "Bad kdump location: $location" && continue
|
[ $? != 0 ] && echo "Bad kdump location: $location" && exit 1
|
||||||
#the field in the ip output changes if we go to another subnet
|
#the field in the ip output changes if we go to another subnet
|
||||||
OFF_SUBNET=`echo $netdev | grep via`
|
OFF_SUBNET=`echo $netdev | grep via`
|
||||||
if [ -n "$OFF_SUBNET" ]
|
if [ -n "$OFF_SUBNET" ]
|
||||||
@ -855,12 +877,10 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
;;
|
;;
|
||||||
raw)
|
raw)
|
||||||
USING_METHOD="raw"
|
USING_METHOD="raw"
|
||||||
;;
|
if (echo $location | egrep -q "^(LABEL|UUID)="); then
|
||||||
ifc)
|
location=$(findfs $location)
|
||||||
KDUMP_IFC=$location
|
|
||||||
if [ -n "$network" ]; then
|
|
||||||
network=`echo $network | sed -e's/\(^.* \)\('$netdev'\)\( .*$\)/\1 '$KDUMP_IFC' \3/'`
|
|
||||||
fi
|
fi
|
||||||
|
handlelvordev $location
|
||||||
;;
|
;;
|
||||||
core_collector)
|
core_collector)
|
||||||
if [ -x /sbin/makedumpfile ]; then
|
if [ -x /sbin/makedumpfile ]; then
|
||||||
@ -873,8 +893,26 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
path)
|
||||||
|
SAVE_PATH=$location
|
||||||
|
;;
|
||||||
|
link_delay)
|
||||||
|
LINK_DELAY=$location
|
||||||
|
;;
|
||||||
|
default)
|
||||||
|
DEFAULT_ACTION=$location
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
USING_METHOD="local_fs"
|
IS_COMMENT=`echo $type | grep ^#.*$`
|
||||||
|
if [ -n "$IS_COMMENT" -o -z "$location" ]
|
||||||
|
then
|
||||||
|
#don't process comments or blank line
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if (echo $location | egrep -q "^(LABEL|UUID)="); then
|
||||||
|
location=$(findfs $location)
|
||||||
|
fi
|
||||||
|
handlelvordev $location
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -899,6 +937,7 @@ mkdir -p $MNTIMAGE/etc
|
|||||||
mkdir -p $MNTIMAGE/dev
|
mkdir -p $MNTIMAGE/dev
|
||||||
mkdir -p $MNTIMAGE/proc
|
mkdir -p $MNTIMAGE/proc
|
||||||
mkdir -p $MNTIMAGE/sys
|
mkdir -p $MNTIMAGE/sys
|
||||||
|
mkdir -p $MNTIMAGE/tmp
|
||||||
mkdir -p $MNTIMAGE/sysroot
|
mkdir -p $MNTIMAGE/sysroot
|
||||||
mkdir -p $MNTIMAGE/modules
|
mkdir -p $MNTIMAGE/modules
|
||||||
mkdir -p $MNTIMAGE/usr/share/udhcpc
|
mkdir -p $MNTIMAGE/usr/share/udhcpc
|
||||||
@ -913,7 +952,15 @@ ln -s bin $MNTIMAGE/sbin
|
|||||||
#if we are using makedumpfile here, then generate the config file
|
#if we are using makedumpfile here, then generate the config file
|
||||||
if [ -n "$CORE_COLLECTOR" ]; then
|
if [ -n "$CORE_COLLECTOR" ]; then
|
||||||
RUN_KERN_VER=`uname -r`
|
RUN_KERN_VER=`uname -r`
|
||||||
/sbin/makedumpfile -g $MNTIMAGE/etc/makedumpfile.config -x /usr/lib/debug/lib/modules/$RUN_KERN_VER/vmlinux /boot/System.map-$RUN_KERN_VER
|
if [ ! -f /usr/lib/debug/lib/modules/$RUN_KERN_VER/vmlinux ]
|
||||||
|
then
|
||||||
|
echo "kernel-debuginfo-$RUN_KERN_VER is not installed. You need this to use makedumpfile!"
|
||||||
|
echo "please install it and restart the kdump service"
|
||||||
|
rm -rf $MNTIMAGE
|
||||||
|
rm -rf $IMAGE
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
/sbin/makedumpfile -g $MNTIMAGE/etc/makedumpfile.config -x /usr/lib/debug/lib/modules/$RUN_KERN_VER/vmlinux > /dev/null
|
||||||
if [ $? != 0 ]; then
|
if [ $? != 0 ]; then
|
||||||
echo "could not generate makedumpfile configuration. aborting"
|
echo "could not generate makedumpfile configuration. aborting"
|
||||||
rm -rf $MNTIMAGE
|
rm -rf $MNTIMAGE
|
||||||
@ -985,7 +1032,41 @@ EOF
|
|||||||
#NETWORKING SCRIPT DIRECTORIES
|
#NETWORKING SCRIPT DIRECTORIES
|
||||||
cat >> $MNTIMAGE/etc/network/if-pre-up.d/pre-up-script << EOF
|
cat >> $MNTIMAGE/etc/network/if-pre-up.d/pre-up-script << EOF
|
||||||
#!/bin/msh
|
#!/bin/msh
|
||||||
ifconfig \$IFACE up
|
PATH=\$PATH:/scriptfns
|
||||||
|
. /etc/ifcfg-\$IFACE
|
||||||
|
|
||||||
|
LINK_DELAY=$LINK_DELAY
|
||||||
|
if [ "\$BUS_ID" != "Vlan" ]
|
||||||
|
then
|
||||||
|
ifconfig \$IFACE up
|
||||||
|
if [ -n "\$LINK_DELAY" ]
|
||||||
|
then
|
||||||
|
echo "\$IFACE Link Up. Waiting \$LINK_DELAY Seconds"
|
||||||
|
sleep \$LINK_DELAY
|
||||||
|
echo "Continuing"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "\$BUS_ID" == "Bonding" ]
|
||||||
|
then
|
||||||
|
#this is a bond find and bring up the slaves
|
||||||
|
echo searching for slaves
|
||||||
|
find_activate_slaves \$IFACE
|
||||||
|
elif [ "\$BUS_ID" == "Vlan" ]
|
||||||
|
then
|
||||||
|
#bring up the base interface first
|
||||||
|
BASE_DEV=\`echo \$IFACE | cut -d"." -f1\`
|
||||||
|
VLAN_ID=\`echo \$IFACE | cut -d"." -f2\`
|
||||||
|
ifconfig \$BASE_DEV up
|
||||||
|
if [ -n "\$LINK_DELAY" ]
|
||||||
|
then
|
||||||
|
echo "\$IFACE Link Up. Waiting \$LINK_DELAY Seconds"
|
||||||
|
sleep \$LINK_DELAY
|
||||||
|
echo "Continuing"
|
||||||
|
fi
|
||||||
|
vconfig add \$BASE_DEV \$VLAN_ID
|
||||||
|
ifconfig \$IFACE up
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@ -996,6 +1077,7 @@ done
|
|||||||
|
|
||||||
cat >> $MNTIMAGE/etc/network/if-up.d/up-script << EOF
|
cat >> $MNTIMAGE/etc/network/if-up.d/up-script << EOF
|
||||||
#!/bin/msh
|
#!/bin/msh
|
||||||
|
PATH=\$PATH:/scriptfns
|
||||||
if [ "\$METHOD" != "dhcp" ]
|
if [ "\$METHOD" != "dhcp" ]
|
||||||
then
|
then
|
||||||
. /etc/ifcfg-\$IFACE
|
. /etc/ifcfg-\$IFACE
|
||||||
@ -1017,56 +1099,69 @@ chmod 755 $MNTIMAGE/usr/share/udhcpc/default.script
|
|||||||
SCRIPTDIR=$MNTIMAGE/scriptfns
|
SCRIPTDIR=$MNTIMAGE/scriptfns
|
||||||
mkdir -p $SCRIPTDIR
|
mkdir -p $SCRIPTDIR
|
||||||
|
|
||||||
cat >> $SCRIPTDIR/rename_interfaces << EOF
|
cat >> $SCRIPTDIR/map_interface << EOF
|
||||||
#!/bin/msh
|
#!/bin/msh
|
||||||
TMPCNT=0
|
if [ -e /tmp/tmpcnt ]
|
||||||
|
then
|
||||||
|
TMPCNT=\`cat /tmp/tmpcnt\`
|
||||||
|
else
|
||||||
|
TMPCNT=0
|
||||||
|
fi
|
||||||
#erase previously recorded map
|
#erase previously recorded map
|
||||||
rm -f /etc/iface_map
|
RENAMED=""
|
||||||
for i in \`ls /etc/ifcfg-*\`
|
REAL_DEV=""
|
||||||
|
NETDEV=\$1
|
||||||
|
. /etc/ifcfg-\$NETDEV
|
||||||
|
for j in \`ifconfig -a | awk '/.*Link encap.*/ {print \$1}'\`
|
||||||
do
|
do
|
||||||
RENAMED=""
|
case "\$BUS_ID" in
|
||||||
REAL_DEV=""
|
Bonding)
|
||||||
NETDEV=\`echo \$i | cut -d"-" -f2\`
|
REAL_DEV=bond0
|
||||||
for j in \`ifconfig -a | awk '/.*Link encap.*/ {print \$1}'\`
|
RENAMED="yes"
|
||||||
do
|
;;
|
||||||
. /etc/ifcfg-\$NETDEV
|
Vlan)
|
||||||
case "\$BUS_ID" in
|
BASE_DEV=\`echo \$NETDEV | cut -d"." -f1\`
|
||||||
Bonding)
|
VLAN_ID=\`echo \$NETDEV | cut -d"." -f2\`
|
||||||
#do something for bonding
|
REAL_BASE=\`grep "^\$BASE_DEV " /etc/iface_map | cut -d" " -f2\`
|
||||||
;;
|
#Note we add the \ to our vlan values to escape the . for sed-ability
|
||||||
Vlan)
|
#Note we also convert . to _ to avoid problems with busybox ifup
|
||||||
#do something for vlan
|
REAL_DEV=\$REAL_BASE\\\\.\$VLAN_ID
|
||||||
;;
|
NETDEV=\$BASE_DEV\\\\.\$VLAN_ID
|
||||||
*)
|
RENAMED="yes"
|
||||||
INFO=\`ethtool -i \$j | grep bus-info\`
|
;;
|
||||||
if [ "\$INFO" == "\$BUS_ID" -a -z "\$REAL_DEV" ]
|
*)
|
||||||
then
|
INFO=\`ls -l /sys/class/net/\$j/device 2>/dev/null | sed -e's/\\(.*\\/\\)\\(.*$\\)/\\2/'\`
|
||||||
REAL_DEV=\$j
|
if [ "\$INFO" == "\$BUS_ID" -a -z "\$REAL_DEV" ]
|
||||||
RENAMED="yes"
|
then
|
||||||
fi
|
REAL_DEV=\$j
|
||||||
;;
|
RENAMED="yes"
|
||||||
esac
|
fi
|
||||||
done
|
;;
|
||||||
|
esac
|
||||||
if [ -z "\$RENAMED" ]
|
|
||||||
then
|
|
||||||
echo "Could not find a mapping for device \$NETDEV"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#build the interface rename map
|
|
||||||
echo \$NETDEV \$REAL_DEV tmp\$TMPCNT>> /etc/iface_map
|
|
||||||
TMPCNT=\`echo \$TMPCNT 1 + p | dc\`
|
|
||||||
echo mapping \$NETDEV to \$REAL_DEV
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ -z "\$RENAMED" ]
|
||||||
|
then
|
||||||
|
echo "Could not find a mapping for device \$NETDEV"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#build the interface rename map
|
||||||
|
echo \$NETDEV \$REAL_DEV tmp\$TMPCNT >> /etc/iface_map
|
||||||
|
TMPCNT=\`echo \$TMPCNT 1 + p | dc\`
|
||||||
|
echo \$TMPCNT > /tmp/tmpcnt
|
||||||
|
echo mapping \$NETDEV to \$REAL_DEV
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat >> $SCRIPTDIR/rename_interfaces << EOF
|
||||||
|
#!/bin/msh
|
||||||
MAP_COUNT=\`wc -l /etc/iface_map | cut -d" " -f7 \`
|
MAP_COUNT=\`wc -l /etc/iface_map | cut -d" " -f7 \`
|
||||||
#now do all the renaming - first to temp space
|
#now do all the renaming - first to temp space
|
||||||
for j in \`seq 1 1 \$MAP_COUNT\`
|
for j in \`seq 1 1 \$MAP_COUNT\`
|
||||||
do
|
do
|
||||||
CURRENT=\`awk '{if (RN == ARGV[j]) print \$1}' /etc/iface_map\`
|
CURRENT=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$1}' /etc/iface_map\`
|
||||||
NEW=\`awk '{if (RN == ARGV[j]) print \$2}' /etc/iface_map\`
|
NEW=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$2}' /etc/iface_map\`
|
||||||
INTERIM=\`awk '{if (RN == ARGV[j]) print \$3}' /etc/iface_map\`
|
INTERIM=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$3}' /etc/iface_map\`
|
||||||
mv /etc/ifcfg-\$CURRENT /etc/ifcfg-\$INTERIM
|
mv /etc/ifcfg-\$CURRENT /etc/ifcfg-\$INTERIM
|
||||||
for i in /etc/ifcfg-\$INTERIM /etc/iface_to_activate /etc/network/interfaces
|
for i in /etc/ifcfg-\$INTERIM /etc/iface_to_activate /etc/network/interfaces
|
||||||
do
|
do
|
||||||
@ -1079,9 +1174,9 @@ done
|
|||||||
|
|
||||||
for j in \`seq 1 1 \$MAP_COUNT\`
|
for j in \`seq 1 1 \$MAP_COUNT\`
|
||||||
do
|
do
|
||||||
CURRENT=\`awk '{if (RN == ARGV[j]) print \$1}' /etc/iface_map\`
|
CURRENT=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$1}' /etc/iface_map\`
|
||||||
NEW=\`awk '{if (RN == ARGV[j]) print \$2}' /etc/iface_map\`
|
NEW=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$2}' /etc/iface_map\`
|
||||||
INTERIM=\`awk '{if (RN == ARGV[j]) print \$3}' /etc/iface_map\`
|
INTERIM=\`awk -v MATCH=\$j '{if (NR == MATCH) print \$3}' /etc/iface_map\`
|
||||||
mv /etc/ifcfg-\$INTERIM /etc/ifcfg-\$NEW
|
mv /etc/ifcfg-\$INTERIM /etc/ifcfg-\$NEW
|
||||||
for i in /etc/ifcfg-\$NEW /etc/iface_to_activate /etc/network/interfaces
|
for i in /etc/ifcfg-\$NEW /etc/iface_to_activate /etc/network/interfaces
|
||||||
do
|
do
|
||||||
@ -1094,6 +1189,23 @@ done < /etc/iface_map
|
|||||||
exit 0
|
exit 0
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
cat >> $SCRIPTDIR/find_activate_slaves << EOF
|
||||||
|
#!/bin/msh
|
||||||
|
BOND_MASTER=\$1
|
||||||
|
|
||||||
|
for j in \`ifconfig -a | awk '/.*Link encap.*/ {print \$1}'\`
|
||||||
|
do
|
||||||
|
MASTER=""
|
||||||
|
. /etc/ifcfg-\$j
|
||||||
|
if [ "\$MASTER" == "\$BOND_MASTER" ]
|
||||||
|
then
|
||||||
|
#this is a slave of the rising interface
|
||||||
|
echo enslaving \$j to \$BOND_MASTER
|
||||||
|
echo +\$j > /sys/class/net/\$BOND_MASTER/bonding/slaves
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
EOF
|
||||||
|
|
||||||
#DONT ADD STUFF to SCRIPTDIR PAST HERE
|
#DONT ADD STUFF to SCRIPTDIR PAST HERE
|
||||||
for i in `ls $SCRIPTDIR/*`
|
for i in `ls $SCRIPTDIR/*`
|
||||||
do
|
do
|
||||||
@ -1156,10 +1268,13 @@ cat >> $MNTIMAGE/init << EOF
|
|||||||
#!/bin/msh
|
#!/bin/msh
|
||||||
export PATH=$PATH:/scriptfns
|
export PATH=$PATH:/scriptfns
|
||||||
mount -t proc /proc /proc
|
mount -t proc /proc /proc
|
||||||
setquiet
|
|
||||||
echo Mounting proc filesystem
|
echo Mounting proc filesystem
|
||||||
echo Mounting sysfs filesystem
|
echo Mounting sysfs filesystem
|
||||||
mount -t sysfs /sys /sys
|
mount -t sysfs /sys /sys
|
||||||
|
echo 1 > /proc/sys/vm/dirty_background_ratio
|
||||||
|
echo 5 > /proc/sys/vm/dirty_ratio
|
||||||
|
echo 10 > /proc/sys/vm/dirty_writeback_centisecs
|
||||||
|
echo 50 > /proc/sys/vm/dirty_expire_centisecs
|
||||||
echo Creating /dev
|
echo Creating /dev
|
||||||
mount -o mode=0755 -t tmpfs /dev /dev
|
mount -o mode=0755 -t tmpfs /dev /dev
|
||||||
mkdir /dev/pts
|
mkdir /dev/pts
|
||||||
@ -1232,17 +1347,23 @@ emit "echo Creating Block Devices"
|
|||||||
emit "for i in \`ls /sys/block\`; do"
|
emit "for i in \`ls /sys/block\`; do"
|
||||||
emit " MAJOR_NUM=\`cat /sys/block/\$i/dev | cut -d":" -f1\`"
|
emit " MAJOR_NUM=\`cat /sys/block/\$i/dev | cut -d":" -f1\`"
|
||||||
emit " MINOR_NUM=\`cat /sys/block/\$i/dev | cut -d":" -f2\`"
|
emit " MINOR_NUM=\`cat /sys/block/\$i/dev | cut -d":" -f2\`"
|
||||||
|
emit " MINOR_RANGE=\`cat /sys/block/\$i/range | cut -d":" -f2\`"
|
||||||
emit " echo Creating block device \$i"
|
emit " echo Creating block device \$i"
|
||||||
emit " mknod /dev/\$i b \$MAJOR_NUM \$MINOR_NUM"
|
emit " mknod /dev/\$i b \$MAJOR_NUM \$MINOR_NUM"
|
||||||
emit " MINOR_END=\`echo \$MINOR_NUM 10 + p | dc\`"
|
emit " if [ \"\$MINOR_RANGE\" -gt 1 ]"
|
||||||
emit " MINOR_START=\`echo \$MINOR_NUM 1 + p | dc\`"
|
emit " then"
|
||||||
emit " for j in \`seq \$MINOR_START 1 \$MINOR_END\`"
|
emit " MINOR_END=\`echo \$MINOR_NUM \$MINOR_RANGE + p | dc\`"
|
||||||
emit " do"
|
emit " MINOR_START=\`echo \$MINOR_NUM 1 + p | dc\`"
|
||||||
emit " if [ ! -e /dev/\$i\$j ]"
|
emit " PART_NUM=1"
|
||||||
emit " then"
|
emit " for j in \`seq \$MINOR_START 1 \$MINOR_END\`"
|
||||||
emit " mknod /dev/\$i\$j b \$MAJOR_NUM \$j"
|
emit " do"
|
||||||
emit " fi"
|
emit " if [ ! -e /dev/\$i\$PART_NUM ]"
|
||||||
emit " done"
|
emit " then"
|
||||||
|
emit " mknod /dev/\$i\$PART_NUM b \$MAJOR_NUM \$j"
|
||||||
|
emit " fi"
|
||||||
|
emit " PART_NUM=\`expr \$PART_NUM + 1\`"
|
||||||
|
emit " done"
|
||||||
|
emit " fi"
|
||||||
emit "done"
|
emit "done"
|
||||||
|
|
||||||
if [ -n "$vg_list" ]; then
|
if [ -n "$vg_list" ]; then
|
||||||
@ -1286,7 +1407,7 @@ if [ -n "$vg_list" ]; then
|
|||||||
emit " DM_NUM=\`echo \$DM_NUM 1 + p | dc\`"
|
emit " DM_NUM=\`echo \$DM_NUM 1 + p | dc\`"
|
||||||
emit " if [ -z \"\$noresume\" ]"
|
emit " if [ -z \"\$noresume\" ]"
|
||||||
emit " then"
|
emit " then"
|
||||||
emit " /sbin/dmsetup resume /dev/mapper/\$VGRP-\$i"
|
emit " /sbin/dmsetup.static resume /dev/mapper/\$VGRP-\$i"
|
||||||
emit " fi"
|
emit " fi"
|
||||||
emit " fi"
|
emit " fi"
|
||||||
emit "done"
|
emit "done"
|
||||||
@ -1298,15 +1419,31 @@ kdump_chk()
|
|||||||
echo "$KDUMP_CONFIG_FILE: $2"
|
echo "$KDUMP_CONFIG_FILE: $2"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
emit "DATE=\`date +%Y-%M-%d-%T\`"
|
|
||||||
if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
||||||
memtotal=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
|
memtotal=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
|
||||||
|
|
||||||
#timezone info for date which outputs YYYY-MM-DD-hh:mm
|
#timezone info for date which outputs YYYY-MM-DD-hh:mm
|
||||||
cp /etc/localtime $MNTIMAGE/etc/localtime
|
cp /etc/localtime $MNTIMAGE/etc/localtime
|
||||||
bin="/sbin/dmsetup /usr/bin/scp /usr/bin/ssh /sbin/ethtool /sbin/mdadm"
|
cp /etc/sysconfig/clock $MNTIMAGE/etc
|
||||||
|
emit ". /etc/clock"
|
||||||
|
emit " if [ \"\$UTC\" == "true" ]"
|
||||||
|
emit " then"
|
||||||
|
emit " TIME_FORMAT=-u"
|
||||||
|
emit " else"
|
||||||
|
emit " TIME_FORMAT=-l"
|
||||||
|
emit "fi"
|
||||||
|
emit "hwclock --hctosys \$TIME_FORMAT"
|
||||||
|
emit "DATE=\`date +%Y-%m-%d-%T\`"
|
||||||
|
|
||||||
|
bin="/sbin/dmsetup.static /sbin/kpartx.static"
|
||||||
|
|
||||||
|
if [ -n "$CORE_COLLECTOR" ]; then
|
||||||
|
bin="$bin /sbin/makedumpfile"
|
||||||
|
fi
|
||||||
|
|
||||||
#ssh, scp require libraries that aren't found with ldd
|
#ssh, scp require libraries that aren't found with ldd
|
||||||
lib=/lib && [ -d "/lib64" ] && lib=/lib64
|
ARCH=`uname -m`
|
||||||
|
lib=/lib && [ -d "/lib64" -a "$ARCH" != "ppc64" ] && lib=/lib64
|
||||||
k_extras="/$lib/libnss_compat.so.2 /$lib/libnss_files.so.2"
|
k_extras="/$lib/libnss_compat.so.2 /$lib/libnss_files.so.2"
|
||||||
|
|
||||||
#traverse the config file and setup each dump location
|
#traverse the config file and setup each dump location
|
||||||
@ -1327,21 +1464,40 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
#setup raw case
|
#setup raw case
|
||||||
emit "echo Saving to partition $location"
|
emit "echo Saving to partition $location"
|
||||||
emit "dd if=/proc/vmcore of=$location"
|
emit "dd if=/proc/vmcore of=$location"
|
||||||
emit "cond reboot -h -f"
|
emit "if [ $? == 0 ]"
|
||||||
|
emit "then"
|
||||||
|
emit " reboot -f"
|
||||||
|
emit "fi"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
net)
|
net)
|
||||||
if [ -n "$CORE_COLLECTOR" ]; then
|
|
||||||
bin="$bin /sbin/makedumpfile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#build an /etc/passwd for scp to work properly
|
#build an /etc/passwd for scp to work properly
|
||||||
grep "^root" /etc/passwd > $MNTIMAGE/etc/passwd
|
grep "^root" /etc/passwd > $MNTIMAGE/etc/passwd
|
||||||
|
|
||||||
# bring up the network
|
# bring up the network
|
||||||
|
emit "for i in \`ls /etc/ifcfg-*\`"
|
||||||
|
emit "do"
|
||||||
|
emit " NETDEV=\`echo \$i | cut -d\"-\" -f2\`"
|
||||||
|
emit " map_interface \$NETDEV"
|
||||||
|
emit "done"
|
||||||
emit "rename_interfaces"
|
emit "rename_interfaces"
|
||||||
emit "IFACE=\`cat /etc/iface_to_activate\`"
|
emit "IFACE=\`cat /etc/iface_to_activate\`"
|
||||||
emit "ifup \$IFACE"
|
emit "ifup \$IFACE"
|
||||||
|
#lets make sure we're up
|
||||||
|
emit "IFADDR=\`ifconfig \$IFACE | awk '/inet addr/ {print \$2}' | cut -d\":\" -f 2\`"
|
||||||
|
emit "if [ -z \"\$IFADDR\" ]"
|
||||||
|
emit "then"
|
||||||
|
emit " echo \"\$IFACE failed to come up\""
|
||||||
|
if [ "$DEFAULT_ACTION" == "shell" ]
|
||||||
|
then
|
||||||
|
emit " echo \"Dropping to shell. exit to reboot\""
|
||||||
|
emit " /bin/msh"
|
||||||
|
emit " reboot -f"
|
||||||
|
elif [ "$DEFAULT_ACTION" == "reboot" ]
|
||||||
|
then
|
||||||
|
emit " reboot -f"
|
||||||
|
fi
|
||||||
|
emit "fi"
|
||||||
#grab remote host and xlate into numbers
|
#grab remote host and xlate into numbers
|
||||||
rhost=`echo $location | sed 's/.*@//' | cut -d':' -f1`
|
rhost=`echo $location | sed 's/.*@//' | cut -d':' -f1`
|
||||||
need_dns=`echo $rhost|grep [a-zA-Z]`
|
need_dns=`echo $rhost|grep [a-zA-Z]`
|
||||||
@ -1349,9 +1505,17 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
|
|
||||||
#find the local ip being used as a route to remote ip
|
#find the local ip being used as a route to remote ip
|
||||||
netdev=`/sbin/ip route get to $rhost 2>&1`
|
netdev=`/sbin/ip route get to $rhost 2>&1`
|
||||||
[ $? != 0 ] && echo "Bad kdump location: $location" && continue
|
[ $? != 0 ] && echo "Bad kdump location: $location" && exit 1
|
||||||
lhost=`echo $netdev|awk '{print $5;}'|head -n 1`
|
OFF_SUBNET=`echo $netdev | grep via`
|
||||||
|
if [ -n "$OFF_SUBNET" ]
|
||||||
|
then
|
||||||
|
# we are going to a different subnet
|
||||||
|
lhost=`echo $netdev|awk '{print $7}'|head -n 1`
|
||||||
|
else
|
||||||
|
# we are on the same subnet
|
||||||
|
lhost=`echo $netdev|awk '{print $5}'|head -n 1`
|
||||||
|
fi
|
||||||
|
|
||||||
emit "echo Saving to remote location $location"
|
emit "echo Saving to remote location $location"
|
||||||
if [ -z "`echo $location|grep @`" ]; then
|
if [ -z "`echo $location|grep @`" ]; then
|
||||||
#NFS path
|
#NFS path
|
||||||
@ -1360,12 +1524,18 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
tmnt=`mktemp -dq`
|
tmnt=`mktemp -dq`
|
||||||
kdump_chk "mount -t nfs -o nolock $rlocation $tmnt" \
|
kdump_chk "mount -t nfs -o nolock $rlocation $tmnt" \
|
||||||
"Bad NFS mount $location"
|
"Bad NFS mount $location"
|
||||||
mkdir -p $tmnt/var/crash
|
mkdir -p $tmnt/$SAVE_PATH
|
||||||
tdir=`mktemp -dqp $tmnt/var/crash`
|
tdir=`mktemp -dqp $tmnt/$SAVE_PATH`
|
||||||
|
|
||||||
rc=$? && rm -rf $tdir && umount $tmnt && rm -rf $tmnt
|
rc=$? && rm -rf $tdir
|
||||||
|
umount $tmnt
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "Cannot unmount the temporary directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -rf $tmnt
|
||||||
if [ $rc != "0" ]; then
|
if [ $rc != "0" ]; then
|
||||||
echo "Cannot create directory in $location: var/crash"
|
echo "Cannot create directory in $location: $SAVE_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -1378,26 +1548,31 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
#setup nfs case
|
#setup nfs case
|
||||||
mkdir -p $MNTIMAGE/mnt
|
mkdir -p $MNTIMAGE/mnt
|
||||||
emit "mount -t nfs -o nolock $rlocation /mnt"
|
emit "mount -t nfs -o nolock $rlocation /mnt"
|
||||||
emit "mkdir -p /mnt/var/crash/$lhost-\$DATE"
|
emit "mkdir -p /mnt/$SAVE_PATH/$lhost-\$DATE"
|
||||||
emit "$CORE_COLLECTOR /proc/vmcore /mnt/var/crash/$lhost-\$DATE/vmcore"
|
emit "$CORE_COLLECTOR /proc/vmcore /mnt/$SAVE_PATH/$lhost-\$DATE/vmcore-incomplete"
|
||||||
emit "if [ \$? == 0 ]"
|
emit "if [ \$? == 0 ]"
|
||||||
emit "then"
|
emit "then"
|
||||||
|
emit " mv /mnt/$SAVE_PATH/$lhost-\$DATE/vmcore-incomplete /mnt/$SAVE_PATH/$lhost-\$DATE/vmcore"
|
||||||
|
emit " umount /mnt"
|
||||||
emit " reboot -f"
|
emit " reboot -f"
|
||||||
emit "fi"
|
emit "fi"
|
||||||
emit "umount /mnt"
|
emit "umount /mnt"
|
||||||
else
|
else
|
||||||
#SSH path
|
#SSH path
|
||||||
#rebuild $location replacing machine name with ip address
|
#rebuild $location replacing machine name with ip address
|
||||||
|
bin="$bin /usr/bin/ssh /usr/bin/scp"
|
||||||
rlocation=`echo $location|sed 's/@.*/@'"$rhost"'/'`
|
rlocation=`echo $location|sed 's/@.*/@'"$rhost"'/'`
|
||||||
#test ssh path and directory creation
|
#test ssh path and directory creation
|
||||||
s_opts="-o BatchMode=yes -o StrictHostKeyChecking=no"
|
s_opts="-o BatchMode=yes -o StrictHostKeyChecking=no"
|
||||||
kdump_chk "ssh -q $s_opts $rlocation mkdir -p /var/crash/ </dev/null" \
|
kdump_chk "ssh -q $s_opts $rlocation mkdir -p $SAVE_PATH </dev/null" \
|
||||||
"Could not create $location:/var/crash, check ssh keys"
|
"Could not create $location:$SAVE_PATH, you probably need to run \"service kdump propagate\""
|
||||||
tdir=`ssh -q $s_opts $rlocation mktemp -dqp /var/crash </dev/null`
|
tdir=`ssh -q $s_opts $rlocation mktemp -dqp $SAVE_PATH </dev/null`
|
||||||
if [ $? != "0" ]; then
|
if [ $? != "0" ]; then
|
||||||
echo "$KDUMP_CONFIG_FILE: Could not create temp directory in $location:/var/crash"
|
echo "$KDUMP_CONFIG_FILE: Could not create temp directory in $location:$SAVE_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
#We do this to remove the temp directory from above
|
||||||
|
ssh -q $s_opts $rlocation rmdir $tdir
|
||||||
|
|
||||||
#setup ssh case, quick check to see if setup already
|
#setup ssh case, quick check to see if setup already
|
||||||
if [ ! -r $MNTIMAGE/dev/urandom ]; then
|
if [ ! -r $MNTIMAGE/dev/urandom ]; then
|
||||||
@ -1408,38 +1583,32 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
mknod $MNTIMAGE/dev/urandom c 1 9
|
mknod $MNTIMAGE/dev/urandom c 1 9
|
||||||
fi
|
fi
|
||||||
emit "dd if=/dev/mem of=/dev/urandom count=1 bs=512 skip=100"
|
emit "dd if=/dev/mem of=/dev/urandom count=1 bs=512 skip=100"
|
||||||
emit "ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no $rlocation mkdir /var/crash/$lhost-\$DATE"
|
emit "ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no $rlocation mkdir $SAVE_PATH/$lhost-\$DATE"
|
||||||
emit "scp -q -o BatchMode=yes -o StrictHostKeyChecking=no /proc/vmcore $rlocation:/var/crash/$lhost-\$DATE/vmcore"
|
emit "scp -q -o BatchMode=yes -o StrictHostKeyChecking=no /proc/vmcore $rlocation:$SAVE_PATH/$lhost-\$DATE/vmcore-incomplete"
|
||||||
emit "if [ \$? == 0 ]"
|
emit "if [ \$? == 0 ]"
|
||||||
emit "then"
|
emit "then"
|
||||||
|
emit " ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no $rlocation mv $SAVE_PATH/$lhost-\$DATE/vmcore-incomplete $SAVE_PATH/$lhost-\$DATE/vmcore"
|
||||||
emit " reboot -f"
|
emit " reboot -f"
|
||||||
emit "fi"
|
emit "fi"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
ifc)
|
|
||||||
;;
|
|
||||||
core_collector)
|
core_collector)
|
||||||
;;
|
;;
|
||||||
default)
|
default)
|
||||||
[ "$location" == "reboot" ] && emit "reboot -f"
|
;;
|
||||||
if [ "$location" == "shell" ]
|
link_delay)
|
||||||
then
|
;;
|
||||||
emit "echo dropping to initramfs shell"
|
path)
|
||||||
emit "echo exiting this shell will reboot your system"
|
|
||||||
emit "/bin/msh"
|
|
||||||
emit "reboot -f"
|
|
||||||
fi
|
|
||||||
#else load normally on default failure case
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
#test filesystem and directory creation
|
#test filesystem and directory creation
|
||||||
kdump_chk "test -f /sbin/fsck.$type" "Unsupported type $type"
|
kdump_chk "test -f /sbin/fsck.$type" "Unsupported type $type"
|
||||||
kdump_chk "mount -t $type $location /mnt" "Bad mount point $location"
|
kdump_chk "mount -t $type $location /mnt" "Bad mount point $location"
|
||||||
mkdir -p /mnt/var/crash
|
mkdir -p /mnt/$SAVE_PATH
|
||||||
tdir=`mktemp -dqp /mnt/var/crash/`
|
tdir=`mktemp -dqp /mnt/$SAVE_PATH`
|
||||||
rc=$? && rm -rf $tdir && umount /mnt
|
rc=$? && rm -rf $tdir && umount /mnt
|
||||||
if [ $rc != "0" ]; then
|
if [ $rc != "0" ]; then
|
||||||
echo "Cannot create directory in $location: /var/crash"
|
echo "Cannot create directory in $location: $SAVE_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
#TODO check for available size is greater than $memtotal
|
#TODO check for available size is greater than $memtotal
|
||||||
@ -1451,14 +1620,23 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
CORE_COLLECTOR="cp"
|
CORE_COLLECTOR="cp"
|
||||||
fi
|
fi
|
||||||
emit "echo Saving to the local filesystem $location"
|
emit "echo Saving to the local filesystem $location"
|
||||||
emit "fsck.$type $location"
|
emit "DUMPDEV=$location"
|
||||||
emit "mount -t $type $location /mnt"
|
emit "IS_LABEL=\`echo \$DUMPDEV | grep LABEL\`"
|
||||||
|
emit "IS_UUID=\`echo \$DUMPDEV | grep UUID\`"
|
||||||
|
emit "if [ -n \"\$IS_LABEL\" -o -n \"\$IS_UUID\" ] "
|
||||||
|
emit "then"
|
||||||
|
emit " DUMPDEV=\`findfs \$DUMPDEV\`"
|
||||||
|
emit "fi"
|
||||||
|
emit "fsck.$type \$DUMPDEV"
|
||||||
|
emit "mount -t $type \$DUMPDEV /mnt"
|
||||||
emit "if [ \$? == 0 ]"
|
emit "if [ \$? == 0 ]"
|
||||||
emit "then"
|
emit "then"
|
||||||
emit " mkdir -p /mnt/var/crash/127.0.0.1-\$DATE"
|
emit " mkdir -p /mnt/$SAVE_PATH/127.0.0.1-\$DATE"
|
||||||
emit " $CORE_COLLECTOR /proc/vmcore /mnt/var/crash/127.0.0.1-\$DATE/vmcore"
|
emit " $CORE_COLLECTOR /proc/vmcore /mnt/$SAVE_PATH/127.0.0.1-\$DATE/vmcore-incomplete"
|
||||||
emit " if [ \$? == 0 ]"
|
emit " if [ \$? == 0 ]"
|
||||||
emit " then"
|
emit " then"
|
||||||
|
emit " mv /mnt/$SAVE_PATH/127.0.0.1-\$DATE/vmcore-incomplete /mnt/$SAVE_PATH/127.0.0.1-\$DATE/vmcore"
|
||||||
|
emit " umount /mnt"
|
||||||
emit " reboot -f"
|
emit " reboot -f"
|
||||||
emit " fi"
|
emit " fi"
|
||||||
emit "fi"
|
emit "fi"
|
||||||
@ -1467,6 +1645,18 @@ if [ -n "$KDUMP_CONFIG_FILE" ]; then
|
|||||||
esac
|
esac
|
||||||
done < $KDUMP_CONFIG_FILE
|
done < $KDUMP_CONFIG_FILE
|
||||||
|
|
||||||
|
#now handle the default action
|
||||||
|
if [ "$DEFAULT_ACTION" == "shell" ]
|
||||||
|
then
|
||||||
|
emit "echo dropping to initramfs shell"
|
||||||
|
emit "echo exiting this shell will reboot your system"
|
||||||
|
emit "/bin/msh"
|
||||||
|
emit "reboot -f"
|
||||||
|
elif [ "$DEFAULT_ACTION" == "reboot" ]
|
||||||
|
then
|
||||||
|
emit "reboot -f"
|
||||||
|
fi
|
||||||
|
|
||||||
#find the shared libraries. this snippet taken from kboot
|
#find the shared libraries. this snippet taken from kboot
|
||||||
kdump_libs=`for n in $bin; do
|
kdump_libs=`for n in $bin; do
|
||||||
ldd "$n" 2>/dev/null | tr -s '\011' ' ' |
|
ldd "$n" 2>/dev/null | tr -s '\011' ' ' |
|
||||||
@ -1485,7 +1675,13 @@ emit "#check to see if we have root= on the command line"
|
|||||||
emit "ROOTDEV=\`cat /proc/cmdline | grep root=\`"
|
emit "ROOTDEV=\`cat /proc/cmdline | grep root=\`"
|
||||||
emit "if [ -n \"\$ROOTDEV\" ]"
|
emit "if [ -n \"\$ROOTDEV\" ]"
|
||||||
emit "then"
|
emit "then"
|
||||||
emit " ROOTDEV=\`cat /proc/cmdline | cut -d\" \" -f2 | sed -e's/root=//'\`"
|
emit " ROOTDEV=\`cat /proc/cmdline | sed 's/^.*root=//' | cut -d\" \" -f1\`"
|
||||||
|
emit " IS_LABEL=\`echo \$ROOTDEV | grep LABEL\`"
|
||||||
|
emit " IS_UUID=\`echo \$ROOTDEV | grep UUID\`"
|
||||||
|
emit " if [ -n \"\$IS_LABEL\" -o -n \"\$IS_UUID\" ] "
|
||||||
|
emit " then"
|
||||||
|
emit " ROOTDEV=\`findfs \$ROOTDEV\`"
|
||||||
|
emit " fi"
|
||||||
emit "else"
|
emit "else"
|
||||||
emit " #we need to get the root major/minor from real-root-dev"
|
emit " #we need to get the root major/minor from real-root-dev"
|
||||||
emit " ROOT_DEV_NR=\`cat /proc/sys/kernel/real-root-dev\`"
|
emit " ROOT_DEV_NR=\`cat /proc/sys/kernel/real-root-dev\`"
|
||||||
|
Loading…
Reference in New Issue
Block a user