mirror of https://gitee.com/openkylin/linux.git
Merge with temp tree to get David's gdb inferior calls patch
This commit is contained in:
commit
325a479c4c
|
@ -357,14 +357,14 @@ Quota-tools
|
||||||
----------
|
----------
|
||||||
o <http://sourceforge.net/projects/linuxquota/>
|
o <http://sourceforge.net/projects/linuxquota/>
|
||||||
|
|
||||||
Jade
|
|
||||||
----
|
|
||||||
o <ftp://ftp.jclark.com/pub/jade/jade-1.2.1.tar.gz>
|
|
||||||
|
|
||||||
DocBook Stylesheets
|
DocBook Stylesheets
|
||||||
-------------------
|
-------------------
|
||||||
o <http://nwalsh.com/docbook/dsssl/>
|
o <http://nwalsh.com/docbook/dsssl/>
|
||||||
|
|
||||||
|
XMLTO XSLT Frontend
|
||||||
|
-------------------
|
||||||
|
o <http://cyberelk.net/tim/xmlto/>
|
||||||
|
|
||||||
Intel P6 microcode
|
Intel P6 microcode
|
||||||
------------------
|
------------------
|
||||||
o <http://www.urbanmyth.org/microcode/>
|
o <http://www.urbanmyth.org/microcode/>
|
||||||
|
|
|
@ -7,10 +7,9 @@
|
||||||
# list of DOCBOOKS.
|
# list of DOCBOOKS.
|
||||||
|
|
||||||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml via-audio.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
deviceiobook.xml procfs-guide.xml tulip-user.xml \
|
procfs-guide.xml writing_usb_driver.xml scsidrivers.xml \
|
||||||
writing_usb_driver.xml scsidrivers.xml sis900.xml \
|
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||||
kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
|
||||||
gadget.xml libata.xml mtdnand.xml librs.xml
|
gadget.xml libata.xml mtdnand.xml librs.xml
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -42,14 +41,16 @@ MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
||||||
mandocs: $(MAN)
|
mandocs: $(MAN)
|
||||||
|
|
||||||
installmandocs: mandocs
|
installmandocs: mandocs
|
||||||
$(MAKEMAN) install Documentation/DocBook/man
|
mkdir -p /usr/local/man/man9/
|
||||||
|
install Documentation/DocBook/man/*.9.gz /usr/local/man/man9/
|
||||||
|
|
||||||
###
|
###
|
||||||
#External programs used
|
#External programs used
|
||||||
KERNELDOC = scripts/kernel-doc
|
KERNELDOC = scripts/kernel-doc
|
||||||
DOCPROC = scripts/basic/docproc
|
DOCPROC = scripts/basic/docproc
|
||||||
SPLITMAN = $(PERL) $(srctree)/scripts/split-man
|
|
||||||
MAKEMAN = $(PERL) $(srctree)/scripts/makeman
|
XMLTOFLAGS = -m Documentation/DocBook/stylesheet.xsl
|
||||||
|
#XMLTOFLAGS += --skip-validation
|
||||||
|
|
||||||
###
|
###
|
||||||
# DOCPROC is used for two purposes:
|
# DOCPROC is used for two purposes:
|
||||||
|
@ -96,45 +97,44 @@ $(obj)/procfs-guide.xml: $(C-procfs-example2)
|
||||||
# Rules to generate postscript, PDF and HTML
|
# Rules to generate postscript, PDF and HTML
|
||||||
# db2html creates a directory. Generate a html file used for timestamp
|
# db2html creates a directory. Generate a html file used for timestamp
|
||||||
|
|
||||||
quiet_cmd_db2ps = DB2PS $@
|
quiet_cmd_db2ps = XMLTO $@
|
||||||
cmd_db2ps = db2ps -o $(dir $@) $<
|
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
|
||||||
%.ps : %.xml
|
%.ps : %.xml
|
||||||
@(which db2ps > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
$(call cmd,db2ps)
|
$(call cmd,db2ps)
|
||||||
|
|
||||||
quiet_cmd_db2pdf = DB2PDF $@
|
quiet_cmd_db2pdf = XMLTO $@
|
||||||
cmd_db2pdf = db2pdf -o $(dir $@) $<
|
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
|
||||||
%.pdf : %.xml
|
%.pdf : %.xml
|
||||||
@(which db2pdf > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
$(call cmd,db2pdf)
|
$(call cmd,db2pdf)
|
||||||
|
|
||||||
quiet_cmd_db2html = DB2HTML $@
|
quiet_cmd_db2html = XMLTO $@
|
||||||
cmd_db2html = db2html -o $(patsubst %.html,%,$@) $< && \
|
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/book1.html"> \
|
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||||
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||||
|
|
||||||
%.html: %.xml
|
%.html: %.xml
|
||||||
@(which db2html > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
@rm -rf $@ $(patsubst %.html,%,$@)
|
@rm -rf $@ $(patsubst %.html,%,$@)
|
||||||
$(call cmd,db2html)
|
$(call cmd,db2html)
|
||||||
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
||||||
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
||||||
|
|
||||||
###
|
quiet_cmd_db2man = XMLTO $@
|
||||||
# Rule to generate man files - output is placed in the man subdirectory
|
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
|
||||||
|
%.9 : %.xml
|
||||||
%.9: %.xml
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
ifneq ($(KBUILD_SRC),)
|
(echo "*** You need to install xmlto ***"; \
|
||||||
$(Q)mkdir -p $(objtree)/Documentation/DocBook/man
|
exit 1)
|
||||||
endif
|
$(call cmd,db2man)
|
||||||
$(SPLITMAN) $< $(objtree)/Documentation/DocBook/man "$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)"
|
@touch $@
|
||||||
$(MAKEMAN) convert $(objtree)/Documentation/DocBook/man $<
|
|
||||||
|
|
||||||
###
|
###
|
||||||
# Rules to generate postscripts and PNG imgages from .fig format files
|
# Rules to generate postscripts and PNG imgages from .fig format files
|
||||||
|
|
|
@ -49,13 +49,33 @@
|
||||||
!Iinclude/asm-i386/unaligned.h
|
!Iinclude/asm-i386/unaligned.h
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<!-- FIXME:
|
|
||||||
kernel/sched.c has no docs, which stuffs up the sgml. Comment
|
|
||||||
out until somebody adds docs. KAO
|
|
||||||
<sect1><title>Delaying, scheduling, and timer routines</title>
|
<sect1><title>Delaying, scheduling, and timer routines</title>
|
||||||
X!Ekernel/sched.c
|
!Iinclude/linux/sched.h
|
||||||
|
!Ekernel/sched.c
|
||||||
|
!Ekernel/timer.c
|
||||||
</sect1>
|
</sect1>
|
||||||
KAO -->
|
<sect1><title>Internal Functions</title>
|
||||||
|
!Ikernel/exit.c
|
||||||
|
!Ikernel/signal.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel objects manipulation</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/kobject.h
|
||||||
|
-->
|
||||||
|
!Elib/kobject.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel utility functions</title>
|
||||||
|
!Iinclude/linux/kernel.h
|
||||||
|
<!-- This needs to clean up to make kernel-doc happy
|
||||||
|
X!Ekernel/printk.c
|
||||||
|
-->
|
||||||
|
!Ekernel/panic.c
|
||||||
|
!Ekernel/sys.c
|
||||||
|
!Ekernel/rcupdate.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="adt">
|
<chapter id="adt">
|
||||||
|
@ -81,7 +101,9 @@ KAO -->
|
||||||
!Elib/vsprintf.c
|
!Elib/vsprintf.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>String Manipulation</title>
|
<sect1><title>String Manipulation</title>
|
||||||
!Ilib/string.c
|
<!-- All functions are exported at now
|
||||||
|
X!Ilib/string.c
|
||||||
|
-->
|
||||||
!Elib/string.c
|
!Elib/string.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Bit Operations</title>
|
<sect1><title>Bit Operations</title>
|
||||||
|
@ -98,6 +120,25 @@ KAO -->
|
||||||
!Iinclude/asm-i386/uaccess.h
|
!Iinclude/asm-i386/uaccess.h
|
||||||
!Iarch/i386/lib/usercopy.c
|
!Iarch/i386/lib/usercopy.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>More Memory Management Functions</title>
|
||||||
|
!Iinclude/linux/rmap.h
|
||||||
|
!Emm/readahead.c
|
||||||
|
!Emm/filemap.c
|
||||||
|
!Emm/memory.c
|
||||||
|
!Emm/vmalloc.c
|
||||||
|
!Emm/mempool.c
|
||||||
|
!Emm/page-writeback.c
|
||||||
|
!Emm/truncate.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
|
||||||
|
<chapter id="ipc">
|
||||||
|
<title>Kernel IPC facilities</title>
|
||||||
|
|
||||||
|
<sect1><title>IPC utilities</title>
|
||||||
|
!Iipc/util.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="kfifo">
|
<chapter id="kfifo">
|
||||||
|
@ -114,6 +155,10 @@ KAO -->
|
||||||
<sect1><title>sysctl interface</title>
|
<sect1><title>sysctl interface</title>
|
||||||
!Ekernel/sysctl.c
|
!Ekernel/sysctl.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>proc filesystem interface</title>
|
||||||
|
!Ifs/proc/base.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="debugfs">
|
<chapter id="debugfs">
|
||||||
|
@ -127,6 +172,10 @@ KAO -->
|
||||||
|
|
||||||
<chapter id="vfs">
|
<chapter id="vfs">
|
||||||
<title>The Linux VFS</title>
|
<title>The Linux VFS</title>
|
||||||
|
<sect1><title>The Filesystem types</title>
|
||||||
|
!Iinclude/linux/fs.h
|
||||||
|
!Einclude/linux/fs.h
|
||||||
|
</sect1>
|
||||||
<sect1><title>The Directory Cache</title>
|
<sect1><title>The Directory Cache</title>
|
||||||
!Efs/dcache.c
|
!Efs/dcache.c
|
||||||
!Iinclude/linux/dcache.h
|
!Iinclude/linux/dcache.h
|
||||||
|
@ -142,13 +191,31 @@ KAO -->
|
||||||
!Efs/locks.c
|
!Efs/locks.c
|
||||||
!Ifs/locks.c
|
!Ifs/locks.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>Other Functions</title>
|
||||||
|
!Efs/mpage.c
|
||||||
|
!Efs/namei.c
|
||||||
|
!Efs/buffer.c
|
||||||
|
!Efs/bio.c
|
||||||
|
!Efs/seq_file.c
|
||||||
|
!Efs/filesystems.c
|
||||||
|
!Efs/fs-writeback.c
|
||||||
|
!Efs/block_dev.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="netcore">
|
<chapter id="netcore">
|
||||||
<title>Linux Networking</title>
|
<title>Linux Networking</title>
|
||||||
|
<sect1><title>Networking Base Types</title>
|
||||||
|
!Iinclude/linux/net.h
|
||||||
|
</sect1>
|
||||||
<sect1><title>Socket Buffer Functions</title>
|
<sect1><title>Socket Buffer Functions</title>
|
||||||
!Iinclude/linux/skbuff.h
|
!Iinclude/linux/skbuff.h
|
||||||
|
!Iinclude/net/sock.h
|
||||||
|
!Enet/socket.c
|
||||||
!Enet/core/skbuff.c
|
!Enet/core/skbuff.c
|
||||||
|
!Enet/core/sock.c
|
||||||
|
!Enet/core/datagram.c
|
||||||
|
!Enet/core/stream.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Socket Filter</title>
|
<sect1><title>Socket Filter</title>
|
||||||
!Enet/core/filter.c
|
!Enet/core/filter.c
|
||||||
|
@ -158,6 +225,14 @@ KAO -->
|
||||||
!Enet/core/gen_stats.c
|
!Enet/core/gen_stats.c
|
||||||
!Enet/core/gen_estimator.c
|
!Enet/core/gen_estimator.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>SUN RPC subsystem</title>
|
||||||
|
<!-- The !D functionality is not perfect, garbage has to be protected by comments
|
||||||
|
!Dnet/sunrpc/sunrpc_syms.c
|
||||||
|
-->
|
||||||
|
!Enet/sunrpc/xdr.c
|
||||||
|
!Enet/sunrpc/svcsock.c
|
||||||
|
!Enet/sunrpc/sched.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="netdev">
|
<chapter id="netdev">
|
||||||
|
@ -194,11 +269,26 @@ X!Ekernel/module.c
|
||||||
!Iarch/i386/kernel/irq.c
|
!Iarch/i386/kernel/irq.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Resources Management</title>
|
||||||
|
!Ekernel/resource.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
<sect1><title>MTRR Handling</title>
|
<sect1><title>MTRR Handling</title>
|
||||||
!Earch/i386/kernel/cpu/mtrr/main.c
|
!Earch/i386/kernel/cpu/mtrr/main.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>PCI Support Library</title>
|
<sect1><title>PCI Support Library</title>
|
||||||
!Edrivers/pci/pci.c
|
!Edrivers/pci/pci.c
|
||||||
|
!Edrivers/pci/pci-driver.c
|
||||||
|
!Edrivers/pci/remove.c
|
||||||
|
!Edrivers/pci/pci-acpi.c
|
||||||
|
<!-- kerneldoc does not understand to __devinit
|
||||||
|
X!Edrivers/pci/search.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pci/msi.c
|
||||||
|
!Edrivers/pci/bus.c
|
||||||
|
!Edrivers/pci/hotplug.c
|
||||||
|
!Edrivers/pci/probe.c
|
||||||
|
!Edrivers/pci/rom.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>PCI Hotplug Support Library</title>
|
<sect1><title>PCI Hotplug Support Library</title>
|
||||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||||
|
@ -223,6 +313,14 @@ X!Earch/i386/kernel/mca.c
|
||||||
!Efs/devfs/base.c
|
!Efs/devfs/base.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="sysfs">
|
||||||
|
<title>The Filesystem for Exporting Kernel Objects</title>
|
||||||
|
!Efs/sysfs/file.c
|
||||||
|
!Efs/sysfs/dir.c
|
||||||
|
!Efs/sysfs/symlink.c
|
||||||
|
!Efs/sysfs/bin.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
<chapter id="security">
|
<chapter id="security">
|
||||||
<title>Security Framework</title>
|
<title>Security Framework</title>
|
||||||
!Esecurity/security.c
|
!Esecurity/security.c
|
||||||
|
@ -233,6 +331,61 @@ X!Earch/i386/kernel/mca.c
|
||||||
!Ekernel/power/pm.c
|
!Ekernel/power/pm.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="devdrivers">
|
||||||
|
<title>Device drivers infrastructure</title>
|
||||||
|
<sect1><title>Device Drivers Base</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/device.h
|
||||||
|
-->
|
||||||
|
!Edrivers/base/driver.c
|
||||||
|
!Edrivers/base/class_simple.c
|
||||||
|
!Edrivers/base/core.c
|
||||||
|
!Edrivers/base/firmware_class.c
|
||||||
|
!Edrivers/base/transport_class.c
|
||||||
|
!Edrivers/base/dmapool.c
|
||||||
|
<!-- Cannot be included, because
|
||||||
|
attribute_container_add_class_device_adapter
|
||||||
|
and attribute_container_classdev_to_container
|
||||||
|
exceed allowed 44 characters maximum
|
||||||
|
X!Edrivers/base/attribute_container.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/sys.c
|
||||||
|
<!--
|
||||||
|
X!Edrivers/base/interface.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/platform.c
|
||||||
|
!Edrivers/base/bus.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers Power Management</title>
|
||||||
|
!Edrivers/base/power/main.c
|
||||||
|
!Edrivers/base/power/resume.c
|
||||||
|
!Edrivers/base/power/suspend.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers ACPI Support</title>
|
||||||
|
<!-- Internal functions only
|
||||||
|
X!Edrivers/acpi/sleep/main.c
|
||||||
|
X!Edrivers/acpi/sleep/wakeup.c
|
||||||
|
X!Edrivers/acpi/motherboard.c
|
||||||
|
X!Edrivers/acpi/bus.c
|
||||||
|
-->
|
||||||
|
!Edrivers/acpi/scan.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/acpi/pci_bind.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device drivers PnP support</title>
|
||||||
|
!Edrivers/pnp/core.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/pnp/system.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pnp/card.c
|
||||||
|
!Edrivers/pnp/driver.c
|
||||||
|
!Edrivers/pnp/manager.c
|
||||||
|
!Edrivers/pnp/support.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
|
||||||
<chapter id="blkdev">
|
<chapter id="blkdev">
|
||||||
<title>Block Devices</title>
|
<title>Block Devices</title>
|
||||||
!Edrivers/block/ll_rw_blk.c
|
!Edrivers/block/ll_rw_blk.c
|
||||||
|
@ -250,7 +403,23 @@ X!Earch/i386/kernel/mca.c
|
||||||
|
|
||||||
<chapter id="snddev">
|
<chapter id="snddev">
|
||||||
<title>Sound Devices</title>
|
<title>Sound Devices</title>
|
||||||
|
!Iinclude/sound/core.h
|
||||||
!Esound/sound_core.c
|
!Esound/sound_core.c
|
||||||
|
!Iinclude/sound/pcm.h
|
||||||
|
!Esound/core/pcm.c
|
||||||
|
!Esound/core/device.c
|
||||||
|
!Esound/core/info.c
|
||||||
|
!Esound/core/rawmidi.c
|
||||||
|
!Esound/core/sound.c
|
||||||
|
!Esound/core/memory.c
|
||||||
|
!Esound/core/pcm_memory.c
|
||||||
|
!Esound/core/init.c
|
||||||
|
!Esound/core/isadma.c
|
||||||
|
!Esound/core/control.c
|
||||||
|
!Esound/core/pcm_lib.c
|
||||||
|
!Esound/core/hwdep.c
|
||||||
|
!Esound/core/pcm_native.c
|
||||||
|
!Esound/core/memalloc.c
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
X!Isound/sound_firmware.c
|
X!Isound/sound_firmware.c
|
||||||
-->
|
-->
|
||||||
|
@ -258,6 +427,7 @@ X!Isound/sound_firmware.c
|
||||||
|
|
||||||
<chapter id="uart16x50">
|
<chapter id="uart16x50">
|
||||||
<title>16x50 UART Driver</title>
|
<title>16x50 UART Driver</title>
|
||||||
|
!Iinclude/linux/serial_core.h
|
||||||
!Edrivers/serial/serial_core.c
|
!Edrivers/serial/serial_core.c
|
||||||
!Edrivers/serial/8250.c
|
!Edrivers/serial/8250.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
@ -310,9 +480,11 @@ X!Isound/sound_firmware.c
|
||||||
<sect1><title>Frame Buffer Memory</title>
|
<sect1><title>Frame Buffer Memory</title>
|
||||||
!Edrivers/video/fbmem.c
|
!Edrivers/video/fbmem.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<!--
|
||||||
<sect1><title>Frame Buffer Console</title>
|
<sect1><title>Frame Buffer Console</title>
|
||||||
!Edrivers/video/console/fbcon.c
|
X!Edrivers/video/console/fbcon.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
-->
|
||||||
<sect1><title>Frame Buffer Colormap</title>
|
<sect1><title>Frame Buffer Colormap</title>
|
||||||
!Edrivers/video/fbcmap.c
|
!Edrivers/video/fbcmap.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
|
<param name="chunk.quietly">1</param>
|
||||||
|
<param name="funcsynopsis.style">ansi</param>
|
||||||
|
</stylesheet>
|
|
@ -1,327 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
||||||
|
|
||||||
<book id="TulipUserGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Tulip Driver User's Guide</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Jeff</firstname>
|
|
||||||
<surname>Garzik</surname>
|
|
||||||
<affiliation>
|
|
||||||
<address>
|
|
||||||
<email>jgarzik@pobox.com</email>
|
|
||||||
</address>
|
|
||||||
</affiliation>
|
|
||||||
</author>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>2001</year>
|
|
||||||
<holder>Jeff Garzik</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation 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.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
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.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
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., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<toc></toc>
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
<para>
|
|
||||||
The Tulip Ethernet Card Driver
|
|
||||||
is maintained by Jeff Garzik (<email>jgarzik@pobox.com</email>).
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Tulip driver was developed by Donald Becker and changed by
|
|
||||||
Jeff Garzik, Takashi Manabe and a cast of thousands.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For 2.4.x and later kernels, the Linux Tulip driver is available at
|
|
||||||
<ulink url="http://sourceforge.net/projects/tulip/">http://sourceforge.net/projects/tulip/</ulink>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This driver is for the Digital "Tulip" Ethernet adapter interface.
|
|
||||||
It should work with most DEC 21*4*-based chips/ethercards, as well as
|
|
||||||
with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and ASIX.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The original author may be reached as becker@scyld.com, or C/O
|
|
||||||
Scyld Computing Corporation,
|
|
||||||
410 Severn Ave., Suite 210,
|
|
||||||
Annapolis MD 21403
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Additional information on Donald Becker's tulip.c
|
|
||||||
is available at <ulink url="http://www.scyld.com/network/tulip.html">http://www.scyld.com/network/tulip.html</ulink>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="drvr-compat">
|
|
||||||
<title>Driver Compatibility</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This device driver is designed for the DECchip "Tulip", Digital's
|
|
||||||
single-chip ethernet controllers for PCI (now owned by Intel).
|
|
||||||
Supported members of the family
|
|
||||||
are the 21040, 21041, 21140, 21140A, 21142, and 21143. Similar work-alike
|
|
||||||
chips from Lite-On, Macronics, ASIX, Compex and other listed below are also
|
|
||||||
supported.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
These chips are used on at least 140 unique PCI board designs. The great
|
|
||||||
number of chips and board designs supported is the reason for the
|
|
||||||
driver size and complexity. Almost of the increasing complexity is in the
|
|
||||||
board configuration and media selection code. There is very little
|
|
||||||
increasing in the operational critical path length.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="board-settings">
|
|
||||||
<title>Board-specific Settings</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
PCI bus devices are configured by the system at boot time, so no jumpers
|
|
||||||
need to be set on the board. The system BIOS preferably should assign the
|
|
||||||
PCI INTA signal to an otherwise unused system IRQ line.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Some boards have EEPROMs tables with default media entry. The factory default
|
|
||||||
is usually "autoselect". This should only be overridden when using
|
|
||||||
transceiver connections without link beat e.g. 10base2 or AUI, or (rarely!)
|
|
||||||
for forcing full-duplex when used with old link partners that do not do
|
|
||||||
autonegotiation.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="driver-operation">
|
|
||||||
<title>Driver Operation</title>
|
|
||||||
|
|
||||||
<sect1><title>Ring buffers</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Tulip can use either ring buffers or lists of Tx and Rx descriptors.
|
|
||||||
This driver uses statically allocated rings of Rx and Tx descriptors, set at
|
|
||||||
compile time by RX/TX_RING_SIZE. This version of the driver allocates skbuffs
|
|
||||||
for the Rx ring buffers at open() time and passes the skb->data field to the
|
|
||||||
Tulip as receive data buffers. When an incoming frame is less than
|
|
||||||
RX_COPYBREAK bytes long, a fresh skbuff is allocated and the frame is
|
|
||||||
copied to the new skbuff. When the incoming frame is larger, the skbuff is
|
|
||||||
passed directly up the protocol stack and replaced by a newly allocated
|
|
||||||
skbuff.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The RX_COPYBREAK value is chosen to trade-off the memory wasted by
|
|
||||||
using a full-sized skbuff for small frames vs. the copying costs of larger
|
|
||||||
frames. For small frames the copying cost is negligible (esp. considering
|
|
||||||
that we are pre-loading the cache with immediately useful header
|
|
||||||
information). For large frames the copying cost is non-trivial, and the
|
|
||||||
larger copy might flush the cache of useful data. A subtle aspect of this
|
|
||||||
choice is that the Tulip only receives into longword aligned buffers, thus
|
|
||||||
the IP header at offset 14 isn't longword aligned for further processing.
|
|
||||||
Copied frames are put into the new skbuff at an offset of "+2", thus copying
|
|
||||||
has the beneficial effect of aligning the IP header and preloading the
|
|
||||||
cache.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Synchronization</title>
|
|
||||||
<para>
|
|
||||||
The driver runs as two independent, single-threaded flows of control. One
|
|
||||||
is the send-packet routine, which enforces single-threaded use by the
|
|
||||||
dev->tbusy flag. The other thread is the interrupt handler, which is single
|
|
||||||
threaded by the hardware and other software.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The send packet thread has partial control over the Tx ring and 'dev->tbusy'
|
|
||||||
flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
|
|
||||||
queue slot is empty, it clears the tbusy flag when finished otherwise it sets
|
|
||||||
the 'tp->tx_full' flag.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The interrupt handler has exclusive control over the Rx ring and records stats
|
|
||||||
from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so
|
|
||||||
we can't avoid the interrupt overhead by having the Tx routine reap the Tx
|
|
||||||
stats.) After reaping the stats, it marks the queue entry as empty by setting
|
|
||||||
the 'base' to zero. Iff the 'tp->tx_full' flag is set, it clears both the
|
|
||||||
tx_full and tbusy flags.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="errata">
|
|
||||||
<title>Errata</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The old DEC databooks were light on details.
|
|
||||||
The 21040 databook claims that CSR13, CSR14, and CSR15 should each be the last
|
|
||||||
register of the set CSR12-15 written. Hmmm, now how is that possible?
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The DEC SROM format is very badly designed not precisely defined, leading to
|
|
||||||
part of the media selection junkheap below. Some boards do not have EEPROM
|
|
||||||
media tables and need to be patched up. Worse, other boards use the DEC
|
|
||||||
design kit media table when it isn't correct for their board.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
We cannot use MII interrupts because there is no defined GPIO pin to attach
|
|
||||||
them. The MII transceiver status is polled using an kernel timer.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="changelog">
|
|
||||||
<title>Driver Change History</title>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.14 (February 20, 2001)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Fix PNIC problems (Manfred Spraul)</para></listitem>
|
|
||||||
<listitem><para>Add new PCI id for Accton comet</para></listitem>
|
|
||||||
<listitem><para>Support Davicom tulips</para></listitem>
|
|
||||||
<listitem><para>Fix oops in eeprom parsing</para></listitem>
|
|
||||||
<listitem><para>Enable workarounds for early PCI chipsets</para></listitem>
|
|
||||||
<listitem><para>IA64, hppa csr0 support</para></listitem>
|
|
||||||
<listitem><para>Support media types 5, 6</para></listitem>
|
|
||||||
<listitem><para>Interpret a bit more of the 21142 SROM extended media type 3</para></listitem>
|
|
||||||
<listitem><para>Add missing delay in eeprom reading</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.11 (November 3, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Eliminate extra bus accesses when sharing interrupts (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Barrier following ownership descriptor bit flip (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Endianness fixes for >14 addresses in setup frames (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Report link beat to kernel/userspace via netif_carrier_*. (kuznet)</para></listitem>
|
|
||||||
<listitem><para>Better spinlocking in set_rx_mode.</para></listitem>
|
|
||||||
<listitem><para>Fix I/O resource request failure error messages (DaveM catch)</para></listitem>
|
|
||||||
<listitem><para>Handle DMA allocation failure.</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.10 (September 6, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Simple interrupt mitigation (via jamal)</para></listitem>
|
|
||||||
<listitem><para>More PCI ids</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.9 (August 11, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>More PCI ids</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.8 (July 13, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Correct signed/unsigned comparison for dummy frame index</para></listitem>
|
|
||||||
<listitem><para>Remove outdated references to struct enet_statistics</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.7 (June 17, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Timer cleanups (Andrew Morton)</para></listitem>
|
|
||||||
<listitem><para>Alpha compile fix (somebody?)</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.6 (May 31, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Revert 21143-related support flag patch</para></listitem>
|
|
||||||
<listitem><para>Add HPPA/media-table debugging printk</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.5 (May 30, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>HPPA support (willy@puffingroup)</para></listitem>
|
|
||||||
<listitem><para>CSR6 bits and tulip.h cleanup (Chris Smith)</para></listitem>
|
|
||||||
<listitem><para>Improve debugging messages a bit</para></listitem>
|
|
||||||
<listitem><para>Add delay after CSR13 write in t21142_start_nway</para></listitem>
|
|
||||||
<listitem><para>Remove unused ETHER_STATS code</para></listitem>
|
|
||||||
<listitem><para>Convert 'extern inline' to 'static inline' in tulip.h (Chris Smith)</para></listitem>
|
|
||||||
<listitem><para>Update DS21143 support flags in tulip_chip_info[]</para></listitem>
|
|
||||||
<listitem><para>Use spin_lock_irq, not _irqsave/restore, in tulip_start_xmit()</para></listitem>
|
|
||||||
<listitem><para>Add locking to set_rx_mode()</para></listitem>
|
|
||||||
<listitem><para>Fix race with chip setting DescOwned bit (Hal Murray)</para></listitem>
|
|
||||||
<listitem><para>Request 100% of PIO and MMIO resource space assigned to card</para></listitem>
|
|
||||||
<listitem><para>Remove error message from pci_enable_device failure</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.3 (April 14, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>mod_timer fix (Hal Murray)</para></listitem>
|
|
||||||
<listitem><para>PNIC2 resuscitation (Chris Smith)</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.2 (March 21, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Fix 21041 CSR7, CSR13/14/15 handling</para></listitem>
|
|
||||||
<listitem><para>Merge some PCI ids from tulip 0.91x</para></listitem>
|
|
||||||
<listitem><para>Merge some HAS_xxx flags and flag settings from tulip 0.91x</para></listitem>
|
|
||||||
<listitem><para>asm/io.h fix (submitted by many) and cleanup</para></listitem>
|
|
||||||
<listitem><para>s/HAS_NWAY143/HAS_NWAY/</para></listitem>
|
|
||||||
<listitem><para>Cleanup 21041 mode reporting</para></listitem>
|
|
||||||
<listitem><para>Small code cleanups</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.1 (March 18, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Finish PCI DMA conversion (davem)</para></listitem>
|
|
||||||
<listitem><para>Do not netif_start_queue() at end of tulip_tx_timeout() (kuznet)</para></listitem>
|
|
||||||
<listitem><para>PCI DMA fix (kuznet)</para></listitem>
|
|
||||||
<listitem><para>eeprom.c code cleanup</para></listitem>
|
|
||||||
<listitem><para>Remove Xircom Tulip crud</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
</book>
|
|
|
@ -1,597 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
||||||
|
|
||||||
<book id="ViaAudioGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Via 686 Audio Driver for Linux</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Jeff</firstname>
|
|
||||||
<surname>Garzik</surname>
|
|
||||||
</author>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>1999-2001</year>
|
|
||||||
<holder>Jeff Garzik</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation 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.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
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.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
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., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<toc></toc>
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
<para>
|
|
||||||
The Via VT82C686A "super southbridge" chips contain
|
|
||||||
AC97-compatible audio logic which features dual 16-bit stereo
|
|
||||||
PCM sound channels (full duplex), plus a third PCM channel intended for use
|
|
||||||
in hardware-assisted FM synthesis.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The current Linux kernel audio driver for this family of chips
|
|
||||||
supports audio playback and recording, but hardware-assisted
|
|
||||||
FM features, and hardware buffer direct-access (mmap)
|
|
||||||
support are not yet available.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
This driver supports any Linux kernel version after 2.4.10.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Please send bug reports to the mailing list <email>linux-via@gtf.org</email>.
|
|
||||||
To subscribe, e-mail <email>majordomo@gtf.org</email> with
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
subscribe linux-via
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
in the body of the message.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="install">
|
|
||||||
<title>Driver Installation</title>
|
|
||||||
<para>
|
|
||||||
To use this audio driver, select the
|
|
||||||
CONFIG_SOUND_VIA82CXXX option in the section Sound during kernel configuration.
|
|
||||||
Follow the usual kernel procedures for rebuilding the kernel,
|
|
||||||
or building and installing driver modules.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
To make this driver the default audio driver, you can add the
|
|
||||||
following to your /etc/conf.modules file:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
alias sound via82cxxx_audio
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
Note that soundcore and ac97_codec support modules
|
|
||||||
are also required for working audio, in addition to
|
|
||||||
the via82cxxx_audio module itself.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="reportbug">
|
|
||||||
<title>Submitting a bug report</title>
|
|
||||||
<sect1 id="bugrepdesc"><title>Description of problem</title>
|
|
||||||
<para>
|
|
||||||
Describe the application you were using to play/record sound, and how
|
|
||||||
to reproduce the problem.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepdiag"><title>Diagnostic output</title>
|
|
||||||
<para>
|
|
||||||
Obtain the via-audio-diag diagnostics program from
|
|
||||||
http://sf.net/projects/gkernel/ and provide a dump of the
|
|
||||||
audio chip's registers while the problem is occurring. Sample command line:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
./via-audio-diag -aps > diag-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepdebug"><title>Driver debug output</title>
|
|
||||||
<para>
|
|
||||||
Define <constant>VIA_DEBUG</constant> at the beginning of the driver, then capture and email
|
|
||||||
the kernel log output. This can be viewed in the system kernel log (if
|
|
||||||
enabled), or via the dmesg program. Sample command line:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
dmesg > /tmp/dmesg-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepprintk"><title>Bigger kernel message buffer</title>
|
|
||||||
<para>
|
|
||||||
If you wish to increase the size of the buffer displayed by dmesg, then
|
|
||||||
change the <constant>LOG_BUF_LEN</constant> macro at the top of linux/kernel/printk.c, recompile
|
|
||||||
your kernel, and pass the <constant>LOG_BUF_LEN</constant> value to dmesg. Sample command line with
|
|
||||||
<constant>LOG_BUF_LEN</constant> == 32768:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
dmesg -s 32768 > /tmp/dmesg-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="bugs">
|
|
||||||
<title>Known Bugs And Assumptions</title>
|
|
||||||
<para>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry><term>Low volume</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Volume too low on many systems. Workaround: use mixer program
|
|
||||||
such as xmixer to increase volume.
|
|
||||||
</para>
|
|
||||||
</listitem></varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="thanks">
|
|
||||||
<title>Thanks</title>
|
|
||||||
<para>
|
|
||||||
Via for providing e-mail support, specs, and NDA'd source code.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
MandrakeSoft for providing hacking time.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
AC97 mixer interface fixes and debugging by Ron Cemer <email>roncemer@gte.net</email>.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Rui Sousa <email>rui.sousa@conexant.com</email>, for bugfixing
|
|
||||||
MMAP support, and several other notable fixes that resulted from
|
|
||||||
his hard work and testing.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Adrian Cox <email>adrian@humboldt.co.uk</email>, for bugfixing
|
|
||||||
MMAP support, and several other notable fixes that resulted from
|
|
||||||
his hard work and testing.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Thomas Sailer for further bugfixes.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="notes">
|
|
||||||
<title>Random Notes</title>
|
|
||||||
<para>
|
|
||||||
Two /proc pseudo-files provide diagnostic information. This is generally
|
|
||||||
not useful to most users. Power users can disable CONFIG_SOUND_VIA82CXXX_PROCFS,
|
|
||||||
and remove the /proc support code. Once
|
|
||||||
version 2.0.0 is released, the /proc support code will be disabled by
|
|
||||||
default. Available /proc pseudo-files:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
/proc/driver/via/0/info
|
|
||||||
/proc/driver/via/0/ac97
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
This driver by default supports all PCI audio devices which report
|
|
||||||
a vendor id of 0x1106, and a device id of 0x3058. Subsystem vendor
|
|
||||||
and device ids are not examined.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
GNU indent formatting options:
|
|
||||||
<programlisting>
|
|
||||||
-kr -i8 -ts8 -br -ce -bap -sob -l80 -pcs -cs -ss -bs -di1 -nbc -lp -psl
|
|
||||||
</programlisting>
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Via has graciously donated e-mail support and source code to help further
|
|
||||||
the development of this driver. Their assistance has been invaluable
|
|
||||||
in the design and coding of the next major version of this driver.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The Via audio chip apparently provides a second PCM scatter-gather
|
|
||||||
DMA channel just for FM data, but does not have a full hardware MIDI
|
|
||||||
processor. I haven't put much thought towards a solution here, but it
|
|
||||||
might involve using SoftOSS midi wave table, or simply disabling MIDI
|
|
||||||
support altogether and using the FM PCM channel as a second (input? output?)
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="changelog">
|
|
||||||
<title>Driver ChangeLog</title>
|
|
||||||
|
|
||||||
<sect1 id="version191"><title>
|
|
||||||
Version 1.9.1
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
DSP read/write bugfixes from Thomas Sailer.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Add new PCI id for single-channel use of Via 8233.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Other bug fixes, tweaks, new ioctls.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1115"><title>
|
|
||||||
Version 1.1.15
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for variable fragment size and variable fragment number (Rui
|
|
||||||
Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fixes for the SPEED, STEREO, CHANNELS, FMT ioctls when in read &
|
|
||||||
write mode (Rui Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Mmaped sound is now fully functional. (Rui Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Make sure to enable PCI device before reading any of its PCI
|
|
||||||
config information. (fixes potential hotplug problems)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Clean up code a bit and add more internal function documentation.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
AC97 codec access fixes (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Big endian fixes (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
MIDI support (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Detect and report locked-rate AC97 codecs. If your hardware only
|
|
||||||
supports 48Khz (locked rate), then your recording/playback software
|
|
||||||
must upsample or downsample accordingly. The hardware cannot do it.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Use new pci_request_regions and pci_disable_device functions in
|
|
||||||
kernel 2.4.6.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1114"><title>
|
|
||||||
Version 1.1.14
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Use VM_RESERVE when available, to eliminate unnecessary page faults.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1112"><title>
|
|
||||||
Version 1.1.12
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
mmap bug fixes from Linus.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1111"><title>
|
|
||||||
Version 1.1.11
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Many more bug fixes. mmap enabled by default, but may still be buggy.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Uses new and spiffy method of mmap'ing the DMA buffer, based
|
|
||||||
on a suggestion from Linus.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1110"><title>
|
|
||||||
Version 1.1.10
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Many bug fixes. mmap enabled by default, but may still be buggy.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version119"><title>
|
|
||||||
Version 1.1.9
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Redesign and rewrite audio playback implementation. (faster and smaller, hopefully)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Implement recording and full duplex (DSP_CAP_DUPLEX) support.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Make procfs support optional.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Quick interrupt status check, to lessen overhead in interrupt
|
|
||||||
sharing situations.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Add mmap(2) support. Disabled for now, it is still buggy and experimental.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Surround all syscalls with a semaphore for cheap and easy SMP protection.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix bug in channel shutdown (hardware channel reset) code.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove unnecessary spinlocks (better performance).
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Eliminate "unknown AFMT" message by using a different method
|
|
||||||
of selecting the best AFMT_xxx sound sample format for use.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for realtime hardware pointer position reporting
|
|
||||||
(DSP_CAP_REALTIME, SNDCTL_DSP_GETxPTR ioctls)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for capture/playback triggering
|
|
||||||
(DSP_CAP_TRIGGER, SNDCTL_DSP_SETTRIGGER ioctls)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
SNDCTL_DSP_SETDUPLEX and SNDCTL_DSP_POST ioctls now handled.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Rewrite open(2) and close(2) logic to allow only one user at
|
|
||||||
a time. All other open(2) attempts will sleep until they succeed.
|
|
||||||
FIXME: open(O_RDONLY) and open(O_WRONLY) should be allowed to succeed.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Reviewed code to ensure that SMP and multiple audio devices
|
|
||||||
are fully supported.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version118"><title>
|
|
||||||
Version 1.1.8
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Clean up interrupt handler output. Fixes the following kernel error message:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
unhandled interrupt ...
|
|
||||||
</programlisting>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Convert documentation to DocBook, so that PDF, HTML and PostScript (.ps) output is readily
|
|
||||||
available.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version117"><title>
|
|
||||||
Version 1.1.7
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix module unload bug where mixer device left registered
|
|
||||||
after driver exit
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version116"><title>
|
|
||||||
Version 1.1.6
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Rewrite via_set_rate to mimic ALSA basic AC97 rate setting
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove much dead code
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Complete spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix build problem in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Optimize included headers to eliminate headers found in linux/sound
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version115"><title>
|
|
||||||
Version 1.1.5
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Disable some overly-verbose debugging code
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove unnecessary sound locks
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix some ioctls for better time resolution
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Begin spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version114"><title>
|
|
||||||
Version 1.1.4
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Completed rewrite of driver. Eliminated SoundBlaster compatibility
|
|
||||||
completely, and now uses the much-faster scatter-gather DMA engine.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="intfunctions">
|
|
||||||
<title>Internal Functions</title>
|
|
||||||
!Isound/oss/via82cxxx_audio.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
</book>
|
|
||||||
|
|
||||||
|
|
|
@ -108,8 +108,9 @@ year saw a paper describing an RCU implementation of System V IPC
|
||||||
2004 has seen a Linux-Journal article on use of RCU in dcache
|
2004 has seen a Linux-Journal article on use of RCU in dcache
|
||||||
[McKenney04a], a performance comparison of locking to RCU on several
|
[McKenney04a], a performance comparison of locking to RCU on several
|
||||||
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
||||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], and a paper
|
number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
|
||||||
describing how to make RCU safe for soft-realtime applications [Sarma04c].
|
describing how to make RCU safe for soft-realtime applications [Sarma04c],
|
||||||
|
and a paper describing SELinux performance with RCU [JamesMorris04b].
|
||||||
|
|
||||||
|
|
||||||
Bibtex Entries
|
Bibtex Entries
|
||||||
|
@ -341,6 +342,17 @@ Dipankar Sarma"
|
||||||
,pages="18-26"
|
,pages="18-26"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@techreport{Friedberg03a
|
||||||
|
,author="Stuart A. Friedberg"
|
||||||
|
,title="Lock-Free Wild Card Search Data Structure and Method"
|
||||||
|
,institution="US Patent and Trademark Office"
|
||||||
|
,address="Washington, DC"
|
||||||
|
,year="2003"
|
||||||
|
,number="US Patent 6,662,184 (contributed under GPL)"
|
||||||
|
,month="December"
|
||||||
|
,pages="112"
|
||||||
|
}
|
||||||
|
|
||||||
@article{McKenney04a
|
@article{McKenney04a
|
||||||
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
||||||
,title="Scaling dcache with {RCU}"
|
,title="Scaling dcache with {RCU}"
|
||||||
|
@ -373,6 +385,9 @@ in Operating System Kernels"
|
||||||
,school="OGI School of Science and Engineering at
|
,school="OGI School of Science and Engineering at
|
||||||
Oregon Health and Sciences University"
|
Oregon Health and Sciences University"
|
||||||
,year="2004"
|
,year="2004"
|
||||||
|
,note="Available:
|
||||||
|
\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf}
|
||||||
|
[Viewed October 15, 2004]"
|
||||||
}
|
}
|
||||||
|
|
||||||
@Conference{Sarma04c
|
@Conference{Sarma04c
|
||||||
|
@ -385,3 +400,13 @@ Oregon Health and Sciences University"
|
||||||
,month="June"
|
,month="June"
|
||||||
,pages="182-191"
|
,pages="182-191"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@unpublished{JamesMorris04b
|
||||||
|
,Author="James Morris"
|
||||||
|
,Title="Recent Developments in {SELinux} Kernel Performance"
|
||||||
|
,month="December"
|
||||||
|
,year="2004"
|
||||||
|
,note="Available:
|
||||||
|
\url{http://www.livejournal.com/users/james_morris/2153.html}
|
||||||
|
[Viewed December 10, 2004]"
|
||||||
|
}
|
||||||
|
|
|
@ -2,11 +2,11 @@ RCU on Uniprocessor Systems
|
||||||
|
|
||||||
|
|
||||||
A common misconception is that, on UP systems, the call_rcu() primitive
|
A common misconception is that, on UP systems, the call_rcu() primitive
|
||||||
may immediately invoke its function, and that the synchronize_kernel
|
may immediately invoke its function, and that the synchronize_rcu()
|
||||||
primitive may return immediately. The basis of this misconception
|
primitive may return immediately. The basis of this misconception
|
||||||
is that since there is only one CPU, it should not be necessary to
|
is that since there is only one CPU, it should not be necessary to
|
||||||
wait for anything else to get done, since there are no other CPUs for
|
wait for anything else to get done, since there are no other CPUs for
|
||||||
anything else to be happening on. Although this approach will sort of
|
anything else to be happening on. Although this approach will -sort- -of-
|
||||||
work a surprising amount of the time, it is a very bad idea in general.
|
work a surprising amount of the time, it is a very bad idea in general.
|
||||||
This document presents two examples that demonstrate exactly how bad an
|
This document presents two examples that demonstrate exactly how bad an
|
||||||
idea this is.
|
idea this is.
|
||||||
|
@ -44,14 +44,14 @@ its arguments would cause it to fail to make the fundamental guarantee
|
||||||
underlying RCU, namely that call_rcu() defers invoking its arguments until
|
underlying RCU, namely that call_rcu() defers invoking its arguments until
|
||||||
all RCU read-side critical sections currently executing have completed.
|
all RCU read-side critical sections currently executing have completed.
|
||||||
|
|
||||||
Quick Quiz: why is it -not- legal to invoke synchronize_kernel() in
|
Quick Quiz: why is it -not- legal to invoke synchronize_rcu() in
|
||||||
this case?
|
this case?
|
||||||
|
|
||||||
|
|
||||||
Summary
|
Summary
|
||||||
|
|
||||||
Permitting call_rcu() to immediately invoke its arguments or permitting
|
Permitting call_rcu() to immediately invoke its arguments or permitting
|
||||||
synchronize_kernel() to immediately return breaks RCU, even on a UP system.
|
synchronize_rcu() to immediately return breaks RCU, even on a UP system.
|
||||||
So do not do it! Even on a UP system, the RCU infrastructure -must-
|
So do not do it! Even on a UP system, the RCU infrastructure -must-
|
||||||
respect grace periods.
|
respect grace periods.
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,10 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
them -- even x86 allows reads to be reordered), and be prepared
|
them -- even x86 allows reads to be reordered), and be prepared
|
||||||
to explain why this added complexity is worthwhile. If you
|
to explain why this added complexity is worthwhile. If you
|
||||||
choose #c, be prepared to explain how this single task does not
|
choose #c, be prepared to explain how this single task does not
|
||||||
become a major bottleneck on big multiprocessor machines.
|
become a major bottleneck on big multiprocessor machines (for
|
||||||
|
example, if the task is updating information relating to itself
|
||||||
|
that other tasks can read, there by definition can be no
|
||||||
|
bottleneck).
|
||||||
|
|
||||||
2. Do the RCU read-side critical sections make proper use of
|
2. Do the RCU read-side critical sections make proper use of
|
||||||
rcu_read_lock() and friends? These primitives are needed
|
rcu_read_lock() and friends? These primitives are needed
|
||||||
|
@ -89,27 +92,34 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
"_rcu()" list-traversal primitives, such as the
|
"_rcu()" list-traversal primitives, such as the
|
||||||
list_for_each_entry_rcu().
|
list_for_each_entry_rcu().
|
||||||
|
|
||||||
b. If the list macros are being used, the list_del_rcu(),
|
b. If the list macros are being used, the list_add_tail_rcu()
|
||||||
list_add_tail_rcu(), and list_del_rcu() primitives must
|
and list_add_rcu() primitives must be used in order
|
||||||
be used in order to prevent weakly ordered machines from
|
to prevent weakly ordered machines from misordering
|
||||||
misordering structure initialization and pointer planting.
|
structure initialization and pointer planting.
|
||||||
Similarly, if the hlist macros are being used, the
|
Similarly, if the hlist macros are being used, the
|
||||||
hlist_del_rcu() and hlist_add_head_rcu() primitives
|
hlist_add_head_rcu() primitive is required.
|
||||||
are required.
|
|
||||||
|
|
||||||
c. Updates must ensure that initialization of a given
|
c. If the list macros are being used, the list_del_rcu()
|
||||||
|
primitive must be used to keep list_del()'s pointer
|
||||||
|
poisoning from inflicting toxic effects on concurrent
|
||||||
|
readers. Similarly, if the hlist macros are being used,
|
||||||
|
the hlist_del_rcu() primitive is required.
|
||||||
|
|
||||||
|
The list_replace_rcu() primitive may be used to
|
||||||
|
replace an old structure with a new one in an
|
||||||
|
RCU-protected list.
|
||||||
|
|
||||||
|
d. Updates must ensure that initialization of a given
|
||||||
structure happens before pointers to that structure are
|
structure happens before pointers to that structure are
|
||||||
publicized. Use the rcu_assign_pointer() primitive
|
publicized. Use the rcu_assign_pointer() primitive
|
||||||
when publicizing a pointer to a structure that can
|
when publicizing a pointer to a structure that can
|
||||||
be traversed by an RCU read-side critical section.
|
be traversed by an RCU read-side critical section.
|
||||||
|
|
||||||
[The rcu_assign_pointer() primitive is in process.]
|
|
||||||
|
|
||||||
5. If call_rcu(), or a related primitive such as call_rcu_bh(),
|
5. If call_rcu(), or a related primitive such as call_rcu_bh(),
|
||||||
is used, the callback function must be written to be called
|
is used, the callback function must be written to be called
|
||||||
from softirq context. In particular, it cannot block.
|
from softirq context. In particular, it cannot block.
|
||||||
|
|
||||||
6. Since synchronize_kernel() blocks, it cannot be called from
|
6. Since synchronize_rcu() can block, it cannot be called from
|
||||||
any sort of irq context.
|
any sort of irq context.
|
||||||
|
|
||||||
7. If the updater uses call_rcu(), then the corresponding readers
|
7. If the updater uses call_rcu(), then the corresponding readers
|
||||||
|
@ -125,9 +135,9 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
such cases is a must, of course! And the jury is still out on
|
such cases is a must, of course! And the jury is still out on
|
||||||
whether the increased speed is worth it.
|
whether the increased speed is worth it.
|
||||||
|
|
||||||
8. Although synchronize_kernel() is a bit slower than is call_rcu(),
|
8. Although synchronize_rcu() is a bit slower than is call_rcu(),
|
||||||
it usually results in simpler code. So, unless update performance
|
it usually results in simpler code. So, unless update performance
|
||||||
is important or the updaters cannot block, synchronize_kernel()
|
is important or the updaters cannot block, synchronize_rcu()
|
||||||
should be used in preference to call_rcu().
|
should be used in preference to call_rcu().
|
||||||
|
|
||||||
9. All RCU list-traversal primitives, which include
|
9. All RCU list-traversal primitives, which include
|
||||||
|
@ -155,3 +165,14 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
you -must- use the "_rcu()" variants of the list macros.
|
you -must- use the "_rcu()" variants of the list macros.
|
||||||
Failing to do so will break Alpha and confuse people reading
|
Failing to do so will break Alpha and confuse people reading
|
||||||
your code.
|
your code.
|
||||||
|
|
||||||
|
11. Note that synchronize_rcu() -only- guarantees to wait until
|
||||||
|
all currently executing rcu_read_lock()-protected RCU read-side
|
||||||
|
critical sections complete. It does -not- necessarily guarantee
|
||||||
|
that all currently running interrupts, NMIs, preempt_disable()
|
||||||
|
code, or idle loops will complete. Therefore, if you do not have
|
||||||
|
rcu_read_lock()-protected read-side critical sections, do -not-
|
||||||
|
use synchronize_rcu().
|
||||||
|
|
||||||
|
If you want to wait for some of these other things, you might
|
||||||
|
instead need to use synchronize_irq() or synchronize_sched().
|
||||||
|
|
|
@ -32,6 +32,7 @@ implementation of audit_filter_task() might be as follows:
|
||||||
enum audit_state state;
|
enum audit_state state;
|
||||||
|
|
||||||
read_lock(&auditsc_lock);
|
read_lock(&auditsc_lock);
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry(e, &audit_tsklist, list) {
|
list_for_each_entry(e, &audit_tsklist, list) {
|
||||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||||
read_unlock(&auditsc_lock);
|
read_unlock(&auditsc_lock);
|
||||||
|
@ -55,6 +56,7 @@ This means that RCU can be easily applied to the read side, as follows:
|
||||||
enum audit_state state;
|
enum audit_state state;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
||||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -139,12 +141,15 @@ Normally, the write_lock() and write_unlock() would be replaced by
|
||||||
a spin_lock() and a spin_unlock(), but in this case, all callers hold
|
a spin_lock() and a spin_unlock(), but in this case, all callers hold
|
||||||
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
||||||
can therefore be eliminated, since use of RCU eliminates the need for
|
can therefore be eliminated, since use of RCU eliminates the need for
|
||||||
writers to exclude readers.
|
writers to exclude readers. Normally, the write_lock() calls would
|
||||||
|
be converted into spin_lock() calls.
|
||||||
|
|
||||||
The list_del(), list_add(), and list_add_tail() primitives have been
|
The list_del(), list_add(), and list_add_tail() primitives have been
|
||||||
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
||||||
The _rcu() list-manipulation primitives add memory barriers that are
|
The _rcu() list-manipulation primitives add memory barriers that are
|
||||||
needed on weakly ordered CPUs (most of them!).
|
needed on weakly ordered CPUs (most of them!). The list_del_rcu()
|
||||||
|
primitive omits the pointer poisoning debug-assist code that would
|
||||||
|
otherwise cause concurrent readers to fail spectacularly.
|
||||||
|
|
||||||
So, when readers can tolerate stale data and when entries are either added
|
So, when readers can tolerate stale data and when entries are either added
|
||||||
or deleted, without in-place modification, it is very easy to use RCU!
|
or deleted, without in-place modification, it is very easy to use RCU!
|
||||||
|
@ -166,6 +171,7 @@ otherwise, the added fields would need to be filled in):
|
||||||
struct audit_newentry *ne;
|
struct audit_newentry *ne;
|
||||||
|
|
||||||
write_lock(&auditsc_lock);
|
write_lock(&auditsc_lock);
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry(e, list, list) {
|
list_for_each_entry(e, list, list) {
|
||||||
if (!audit_compare_rule(rule, &e->rule)) {
|
if (!audit_compare_rule(rule, &e->rule)) {
|
||||||
e->rule.action = newaction;
|
e->rule.action = newaction;
|
||||||
|
@ -199,8 +205,7 @@ RCU ("read-copy update") its name. The RCU code is as follows:
|
||||||
audit_copy_rule(&ne->rule, &e->rule);
|
audit_copy_rule(&ne->rule, &e->rule);
|
||||||
ne->rule.action = newaction;
|
ne->rule.action = newaction;
|
||||||
ne->rule.file_count = newfield_count;
|
ne->rule.file_count = newfield_count;
|
||||||
list_add_rcu(ne, e);
|
list_replace_rcu(e, ne);
|
||||||
list_del(e);
|
|
||||||
call_rcu(&e->rcu, audit_free_rule, e);
|
call_rcu(&e->rcu, audit_free_rule, e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,9 @@ o If I am running on a uniprocessor kernel, which can only do one
|
||||||
|
|
||||||
o How can I see where RCU is currently used in the Linux kernel?
|
o How can I see where RCU is currently used in the Linux kernel?
|
||||||
|
|
||||||
Search for "rcu_read_lock", "call_rcu", and "synchronize_kernel".
|
Search for "rcu_read_lock", "rcu_read_unlock", "call_rcu",
|
||||||
|
"rcu_read_lock_bh", "rcu_read_unlock_bh", "call_rcu_bh",
|
||||||
|
"synchronize_rcu", and "synchronize_net".
|
||||||
|
|
||||||
o What guidelines should I follow when writing code that uses RCU?
|
o What guidelines should I follow when writing code that uses RCU?
|
||||||
|
|
||||||
|
|
|
@ -1,137 +1,137 @@
|
||||||
.*
|
|
||||||
*~
|
|
||||||
53c8xx_d.h*
|
|
||||||
*.a
|
*.a
|
||||||
aic7*reg.h*
|
*.aux
|
||||||
aic7*seq.h*
|
*.bin
|
||||||
aic7*reg_print.c*
|
*.cpio
|
||||||
|
*.css
|
||||||
|
*.dvi
|
||||||
|
*.eps
|
||||||
|
*.gif
|
||||||
|
*.grep
|
||||||
|
*.grp
|
||||||
|
*.gz
|
||||||
|
*.html
|
||||||
|
*.jpeg
|
||||||
|
*.ko
|
||||||
|
*.log
|
||||||
|
*.lst
|
||||||
|
*.mod.c
|
||||||
|
*.o
|
||||||
|
*.orig
|
||||||
|
*.out
|
||||||
|
*.pdf
|
||||||
|
*.png
|
||||||
|
*.ps
|
||||||
|
*.rej
|
||||||
|
*.s
|
||||||
|
*.sgml
|
||||||
|
*.so
|
||||||
|
*.tex
|
||||||
|
*.ver
|
||||||
|
*_MODULES
|
||||||
|
*_vga16.c
|
||||||
|
*cscope*
|
||||||
|
*~
|
||||||
|
.*
|
||||||
|
.cscope
|
||||||
53c700_d.h
|
53c700_d.h
|
||||||
|
53c8xx_d.h*
|
||||||
|
BitKeeper
|
||||||
|
COPYING
|
||||||
|
CREDITS
|
||||||
|
CVS
|
||||||
|
ChangeSet
|
||||||
|
Kerntypes
|
||||||
|
MODS.txt
|
||||||
|
Module.symvers
|
||||||
|
PENDING
|
||||||
|
SCCS
|
||||||
|
System.map*
|
||||||
|
TAGS
|
||||||
|
aic7*reg.h*
|
||||||
|
aic7*reg_print.c*
|
||||||
|
aic7*seq.h*
|
||||||
aicasm
|
aicasm
|
||||||
aicdb.h*
|
aicdb.h*
|
||||||
asm
|
asm
|
||||||
asm_offsets.*
|
asm_offsets.*
|
||||||
autoconf.h*
|
autoconf.h*
|
||||||
*.aux
|
|
||||||
bbootsect
|
bbootsect
|
||||||
*.bin
|
|
||||||
bin2c
|
bin2c
|
||||||
binkernel.spec
|
binkernel.spec
|
||||||
BitKeeper
|
|
||||||
bootsect
|
bootsect
|
||||||
bsetup
|
bsetup
|
||||||
btfixupprep
|
btfixupprep
|
||||||
build
|
build
|
||||||
bvmlinux
|
bvmlinux
|
||||||
bzImage*
|
bzImage*
|
||||||
ChangeSet
|
|
||||||
classlist.h*
|
classlist.h*
|
||||||
compile.h*
|
|
||||||
comp*.log
|
comp*.log
|
||||||
|
compile.h*
|
||||||
config
|
config
|
||||||
config-*
|
config-*
|
||||||
config_data.h*
|
config_data.h*
|
||||||
conmakehash
|
conmakehash
|
||||||
consolemap_deftbl.c*
|
consolemap_deftbl.c*
|
||||||
COPYING
|
crc32table.h*
|
||||||
CREDITS
|
|
||||||
.cscope
|
|
||||||
*cscope*
|
|
||||||
cscope.*
|
cscope.*
|
||||||
*.out
|
|
||||||
*.css
|
|
||||||
CVS
|
|
||||||
defkeymap.c*
|
defkeymap.c*
|
||||||
devlist.h*
|
devlist.h*
|
||||||
docproc
|
docproc
|
||||||
dummy_sym.c*
|
dummy_sym.c*
|
||||||
*.dvi
|
elfconfig.h*
|
||||||
*.eps
|
|
||||||
filelist
|
filelist
|
||||||
fixdep
|
fixdep
|
||||||
fore200e_mkfirm
|
fore200e_mkfirm
|
||||||
fore200e_pca_fw.c*
|
fore200e_pca_fw.c*
|
||||||
gen-devlist
|
gen-devlist
|
||||||
gen_init_cpio
|
|
||||||
gen_crc32table
|
|
||||||
crc32table.h*
|
|
||||||
*.cpio
|
|
||||||
gen-kdb_cmds.c*
|
gen-kdb_cmds.c*
|
||||||
gentbl
|
gen_crc32table
|
||||||
|
gen_init_cpio
|
||||||
genksyms
|
genksyms
|
||||||
*.gif
|
gentbl
|
||||||
*.gz
|
|
||||||
*.html
|
|
||||||
ikconfig.h*
|
ikconfig.h*
|
||||||
initramfs_list
|
initramfs_list
|
||||||
*.jpeg
|
kallsyms
|
||||||
kconfig
|
kconfig
|
||||||
kconfig.tk
|
kconfig.tk
|
||||||
Kerntypes
|
|
||||||
keywords.c*
|
keywords.c*
|
||||||
ksym.c*
|
ksym.c*
|
||||||
ksym.h*
|
ksym.h*
|
||||||
kallsyms
|
|
||||||
mk_elfconfig
|
|
||||||
elfconfig.h*
|
|
||||||
modpost
|
|
||||||
pnmtologo
|
|
||||||
logo_*.c
|
|
||||||
*.log
|
|
||||||
lex.c*
|
lex.c*
|
||||||
|
logo_*.c
|
||||||
logo_*_clut224.c
|
logo_*_clut224.c
|
||||||
logo_*_mono.c
|
logo_*_mono.c
|
||||||
lxdialog
|
lxdialog
|
||||||
make_times_h
|
make_times_h
|
||||||
map
|
map
|
||||||
mkdep
|
|
||||||
*_MODULES
|
|
||||||
MODS.txt
|
|
||||||
modversions.h*
|
|
||||||
Module.symvers
|
|
||||||
*.mod.c
|
|
||||||
*.o
|
|
||||||
*.ko
|
|
||||||
*.orig
|
|
||||||
*.lst
|
|
||||||
*.grp
|
|
||||||
*.grep
|
|
||||||
oui.c*
|
|
||||||
mktables
|
|
||||||
raid6tables.c
|
|
||||||
raid6int*.c
|
|
||||||
raid6altivec*.c
|
|
||||||
wanxlfw.inc
|
|
||||||
maui_boot.h
|
maui_boot.h
|
||||||
pss_boot.h
|
mk_elfconfig
|
||||||
trix_boot.h
|
mkdep
|
||||||
*.pdf
|
mktables
|
||||||
|
modpost
|
||||||
|
modversions.h*
|
||||||
|
oui.c*
|
||||||
parse.c*
|
parse.c*
|
||||||
parse.h*
|
parse.h*
|
||||||
PENDING
|
pnmtologo
|
||||||
ppc_defs.h*
|
ppc_defs.h*
|
||||||
promcon_tbl.c*
|
promcon_tbl.c*
|
||||||
*.png
|
pss_boot.h
|
||||||
*.ps
|
raid6altivec*.c
|
||||||
*.rej
|
raid6int*.c
|
||||||
SCCS
|
raid6tables.c
|
||||||
setup
|
setup
|
||||||
*.s
|
|
||||||
*.so
|
|
||||||
*.sgml
|
|
||||||
sim710_d.h*
|
sim710_d.h*
|
||||||
sm_tbl*
|
sm_tbl*
|
||||||
split-include
|
split-include
|
||||||
System.map*
|
|
||||||
tags
|
tags
|
||||||
TAGS
|
|
||||||
*.tex
|
|
||||||
times.h*
|
times.h*
|
||||||
tkparse
|
tkparse
|
||||||
*.ver
|
trix_boot.h
|
||||||
version.h*
|
version.h*
|
||||||
*_vga16.c
|
|
||||||
vmlinux
|
vmlinux
|
||||||
vmlinux.lds
|
|
||||||
vmlinux-*
|
vmlinux-*
|
||||||
|
vmlinux.lds
|
||||||
vsyscall.lds
|
vsyscall.lds
|
||||||
|
wanxlfw.inc
|
||||||
zImage
|
zImage
|
||||||
|
|
|
@ -48,3 +48,18 @@ When: April 2005
|
||||||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||||
vecors.
|
vecors.
|
||||||
Who: Andi Kleen <ak@muc.de>, Christoph Hellwig <hch@lst.de>
|
Who: Andi Kleen <ak@muc.de>, Christoph Hellwig <hch@lst.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: RCU API moves to EXPORT_SYMBOL_GPL
|
||||||
|
When: April 2006
|
||||||
|
Files: include/linux/rcupdate.h, kernel/rcupdate.c
|
||||||
|
Why: Outside of Linux, the only implementations of anything even
|
||||||
|
vaguely resembling RCU that I am aware of are in DYNIX/ptx,
|
||||||
|
VM/XA, Tornado, and K42. I do not expect anyone to port binary
|
||||||
|
drivers or kernel modules from any of these, since the first two
|
||||||
|
are owned by IBM and the last two are open-source research OSes.
|
||||||
|
So these will move to GPL after a grace period to allow
|
||||||
|
people, who might be using implementations that I am not aware
|
||||||
|
of, to adjust to this upcoming change.
|
||||||
|
Who: Paul E. McKenney <paulmck@us.ibm.com>
|
||||||
|
|
|
@ -219,8 +219,12 @@ This may also be done to avoid internal deadlocks, but rarely.
|
||||||
If the filesytem is called for sync then it must wait on any
|
If the filesytem is called for sync then it must wait on any
|
||||||
in-progress I/O and then start new I/O.
|
in-progress I/O and then start new I/O.
|
||||||
|
|
||||||
The filesystem should unlock the page synchronously, before returning
|
The filesystem should unlock the page synchronously, before returning to the
|
||||||
to the caller.
|
caller, unless ->writepage() returns special WRITEPAGE_ACTIVATE
|
||||||
|
value. WRITEPAGE_ACTIVATE means that page cannot really be written out
|
||||||
|
currently, and VM should stop calling ->writepage() on this page for some
|
||||||
|
time. VM does this by moving page to the head of the active list, hence the
|
||||||
|
name.
|
||||||
|
|
||||||
Unless the filesystem is going to redirty_page_for_writepage(), unlock the page
|
Unless the filesystem is going to redirty_page_for_writepage(), unlock the page
|
||||||
and return zero, writepage *must* run set_page_writeback() against the page,
|
and return zero, writepage *must* run set_page_writeback() against the page,
|
||||||
|
|
|
@ -909,16 +909,6 @@ nr_free_inodes
|
||||||
Represents the number of free inodes. Ie. The number of inuse inodes is
|
Represents the number of free inodes. Ie. The number of inuse inodes is
|
||||||
(nr_inodes - nr_free_inodes).
|
(nr_inodes - nr_free_inodes).
|
||||||
|
|
||||||
super-nr and super-max
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Again, super block structures are allocated by the kernel, but not freed. The
|
|
||||||
file super-max contains the maximum number of super block handlers, where
|
|
||||||
super-nr shows the number of currently allocated ones.
|
|
||||||
|
|
||||||
Every mounted file system needs a super block, so if you plan to mount lots of
|
|
||||||
file systems, you may want to increase these numbers.
|
|
||||||
|
|
||||||
aio-nr and aio-max-nr
|
aio-nr and aio-max-nr
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,6 @@ Offset Type Description
|
||||||
0x22c unsigned long ramdisk_max
|
0x22c unsigned long ramdisk_max
|
||||||
0x230 16 bytes trampoline
|
0x230 16 bytes trampoline
|
||||||
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
||||||
0x2d0 - 0x600 E820MAP
|
0x2d0 - 0xd00 E820MAP
|
||||||
0x600 - 0x7ff EDDBUF (edd.S) for disk signature read sector
|
0xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector
|
||||||
0x600 - 0x7eb EDDBUF (edd.S) for edd data
|
0xd00 - 0xeeb EDDBUF (edd.S) for edd data
|
||||||
|
|
|
@ -56,12 +56,16 @@ read_dev_chars()
|
||||||
read device characteristics
|
read device characteristics
|
||||||
|
|
||||||
read_conf_data()
|
read_conf_data()
|
||||||
|
read_conf_data_lpm()
|
||||||
read configuration data.
|
read configuration data.
|
||||||
|
|
||||||
ccw_device_get_ciw()
|
ccw_device_get_ciw()
|
||||||
get commands from extended sense data.
|
get commands from extended sense data.
|
||||||
|
|
||||||
ccw_device_start()
|
ccw_device_start()
|
||||||
|
ccw_device_start_timeout()
|
||||||
|
ccw_device_start_key()
|
||||||
|
ccw_device_start_key_timeout()
|
||||||
initiate an I/O request.
|
initiate an I/O request.
|
||||||
|
|
||||||
ccw_device_resume()
|
ccw_device_resume()
|
||||||
|
@ -197,19 +201,21 @@ The read_dev_chars() function returns :
|
||||||
operational.
|
operational.
|
||||||
|
|
||||||
|
|
||||||
read_conf_data() - Read Configuration Data
|
read_conf_data(), read_conf_data_lpm() - Read Configuration Data
|
||||||
|
|
||||||
Retrieve the device dependent configuration data. Please have a look at your
|
Retrieve the device dependent configuration data. Please have a look at your
|
||||||
device dependent I/O commands for the device specific layout of the node
|
device dependent I/O commands for the device specific layout of the node
|
||||||
descriptor elements.
|
descriptor elements. read_conf_data_lpm() will retrieve the configuration data
|
||||||
|
for a specific path.
|
||||||
|
|
||||||
The function is meant to be called with an irq handler in place; that is,
|
The function is meant to be called with the device already enabled; that is,
|
||||||
at earliest during set_online() processing.
|
at earliest during set_online() processing.
|
||||||
|
|
||||||
The function may be called enabled or disabled, but the device must not be
|
The function may be called enabled or disabled, but the device must not be
|
||||||
locked
|
locked
|
||||||
|
|
||||||
int read_conf_data(struct ccw_device, void **buffer, int *length, __u8 lpm);
|
int read_conf_data(struct ccw_device, void **buffer, int *length);
|
||||||
|
int read_conf_data_lpm(struct ccw_device, void **buffer, int *length, __u8 lpm);
|
||||||
|
|
||||||
cdev - the ccw_device the data is requested for.
|
cdev - the ccw_device the data is requested for.
|
||||||
buffer - Pointer to a buffer pointer. The read_conf_data() routine
|
buffer - Pointer to a buffer pointer. The read_conf_data() routine
|
||||||
|
@ -263,6 +269,25 @@ int ccw_device_start(struct ccw_device *cdev,
|
||||||
unsigned long intparm,
|
unsigned long intparm,
|
||||||
__u8 lpm,
|
__u8 lpm,
|
||||||
unsigned long flags);
|
unsigned long flags);
|
||||||
|
int ccw_device_start_timeout(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
unsigned long flags,
|
||||||
|
int expires);
|
||||||
|
int ccw_device_start_key(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
__u8 key,
|
||||||
|
unsigned long flags);
|
||||||
|
int ccw_device_start_key_timeout(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
__u8 key,
|
||||||
|
unsigned long flags,
|
||||||
|
int expires);
|
||||||
|
|
||||||
cdev : ccw_device the I/O is destined for
|
cdev : ccw_device the I/O is destined for
|
||||||
cpa : logical start address of channel program
|
cpa : logical start address of channel program
|
||||||
|
@ -272,7 +297,12 @@ user_intparm : user specific interrupt information; will be presented
|
||||||
particular I/O request.
|
particular I/O request.
|
||||||
lpm : defines the channel path to be used for a specific I/O
|
lpm : defines the channel path to be used for a specific I/O
|
||||||
request. A value of 0 will make cio use the opm.
|
request. A value of 0 will make cio use the opm.
|
||||||
|
key : the storage key to use for the I/O (useful for operating on a
|
||||||
|
storage with a storage key != default key)
|
||||||
flag : defines the action to be performed for I/O processing
|
flag : defines the action to be performed for I/O processing
|
||||||
|
expires : timeout value in jiffies. The common I/O layer will terminate
|
||||||
|
the running program after this and call the interrupt handler
|
||||||
|
with ERR_PTR(-ETIMEDOUT) as irb.
|
||||||
|
|
||||||
Possible flag values are :
|
Possible flag values are :
|
||||||
|
|
||||||
|
@ -327,6 +357,13 @@ current (last) I/O request. In case of a delayed status notification no special
|
||||||
interrupt will be presented to indicate I/O completion as the I/O request was
|
interrupt will be presented to indicate I/O completion as the I/O request was
|
||||||
never started, even though ccw_device_start() returned with successful completion.
|
never started, even though ccw_device_start() returned with successful completion.
|
||||||
|
|
||||||
|
The irb may contain an error value, and the device driver should check for this
|
||||||
|
first:
|
||||||
|
|
||||||
|
-ETIMEDOUT: the common I/O layer terminated the request after the specified
|
||||||
|
timeout value
|
||||||
|
-EIO: the common I/O layer terminated the request due to an error state
|
||||||
|
|
||||||
If the concurrent sense flag in the extended status word in the irb is set, the
|
If the concurrent sense flag in the extended status word in the irb is set, the
|
||||||
field irb->scsw.count describes the numer of device specific sense bytes
|
field irb->scsw.count describes the numer of device specific sense bytes
|
||||||
available in the extended control word irb->scsw.ecw[0]. No device sensing by
|
available in the extended control word irb->scsw.ecw[0]. No device sensing by
|
||||||
|
|
|
@ -2113,6 +2113,13 @@ M: perex@suse.cz
|
||||||
L: alsa-devel@alsa-project.org
|
L: alsa-devel@alsa-project.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TPM DEVICE DRIVER
|
||||||
|
P: Kylene Hall
|
||||||
|
M: kjhall@us.ibm.com
|
||||||
|
W: http://tpmdd.sourceforge.net
|
||||||
|
L: tpmdd-devel@lists.sourceforge.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
UltraSPARC (sparc64):
|
UltraSPARC (sparc64):
|
||||||
P: David S. Miller
|
P: David S. Miller
|
||||||
M: davem@davemloft.net
|
M: davem@davemloft.net
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -332,9 +332,7 @@ KALLSYMS = scripts/kallsyms
|
||||||
PERL = perl
|
PERL = perl
|
||||||
CHECK = sparse
|
CHECK = sparse
|
||||||
|
|
||||||
NOSTDINC_FLAGS = -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
|
||||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
||||||
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
|
||||||
MODFLAGS = -DMODULE
|
MODFLAGS = -DMODULE
|
||||||
CFLAGS_MODULE = $(MODFLAGS)
|
CFLAGS_MODULE = $(MODFLAGS)
|
||||||
AFLAGS_MODULE = $(MODFLAGS)
|
AFLAGS_MODULE = $(MODFLAGS)
|
||||||
|
@ -531,6 +529,10 @@ endif
|
||||||
|
|
||||||
include $(srctree)/arch/$(ARCH)/Makefile
|
include $(srctree)/arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
|
# arch Makefile may override CC so keep this after arch Makefile is included
|
||||||
|
NOSTDINC_FLAGS := -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
||||||
|
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
||||||
|
|
||||||
# warn about C99 declaration after statement
|
# warn about C99 declaration after statement
|
||||||
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||||
|
|
||||||
|
@ -1188,8 +1190,8 @@ cmd_TAGS = $(all-sources) | etags -
|
||||||
quiet_cmd_tags = MAKE $@
|
quiet_cmd_tags = MAKE $@
|
||||||
define cmd_tags
|
define cmd_tags
|
||||||
rm -f $@; \
|
rm -f $@; \
|
||||||
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL"`; \
|
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL --extra=+f"`; \
|
||||||
$(all-sources) | xargs ctags $$CTAGSF -a --extra=+f
|
$(all-sources) | xargs ctags $$CTAGSF -a
|
||||||
endef
|
endef
|
||||||
|
|
||||||
TAGS: FORCE
|
TAGS: FORCE
|
||||||
|
|
|
@ -457,22 +457,6 @@ osf_getdomainname(char __user *name, int namelen)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
osf_shmat(int shmid, void __user *shmaddr, int shmflg)
|
|
||||||
{
|
|
||||||
unsigned long raddr;
|
|
||||||
long err;
|
|
||||||
|
|
||||||
err = do_shmat(shmid, shmaddr, shmflg, &raddr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This works because all user-level addresses are
|
|
||||||
* non-negative longs!
|
|
||||||
*/
|
|
||||||
return err ? err : (long)raddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following stuff should move into a header file should it ever
|
* The following stuff should move into a header file should it ever
|
||||||
* be labeled "officially supported." Right now, there is just enough
|
* be labeled "officially supported." Right now, there is just enough
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -335,7 +336,7 @@ do_sys_ptrace(long request, long pid, long addr, long data,
|
||||||
/* continue and stop at next (return from) syscall */
|
/* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -365,7 +366,7 @@ do_sys_ptrace(long request, long pid, long addr, long data,
|
||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* execute single instruction. */
|
case PTRACE_SINGLESTEP: /* execute single instruction. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
/* Mark single stepping. */
|
/* Mark single stepping. */
|
||||||
child->thread_info->bpt_nsaved = -1;
|
child->thread_info->bpt_nsaved = -1;
|
||||||
|
|
|
@ -227,7 +227,7 @@ sys_call_table:
|
||||||
.quad sys_semop
|
.quad sys_semop
|
||||||
.quad osf_utsname
|
.quad osf_utsname
|
||||||
.quad sys_lchown
|
.quad sys_lchown
|
||||||
.quad osf_shmat
|
.quad sys_shmat
|
||||||
.quad sys_shmctl /* 210 */
|
.quad sys_shmctl /* 210 */
|
||||||
.quad sys_shmdt
|
.quad sys_shmdt
|
||||||
.quad sys_shmget
|
.quad sys_shmget
|
||||||
|
|
|
@ -18,48 +18,30 @@
|
||||||
* Please select one of the following when turning on debugging.
|
* Please select one of the following when turning on debugging.
|
||||||
*/
|
*/
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#if defined(CONFIG_DEBUG_DC21285_PORT)
|
|
||||||
.macro loadsp, rb
|
#include <asm/arch/debug-macro.S>
|
||||||
mov \rb, #0x42000000
|
|
||||||
.endm
|
#if defined(CONFIG_DEBUG_ICEDCC)
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0x160]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_DEBUG_ICEDCC)
|
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
.macro writeb, ch, rb
|
||||||
mcr p14, 0, \rb, c0, c1, 0
|
mcr p14, 0, \ch, c0, c1, 0
|
||||||
.endm
|
.endm
|
||||||
#elif defined(CONFIG_FOOTBRIDGE)
|
#else
|
||||||
|
.macro writeb, ch, rb
|
||||||
|
senduart \ch, \rb
|
||||||
|
.endm
|
||||||
|
|
||||||
|
#if defined(CONFIG_FOOTBRIDGE) || \
|
||||||
|
defined(CONFIG_ARCH_RPC) || \
|
||||||
|
defined(CONFIG_ARCH_INTEGRATOR) || \
|
||||||
|
defined(CONFIG_ARCH_PXA) || \
|
||||||
|
defined(CONFIG_ARCH_IXP4XX) || \
|
||||||
|
defined(CONFIG_ARCH_IXP2000) || \
|
||||||
|
defined(CONFIG_ARCH_LH7A40X) || \
|
||||||
|
defined(CONFIG_ARCH_OMAP)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0x7c000000
|
addruart \rb
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x3f8]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_RPC)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x03000000
|
|
||||||
orr \rb, \rb, #0x00010000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x3f8 << 2]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_INTEGRATOR)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x16000000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_PXA) /* Xscale-type */
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x40000000
|
|
||||||
orr \rb, \rb, #0x00100000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
.endm
|
||||||
#elif defined(CONFIG_ARCH_SA1100)
|
#elif defined(CONFIG_ARCH_SA1100)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
|
@ -70,64 +52,21 @@
|
||||||
add \rb, \rb, #0x00010000 @ Ser1
|
add \rb, \rb, #0x00010000 @ Ser1
|
||||||
# endif
|
# endif
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0x14] @ UTDR
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_IXP4XX)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xc8000000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
#elif defined(CONFIG_ARCH_IXP2000)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xc0000000
|
|
||||||
orr \rb, \rb, #0x00030000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_LH7A40X)
|
|
||||||
.macro loadsp, rb
|
|
||||||
ldr \rb, =0x80000700 @ UART2 UARTBASE
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_OMAP)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xff000000 @ physical base address
|
|
||||||
add \rb, \rb, #0x00fb0000
|
|
||||||
#if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
|
|
||||||
add \rb, \rb, #0x00000800
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_OMAP_LL_DEBUG_UART3
|
|
||||||
add \rb, \rb, #0x00009000
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_IOP331)
|
#elif defined(CONFIG_ARCH_IOP331)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0xff000000
|
mov \rb, #0xff000000
|
||||||
orr \rb, \rb, #0x00ff0000
|
orr \rb, \rb, #0x00ff0000
|
||||||
orr \rb, \rb, #0x0000f700 @ location of the UART
|
orr \rb, \rb, #0x0000f700 @ location of the UART
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_S3C2410)
|
#elif defined(CONFIG_ARCH_S3C2410)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0x50000000
|
mov \rb, #0x50000000
|
||||||
add \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
|
add \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x20]
|
|
||||||
.endm
|
|
||||||
#else
|
#else
|
||||||
#error no serial architecture defined
|
#error no serial architecture defined
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.macro kputc,val
|
.macro kputc,val
|
||||||
|
@ -734,7 +673,7 @@ puts: loadsp r3
|
||||||
1: ldrb r2, [r0], #1
|
1: ldrb r2, [r0], #1
|
||||||
teq r2, #0
|
teq r2, #0
|
||||||
moveq pc, lr
|
moveq pc, lr
|
||||||
2: writeb r2
|
2: writeb r2, r3
|
||||||
mov r1, #0x00020000
|
mov r1, #0x00020000
|
||||||
3: subs r1, r1, #1
|
3: subs r1, r1, #1
|
||||||
bne 3b
|
bne 3b
|
||||||
|
|
|
@ -141,10 +141,10 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc
|
||||||
next->tm_sec = alrm->tm_sec;
|
next->tm_sec = alrm->tm_sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
|
static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
memset(tm, 0, sizeof(struct rtc_time));
|
memset(tm, 0, sizeof(struct rtc_time));
|
||||||
ops->read_time(tm);
|
return ops->read_time(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm)
|
static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm)
|
||||||
|
@ -163,8 +163,7 @@ static inline int rtc_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm)
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
if (ops->read_alarm) {
|
if (ops->read_alarm) {
|
||||||
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
||||||
ops->read_alarm(alrm);
|
ret = ops->read_alarm(alrm);
|
||||||
ret = 0;
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTC_RD_TIME:
|
case RTC_RD_TIME:
|
||||||
rtc_read_time(ops, &tm);
|
ret = rtc_read_time(ops, &tm);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
ret = copy_to_user(uarg, &tm, sizeof(tm));
|
ret = copy_to_user(uarg, &tm, sizeof(tm));
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
|
@ -424,15 +425,15 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo
|
||||||
struct rtc_time tm;
|
struct rtc_time tm;
|
||||||
char *p = page;
|
char *p = page;
|
||||||
|
|
||||||
rtc_read_time(ops, &tm);
|
if (rtc_read_time(ops, &tm) == 0) {
|
||||||
|
p += sprintf(p,
|
||||||
p += sprintf(p,
|
"rtc_time\t: %02d:%02d:%02d\n"
|
||||||
"rtc_time\t: %02d:%02d:%02d\n"
|
"rtc_date\t: %04d-%02d-%02d\n"
|
||||||
"rtc_date\t: %04d-%02d-%02d\n"
|
"rtc_epoch\t: %04lu\n",
|
||||||
"rtc_epoch\t: %04lu\n",
|
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
rtc_epoch);
|
||||||
rtc_epoch);
|
}
|
||||||
|
|
||||||
if (rtc_read_alarm(ops, &alrm) == 0) {
|
if (rtc_read_alarm(ops, &alrm) == 0) {
|
||||||
p += sprintf(p, "alrm_time\t: ");
|
p += sprintf(p, "alrm_time\t: ");
|
||||||
|
|
|
@ -133,7 +133,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
||||||
#
|
#
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -269,6 +269,12 @@ __pabt_svc:
|
||||||
add r5, sp, #S_PC
|
add r5, sp, #S_PC
|
||||||
ldmia r7, {r2 - r4} @ Get USR pc, cpsr
|
ldmia r7, {r2 - r4} @ Get USR pc, cpsr
|
||||||
|
|
||||||
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
|
@ make sure our user space atomic helper is aborted
|
||||||
|
cmp r2, #VIRT_OFFSET
|
||||||
|
bichs r3, r3, #PSR_Z_BIT
|
||||||
|
#endif
|
||||||
|
|
||||||
@
|
@
|
||||||
@ We are now ready to fill in the remaining blanks on the stack:
|
@ We are now ready to fill in the remaining blanks on the stack:
|
||||||
@
|
@
|
||||||
|
@ -499,8 +505,12 @@ ENTRY(__switch_to)
|
||||||
mra r4, r5, acc0
|
mra r4, r5, acc0
|
||||||
stmia ip, {r4, r5}
|
stmia ip, {r4, r5}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_TLS_REG
|
||||||
|
mcr p15, 0, r3, c13, c0, 3 @ set TLS register
|
||||||
|
#else
|
||||||
mov r4, #0xffff0fff
|
mov r4, #0xffff0fff
|
||||||
str r3, [r4, #-3] @ Set TLS ptr
|
str r3, [r4, #-15] @ TLS val at 0xffff0ff0
|
||||||
|
#endif
|
||||||
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
||||||
#ifdef CONFIG_VFP
|
#ifdef CONFIG_VFP
|
||||||
@ Always disable VFP so we can lazily save/restore the old
|
@ Always disable VFP so we can lazily save/restore the old
|
||||||
|
@ -519,6 +529,207 @@ ENTRY(__switch_to)
|
||||||
ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously
|
ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously
|
||||||
|
|
||||||
__INIT
|
__INIT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User helpers.
|
||||||
|
*
|
||||||
|
* These are segment of kernel provided user code reachable from user space
|
||||||
|
* at a fixed address in kernel memory. This is used to provide user space
|
||||||
|
* with some operations which require kernel help because of unimplemented
|
||||||
|
* native feature and/or instructions in many ARM CPUs. The idea is for
|
||||||
|
* this code to be executed directly in user mode for best efficiency but
|
||||||
|
* which is too intimate with the kernel counter part to be left to user
|
||||||
|
* libraries. In fact this code might even differ from one CPU to another
|
||||||
|
* depending on the available instruction set and restrictions like on
|
||||||
|
* SMP systems. In other words, the kernel reserves the right to change
|
||||||
|
* this code as needed without warning. Only the entry points and their
|
||||||
|
* results are guaranteed to be stable.
|
||||||
|
*
|
||||||
|
* Each segment is 32-byte aligned and will be moved to the top of the high
|
||||||
|
* vector page. New segments (if ever needed) must be added in front of
|
||||||
|
* existing ones. This mechanism should be used only for things that are
|
||||||
|
* really small and justified, and not be abused freely.
|
||||||
|
*
|
||||||
|
* User space is expected to implement those things inline when optimizing
|
||||||
|
* for a processor that has the necessary native support, but only if such
|
||||||
|
* resulting binaries are already to be incompatible with earlier ARM
|
||||||
|
* processors due to the use of unsupported instructions other than what
|
||||||
|
* is provided here. In other words don't make binaries unable to run on
|
||||||
|
* earlier processors just for the sake of not using these kernel helpers
|
||||||
|
* if your compiled code is not going to use the new instructions for other
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
.globl __kuser_helper_start
|
||||||
|
__kuser_helper_start:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference prototype:
|
||||||
|
*
|
||||||
|
* int __kernel_cmpxchg(int oldval, int newval, int *ptr)
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
*
|
||||||
|
* r0 = oldval
|
||||||
|
* r1 = newval
|
||||||
|
* r2 = ptr
|
||||||
|
* lr = return address
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* r0 = returned value (zero or non-zero)
|
||||||
|
* C flag = set if r0 == 0, clear if r0 != 0
|
||||||
|
*
|
||||||
|
* Clobbered:
|
||||||
|
*
|
||||||
|
* r3, ip, flags
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* typedef int (__kernel_cmpxchg_t)(int oldval, int newval, int *ptr);
|
||||||
|
* #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *)0xffff0fc0)
|
||||||
|
*
|
||||||
|
* Atomically store newval in *ptr if *ptr is equal to oldval for user space.
|
||||||
|
* Return zero if *ptr was changed or non-zero if no exchange happened.
|
||||||
|
* The C flag is also set if *ptr was changed to allow for assembly
|
||||||
|
* optimization in the calling code.
|
||||||
|
*
|
||||||
|
* For example, a user space atomic_add implementation could look like this:
|
||||||
|
*
|
||||||
|
* #define atomic_add(ptr, val) \
|
||||||
|
* ({ register unsigned int *__ptr asm("r2") = (ptr); \
|
||||||
|
* register unsigned int __result asm("r1"); \
|
||||||
|
* asm volatile ( \
|
||||||
|
* "1: @ atomic_add\n\t" \
|
||||||
|
* "ldr r0, [r2]\n\t" \
|
||||||
|
* "mov r3, #0xffff0fff\n\t" \
|
||||||
|
* "add lr, pc, #4\n\t" \
|
||||||
|
* "add r1, r0, %2\n\t" \
|
||||||
|
* "add pc, r3, #(0xffff0fc0 - 0xffff0fff)\n\t" \
|
||||||
|
* "bcc 1b" \
|
||||||
|
* : "=&r" (__result) \
|
||||||
|
* : "r" (__ptr), "rIL" (val) \
|
||||||
|
* : "r0","r3","ip","lr","cc","memory" ); \
|
||||||
|
* __result; })
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_cmpxchg: @ 0xffff0fc0
|
||||||
|
|
||||||
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP /* sanity check */
|
||||||
|
#error "CONFIG_SMP on a machine supporting pre-ARMv6 processors?"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Theory of operation:
|
||||||
|
*
|
||||||
|
* We set the Z flag before loading oldval. If ever an exception
|
||||||
|
* occurs we can not be sure the loaded value will still be the same
|
||||||
|
* when the exception returns, therefore the user exception handler
|
||||||
|
* will clear the Z flag whenever the interrupted user code was
|
||||||
|
* actually from the kernel address space (see the usr_entry macro).
|
||||||
|
*
|
||||||
|
* The post-increment on the str is used to prevent a race with an
|
||||||
|
* exception happening just after the str instruction which would
|
||||||
|
* clear the Z flag although the exchange was done.
|
||||||
|
*/
|
||||||
|
teq ip, ip @ set Z flag
|
||||||
|
ldr ip, [r2] @ load current val
|
||||||
|
add r3, r2, #1 @ prepare store ptr
|
||||||
|
teqeq ip, r0 @ compare with oldval if still allowed
|
||||||
|
streq r1, [r3, #-1]! @ store newval if still allowed
|
||||||
|
subs r0, r2, r3 @ if r2 == r3 the str occured
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ldrex r3, [r2]
|
||||||
|
subs r3, r3, r0
|
||||||
|
strexeq r3, r1, [r2]
|
||||||
|
rsbs r0, r3, #0
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference prototype:
|
||||||
|
*
|
||||||
|
* int __kernel_get_tls(void)
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
*
|
||||||
|
* lr = return address
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* r0 = TLS value
|
||||||
|
*
|
||||||
|
* Clobbered:
|
||||||
|
*
|
||||||
|
* the Z flag might be lost
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* typedef int (__kernel_get_tls_t)(void);
|
||||||
|
* #define __kernel_get_tls (*(__kernel_get_tls_t *)0xffff0fe0)
|
||||||
|
*
|
||||||
|
* Get the TLS value as previously set via the __ARM_NR_set_tls syscall.
|
||||||
|
*
|
||||||
|
* This could be used as follows:
|
||||||
|
*
|
||||||
|
* #define __kernel_get_tls() \
|
||||||
|
* ({ register unsigned int __val asm("r0"); \
|
||||||
|
* asm( "mov r0, #0xffff0fff; mov lr, pc; sub pc, r0, #31" \
|
||||||
|
* : "=r" (__val) : : "lr","cc" ); \
|
||||||
|
* __val; })
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_get_tls: @ 0xffff0fe0
|
||||||
|
|
||||||
|
#ifndef CONFIG_HAS_TLS_REG
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP /* sanity check */
|
||||||
|
#error "CONFIG_SMP without CONFIG_HAS_TLS_REG is wrong"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ldr r0, [pc, #(16 - 8)] @ TLS stored at 0xffff0ff0
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c13, c0, 3 @ read TLS register
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.rep 5
|
||||||
|
.word 0 @ pad up to __kuser_helper_version
|
||||||
|
.endr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference declaration:
|
||||||
|
*
|
||||||
|
* extern unsigned int __kernel_helper_version;
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* #define __kernel_helper_version (*(unsigned int *)0xffff0ffc)
|
||||||
|
*
|
||||||
|
* User space may read this to determine the curent number of helpers
|
||||||
|
* available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_helper_version: @ 0xffff0ffc
|
||||||
|
.word ((__kuser_helper_end - __kuser_helper_start) >> 5)
|
||||||
|
|
||||||
|
.globl __kuser_helper_end
|
||||||
|
__kuser_helper_end:
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Vector stubs.
|
* Vector stubs.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -693,7 +694,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
case PTRACE_SYSCALL:
|
case PTRACE_SYSCALL:
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -728,7 +729,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
*/
|
*/
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
child->ptrace |= PT_SINGLESTEP;
|
child->ptrace |= PT_SINGLESTEP;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -227,18 +227,6 @@ asmlinkage int sys_ipc(uint call, int first, int second, int third,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg,
|
|
||||||
unsigned long __user *addr)
|
|
||||||
{
|
|
||||||
unsigned long ret;
|
|
||||||
long err;
|
|
||||||
|
|
||||||
err = do_shmat(shmid, shmaddr, shmflg, &ret);
|
|
||||||
if (err == 0)
|
|
||||||
err = put_user(ret, addr);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fork a new task - this creates a new program thread.
|
/* Fork a new task - this creates a new program thread.
|
||||||
* This is called indirectly via a small wrapper
|
* This is called indirectly via a small wrapper
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -450,13 +450,17 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
|
|
||||||
case NR(set_tls):
|
case NR(set_tls):
|
||||||
thread->tp_value = regs->ARM_r0;
|
thread->tp_value = regs->ARM_r0;
|
||||||
|
#ifdef CONFIG_HAS_TLS_REG
|
||||||
|
asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
|
||||||
|
#else
|
||||||
/*
|
/*
|
||||||
* Our user accessible TLS ptr is located at 0xffff0ffc.
|
* User space must never try to access this directly.
|
||||||
* On SMP read access to this address must raise a fault
|
* Expect your app to break eventually if you do so.
|
||||||
* and be emulated from the data abort handler.
|
* The user helper at 0xffff0fe0 must be used instead.
|
||||||
* m
|
* (see entry-armv.S for details)
|
||||||
*/
|
*/
|
||||||
*((unsigned long *)0xffff0ffc) = thread->tp_value;
|
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -493,6 +497,41 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_CPU_32v6) && !defined(CONFIG_HAS_TLS_REG)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We might be running on an ARMv6+ processor which should have the TLS
|
||||||
|
* register, but for some reason we can't use it and have to emulate it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int get_tp_trap(struct pt_regs *regs, unsigned int instr)
|
||||||
|
{
|
||||||
|
int reg = (instr >> 12) & 15;
|
||||||
|
if (reg == 15)
|
||||||
|
return 1;
|
||||||
|
regs->uregs[reg] = current_thread_info()->tp_value;
|
||||||
|
regs->ARM_pc += 4;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct undef_hook arm_mrc_hook = {
|
||||||
|
.instr_mask = 0x0fff0fff,
|
||||||
|
.instr_val = 0x0e1d0f70,
|
||||||
|
.cpsr_mask = PSR_T_BIT,
|
||||||
|
.cpsr_val = 0,
|
||||||
|
.fn = get_tp_trap,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init arm_mrc_hook_init(void)
|
||||||
|
{
|
||||||
|
register_undef_hook(&arm_mrc_hook);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
late_initcall(arm_mrc_hook_init);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void __bad_xchg(volatile void *ptr, int size)
|
void __bad_xchg(volatile void *ptr, int size)
|
||||||
{
|
{
|
||||||
printk("xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n",
|
printk("xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n",
|
||||||
|
@ -580,14 +619,17 @@ void __init trap_init(void)
|
||||||
{
|
{
|
||||||
extern char __stubs_start[], __stubs_end[];
|
extern char __stubs_start[], __stubs_end[];
|
||||||
extern char __vectors_start[], __vectors_end[];
|
extern char __vectors_start[], __vectors_end[];
|
||||||
|
extern char __kuser_helper_start[], __kuser_helper_end[];
|
||||||
|
int kuser_sz = __kuser_helper_end - __kuser_helper_start;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the vectors and stubs (in entry-armv.S) into the
|
* Copy the vectors, stubs and kuser helpers (in entry-armv.S)
|
||||||
* vector page, mapped at 0xffff0000, and ensure these are
|
* into the vector page, mapped at 0xffff0000, and ensure these
|
||||||
* visible to the instruction stream.
|
* are visible to the instruction stream.
|
||||||
*/
|
*/
|
||||||
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
|
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
|
||||||
memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
|
memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
|
||||||
|
memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz);
|
||||||
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
|
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
|
||||||
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <asm/arch/imxfb.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
@ -228,6 +229,14 @@ static struct platform_device imx_uart2_device = {
|
||||||
.resource = imx_uart2_resources,
|
.resource = imx_uart2_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct imxfb_mach_info imx_fb_info;
|
||||||
|
|
||||||
|
void __init set_imx_fb_info(struct imxfb_mach_info *hard_imx_fb_info)
|
||||||
|
{
|
||||||
|
memcpy(&imx_fb_info,hard_imx_fb_info,sizeof(struct imxfb_mach_info));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(set_imx_fb_info);
|
||||||
|
|
||||||
static struct resource imxfb_resources[] = {
|
static struct resource imxfb_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = 0x00205000,
|
.start = 0x00205000,
|
||||||
|
@ -241,9 +250,16 @@ static struct resource imxfb_resources[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 fb_dma_mask = ~(u64)0;
|
||||||
|
|
||||||
static struct platform_device imxfb_device = {
|
static struct platform_device imxfb_device = {
|
||||||
.name = "imx-fb",
|
.name = "imx-fb",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &imx_fb_info,
|
||||||
|
.dma_mask = &fb_dma_mask,
|
||||||
|
.coherent_dma_mask = 0xffffffff,
|
||||||
|
},
|
||||||
.num_resources = ARRAY_SIZE(imxfb_resources),
|
.num_resources = ARRAY_SIZE(imxfb_resources),
|
||||||
.resource = imxfb_resources,
|
.resource = imxfb_resources,
|
||||||
};
|
};
|
||||||
|
|
|
@ -216,7 +216,9 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
write_seqlock(&xtime_lock);
|
write_seqlock(&xtime_lock);
|
||||||
|
|
||||||
// ...clear the interrupt
|
/*
|
||||||
|
* clear the interrupt
|
||||||
|
*/
|
||||||
timer1->TimerClear = 1;
|
timer1->TimerClear = 1;
|
||||||
|
|
||||||
timer_tick(regs);
|
timer_tick(regs);
|
||||||
|
@ -264,7 +266,7 @@ void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
||||||
timer1->TimerValue = timer_reload;
|
timer1->TimerValue = timer_reload;
|
||||||
timer1->TimerControl = timer_ctrl;
|
timer1->TimerControl = timer_ctrl;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make irqs happen for the system timer
|
* Make irqs happen for the system timer
|
||||||
*/
|
*/
|
||||||
setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
|
setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
|
||||||
|
|
|
@ -420,7 +420,22 @@ static struct clcd_panel vga = {
|
||||||
*/
|
*/
|
||||||
static void cp_clcd_enable(struct clcd_fb *fb)
|
static void cp_clcd_enable(struct clcd_fb *fb)
|
||||||
{
|
{
|
||||||
cm_control(CM_CTRL_LCDMUXSEL_MASK, CM_CTRL_LCDMUXSEL_VGA);
|
u32 val;
|
||||||
|
|
||||||
|
if (fb->fb.var.bits_per_pixel <= 8)
|
||||||
|
val = CM_CTRL_LCDMUXSEL_VGA_8421BPP;
|
||||||
|
else if (fb->fb.var.bits_per_pixel <= 16)
|
||||||
|
val = CM_CTRL_LCDMUXSEL_VGA_16BPP;
|
||||||
|
else
|
||||||
|
val = 0; /* no idea for this, don't trust the docs */
|
||||||
|
|
||||||
|
cm_control(CM_CTRL_LCDMUXSEL_MASK|
|
||||||
|
CM_CTRL_LCDEN0|
|
||||||
|
CM_CTRL_LCDEN1|
|
||||||
|
CM_CTRL_STATIC1|
|
||||||
|
CM_CTRL_STATIC2|
|
||||||
|
CM_CTRL_STATIC|
|
||||||
|
CM_CTRL_n24BITEN, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long framesize = SZ_1M;
|
static unsigned long framesize = SZ_1M;
|
||||||
|
|
|
@ -37,7 +37,7 @@ static void integrator_leds_event(led_event_t ledevt)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
||||||
unsigned int update_alpha_leds;
|
unsigned int update_alpha_leds;
|
||||||
|
|
||||||
// yup, change the LEDs
|
// yup, change the LEDs
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
update_alpha_leds = 0;
|
update_alpha_leds = 0;
|
||||||
|
|
|
@ -40,25 +40,32 @@ static int integrator_set_rtc(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtc_read_alarm(struct rtc_wkalrm *alrm)
|
static int rtc_read_alarm(struct rtc_wkalrm *alrm)
|
||||||
{
|
{
|
||||||
rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time);
|
rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
static inline int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||||
{
|
{
|
||||||
unsigned long time;
|
unsigned long time;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = rtc_tm_to_time(&alrm->time, &time);
|
/*
|
||||||
|
* At the moment, we can only deal with non-wildcarded alarm times.
|
||||||
|
*/
|
||||||
|
ret = rtc_valid_tm(&alrm->time);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = rtc_tm_to_time(&alrm->time, &time);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
writel(time, rtc_base + RTC_MR);
|
writel(time, rtc_base + RTC_MR);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtc_read_time(struct rtc_time *tm)
|
static int rtc_read_time(struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
rtc_time_to_tm(readl(rtc_base + RTC_DR), tm);
|
rtc_time_to_tm(readl(rtc_base + RTC_DR), tm);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -69,7 +76,7 @@ static void rtc_read_time(struct rtc_time *tm)
|
||||||
* edge of the 1Hz clock, we must write the time one second
|
* edge of the 1Hz clock, we must write the time one second
|
||||||
* in advance.
|
* in advance.
|
||||||
*/
|
*/
|
||||||
static int rtc_set_time(struct rtc_time *tm)
|
static inline int rtc_set_time(struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
unsigned long time;
|
unsigned long time;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -65,19 +65,102 @@ static struct sys_timer ixdp2800_timer = {
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* IXDP2800 PCI
|
* IXDP2800 PCI
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
static void __init ixdp2800_slave_disable_pci_master(void)
|
||||||
|
{
|
||||||
|
*IXP2000_PCI_CMDSTAT &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_master_wait_for_slave(void)
|
||||||
|
{
|
||||||
|
volatile u32 *addr;
|
||||||
|
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for slave NPU to configure "
|
||||||
|
"its BAR sizes\n");
|
||||||
|
|
||||||
|
addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_BASE_ADDRESS_1);
|
||||||
|
do {
|
||||||
|
*addr = 0xffffffff;
|
||||||
|
cpu_relax();
|
||||||
|
} while (*addr != 0xfe000008);
|
||||||
|
|
||||||
|
addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_BASE_ADDRESS_2);
|
||||||
|
do {
|
||||||
|
*addr = 0xffffffff;
|
||||||
|
cpu_relax();
|
||||||
|
} while (*addr != 0xc0000008);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure the slave's SDRAM BAR by hand.
|
||||||
|
*/
|
||||||
|
*addr = 0x40000008;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_slave_wait_for_master_enable(void)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for master NPU to enable us\n");
|
||||||
|
|
||||||
|
while ((*IXP2000_PCI_CMDSTAT & PCI_COMMAND_MASTER) == 0)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
void __init ixdp2800_pci_preinit(void)
|
void __init ixdp2800_pci_preinit(void)
|
||||||
{
|
{
|
||||||
printk("ixdp2x00_pci_preinit called\n");
|
printk("ixdp2x00_pci_preinit called\n");
|
||||||
|
|
||||||
*IXP2000_PCI_ADDR_EXT = 0x0000e000;
|
*IXP2000_PCI_ADDR_EXT = 0x0001e000;
|
||||||
|
|
||||||
|
if (!ixdp2x00_master_npu())
|
||||||
|
ixdp2800_slave_disable_pci_master();
|
||||||
|
|
||||||
*IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
|
||||||
*IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff;
|
*IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff;
|
||||||
|
*IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
||||||
|
|
||||||
ixp2000_pci_preinit();
|
ixp2000_pci_preinit();
|
||||||
|
|
||||||
|
if (ixdp2x00_master_npu()) {
|
||||||
|
/*
|
||||||
|
* Wait until the slave set its SRAM/SDRAM BAR sizes
|
||||||
|
* correctly before we proceed to scan and enumerate
|
||||||
|
* the bus.
|
||||||
|
*/
|
||||||
|
ixdp2800_master_wait_for_slave();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We configure the SDRAM BARs by hand because they
|
||||||
|
* are 1G and fall outside of the regular allocated
|
||||||
|
* PCI address space.
|
||||||
|
*/
|
||||||
|
*IXP2000_PCI_SDRAM_BAR = 0x00000008;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Wait for the master to complete scanning the bus
|
||||||
|
* and assigning resources before we proceed to scan
|
||||||
|
* the bus ourselves. Set pci=firmware to honor the
|
||||||
|
* master's resource assignment.
|
||||||
|
*/
|
||||||
|
ixdp2800_slave_wait_for_master_enable();
|
||||||
|
pcibios_setup("firmware");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ixdp2800_pci_setup(int nr, struct pci_sys_data *sys)
|
/*
|
||||||
|
* We assign the SDRAM BARs for the two IXP2800 CPUs by hand, outside
|
||||||
|
* of the regular PCI window, because there's only 512M of outbound PCI
|
||||||
|
* memory window on each IXP, while we need 1G for each of the BARs.
|
||||||
|
*/
|
||||||
|
static void __devinit ixp2800_pci_fixup(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
if (machine_is_ixdp2800()) {
|
||||||
|
dev->resource[2].start = 0;
|
||||||
|
dev->resource[2].end = 0;
|
||||||
|
dev->resource[2].flags = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IXP2800, ixp2800_pci_fixup);
|
||||||
|
|
||||||
|
static int __init ixdp2800_pci_setup(int nr, struct pci_sys_data *sys)
|
||||||
{
|
{
|
||||||
sys->mem_offset = 0x00000000;
|
sys->mem_offset = 0x00000000;
|
||||||
|
|
||||||
|
@ -129,22 +212,47 @@ static int __init ixdp2800_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
|
} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixdp2800_pci_postinit(void)
|
static void __init ixdp2800_master_enable_slave(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
volatile u32 *addr;
|
||||||
|
|
||||||
if (ixdp2x00_master_npu()) {
|
printk(KERN_INFO "IXDP2800: enabling slave NPU\n");
|
||||||
dev = pci_find_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
|
|
||||||
pci_remove_bus_device(dev);
|
|
||||||
} else {
|
|
||||||
dev = pci_find_slot(1, IXDP2800_MASTER_ENET_DEVFN);
|
|
||||||
pci_remove_bus_device(dev);
|
|
||||||
|
|
||||||
|
addr = (volatile u32 *)ixp2000_pci_config_addr(0,
|
||||||
|
IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_COMMAND);
|
||||||
|
|
||||||
|
*addr |= PCI_COMMAND_MASTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_master_wait_for_slave_bus_scan(void)
|
||||||
|
{
|
||||||
|
volatile u32 *addr;
|
||||||
|
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for slave to finish bus scan\n");
|
||||||
|
|
||||||
|
addr = (volatile u32 *)ixp2000_pci_config_addr(0,
|
||||||
|
IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_COMMAND);
|
||||||
|
while ((*addr & PCI_COMMAND_MEMORY) == 0)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_slave_signal_bus_scan_completion(void)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "IXDP2800: bus scan done, signaling master\n");
|
||||||
|
*IXP2000_PCI_CMDSTAT |= PCI_COMMAND_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_pci_postinit(void)
|
||||||
|
{
|
||||||
|
if (!ixdp2x00_master_npu()) {
|
||||||
ixdp2x00_slave_pci_postinit();
|
ixdp2x00_slave_pci_postinit();
|
||||||
|
ixdp2800_slave_signal_bus_scan_completion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hw_pci ixdp2800_pci __initdata = {
|
struct __initdata hw_pci ixdp2800_pci __initdata = {
|
||||||
.nr_controllers = 1,
|
.nr_controllers = 1,
|
||||||
.setup = ixdp2800_pci_setup,
|
.setup = ixdp2800_pci_setup,
|
||||||
.preinit = ixdp2800_pci_preinit,
|
.preinit = ixdp2800_pci_preinit,
|
||||||
|
@ -155,8 +263,21 @@ struct hw_pci ixdp2800_pci __initdata = {
|
||||||
|
|
||||||
int __init ixdp2800_pci_init(void)
|
int __init ixdp2800_pci_init(void)
|
||||||
{
|
{
|
||||||
if (machine_is_ixdp2800())
|
if (machine_is_ixdp2800()) {
|
||||||
|
struct pci_dev *dev;
|
||||||
|
|
||||||
pci_common_init(&ixdp2800_pci);
|
pci_common_init(&ixdp2800_pci);
|
||||||
|
if (ixdp2x00_master_npu()) {
|
||||||
|
dev = pci_find_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
|
||||||
|
pci_remove_bus_device(dev);
|
||||||
|
|
||||||
|
ixdp2800_master_enable_slave();
|
||||||
|
ixdp2800_master_wait_for_slave_bus_scan();
|
||||||
|
} else {
|
||||||
|
dev = pci_find_slot(1, IXDP2800_MASTER_ENET_DEVFN);
|
||||||
|
pci_remove_bus_device(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ static int pci_master_aborts = 0;
|
||||||
|
|
||||||
static int clear_master_aborts(void);
|
static int clear_master_aborts(void);
|
||||||
|
|
||||||
static u32 *
|
u32 *
|
||||||
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
||||||
{
|
{
|
||||||
u32 *paddress;
|
u32 *paddress;
|
||||||
|
@ -208,15 +208,15 @@ ixp2000_pci_preinit(void)
|
||||||
* use our own resource space.
|
* use our own resource space.
|
||||||
*/
|
*/
|
||||||
static struct resource ixp2000_pci_mem_space = {
|
static struct resource ixp2000_pci_mem_space = {
|
||||||
.start = 0x00000000,
|
.start = 0xe0000000,
|
||||||
.end = 0xffffffff,
|
.end = 0xffffffff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
.name = "PCI Mem Space"
|
.name = "PCI Mem Space"
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource ixp2000_pci_io_space = {
|
static struct resource ixp2000_pci_io_space = {
|
||||||
.start = 0x00000000,
|
.start = 0x00010000,
|
||||||
.end = 0xffffffff,
|
.end = 0x0001ffff,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_IO,
|
||||||
.name = "PCI I/O Space"
|
.name = "PCI I/O Space"
|
||||||
};
|
};
|
||||||
|
|
|
@ -220,6 +220,30 @@ static struct platform_device stuart_device = {
|
||||||
.id = 2,
|
.id = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource i2c_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x40301680,
|
||||||
|
.end = 0x403016a3,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_I2C,
|
||||||
|
.end = IRQ_I2C,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device i2c_device = {
|
||||||
|
.name = "pxa2xx-i2c",
|
||||||
|
.id = 0,
|
||||||
|
.resource = i2c_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(i2c_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info)
|
||||||
|
{
|
||||||
|
i2c_device.dev.platform_data = info;
|
||||||
|
}
|
||||||
|
|
||||||
static struct platform_device *devices[] __initdata = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&pxamci_device,
|
&pxamci_device,
|
||||||
&udc_device,
|
&udc_device,
|
||||||
|
@ -227,6 +251,7 @@ static struct platform_device *devices[] __initdata = {
|
||||||
&ffuart_device,
|
&ffuart_device,
|
||||||
&btuart_device,
|
&btuart_device,
|
||||||
&stuart_device,
|
&stuart_device,
|
||||||
|
&i2c_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa_init(void)
|
static int __init pxa_init(void)
|
||||||
|
|
|
@ -409,3 +409,18 @@ config CPU_BPREDICT_DISABLE
|
||||||
depends on CPU_ARM1020
|
depends on CPU_ARM1020
|
||||||
help
|
help
|
||||||
Say Y here to disable branch prediction. If unsure, say N.
|
Say Y here to disable branch prediction. If unsure, say N.
|
||||||
|
|
||||||
|
config HAS_TLS_REG
|
||||||
|
bool
|
||||||
|
depends on CPU_32v6 && !CPU_32v5 && !CPU_32v4 && !CPU_32v3
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
This selects support for the CP15 thread register.
|
||||||
|
It is defined to be available on ARMv6 or later. However
|
||||||
|
if the kernel is configured to support multiple CPUs including
|
||||||
|
a pre-ARMv6 processors, or if a given ARMv6 processor doesn't
|
||||||
|
implement the thread register for some reason, then access to
|
||||||
|
this register from user space must be trapped and emulated.
|
||||||
|
If user space is relying on the __kuser_get_tls code then
|
||||||
|
there should not be any impact.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "abort-macro.S"
|
||||||
/*
|
/*
|
||||||
* Function: v6_early_abort
|
* Function: v6_early_abort
|
||||||
*
|
*
|
||||||
|
@ -13,11 +14,26 @@
|
||||||
* : sp = pointer to registers
|
* : sp = pointer to registers
|
||||||
*
|
*
|
||||||
* Purpose : obtain information about current aborted instruction.
|
* Purpose : obtain information about current aborted instruction.
|
||||||
|
* Note: we read user space. This means we might cause a data
|
||||||
|
* abort here if the I-TLB and D-TLB aren't seeing the same
|
||||||
|
* picture. Unfortunately, this does happen. We live with it.
|
||||||
*/
|
*/
|
||||||
.align 5
|
.align 5
|
||||||
ENTRY(v6_early_abort)
|
ENTRY(v6_early_abort)
|
||||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||||
|
/*
|
||||||
|
* Faulty SWP instruction on 1136 doesn't set bit 11 in DFSR.
|
||||||
|
* The test below covers all the write situations, including Java bytecodes
|
||||||
|
*/
|
||||||
|
bic r1, r1, #1 << 11 | 1 << 10 @ clear bits 11 and 10 of FSR
|
||||||
|
tst r3, #PSR_J_BIT @ Java?
|
||||||
|
movne pc, lr
|
||||||
|
do_thumb_abort
|
||||||
|
ldreq r3, [r2] @ read aborted ARM instruction
|
||||||
|
do_ldrd_abort
|
||||||
|
tst r3, #1 << 20 @ L = 0 -> write
|
||||||
|
orreq r1, r1, #1 << 11 @ yes.
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -411,9 +411,10 @@ static void __init build_mem_type_table(void)
|
||||||
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
||||||
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
||||||
/*
|
/*
|
||||||
* Mark cache clean areas read only from SVC mode
|
* Mark cache clean areas and XIP ROM read only
|
||||||
* and no access from userspace.
|
* from SVC mode and no access from userspace.
|
||||||
*/
|
*/
|
||||||
|
mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -591,7 +592,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
case PTRACE_SYSCALL:
|
case PTRACE_SYSCALL:
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -626,7 +627,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
*/
|
*/
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
child->ptrace |= PT_SINGLESTEP;
|
child->ptrace |= PT_SINGLESTEP;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -92,8 +92,7 @@ static unsigned long __get_small_page(int priority, struct order *order)
|
||||||
page = list_entry(order->queue.next, struct page, lru);
|
page = list_entry(order->queue.next, struct page, lru);
|
||||||
again:
|
again:
|
||||||
#ifdef PEDANTIC
|
#ifdef PEDANTIC
|
||||||
if (USED_MAP(page) & ~order->all_used)
|
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||||
PAGE_BUG(page);
|
|
||||||
#endif
|
#endif
|
||||||
offset = ffz(USED_MAP(page));
|
offset = ffz(USED_MAP(page));
|
||||||
SET_USED(page, offset);
|
SET_USED(page, offset);
|
||||||
|
@ -141,8 +140,7 @@ static void __free_small_page(unsigned long spage, struct order *order)
|
||||||
goto non_small;
|
goto non_small;
|
||||||
|
|
||||||
#ifdef PEDANTIC
|
#ifdef PEDANTIC
|
||||||
if (USED_MAP(page) & ~order->all_used)
|
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||||
PAGE_BUG(page);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spage = spage >> order->shift;
|
spage = spage >> order->shift;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -184,7 +185,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
|
@ -219,7 +220,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -239,7 +240,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -267,7 +268,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
ptrace_enable(child);
|
ptrace_enable(child);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -171,7 +172,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: { /* restart after signal. */
|
case PTRACE_CONT: { /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data >= _NSIG)
|
if (!valid_signal(data))
|
||||||
break ;
|
break ;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -202,7 +203,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
|
|
||||||
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
child->exit_code = data;
|
child->exit_code = data;
|
||||||
|
|
|
@ -653,6 +653,24 @@ config I8K
|
||||||
Say Y if you intend to run this kernel on a Dell Inspiron 8000.
|
Say Y if you intend to run this kernel on a Dell Inspiron 8000.
|
||||||
Say N otherwise.
|
Say N otherwise.
|
||||||
|
|
||||||
|
config X86_REBOOTFIXUPS
|
||||||
|
bool "Enable X86 board specific fixups for reboot"
|
||||||
|
depends on X86
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
This enables chipset and/or board specific fixups to be done
|
||||||
|
in order to get reboot to work correctly. This is only needed on
|
||||||
|
some combinations of hardware and BIOS. The symptom, for which
|
||||||
|
this config is intended, is when reboot ends with a stalled/hung
|
||||||
|
system.
|
||||||
|
|
||||||
|
Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1.
|
||||||
|
combination.
|
||||||
|
|
||||||
|
Say Y if you want to enable the fixup. Currently, it's safe to
|
||||||
|
enable this option even if you don't need it.
|
||||||
|
Say N otherwise.
|
||||||
|
|
||||||
config MICROCODE
|
config MICROCODE
|
||||||
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -123,7 +123,7 @@ AFLAGS += $(mflags-y)
|
||||||
boot := arch/i386/boot
|
boot := arch/i386/boot
|
||||||
|
|
||||||
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
||||||
zdisk bzdisk fdimage fdimage144 fdimage288 install
|
zdisk bzdisk fdimage fdimage144 fdimage288 install kernel_install
|
||||||
|
|
||||||
all: bzImage
|
all: bzImage
|
||||||
|
|
||||||
|
@ -145,8 +145,9 @@ zdisk bzdisk: vmlinux
|
||||||
fdimage fdimage144 fdimage288: vmlinux
|
fdimage fdimage144 fdimage288: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||||
|
|
||||||
install:
|
install: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
install kernel_install:
|
||||||
|
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
|
||||||
|
|
||||||
prepare: include/asm-$(ARCH)/asm_offsets.h
|
prepare: include/asm-$(ARCH)/asm_offsets.h
|
||||||
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <video/edid.h>
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -164,7 +164,7 @@ ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
|
||||||
trampoline: call start_of_setup
|
trampoline: call start_of_setup
|
||||||
.align 16
|
.align 16
|
||||||
# The offset at this point is 0x240
|
# The offset at this point is 0x240
|
||||||
.space (0x7ff-0x240+1) # E820 & EDD space (ending at 0x7ff)
|
.space (0xeff-0x240+1) # E820 & EDD space (ending at 0xeff)
|
||||||
# End of setup header #####################################################
|
# End of setup header #####################################################
|
||||||
|
|
||||||
start_of_setup:
|
start_of_setup:
|
||||||
|
@ -333,9 +333,9 @@ jmpe820:
|
||||||
# sizeof(e820rec).
|
# sizeof(e820rec).
|
||||||
#
|
#
|
||||||
good820:
|
good820:
|
||||||
movb (E820NR), %al # up to 32 entries
|
movb (E820NR), %al # up to 128 entries
|
||||||
cmpb $E820MAX, %al
|
cmpb $E820MAX, %al
|
||||||
jnl bail820
|
jae bail820
|
||||||
|
|
||||||
incb (E820NR)
|
incb (E820NR)
|
||||||
movw %di, %ax
|
movw %di, %ax
|
||||||
|
|
|
@ -23,6 +23,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
|
||||||
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
||||||
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
||||||
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
||||||
|
obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups.o
|
||||||
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
||||||
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
||||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||||
|
|
|
@ -1265,8 +1265,6 @@ int __init APIC_init_uniprocessor (void)
|
||||||
|
|
||||||
setup_local_APIC();
|
setup_local_APIC();
|
||||||
|
|
||||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
|
||||||
check_nmi_watchdog();
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
if (smp_found_config)
|
if (smp_found_config)
|
||||||
if (!skip_ioapic_setup && nr_ioapics)
|
if (!skip_ioapic_setup && nr_ioapics)
|
||||||
|
|
|
@ -124,8 +124,8 @@ int generic_get_free_region(unsigned long base, unsigned long size)
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||||
unsigned int *size, mtrr_type * type)
|
unsigned int *size, mtrr_type * type)
|
||||||
{
|
{
|
||||||
unsigned int mask_lo, mask_hi, base_lo, base_hi;
|
unsigned int mask_lo, mask_hi, base_lo, base_hi;
|
||||||
|
|
||||||
|
|
|
@ -72,17 +72,21 @@ void set_mtrr_ops(struct mtrr_ops * ops)
|
||||||
static int have_wrcomb(void)
|
static int have_wrcomb(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
u8 rev;
|
||||||
|
|
||||||
if ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
|
if ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
|
||||||
/* ServerWorks LE chipsets have problems with write-combining
|
/* ServerWorks LE chipsets < rev 6 have problems with write-combining
|
||||||
Don't allow it and leave room for other chipsets to be tagged */
|
Don't allow it and leave room for other chipsets to be tagged */
|
||||||
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
||||||
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
||||||
printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
|
pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
|
||||||
pci_dev_put(dev);
|
if (rev <= 5) {
|
||||||
return 0;
|
printk(KERN_INFO "mtrr: Serverworks LE rev < 6 detected. Write-combining disabled.\n");
|
||||||
|
pci_dev_put(dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Intel 450NX errata # 23. Non ascending cachline evictions to
|
/* Intel 450NX errata # 23. Non ascending cacheline evictions to
|
||||||
write combining memory may resulting in data corruption */
|
write combining memory may resulting in data corruption */
|
||||||
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||||
dev->device == PCI_DEVICE_ID_INTEL_82451NX) {
|
dev->device == PCI_DEVICE_ID_INTEL_82451NX) {
|
||||||
|
|
|
@ -25,7 +25,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||||
"fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "pbe",
|
"fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "pbe",
|
||||||
|
|
||||||
/* AMD-defined */
|
/* AMD-defined */
|
||||||
"pni", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
|
||||||
NULL, NULL, NULL, "mp", "nx", NULL, "mmxext", NULL,
|
NULL, NULL, NULL, "mp", "nx", NULL, "mmxext", NULL,
|
||||||
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
||||||
|
|
|
@ -260,11 +260,9 @@ restore_nocheck:
|
||||||
.section .fixup,"ax"
|
.section .fixup,"ax"
|
||||||
iret_exc:
|
iret_exc:
|
||||||
sti
|
sti
|
||||||
movl $__USER_DS, %edx
|
pushl $0 # no error code
|
||||||
movl %edx, %ds
|
pushl $do_iret_error
|
||||||
movl %edx, %es
|
jmp error_code
|
||||||
movl $11,%eax
|
|
||||||
call do_exit
|
|
||||||
.previous
|
.previous
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -516,8 +514,6 @@ debug_stack_correct:
|
||||||
xorl %edx,%edx # error code 0
|
xorl %edx,%edx # error code 0
|
||||||
movl %esp,%eax # pt_regs pointer
|
movl %esp,%eax # pt_regs pointer
|
||||||
call do_debug
|
call do_debug
|
||||||
testl %eax,%eax
|
|
||||||
jnz restore_all
|
|
||||||
jmp ret_from_exception
|
jmp ret_from_exception
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -598,8 +594,6 @@ ENTRY(int3)
|
||||||
xorl %edx,%edx # zero error code
|
xorl %edx,%edx # zero error code
|
||||||
movl %esp,%eax # pt_regs pointer
|
movl %esp,%eax # pt_regs pointer
|
||||||
call do_int3
|
call do_int3
|
||||||
testl %eax,%eax
|
|
||||||
jnz restore_all
|
|
||||||
jmp ret_from_exception
|
jmp ret_from_exception
|
||||||
|
|
||||||
ENTRY(overflow)
|
ENTRY(overflow)
|
||||||
|
@ -658,296 +652,6 @@ ENTRY(spurious_interrupt_bug)
|
||||||
pushl $do_spurious_interrupt_bug
|
pushl $do_spurious_interrupt_bug
|
||||||
jmp error_code
|
jmp error_code
|
||||||
|
|
||||||
.data
|
#include "syscall_table.S"
|
||||||
ENTRY(sys_call_table)
|
|
||||||
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
|
|
||||||
.long sys_exit
|
|
||||||
.long sys_fork
|
|
||||||
.long sys_read
|
|
||||||
.long sys_write
|
|
||||||
.long sys_open /* 5 */
|
|
||||||
.long sys_close
|
|
||||||
.long sys_waitpid
|
|
||||||
.long sys_creat
|
|
||||||
.long sys_link
|
|
||||||
.long sys_unlink /* 10 */
|
|
||||||
.long sys_execve
|
|
||||||
.long sys_chdir
|
|
||||||
.long sys_time
|
|
||||||
.long sys_mknod
|
|
||||||
.long sys_chmod /* 15 */
|
|
||||||
.long sys_lchown16
|
|
||||||
.long sys_ni_syscall /* old break syscall holder */
|
|
||||||
.long sys_stat
|
|
||||||
.long sys_lseek
|
|
||||||
.long sys_getpid /* 20 */
|
|
||||||
.long sys_mount
|
|
||||||
.long sys_oldumount
|
|
||||||
.long sys_setuid16
|
|
||||||
.long sys_getuid16
|
|
||||||
.long sys_stime /* 25 */
|
|
||||||
.long sys_ptrace
|
|
||||||
.long sys_alarm
|
|
||||||
.long sys_fstat
|
|
||||||
.long sys_pause
|
|
||||||
.long sys_utime /* 30 */
|
|
||||||
.long sys_ni_syscall /* old stty syscall holder */
|
|
||||||
.long sys_ni_syscall /* old gtty syscall holder */
|
|
||||||
.long sys_access
|
|
||||||
.long sys_nice
|
|
||||||
.long sys_ni_syscall /* 35 - old ftime syscall holder */
|
|
||||||
.long sys_sync
|
|
||||||
.long sys_kill
|
|
||||||
.long sys_rename
|
|
||||||
.long sys_mkdir
|
|
||||||
.long sys_rmdir /* 40 */
|
|
||||||
.long sys_dup
|
|
||||||
.long sys_pipe
|
|
||||||
.long sys_times
|
|
||||||
.long sys_ni_syscall /* old prof syscall holder */
|
|
||||||
.long sys_brk /* 45 */
|
|
||||||
.long sys_setgid16
|
|
||||||
.long sys_getgid16
|
|
||||||
.long sys_signal
|
|
||||||
.long sys_geteuid16
|
|
||||||
.long sys_getegid16 /* 50 */
|
|
||||||
.long sys_acct
|
|
||||||
.long sys_umount /* recycled never used phys() */
|
|
||||||
.long sys_ni_syscall /* old lock syscall holder */
|
|
||||||
.long sys_ioctl
|
|
||||||
.long sys_fcntl /* 55 */
|
|
||||||
.long sys_ni_syscall /* old mpx syscall holder */
|
|
||||||
.long sys_setpgid
|
|
||||||
.long sys_ni_syscall /* old ulimit syscall holder */
|
|
||||||
.long sys_olduname
|
|
||||||
.long sys_umask /* 60 */
|
|
||||||
.long sys_chroot
|
|
||||||
.long sys_ustat
|
|
||||||
.long sys_dup2
|
|
||||||
.long sys_getppid
|
|
||||||
.long sys_getpgrp /* 65 */
|
|
||||||
.long sys_setsid
|
|
||||||
.long sys_sigaction
|
|
||||||
.long sys_sgetmask
|
|
||||||
.long sys_ssetmask
|
|
||||||
.long sys_setreuid16 /* 70 */
|
|
||||||
.long sys_setregid16
|
|
||||||
.long sys_sigsuspend
|
|
||||||
.long sys_sigpending
|
|
||||||
.long sys_sethostname
|
|
||||||
.long sys_setrlimit /* 75 */
|
|
||||||
.long sys_old_getrlimit
|
|
||||||
.long sys_getrusage
|
|
||||||
.long sys_gettimeofday
|
|
||||||
.long sys_settimeofday
|
|
||||||
.long sys_getgroups16 /* 80 */
|
|
||||||
.long sys_setgroups16
|
|
||||||
.long old_select
|
|
||||||
.long sys_symlink
|
|
||||||
.long sys_lstat
|
|
||||||
.long sys_readlink /* 85 */
|
|
||||||
.long sys_uselib
|
|
||||||
.long sys_swapon
|
|
||||||
.long sys_reboot
|
|
||||||
.long old_readdir
|
|
||||||
.long old_mmap /* 90 */
|
|
||||||
.long sys_munmap
|
|
||||||
.long sys_truncate
|
|
||||||
.long sys_ftruncate
|
|
||||||
.long sys_fchmod
|
|
||||||
.long sys_fchown16 /* 95 */
|
|
||||||
.long sys_getpriority
|
|
||||||
.long sys_setpriority
|
|
||||||
.long sys_ni_syscall /* old profil syscall holder */
|
|
||||||
.long sys_statfs
|
|
||||||
.long sys_fstatfs /* 100 */
|
|
||||||
.long sys_ioperm
|
|
||||||
.long sys_socketcall
|
|
||||||
.long sys_syslog
|
|
||||||
.long sys_setitimer
|
|
||||||
.long sys_getitimer /* 105 */
|
|
||||||
.long sys_newstat
|
|
||||||
.long sys_newlstat
|
|
||||||
.long sys_newfstat
|
|
||||||
.long sys_uname
|
|
||||||
.long sys_iopl /* 110 */
|
|
||||||
.long sys_vhangup
|
|
||||||
.long sys_ni_syscall /* old "idle" system call */
|
|
||||||
.long sys_vm86old
|
|
||||||
.long sys_wait4
|
|
||||||
.long sys_swapoff /* 115 */
|
|
||||||
.long sys_sysinfo
|
|
||||||
.long sys_ipc
|
|
||||||
.long sys_fsync
|
|
||||||
.long sys_sigreturn
|
|
||||||
.long sys_clone /* 120 */
|
|
||||||
.long sys_setdomainname
|
|
||||||
.long sys_newuname
|
|
||||||
.long sys_modify_ldt
|
|
||||||
.long sys_adjtimex
|
|
||||||
.long sys_mprotect /* 125 */
|
|
||||||
.long sys_sigprocmask
|
|
||||||
.long sys_ni_syscall /* old "create_module" */
|
|
||||||
.long sys_init_module
|
|
||||||
.long sys_delete_module
|
|
||||||
.long sys_ni_syscall /* 130: old "get_kernel_syms" */
|
|
||||||
.long sys_quotactl
|
|
||||||
.long sys_getpgid
|
|
||||||
.long sys_fchdir
|
|
||||||
.long sys_bdflush
|
|
||||||
.long sys_sysfs /* 135 */
|
|
||||||
.long sys_personality
|
|
||||||
.long sys_ni_syscall /* reserved for afs_syscall */
|
|
||||||
.long sys_setfsuid16
|
|
||||||
.long sys_setfsgid16
|
|
||||||
.long sys_llseek /* 140 */
|
|
||||||
.long sys_getdents
|
|
||||||
.long sys_select
|
|
||||||
.long sys_flock
|
|
||||||
.long sys_msync
|
|
||||||
.long sys_readv /* 145 */
|
|
||||||
.long sys_writev
|
|
||||||
.long sys_getsid
|
|
||||||
.long sys_fdatasync
|
|
||||||
.long sys_sysctl
|
|
||||||
.long sys_mlock /* 150 */
|
|
||||||
.long sys_munlock
|
|
||||||
.long sys_mlockall
|
|
||||||
.long sys_munlockall
|
|
||||||
.long sys_sched_setparam
|
|
||||||
.long sys_sched_getparam /* 155 */
|
|
||||||
.long sys_sched_setscheduler
|
|
||||||
.long sys_sched_getscheduler
|
|
||||||
.long sys_sched_yield
|
|
||||||
.long sys_sched_get_priority_max
|
|
||||||
.long sys_sched_get_priority_min /* 160 */
|
|
||||||
.long sys_sched_rr_get_interval
|
|
||||||
.long sys_nanosleep
|
|
||||||
.long sys_mremap
|
|
||||||
.long sys_setresuid16
|
|
||||||
.long sys_getresuid16 /* 165 */
|
|
||||||
.long sys_vm86
|
|
||||||
.long sys_ni_syscall /* Old sys_query_module */
|
|
||||||
.long sys_poll
|
|
||||||
.long sys_nfsservctl
|
|
||||||
.long sys_setresgid16 /* 170 */
|
|
||||||
.long sys_getresgid16
|
|
||||||
.long sys_prctl
|
|
||||||
.long sys_rt_sigreturn
|
|
||||||
.long sys_rt_sigaction
|
|
||||||
.long sys_rt_sigprocmask /* 175 */
|
|
||||||
.long sys_rt_sigpending
|
|
||||||
.long sys_rt_sigtimedwait
|
|
||||||
.long sys_rt_sigqueueinfo
|
|
||||||
.long sys_rt_sigsuspend
|
|
||||||
.long sys_pread64 /* 180 */
|
|
||||||
.long sys_pwrite64
|
|
||||||
.long sys_chown16
|
|
||||||
.long sys_getcwd
|
|
||||||
.long sys_capget
|
|
||||||
.long sys_capset /* 185 */
|
|
||||||
.long sys_sigaltstack
|
|
||||||
.long sys_sendfile
|
|
||||||
.long sys_ni_syscall /* reserved for streams1 */
|
|
||||||
.long sys_ni_syscall /* reserved for streams2 */
|
|
||||||
.long sys_vfork /* 190 */
|
|
||||||
.long sys_getrlimit
|
|
||||||
.long sys_mmap2
|
|
||||||
.long sys_truncate64
|
|
||||||
.long sys_ftruncate64
|
|
||||||
.long sys_stat64 /* 195 */
|
|
||||||
.long sys_lstat64
|
|
||||||
.long sys_fstat64
|
|
||||||
.long sys_lchown
|
|
||||||
.long sys_getuid
|
|
||||||
.long sys_getgid /* 200 */
|
|
||||||
.long sys_geteuid
|
|
||||||
.long sys_getegid
|
|
||||||
.long sys_setreuid
|
|
||||||
.long sys_setregid
|
|
||||||
.long sys_getgroups /* 205 */
|
|
||||||
.long sys_setgroups
|
|
||||||
.long sys_fchown
|
|
||||||
.long sys_setresuid
|
|
||||||
.long sys_getresuid
|
|
||||||
.long sys_setresgid /* 210 */
|
|
||||||
.long sys_getresgid
|
|
||||||
.long sys_chown
|
|
||||||
.long sys_setuid
|
|
||||||
.long sys_setgid
|
|
||||||
.long sys_setfsuid /* 215 */
|
|
||||||
.long sys_setfsgid
|
|
||||||
.long sys_pivot_root
|
|
||||||
.long sys_mincore
|
|
||||||
.long sys_madvise
|
|
||||||
.long sys_getdents64 /* 220 */
|
|
||||||
.long sys_fcntl64
|
|
||||||
.long sys_ni_syscall /* reserved for TUX */
|
|
||||||
.long sys_ni_syscall
|
|
||||||
.long sys_gettid
|
|
||||||
.long sys_readahead /* 225 */
|
|
||||||
.long sys_setxattr
|
|
||||||
.long sys_lsetxattr
|
|
||||||
.long sys_fsetxattr
|
|
||||||
.long sys_getxattr
|
|
||||||
.long sys_lgetxattr /* 230 */
|
|
||||||
.long sys_fgetxattr
|
|
||||||
.long sys_listxattr
|
|
||||||
.long sys_llistxattr
|
|
||||||
.long sys_flistxattr
|
|
||||||
.long sys_removexattr /* 235 */
|
|
||||||
.long sys_lremovexattr
|
|
||||||
.long sys_fremovexattr
|
|
||||||
.long sys_tkill
|
|
||||||
.long sys_sendfile64
|
|
||||||
.long sys_futex /* 240 */
|
|
||||||
.long sys_sched_setaffinity
|
|
||||||
.long sys_sched_getaffinity
|
|
||||||
.long sys_set_thread_area
|
|
||||||
.long sys_get_thread_area
|
|
||||||
.long sys_io_setup /* 245 */
|
|
||||||
.long sys_io_destroy
|
|
||||||
.long sys_io_getevents
|
|
||||||
.long sys_io_submit
|
|
||||||
.long sys_io_cancel
|
|
||||||
.long sys_fadvise64 /* 250 */
|
|
||||||
.long sys_ni_syscall
|
|
||||||
.long sys_exit_group
|
|
||||||
.long sys_lookup_dcookie
|
|
||||||
.long sys_epoll_create
|
|
||||||
.long sys_epoll_ctl /* 255 */
|
|
||||||
.long sys_epoll_wait
|
|
||||||
.long sys_remap_file_pages
|
|
||||||
.long sys_set_tid_address
|
|
||||||
.long sys_timer_create
|
|
||||||
.long sys_timer_settime /* 260 */
|
|
||||||
.long sys_timer_gettime
|
|
||||||
.long sys_timer_getoverrun
|
|
||||||
.long sys_timer_delete
|
|
||||||
.long sys_clock_settime
|
|
||||||
.long sys_clock_gettime /* 265 */
|
|
||||||
.long sys_clock_getres
|
|
||||||
.long sys_clock_nanosleep
|
|
||||||
.long sys_statfs64
|
|
||||||
.long sys_fstatfs64
|
|
||||||
.long sys_tgkill /* 270 */
|
|
||||||
.long sys_utimes
|
|
||||||
.long sys_fadvise64_64
|
|
||||||
.long sys_ni_syscall /* sys_vserver */
|
|
||||||
.long sys_mbind
|
|
||||||
.long sys_get_mempolicy
|
|
||||||
.long sys_set_mempolicy
|
|
||||||
.long sys_mq_open
|
|
||||||
.long sys_mq_unlink
|
|
||||||
.long sys_mq_timedsend
|
|
||||||
.long sys_mq_timedreceive /* 280 */
|
|
||||||
.long sys_mq_notify
|
|
||||||
.long sys_mq_getsetattr
|
|
||||||
.long sys_ni_syscall /* reserved for kexec */
|
|
||||||
.long sys_waitid
|
|
||||||
.long sys_ni_syscall /* 285 */ /* available */
|
|
||||||
.long sys_add_key
|
|
||||||
.long sys_request_key
|
|
||||||
.long sys_keyctl
|
|
||||||
|
|
||||||
syscall_table_size=(.-sys_call_table)
|
syscall_table_size=(.-sys_call_table)
|
||||||
|
|
|
@ -380,6 +380,7 @@ rp_sidt:
|
||||||
ALIGN
|
ALIGN
|
||||||
ignore_int:
|
ignore_int:
|
||||||
cld
|
cld
|
||||||
|
#ifdef CONFIG_PRINTK
|
||||||
pushl %eax
|
pushl %eax
|
||||||
pushl %ecx
|
pushl %ecx
|
||||||
pushl %edx
|
pushl %edx
|
||||||
|
@ -400,6 +401,7 @@ ignore_int:
|
||||||
popl %edx
|
popl %edx
|
||||||
popl %ecx
|
popl %ecx
|
||||||
popl %eax
|
popl %eax
|
||||||
|
#endif
|
||||||
iret
|
iret
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2175,7 +2175,6 @@ static inline void check_timer(void)
|
||||||
disable_8259A_irq(0);
|
disable_8259A_irq(0);
|
||||||
setup_nmi();
|
setup_nmi();
|
||||||
enable_8259A_irq(0);
|
enable_8259A_irq(0);
|
||||||
check_nmi_watchdog();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2198,7 +2197,6 @@ static inline void check_timer(void)
|
||||||
add_pin_to_irq(0, 0, pin2);
|
add_pin_to_irq(0, 0, pin2);
|
||||||
if (nmi_watchdog == NMI_IO_APIC) {
|
if (nmi_watchdog == NMI_IO_APIC) {
|
||||||
setup_nmi();
|
setup_nmi();
|
||||||
check_nmi_watchdog();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,20 +102,21 @@ int nmi_active;
|
||||||
(P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \
|
(P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \
|
||||||
P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
|
P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
|
||||||
|
|
||||||
int __init check_nmi_watchdog (void)
|
static int __init check_nmi_watchdog(void)
|
||||||
{
|
{
|
||||||
unsigned int prev_nmi_count[NR_CPUS];
|
unsigned int prev_nmi_count[NR_CPUS];
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
printk(KERN_INFO "testing NMI watchdog ... ");
|
if (nmi_watchdog == NMI_NONE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
printk(KERN_INFO "Testing NMI watchdog ... ");
|
||||||
|
|
||||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||||
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
mdelay((10*1000)/nmi_hz); // wait 10 ticks
|
mdelay((10*1000)/nmi_hz); // wait 10 ticks
|
||||||
|
|
||||||
/* FIXME: Only boot CPU is online at this stage. Check CPUs
|
|
||||||
as they come up. */
|
|
||||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Check cpu_callin_map here because that is set
|
/* Check cpu_callin_map here because that is set
|
||||||
|
@ -139,6 +140,8 @@ int __init check_nmi_watchdog (void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* This needs to happen later in boot so counters are working */
|
||||||
|
late_initcall(check_nmi_watchdog);
|
||||||
|
|
||||||
static int __init setup_nmi_watchdog(char *str)
|
static int __init setup_nmi_watchdog(char *str)
|
||||||
{
|
{
|
||||||
|
|
|
@ -611,8 +611,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
|
||||||
* Save away %fs and %gs. No need to save %es and %ds, as
|
* Save away %fs and %gs. No need to save %es and %ds, as
|
||||||
* those are always kernel segments while inside the kernel.
|
* those are always kernel segments while inside the kernel.
|
||||||
*/
|
*/
|
||||||
asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs));
|
asm volatile("mov %%fs,%0":"=m" (prev->fs));
|
||||||
asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs));
|
asm volatile("mov %%gs,%0":"=m" (prev->gs));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore %fs and %gs if needed.
|
* Restore %fs and %gs if needed.
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
#include <linux/seccomp.h>
|
#include <linux/seccomp.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -511,7 +512,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -543,7 +544,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
set_singlestep(child);
|
set_singlestep(child);
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include "mach_reboot.h"
|
#include "mach_reboot.h"
|
||||||
|
#include <linux/reboot_fixups.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Power off function, if any
|
* Power off function, if any
|
||||||
|
@ -348,6 +349,7 @@ void machine_restart(char * __unused)
|
||||||
/* rebooting needs to touch the page at absolute addr 0 */
|
/* rebooting needs to touch the page at absolute addr 0 */
|
||||||
*((unsigned short *)__va(0x472)) = reboot_mode;
|
*((unsigned short *)__va(0x472)) = reboot_mode;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
mach_reboot_fixups(); /* for board specific fixups */
|
||||||
mach_reboot();
|
mach_reboot();
|
||||||
/* That didn't work - force a triple fault.. */
|
/* That didn't work - force a triple fault.. */
|
||||||
__asm__ __volatile__("lidt %0": :"m" (no_idt));
|
__asm__ __volatile__("lidt %0": :"m" (no_idt));
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/i386/kernel/reboot_fixups.c
|
||||||
|
*
|
||||||
|
* This is a good place to put board specific reboot fixups.
|
||||||
|
*
|
||||||
|
* List of supported fixups:
|
||||||
|
* geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/delay.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
|
|
||||||
|
static void cs5530a_warm_reset(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
/* writing 1 to the reset control register, 0x44 causes the
|
||||||
|
cs5530a to perform a system warm reset */
|
||||||
|
pci_write_config_byte(dev, 0x44, 0x1);
|
||||||
|
udelay(50); /* shouldn't get here but be safe and spin-a-while */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct device_fixup {
|
||||||
|
unsigned int vendor;
|
||||||
|
unsigned int device;
|
||||||
|
void (*reboot_fixup)(struct pci_dev *);
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct device_fixup fixups_table[] = {
|
||||||
|
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we see if any fixup is available for our current hardware. if there
|
||||||
|
* is a fixup, we call it and we expect to never return from it. if we
|
||||||
|
* do return, we keep looking and then eventually fall back to the
|
||||||
|
* standard mach_reboot on return.
|
||||||
|
*/
|
||||||
|
void mach_reboot_fixups(void)
|
||||||
|
{
|
||||||
|
struct device_fixup *cur;
|
||||||
|
struct pci_dev *dev;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i < (sizeof(fixups_table)/sizeof(fixups_table[0])); i++) {
|
||||||
|
cur = &(fixups_table[i]);
|
||||||
|
dev = pci_get_device(cur->vendor, cur->device, 0);
|
||||||
|
if (!dev)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cur->reboot_fixup(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_WARNING "No reboot fixup found for your hardware\n");
|
||||||
|
}
|
||||||
|
|
|
@ -1089,9 +1089,6 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
|
||||||
check_nmi_watchdog();
|
|
||||||
|
|
||||||
smpboot_setup_io_apic();
|
smpboot_setup_io_apic();
|
||||||
|
|
||||||
setup_boot_APIC_clock();
|
setup_boot_APIC_clock();
|
||||||
|
|
|
@ -0,0 +1,291 @@
|
||||||
|
.data
|
||||||
|
ENTRY(sys_call_table)
|
||||||
|
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
|
||||||
|
.long sys_exit
|
||||||
|
.long sys_fork
|
||||||
|
.long sys_read
|
||||||
|
.long sys_write
|
||||||
|
.long sys_open /* 5 */
|
||||||
|
.long sys_close
|
||||||
|
.long sys_waitpid
|
||||||
|
.long sys_creat
|
||||||
|
.long sys_link
|
||||||
|
.long sys_unlink /* 10 */
|
||||||
|
.long sys_execve
|
||||||
|
.long sys_chdir
|
||||||
|
.long sys_time
|
||||||
|
.long sys_mknod
|
||||||
|
.long sys_chmod /* 15 */
|
||||||
|
.long sys_lchown16
|
||||||
|
.long sys_ni_syscall /* old break syscall holder */
|
||||||
|
.long sys_stat
|
||||||
|
.long sys_lseek
|
||||||
|
.long sys_getpid /* 20 */
|
||||||
|
.long sys_mount
|
||||||
|
.long sys_oldumount
|
||||||
|
.long sys_setuid16
|
||||||
|
.long sys_getuid16
|
||||||
|
.long sys_stime /* 25 */
|
||||||
|
.long sys_ptrace
|
||||||
|
.long sys_alarm
|
||||||
|
.long sys_fstat
|
||||||
|
.long sys_pause
|
||||||
|
.long sys_utime /* 30 */
|
||||||
|
.long sys_ni_syscall /* old stty syscall holder */
|
||||||
|
.long sys_ni_syscall /* old gtty syscall holder */
|
||||||
|
.long sys_access
|
||||||
|
.long sys_nice
|
||||||
|
.long sys_ni_syscall /* 35 - old ftime syscall holder */
|
||||||
|
.long sys_sync
|
||||||
|
.long sys_kill
|
||||||
|
.long sys_rename
|
||||||
|
.long sys_mkdir
|
||||||
|
.long sys_rmdir /* 40 */
|
||||||
|
.long sys_dup
|
||||||
|
.long sys_pipe
|
||||||
|
.long sys_times
|
||||||
|
.long sys_ni_syscall /* old prof syscall holder */
|
||||||
|
.long sys_brk /* 45 */
|
||||||
|
.long sys_setgid16
|
||||||
|
.long sys_getgid16
|
||||||
|
.long sys_signal
|
||||||
|
.long sys_geteuid16
|
||||||
|
.long sys_getegid16 /* 50 */
|
||||||
|
.long sys_acct
|
||||||
|
.long sys_umount /* recycled never used phys() */
|
||||||
|
.long sys_ni_syscall /* old lock syscall holder */
|
||||||
|
.long sys_ioctl
|
||||||
|
.long sys_fcntl /* 55 */
|
||||||
|
.long sys_ni_syscall /* old mpx syscall holder */
|
||||||
|
.long sys_setpgid
|
||||||
|
.long sys_ni_syscall /* old ulimit syscall holder */
|
||||||
|
.long sys_olduname
|
||||||
|
.long sys_umask /* 60 */
|
||||||
|
.long sys_chroot
|
||||||
|
.long sys_ustat
|
||||||
|
.long sys_dup2
|
||||||
|
.long sys_getppid
|
||||||
|
.long sys_getpgrp /* 65 */
|
||||||
|
.long sys_setsid
|
||||||
|
.long sys_sigaction
|
||||||
|
.long sys_sgetmask
|
||||||
|
.long sys_ssetmask
|
||||||
|
.long sys_setreuid16 /* 70 */
|
||||||
|
.long sys_setregid16
|
||||||
|
.long sys_sigsuspend
|
||||||
|
.long sys_sigpending
|
||||||
|
.long sys_sethostname
|
||||||
|
.long sys_setrlimit /* 75 */
|
||||||
|
.long sys_old_getrlimit
|
||||||
|
.long sys_getrusage
|
||||||
|
.long sys_gettimeofday
|
||||||
|
.long sys_settimeofday
|
||||||
|
.long sys_getgroups16 /* 80 */
|
||||||
|
.long sys_setgroups16
|
||||||
|
.long old_select
|
||||||
|
.long sys_symlink
|
||||||
|
.long sys_lstat
|
||||||
|
.long sys_readlink /* 85 */
|
||||||
|
.long sys_uselib
|
||||||
|
.long sys_swapon
|
||||||
|
.long sys_reboot
|
||||||
|
.long old_readdir
|
||||||
|
.long old_mmap /* 90 */
|
||||||
|
.long sys_munmap
|
||||||
|
.long sys_truncate
|
||||||
|
.long sys_ftruncate
|
||||||
|
.long sys_fchmod
|
||||||
|
.long sys_fchown16 /* 95 */
|
||||||
|
.long sys_getpriority
|
||||||
|
.long sys_setpriority
|
||||||
|
.long sys_ni_syscall /* old profil syscall holder */
|
||||||
|
.long sys_statfs
|
||||||
|
.long sys_fstatfs /* 100 */
|
||||||
|
.long sys_ioperm
|
||||||
|
.long sys_socketcall
|
||||||
|
.long sys_syslog
|
||||||
|
.long sys_setitimer
|
||||||
|
.long sys_getitimer /* 105 */
|
||||||
|
.long sys_newstat
|
||||||
|
.long sys_newlstat
|
||||||
|
.long sys_newfstat
|
||||||
|
.long sys_uname
|
||||||
|
.long sys_iopl /* 110 */
|
||||||
|
.long sys_vhangup
|
||||||
|
.long sys_ni_syscall /* old "idle" system call */
|
||||||
|
.long sys_vm86old
|
||||||
|
.long sys_wait4
|
||||||
|
.long sys_swapoff /* 115 */
|
||||||
|
.long sys_sysinfo
|
||||||
|
.long sys_ipc
|
||||||
|
.long sys_fsync
|
||||||
|
.long sys_sigreturn
|
||||||
|
.long sys_clone /* 120 */
|
||||||
|
.long sys_setdomainname
|
||||||
|
.long sys_newuname
|
||||||
|
.long sys_modify_ldt
|
||||||
|
.long sys_adjtimex
|
||||||
|
.long sys_mprotect /* 125 */
|
||||||
|
.long sys_sigprocmask
|
||||||
|
.long sys_ni_syscall /* old "create_module" */
|
||||||
|
.long sys_init_module
|
||||||
|
.long sys_delete_module
|
||||||
|
.long sys_ni_syscall /* 130: old "get_kernel_syms" */
|
||||||
|
.long sys_quotactl
|
||||||
|
.long sys_getpgid
|
||||||
|
.long sys_fchdir
|
||||||
|
.long sys_bdflush
|
||||||
|
.long sys_sysfs /* 135 */
|
||||||
|
.long sys_personality
|
||||||
|
.long sys_ni_syscall /* reserved for afs_syscall */
|
||||||
|
.long sys_setfsuid16
|
||||||
|
.long sys_setfsgid16
|
||||||
|
.long sys_llseek /* 140 */
|
||||||
|
.long sys_getdents
|
||||||
|
.long sys_select
|
||||||
|
.long sys_flock
|
||||||
|
.long sys_msync
|
||||||
|
.long sys_readv /* 145 */
|
||||||
|
.long sys_writev
|
||||||
|
.long sys_getsid
|
||||||
|
.long sys_fdatasync
|
||||||
|
.long sys_sysctl
|
||||||
|
.long sys_mlock /* 150 */
|
||||||
|
.long sys_munlock
|
||||||
|
.long sys_mlockall
|
||||||
|
.long sys_munlockall
|
||||||
|
.long sys_sched_setparam
|
||||||
|
.long sys_sched_getparam /* 155 */
|
||||||
|
.long sys_sched_setscheduler
|
||||||
|
.long sys_sched_getscheduler
|
||||||
|
.long sys_sched_yield
|
||||||
|
.long sys_sched_get_priority_max
|
||||||
|
.long sys_sched_get_priority_min /* 160 */
|
||||||
|
.long sys_sched_rr_get_interval
|
||||||
|
.long sys_nanosleep
|
||||||
|
.long sys_mremap
|
||||||
|
.long sys_setresuid16
|
||||||
|
.long sys_getresuid16 /* 165 */
|
||||||
|
.long sys_vm86
|
||||||
|
.long sys_ni_syscall /* Old sys_query_module */
|
||||||
|
.long sys_poll
|
||||||
|
.long sys_nfsservctl
|
||||||
|
.long sys_setresgid16 /* 170 */
|
||||||
|
.long sys_getresgid16
|
||||||
|
.long sys_prctl
|
||||||
|
.long sys_rt_sigreturn
|
||||||
|
.long sys_rt_sigaction
|
||||||
|
.long sys_rt_sigprocmask /* 175 */
|
||||||
|
.long sys_rt_sigpending
|
||||||
|
.long sys_rt_sigtimedwait
|
||||||
|
.long sys_rt_sigqueueinfo
|
||||||
|
.long sys_rt_sigsuspend
|
||||||
|
.long sys_pread64 /* 180 */
|
||||||
|
.long sys_pwrite64
|
||||||
|
.long sys_chown16
|
||||||
|
.long sys_getcwd
|
||||||
|
.long sys_capget
|
||||||
|
.long sys_capset /* 185 */
|
||||||
|
.long sys_sigaltstack
|
||||||
|
.long sys_sendfile
|
||||||
|
.long sys_ni_syscall /* reserved for streams1 */
|
||||||
|
.long sys_ni_syscall /* reserved for streams2 */
|
||||||
|
.long sys_vfork /* 190 */
|
||||||
|
.long sys_getrlimit
|
||||||
|
.long sys_mmap2
|
||||||
|
.long sys_truncate64
|
||||||
|
.long sys_ftruncate64
|
||||||
|
.long sys_stat64 /* 195 */
|
||||||
|
.long sys_lstat64
|
||||||
|
.long sys_fstat64
|
||||||
|
.long sys_lchown
|
||||||
|
.long sys_getuid
|
||||||
|
.long sys_getgid /* 200 */
|
||||||
|
.long sys_geteuid
|
||||||
|
.long sys_getegid
|
||||||
|
.long sys_setreuid
|
||||||
|
.long sys_setregid
|
||||||
|
.long sys_getgroups /* 205 */
|
||||||
|
.long sys_setgroups
|
||||||
|
.long sys_fchown
|
||||||
|
.long sys_setresuid
|
||||||
|
.long sys_getresuid
|
||||||
|
.long sys_setresgid /* 210 */
|
||||||
|
.long sys_getresgid
|
||||||
|
.long sys_chown
|
||||||
|
.long sys_setuid
|
||||||
|
.long sys_setgid
|
||||||
|
.long sys_setfsuid /* 215 */
|
||||||
|
.long sys_setfsgid
|
||||||
|
.long sys_pivot_root
|
||||||
|
.long sys_mincore
|
||||||
|
.long sys_madvise
|
||||||
|
.long sys_getdents64 /* 220 */
|
||||||
|
.long sys_fcntl64
|
||||||
|
.long sys_ni_syscall /* reserved for TUX */
|
||||||
|
.long sys_ni_syscall
|
||||||
|
.long sys_gettid
|
||||||
|
.long sys_readahead /* 225 */
|
||||||
|
.long sys_setxattr
|
||||||
|
.long sys_lsetxattr
|
||||||
|
.long sys_fsetxattr
|
||||||
|
.long sys_getxattr
|
||||||
|
.long sys_lgetxattr /* 230 */
|
||||||
|
.long sys_fgetxattr
|
||||||
|
.long sys_listxattr
|
||||||
|
.long sys_llistxattr
|
||||||
|
.long sys_flistxattr
|
||||||
|
.long sys_removexattr /* 235 */
|
||||||
|
.long sys_lremovexattr
|
||||||
|
.long sys_fremovexattr
|
||||||
|
.long sys_tkill
|
||||||
|
.long sys_sendfile64
|
||||||
|
.long sys_futex /* 240 */
|
||||||
|
.long sys_sched_setaffinity
|
||||||
|
.long sys_sched_getaffinity
|
||||||
|
.long sys_set_thread_area
|
||||||
|
.long sys_get_thread_area
|
||||||
|
.long sys_io_setup /* 245 */
|
||||||
|
.long sys_io_destroy
|
||||||
|
.long sys_io_getevents
|
||||||
|
.long sys_io_submit
|
||||||
|
.long sys_io_cancel
|
||||||
|
.long sys_fadvise64 /* 250 */
|
||||||
|
.long sys_ni_syscall
|
||||||
|
.long sys_exit_group
|
||||||
|
.long sys_lookup_dcookie
|
||||||
|
.long sys_epoll_create
|
||||||
|
.long sys_epoll_ctl /* 255 */
|
||||||
|
.long sys_epoll_wait
|
||||||
|
.long sys_remap_file_pages
|
||||||
|
.long sys_set_tid_address
|
||||||
|
.long sys_timer_create
|
||||||
|
.long sys_timer_settime /* 260 */
|
||||||
|
.long sys_timer_gettime
|
||||||
|
.long sys_timer_getoverrun
|
||||||
|
.long sys_timer_delete
|
||||||
|
.long sys_clock_settime
|
||||||
|
.long sys_clock_gettime /* 265 */
|
||||||
|
.long sys_clock_getres
|
||||||
|
.long sys_clock_nanosleep
|
||||||
|
.long sys_statfs64
|
||||||
|
.long sys_fstatfs64
|
||||||
|
.long sys_tgkill /* 270 */
|
||||||
|
.long sys_utimes
|
||||||
|
.long sys_fadvise64_64
|
||||||
|
.long sys_ni_syscall /* sys_vserver */
|
||||||
|
.long sys_mbind
|
||||||
|
.long sys_get_mempolicy
|
||||||
|
.long sys_set_mempolicy
|
||||||
|
.long sys_mq_open
|
||||||
|
.long sys_mq_unlink
|
||||||
|
.long sys_mq_timedsend
|
||||||
|
.long sys_mq_timedreceive /* 280 */
|
||||||
|
.long sys_mq_notify
|
||||||
|
.long sys_mq_getsetattr
|
||||||
|
.long sys_ni_syscall /* reserved for kexec */
|
||||||
|
.long sys_waitid
|
||||||
|
.long sys_ni_syscall /* 285 */ /* available */
|
||||||
|
.long sys_add_key
|
||||||
|
.long sys_request_key
|
||||||
|
.long sys_keyctl
|
|
@ -441,7 +441,7 @@ static void __init hpet_time_init(void)
|
||||||
set_normalized_timespec(&wall_to_monotonic,
|
set_normalized_timespec(&wall_to_monotonic,
|
||||||
-xtime.tv_sec, -xtime.tv_nsec);
|
-xtime.tv_sec, -xtime.tv_nsec);
|
||||||
|
|
||||||
if (hpet_enable() >= 0) {
|
if ((hpet_enable() >= 0) && hpet_use_timer) {
|
||||||
printk("Using HPET for base-timer\n");
|
printk("Using HPET for base-timer\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
static unsigned long hpet_period; /* fsecs / HPET clock */
|
static unsigned long hpet_period; /* fsecs / HPET clock */
|
||||||
unsigned long hpet_tick; /* hpet clks count per tick */
|
unsigned long hpet_tick; /* hpet clks count per tick */
|
||||||
unsigned long hpet_address; /* hpet memory map physical address */
|
unsigned long hpet_address; /* hpet memory map physical address */
|
||||||
|
int hpet_use_timer;
|
||||||
|
|
||||||
static int use_hpet; /* can be used for runtime check of hpet */
|
static int use_hpet; /* can be used for runtime check of hpet */
|
||||||
static int boot_hpet_disable; /* boottime override for HPET timer */
|
static int boot_hpet_disable; /* boottime override for HPET timer */
|
||||||
|
@ -73,27 +74,30 @@ static int hpet_timer_stop_set_go(unsigned long tick)
|
||||||
hpet_writel(0, HPET_COUNTER);
|
hpet_writel(0, HPET_COUNTER);
|
||||||
hpet_writel(0, HPET_COUNTER + 4);
|
hpet_writel(0, HPET_COUNTER + 4);
|
||||||
|
|
||||||
/*
|
if (hpet_use_timer) {
|
||||||
* Set up timer 0, as periodic with first interrupt to happen at
|
/*
|
||||||
* hpet_tick, and period also hpet_tick.
|
* Set up timer 0, as periodic with first interrupt to happen at
|
||||||
*/
|
* hpet_tick, and period also hpet_tick.
|
||||||
cfg = hpet_readl(HPET_T0_CFG);
|
*/
|
||||||
cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
|
cfg = hpet_readl(HPET_T0_CFG);
|
||||||
HPET_TN_SETVAL | HPET_TN_32BIT;
|
cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
|
||||||
hpet_writel(cfg, HPET_T0_CFG);
|
HPET_TN_SETVAL | HPET_TN_32BIT;
|
||||||
|
hpet_writel(cfg, HPET_T0_CFG);
|
||||||
/*
|
|
||||||
* The first write after writing TN_SETVAL to the config register sets
|
|
||||||
* the counter value, the second write sets the threshold.
|
|
||||||
*/
|
|
||||||
hpet_writel(tick, HPET_T0_CMP);
|
|
||||||
hpet_writel(tick, HPET_T0_CMP);
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The first write after writing TN_SETVAL to the config register sets
|
||||||
|
* the counter value, the second write sets the threshold.
|
||||||
|
*/
|
||||||
|
hpet_writel(tick, HPET_T0_CMP);
|
||||||
|
hpet_writel(tick, HPET_T0_CMP);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Go!
|
* Go!
|
||||||
*/
|
*/
|
||||||
cfg = hpet_readl(HPET_CFG);
|
cfg = hpet_readl(HPET_CFG);
|
||||||
cfg |= HPET_CFG_ENABLE | HPET_CFG_LEGACY;
|
if (hpet_use_timer)
|
||||||
|
cfg |= HPET_CFG_LEGACY;
|
||||||
|
cfg |= HPET_CFG_ENABLE;
|
||||||
hpet_writel(cfg, HPET_CFG);
|
hpet_writel(cfg, HPET_CFG);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -128,12 +132,11 @@ int __init hpet_enable(void)
|
||||||
* However, we can do with one timer otherwise using the
|
* However, we can do with one timer otherwise using the
|
||||||
* the single HPET timer for system time.
|
* the single HPET timer for system time.
|
||||||
*/
|
*/
|
||||||
if (
|
|
||||||
#ifdef CONFIG_HPET_EMULATE_RTC
|
#ifdef CONFIG_HPET_EMULATE_RTC
|
||||||
!(id & HPET_ID_NUMBER) ||
|
if (!(id & HPET_ID_NUMBER))
|
||||||
#endif
|
|
||||||
!(id & HPET_ID_LEGSUP))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
hpet_period = hpet_readl(HPET_PERIOD);
|
hpet_period = hpet_readl(HPET_PERIOD);
|
||||||
if ((hpet_period < HPET_MIN_PERIOD) || (hpet_period > HPET_MAX_PERIOD))
|
if ((hpet_period < HPET_MIN_PERIOD) || (hpet_period > HPET_MAX_PERIOD))
|
||||||
|
@ -152,6 +155,8 @@ int __init hpet_enable(void)
|
||||||
if (hpet_tick_rem > (hpet_period >> 1))
|
if (hpet_tick_rem > (hpet_period >> 1))
|
||||||
hpet_tick++; /* rounding the result */
|
hpet_tick++; /* rounding the result */
|
||||||
|
|
||||||
|
hpet_use_timer = id & HPET_ID_LEGSUP;
|
||||||
|
|
||||||
if (hpet_timer_stop_set_go(hpet_tick))
|
if (hpet_timer_stop_set_go(hpet_tick))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -202,7 +207,8 @@ int __init hpet_enable(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
wait_timer_tick = wait_hpet_tick;
|
if (hpet_use_timer)
|
||||||
|
wait_timer_tick = wait_hpet_tick;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ static unsigned long get_offset_hpet(void)
|
||||||
|
|
||||||
eax = hpet_readl(HPET_COUNTER);
|
eax = hpet_readl(HPET_COUNTER);
|
||||||
eax -= hpet_last; /* hpet delta */
|
eax -= hpet_last; /* hpet delta */
|
||||||
|
eax = min(hpet_tick, eax);
|
||||||
/*
|
/*
|
||||||
* Time offset = (hpet delta) * ( usecs per HPET clock )
|
* Time offset = (hpet delta) * ( usecs per HPET clock )
|
||||||
* = (hpet delta) * ( usecs per tick / HPET clocks per tick)
|
* = (hpet delta) * ( usecs per tick / HPET clocks per tick)
|
||||||
|
@ -105,9 +105,12 @@ static void mark_offset_hpet(void)
|
||||||
last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low;
|
last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low;
|
||||||
rdtsc(last_tsc_low, last_tsc_high);
|
rdtsc(last_tsc_low, last_tsc_high);
|
||||||
|
|
||||||
offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
|
if (hpet_use_timer)
|
||||||
if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
|
offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
|
||||||
int lost_ticks = (offset - hpet_last) / hpet_tick;
|
else
|
||||||
|
offset = hpet_readl(HPET_COUNTER);
|
||||||
|
if (unlikely(((offset - hpet_last) >= (2*hpet_tick)) && (hpet_last != 0))) {
|
||||||
|
int lost_ticks = ((offset - hpet_last) / hpet_tick) - 1;
|
||||||
jiffies_64 += lost_ticks;
|
jiffies_64 += lost_ticks;
|
||||||
}
|
}
|
||||||
hpet_last = offset;
|
hpet_last = offset;
|
||||||
|
|
|
@ -477,7 +477,7 @@ static int __init init_tsc(char* override)
|
||||||
if (cpu_has_tsc) {
|
if (cpu_has_tsc) {
|
||||||
unsigned long tsc_quotient;
|
unsigned long tsc_quotient;
|
||||||
#ifdef CONFIG_HPET_TIMER
|
#ifdef CONFIG_HPET_TIMER
|
||||||
if (is_hpet_enabled()){
|
if (is_hpet_enabled() && hpet_use_timer) {
|
||||||
unsigned long result, remain;
|
unsigned long result, remain;
|
||||||
printk("Using TSC for gettimeofday\n");
|
printk("Using TSC for gettimeofday\n");
|
||||||
tsc_quotient = calibrate_tsc_hpet(NULL);
|
tsc_quotient = calibrate_tsc_hpet(NULL);
|
||||||
|
|
|
@ -451,6 +451,7 @@ DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
|
||||||
DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
|
DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
|
||||||
DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
|
DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
|
||||||
DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
|
DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
|
||||||
|
DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0)
|
||||||
|
|
||||||
fastcall void do_general_protection(struct pt_regs * regs, long error_code)
|
fastcall void do_general_protection(struct pt_regs * regs, long error_code)
|
||||||
{
|
{
|
||||||
|
@ -642,16 +643,15 @@ void unset_nmi_callback(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KPROBES
|
#ifdef CONFIG_KPROBES
|
||||||
fastcall int do_int3(struct pt_regs *regs, long error_code)
|
fastcall void do_int3(struct pt_regs *regs, long error_code)
|
||||||
{
|
{
|
||||||
if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
|
if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
|
||||||
== NOTIFY_STOP)
|
== NOTIFY_STOP)
|
||||||
return 1;
|
return;
|
||||||
/* This is an interrupt gate, because kprobes wants interrupts
|
/* This is an interrupt gate, because kprobes wants interrupts
|
||||||
disabled. Normal trap handlers don't. */
|
disabled. Normal trap handlers don't. */
|
||||||
restore_interrupts(regs);
|
restore_interrupts(regs);
|
||||||
do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
|
do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -222,7 +222,7 @@ asmlinkage int sys_vm86(struct pt_regs regs)
|
||||||
goto out;
|
goto out;
|
||||||
case VM86_PLUS_INSTALL_CHECK:
|
case VM86_PLUS_INSTALL_CHECK:
|
||||||
/* NOTE: on old vm86 stuff this will return the error
|
/* NOTE: on old vm86 stuff this will return the error
|
||||||
from verify_area(), because the subfunction is
|
from access_ok(), because the subfunction is
|
||||||
interpreted as (invalid) address to vm86_struct.
|
interpreted as (invalid) address to vm86_struct.
|
||||||
So the installation check works.
|
So the installation check works.
|
||||||
*/
|
*/
|
||||||
|
@ -294,8 +294,8 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
|
||||||
*/
|
*/
|
||||||
info->regs32->eax = 0;
|
info->regs32->eax = 0;
|
||||||
tsk->thread.saved_esp0 = tsk->thread.esp0;
|
tsk->thread.saved_esp0 = tsk->thread.esp0;
|
||||||
asm volatile("movl %%fs,%0":"=m" (tsk->thread.saved_fs));
|
asm volatile("mov %%fs,%0":"=m" (tsk->thread.saved_fs));
|
||||||
asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));
|
asm volatile("mov %%gs,%0":"=m" (tsk->thread.saved_gs));
|
||||||
|
|
||||||
tss = &per_cpu(init_tss, get_cpu());
|
tss = &per_cpu(init_tss, get_cpu());
|
||||||
tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
|
tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
|
||||||
|
@ -717,12 +717,12 @@ static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs)
|
||||||
irqbits |= irq_bit;
|
irqbits |= irq_bit;
|
||||||
if (vm86_irqs[intno].sig)
|
if (vm86_irqs[intno].sig)
|
||||||
send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
|
send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
|
||||||
spin_unlock_irqrestore(&irqbits_lock, flags);
|
|
||||||
/*
|
/*
|
||||||
* IRQ will be re-enabled when user asks for the irq (whether
|
* IRQ will be re-enabled when user asks for the irq (whether
|
||||||
* polling or as a result of the signal)
|
* polling or as a result of the signal)
|
||||||
*/
|
*/
|
||||||
disable_irq(intno);
|
disable_irq_nosync(intno);
|
||||||
|
spin_unlock_irqrestore(&irqbits_lock, flags);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -754,17 +754,20 @@ static inline int get_and_reset_irq(int irqnumber)
|
||||||
{
|
{
|
||||||
int bit;
|
int bit;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (invalid_vm86_irq(irqnumber)) return 0;
|
if (invalid_vm86_irq(irqnumber)) return 0;
|
||||||
if (vm86_irqs[irqnumber].tsk != current) return 0;
|
if (vm86_irqs[irqnumber].tsk != current) return 0;
|
||||||
spin_lock_irqsave(&irqbits_lock, flags);
|
spin_lock_irqsave(&irqbits_lock, flags);
|
||||||
bit = irqbits & (1 << irqnumber);
|
bit = irqbits & (1 << irqnumber);
|
||||||
irqbits &= ~bit;
|
irqbits &= ~bit;
|
||||||
|
if (bit) {
|
||||||
|
enable_irq(irqnumber);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&irqbits_lock, flags);
|
spin_unlock_irqrestore(&irqbits_lock, flags);
|
||||||
if (!bit)
|
return ret;
|
||||||
return 0;
|
|
||||||
enable_irq(irqnumber);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ static void timer_stop(void)
|
||||||
{
|
{
|
||||||
enable_timer_nmi_watchdog();
|
enable_timer_nmi_watchdog();
|
||||||
unset_nmi_callback();
|
unset_nmi_callback();
|
||||||
synchronize_kernel();
|
synchronize_sched(); /* Allow already-started NMIs to complete. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -495,6 +495,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
|
||||||
case PCI_DEVICE_ID_INTEL_ICH6_1:
|
case PCI_DEVICE_ID_INTEL_ICH6_1:
|
||||||
case PCI_DEVICE_ID_INTEL_ICH7_0:
|
case PCI_DEVICE_ID_INTEL_ICH7_0:
|
||||||
case PCI_DEVICE_ID_INTEL_ICH7_1:
|
case PCI_DEVICE_ID_INTEL_ICH7_1:
|
||||||
|
case PCI_DEVICE_ID_INTEL_ICH7_30:
|
||||||
|
case PCI_DEVICE_ID_INTEL_ICH7_31:
|
||||||
case PCI_DEVICE_ID_INTEL_ESB2_0:
|
case PCI_DEVICE_ID_INTEL_ESB2_0:
|
||||||
r->name = "PIIX/ICH";
|
r->name = "PIIX/ICH";
|
||||||
r->get = pirq_piix_get;
|
r->get = pirq_piix_get;
|
||||||
|
|
|
@ -1411,7 +1411,7 @@ sys_call_table:
|
||||||
data8 sys_msgrcv
|
data8 sys_msgrcv
|
||||||
data8 sys_msgctl
|
data8 sys_msgctl
|
||||||
data8 sys_shmget
|
data8 sys_shmget
|
||||||
data8 ia64_shmat
|
data8 sys_shmat
|
||||||
data8 sys_shmdt // 1115
|
data8 sys_shmdt // 1115
|
||||||
data8 sys_shmctl
|
data8 sys_shmctl
|
||||||
data8 sys_syslog
|
data8 sys_syslog
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -704,12 +705,32 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs *pt,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: at the time of this call, the target task is blocked
|
||||||
|
* in notify_resume_user() and by clearling PRED_LEAVE_SYSCALL
|
||||||
|
* (aka, "pLvSys") we redirect execution from
|
||||||
|
* .work_pending_syscall_end to .work_processed_kernel.
|
||||||
|
*/
|
||||||
unw_get_pr(&prev_info, &pr);
|
unw_get_pr(&prev_info, &pr);
|
||||||
pr &= ~(1UL << PRED_SYSCALL);
|
pr &= ~((1UL << PRED_SYSCALL) | (1UL << PRED_LEAVE_SYSCALL));
|
||||||
pr |= (1UL << PRED_NON_SYSCALL);
|
pr |= (1UL << PRED_NON_SYSCALL);
|
||||||
unw_set_pr(&prev_info, pr);
|
unw_set_pr(&prev_info, pr);
|
||||||
|
|
||||||
pt->cr_ifs = (1UL << 63) | cfm;
|
pt->cr_ifs = (1UL << 63) | cfm;
|
||||||
|
/*
|
||||||
|
* Clear the memory that is NOT written on syscall-entry to
|
||||||
|
* ensure we do not leak kernel-state to user when execution
|
||||||
|
* resumes.
|
||||||
|
*/
|
||||||
|
pt->r2 = 0;
|
||||||
|
pt->r3 = 0;
|
||||||
|
pt->r14 = 0;
|
||||||
|
memset(&pt->r16, 0, 16*8); /* clear r16-r31 */
|
||||||
|
memset(&pt->f6, 0, 6*16); /* clear f6-f11 */
|
||||||
|
pt->b7 = 0;
|
||||||
|
pt->ar_ccv = 0;
|
||||||
|
pt->ar_csd = 0;
|
||||||
|
pt->ar_ssd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1481,7 +1502,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
/* restart after signal. */
|
/* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if (data > _NSIG)
|
if (!valid_signal(data))
|
||||||
goto out_tsk;
|
goto out_tsk;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -1520,7 +1541,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
|
||||||
/* let child execute for one instruction */
|
/* let child execute for one instruction */
|
||||||
case PTRACE_SINGLEBLOCK:
|
case PTRACE_SINGLEBLOCK:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if (data > _NSIG)
|
if (!valid_signal(data))
|
||||||
goto out_tsk;
|
goto out_tsk;
|
||||||
|
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -92,20 +92,6 @@ sys_getpagesize (void)
|
||||||
return PAGE_SIZE;
|
return PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage unsigned long
|
|
||||||
ia64_shmat (int shmid, void __user *shmaddr, int shmflg)
|
|
||||||
{
|
|
||||||
unsigned long raddr;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
retval = do_shmat(shmid, shmaddr, shmflg, &raddr);
|
|
||||||
if (retval < 0)
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
force_successful_syscall_return();
|
|
||||||
return raddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage unsigned long
|
asmlinkage unsigned long
|
||||||
ia64_brk (unsigned long brk)
|
ia64_brk (unsigned long brk)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
@ -665,7 +666,7 @@ do_ptrace(long request, struct task_struct *child, long addr, long data)
|
||||||
case PTRACE_SYSCALL:
|
case PTRACE_SYSCALL:
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -700,7 +701,7 @@ do_ptrace(long request, struct task_struct *child, long addr, long data)
|
||||||
unsigned long pc, insn;
|
unsigned long pc, insn;
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
if ((child->ptrace & PT_DTRACE) == 0) {
|
if ((child->ptrace & PT_DTRACE) == 0) {
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -251,7 +252,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
child->thread.work.syscall_trace = ~0;
|
child->thread.work.syscall_trace = ~0;
|
||||||
|
@ -292,7 +293,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
child->thread.work.syscall_trace = 0;
|
child->thread.work.syscall_trace = 0;
|
||||||
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -240,7 +241,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -278,7 +279,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
|
@ -257,7 +258,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: { /* restart after signal. */
|
case PTRACE_CONT: { /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
|
@ -241,7 +242,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: { /* restart after signal. */
|
case PTRACE_CONT: { /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned int) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -373,22 +373,6 @@ asmlinkage int sys_ipc (uint call, int first, int second,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Native ABI that is O32 or N64 version
|
|
||||||
*/
|
|
||||||
asmlinkage long sys_shmat(int shmid, char __user *shmaddr,
|
|
||||||
int shmflg, unsigned long *addr)
|
|
||||||
{
|
|
||||||
unsigned long raddr;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = do_shmat(shmid, shmaddr, shmflg, &raddr);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
return put_user(raddr, addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No implemented yet ...
|
* No implemented yet ...
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/personality.h>
|
#include <linux/personality.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -285,7 +286,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
DBG("sys_ptrace(%s)\n",
|
DBG("sys_ptrace(%s)\n",
|
||||||
request == PTRACE_SYSCALL ? "SYSCALL" : "CONT");
|
request == PTRACE_SYSCALL ? "SYSCALL" : "CONT");
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
goto out_tsk;
|
goto out_tsk;
|
||||||
child->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP);
|
child->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP);
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
|
@ -311,7 +312,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
||||||
case PTRACE_SINGLEBLOCK:
|
case PTRACE_SINGLEBLOCK:
|
||||||
DBG("sys_ptrace(SINGLEBLOCK)\n");
|
DBG("sys_ptrace(SINGLEBLOCK)\n");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
goto out_tsk;
|
goto out_tsk;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
child->ptrace &= ~PT_SINGLESTEP;
|
child->ptrace &= ~PT_SINGLESTEP;
|
||||||
|
@ -328,7 +329,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
DBG("sys_ptrace(SINGLESTEP)\n");
|
DBG("sys_ptrace(SINGLESTEP)\n");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
goto out_tsk;
|
goto out_tsk;
|
||||||
|
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
|
@ -161,17 +161,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long sys_shmat_wrapper(int shmid, char __user *shmaddr, int shmflag)
|
|
||||||
{
|
|
||||||
unsigned long raddr;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = do_shmat(shmid, shmaddr, shmflag, &raddr);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
return raddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fucking broken ABI */
|
/* Fucking broken ABI */
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
|
|
|
@ -297,7 +297,7 @@
|
||||||
ENTRY_DIFF(msgrcv)
|
ENTRY_DIFF(msgrcv)
|
||||||
ENTRY_SAME(msgget) /* 190 */
|
ENTRY_SAME(msgget) /* 190 */
|
||||||
ENTRY_SAME(msgctl)
|
ENTRY_SAME(msgctl)
|
||||||
ENTRY_SAME(shmat_wrapper)
|
ENTRY_SAME(shmat)
|
||||||
ENTRY_SAME(shmdt)
|
ENTRY_SAME(shmdt)
|
||||||
ENTRY_SAME(shmget)
|
ENTRY_SAME(shmget)
|
||||||
ENTRY_SAME(shmctl) /* 195 */
|
ENTRY_SAME(shmctl) /* 195 */
|
||||||
|
|
|
@ -53,6 +53,7 @@ choice
|
||||||
|
|
||||||
config 6xx
|
config 6xx
|
||||||
bool "6xx/7xx/74xx/52xx/82xx/83xx"
|
bool "6xx/7xx/74xx/52xx/82xx/83xx"
|
||||||
|
select PPC_FPU
|
||||||
help
|
help
|
||||||
There are four types of PowerPC chips supported. The more common
|
There are four types of PowerPC chips supported. The more common
|
||||||
types (601, 603, 604, 740, 750, 7400), the Motorola embedded
|
types (601, 603, 604, 740, 750, 7400), the Motorola embedded
|
||||||
|
@ -86,6 +87,9 @@ config E500
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config PPC_FPU
|
||||||
|
bool
|
||||||
|
|
||||||
config BOOKE
|
config BOOKE
|
||||||
bool
|
bool
|
||||||
depends on E500
|
depends on E500
|
||||||
|
|
|
@ -53,6 +53,7 @@ head-$(CONFIG_FSL_BOOKE) := arch/ppc/kernel/head_fsl_booke.o
|
||||||
|
|
||||||
head-$(CONFIG_6xx) += arch/ppc/kernel/idle_6xx.o
|
head-$(CONFIG_6xx) += arch/ppc/kernel/idle_6xx.o
|
||||||
head-$(CONFIG_POWER4) += arch/ppc/kernel/idle_power4.o
|
head-$(CONFIG_POWER4) += arch/ppc/kernel/idle_power4.o
|
||||||
|
head-$(CONFIG_PPC_FPU) += arch/ppc/kernel/fpu.o
|
||||||
|
|
||||||
core-y += arch/ppc/kernel/ arch/ppc/platforms/ \
|
core-y += arch/ppc/kernel/ arch/ppc/platforms/ \
|
||||||
arch/ppc/mm/ arch/ppc/lib/ arch/ppc/syslib/
|
arch/ppc/mm/ arch/ppc/lib/ arch/ppc/syslib/
|
||||||
|
|
|
@ -20,8 +20,9 @@ quiet_cmd_uimage = UIMAGE $@
|
||||||
|
|
||||||
targets += uImage
|
targets += uImage
|
||||||
$(obj)/uImage: $(obj)/vmlinux.gz
|
$(obj)/uImage: $(obj)/vmlinux.gz
|
||||||
|
$(Q)rm -f $@
|
||||||
$(call if_changed,uimage)
|
$(call if_changed,uimage)
|
||||||
@echo ' Image $@ is ready'
|
@echo ' Image: $@' $(if $(wildcard $@),'is ready','not made')
|
||||||
|
|
||||||
# Files generated that shall be removed upon make clean
|
# Files generated that shall be removed upon make clean
|
||||||
clean-files := sImage vmapus vmlinux* miboot* zImage* uImage
|
clean-files := sImage vmapus vmlinux* miboot* zImage* uImage
|
||||||
|
|
|
@ -9,6 +9,7 @@ extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o
|
||||||
extra-$(CONFIG_8xx) := head_8xx.o
|
extra-$(CONFIG_8xx) := head_8xx.o
|
||||||
extra-$(CONFIG_6xx) += idle_6xx.o
|
extra-$(CONFIG_6xx) += idle_6xx.o
|
||||||
extra-$(CONFIG_POWER4) += idle_power4.o
|
extra-$(CONFIG_POWER4) += idle_power4.o
|
||||||
|
extra-$(CONFIG_PPC_FPU) += fpu.o
|
||||||
extra-y += vmlinux.lds
|
extra-y += vmlinux.lds
|
||||||
|
|
||||||
obj-y := entry.o traps.o irq.o idle.o time.o misc.o \
|
obj-y := entry.o traps.o irq.o idle.o time.o misc.o \
|
||||||
|
|
|
@ -290,6 +290,10 @@ fix_alignment(struct pt_regs *regs)
|
||||||
/* lwm, stmw */
|
/* lwm, stmw */
|
||||||
nb = (32 - reg) * 4;
|
nb = (32 - reg) * 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
|
||||||
|
return -EFAULT; /* bad address */
|
||||||
|
|
||||||
rptr = (unsigned char *) ®s->gpr[reg];
|
rptr = (unsigned char *) ®s->gpr[reg];
|
||||||
if (flags & LD) {
|
if (flags & LD) {
|
||||||
for (i = 0; i < nb; ++i)
|
for (i = 0; i < nb; ++i)
|
||||||
|
@ -368,16 +372,24 @@ fix_alignment(struct pt_regs *regs)
|
||||||
|
|
||||||
/* Single-precision FP load and store require conversions... */
|
/* Single-precision FP load and store require conversions... */
|
||||||
case LD+F+S:
|
case LD+F+S:
|
||||||
|
#ifdef CONFIG_PPC_FPU
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
enable_kernel_fp();
|
enable_kernel_fp();
|
||||||
cvt_fd(&data.f, &data.d, ¤t->thread.fpscr);
|
cvt_fd(&data.f, &data.d, ¤t->thread.fpscr);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case ST+F+S:
|
case ST+F+S:
|
||||||
|
#ifdef CONFIG_PPC_FPU
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
enable_kernel_fp();
|
enable_kernel_fp();
|
||||||
cvt_df(&data.d, &data.f, ¤t->thread.fpscr);
|
cvt_df(&data.d, &data.f, ¤t->thread.fpscr);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,14 @@ _GLOBAL(__setup_cpu_604)
|
||||||
blr
|
blr
|
||||||
_GLOBAL(__setup_cpu_750)
|
_GLOBAL(__setup_cpu_750)
|
||||||
mflr r4
|
mflr r4
|
||||||
|
bl __init_fpu_registers
|
||||||
bl setup_common_caches
|
bl setup_common_caches
|
||||||
bl setup_750_7400_hid0
|
bl setup_750_7400_hid0
|
||||||
mtlr r4
|
mtlr r4
|
||||||
blr
|
blr
|
||||||
_GLOBAL(__setup_cpu_750cx)
|
_GLOBAL(__setup_cpu_750cx)
|
||||||
mflr r4
|
mflr r4
|
||||||
|
bl __init_fpu_registers
|
||||||
bl setup_common_caches
|
bl setup_common_caches
|
||||||
bl setup_750_7400_hid0
|
bl setup_750_7400_hid0
|
||||||
bl setup_750cx
|
bl setup_750cx
|
||||||
|
@ -43,6 +45,7 @@ _GLOBAL(__setup_cpu_750cx)
|
||||||
blr
|
blr
|
||||||
_GLOBAL(__setup_cpu_750fx)
|
_GLOBAL(__setup_cpu_750fx)
|
||||||
mflr r4
|
mflr r4
|
||||||
|
bl __init_fpu_registers
|
||||||
bl setup_common_caches
|
bl setup_common_caches
|
||||||
bl setup_750_7400_hid0
|
bl setup_750_7400_hid0
|
||||||
bl setup_750fx
|
bl setup_750fx
|
||||||
|
@ -50,6 +53,7 @@ _GLOBAL(__setup_cpu_750fx)
|
||||||
blr
|
blr
|
||||||
_GLOBAL(__setup_cpu_7400)
|
_GLOBAL(__setup_cpu_7400)
|
||||||
mflr r4
|
mflr r4
|
||||||
|
bl __init_fpu_registers
|
||||||
bl setup_7400_workarounds
|
bl setup_7400_workarounds
|
||||||
bl setup_common_caches
|
bl setup_common_caches
|
||||||
bl setup_750_7400_hid0
|
bl setup_750_7400_hid0
|
||||||
|
@ -57,6 +61,7 @@ _GLOBAL(__setup_cpu_7400)
|
||||||
blr
|
blr
|
||||||
_GLOBAL(__setup_cpu_7410)
|
_GLOBAL(__setup_cpu_7410)
|
||||||
mflr r4
|
mflr r4
|
||||||
|
bl __init_fpu_registers
|
||||||
bl setup_7410_workarounds
|
bl setup_7410_workarounds
|
||||||
bl setup_common_caches
|
bl setup_common_caches
|
||||||
bl setup_750_7400_hid0
|
bl setup_750_7400_hid0
|
||||||
|
@ -80,7 +85,7 @@ setup_common_caches:
|
||||||
bne 1f /* don't invalidate the D-cache */
|
bne 1f /* don't invalidate the D-cache */
|
||||||
ori r8,r8,HID0_DCI /* unless it wasn't enabled */
|
ori r8,r8,HID0_DCI /* unless it wasn't enabled */
|
||||||
1: sync
|
1: sync
|
||||||
mtspr SPRN_HID0,r8 /* enable and invalidate caches */
|
mtspr SPRN_HID0,r8 /* enable and invalidate caches */
|
||||||
sync
|
sync
|
||||||
mtspr SPRN_HID0,r11 /* enable caches */
|
mtspr SPRN_HID0,r11 /* enable caches */
|
||||||
sync
|
sync
|
||||||
|
@ -152,9 +157,13 @@ setup_7410_workarounds:
|
||||||
setup_750_7400_hid0:
|
setup_750_7400_hid0:
|
||||||
mfspr r11,SPRN_HID0
|
mfspr r11,SPRN_HID0
|
||||||
ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC
|
ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC
|
||||||
|
oris r11,r11,HID0_DPM@h
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
oris r11,r11,HID0_DPM@h /* enable dynamic power mgmt */
|
xori r11,r11,HID0_BTIC
|
||||||
END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC)
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM)
|
||||||
li r3,HID0_SPD
|
li r3,HID0_SPD
|
||||||
andc r11,r11,r3 /* clear SPD: enable speculative */
|
andc r11,r11,r3 /* clear SPD: enable speculative */
|
||||||
li r3,0
|
li r3,0
|
||||||
|
@ -218,13 +227,15 @@ setup_745x_specifics:
|
||||||
|
|
||||||
/* All of the bits we have to set.....
|
/* All of the bits we have to set.....
|
||||||
*/
|
*/
|
||||||
ori r11,r11,HID0_SGE | HID0_FOLD | HID0_BHTE | HID0_LRSTK | HID0_BTIC
|
ori r11,r11,HID0_SGE | HID0_FOLD | HID0_BHTE
|
||||||
|
ori r11,r11,HID0_LRSTK | HID0_BTIC
|
||||||
|
oris r11,r11,HID0_DPM@h
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
xori r11,r11,HID0_BTIC
|
xori r11,r11,HID0_BTIC
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC)
|
END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC)
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
oris r11,r11,HID0_DPM@h /* enable dynamic power mgmt */
|
xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */
|
||||||
END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM)
|
||||||
|
|
||||||
/* All of the bits we have to clear....
|
/* All of the bits we have to clear....
|
||||||
*/
|
*/
|
||||||
|
@ -248,6 +259,25 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
||||||
isync
|
isync
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the FPU registers. This is needed to work around an errata
|
||||||
|
* in some 750 cpus where using a not yet initialized FPU register after
|
||||||
|
* power on reset may hang the CPU
|
||||||
|
*/
|
||||||
|
_GLOBAL(__init_fpu_registers)
|
||||||
|
mfmsr r10
|
||||||
|
ori r11,r10,MSR_FP
|
||||||
|
mtmsr r11
|
||||||
|
isync
|
||||||
|
addis r9,r3,empty_zero_page@ha
|
||||||
|
addi r9,r9,empty_zero_page@l
|
||||||
|
REST_32FPRS(0,r9)
|
||||||
|
sync
|
||||||
|
mtmsr r10
|
||||||
|
isync
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
/* Definitions for the table use to save CPU states */
|
/* Definitions for the table use to save CPU states */
|
||||||
#define CS_HID0 0
|
#define CS_HID0 0
|
||||||
#define CS_HID1 4
|
#define CS_HID1 4
|
||||||
|
|
|
@ -563,6 +563,65 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||||
addi r1,r1,INT_FRAME_SIZE
|
addi r1,r1,INT_FRAME_SIZE
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
.globl fast_exception_return
|
||||||
|
fast_exception_return:
|
||||||
|
#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
|
||||||
|
andi. r10,r9,MSR_RI /* check for recoverable interrupt */
|
||||||
|
beq 1f /* if not, we've got problems */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
2: REST_4GPRS(3, r11)
|
||||||
|
lwz r10,_CCR(r11)
|
||||||
|
REST_GPR(1, r11)
|
||||||
|
mtcr r10
|
||||||
|
lwz r10,_LINK(r11)
|
||||||
|
mtlr r10
|
||||||
|
REST_GPR(10, r11)
|
||||||
|
mtspr SPRN_SRR1,r9
|
||||||
|
mtspr SPRN_SRR0,r12
|
||||||
|
REST_GPR(9, r11)
|
||||||
|
REST_GPR(12, r11)
|
||||||
|
lwz r11,GPR11(r11)
|
||||||
|
SYNC
|
||||||
|
RFI
|
||||||
|
|
||||||
|
#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
|
||||||
|
/* check if the exception happened in a restartable section */
|
||||||
|
1: lis r3,exc_exit_restart_end@ha
|
||||||
|
addi r3,r3,exc_exit_restart_end@l
|
||||||
|
cmplw r12,r3
|
||||||
|
bge 3f
|
||||||
|
lis r4,exc_exit_restart@ha
|
||||||
|
addi r4,r4,exc_exit_restart@l
|
||||||
|
cmplw r12,r4
|
||||||
|
blt 3f
|
||||||
|
lis r3,fee_restarts@ha
|
||||||
|
tophys(r3,r3)
|
||||||
|
lwz r5,fee_restarts@l(r3)
|
||||||
|
addi r5,r5,1
|
||||||
|
stw r5,fee_restarts@l(r3)
|
||||||
|
mr r12,r4 /* restart at exc_exit_restart */
|
||||||
|
b 2b
|
||||||
|
|
||||||
|
.comm fee_restarts,4
|
||||||
|
|
||||||
|
/* aargh, a nonrecoverable interrupt, panic */
|
||||||
|
/* aargh, we don't know which trap this is */
|
||||||
|
/* but the 601 doesn't implement the RI bit, so assume it's OK */
|
||||||
|
3:
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
b 2b
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_601)
|
||||||
|
li r10,-1
|
||||||
|
stw r10,TRAP(r11)
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
lis r10,MSR_KERNEL@h
|
||||||
|
ori r10,r10,MSR_KERNEL@l
|
||||||
|
bl transfer_to_handler_full
|
||||||
|
.long nonrecoverable_exception
|
||||||
|
.long ret_from_except
|
||||||
|
#endif
|
||||||
|
|
||||||
.globl sigreturn_exit
|
.globl sigreturn_exit
|
||||||
sigreturn_exit:
|
sigreturn_exit:
|
||||||
subi r1,r3,STACK_FRAME_OVERHEAD
|
subi r1,r3,STACK_FRAME_OVERHEAD
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* FPU support code, moved here from head.S so that it can be used
|
||||||
|
* by chips which use other head-whatever.S files.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <asm/mmu.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/cputable.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
#include <asm/ppc_asm.h>
|
||||||
|
#include <asm/offsets.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This task wants to use the FPU now.
|
||||||
|
* On UP, disable FP for the task which had the FPU previously,
|
||||||
|
* and save its floating-point registers in its thread_struct.
|
||||||
|
* Load up this task's FP registers from its thread_struct,
|
||||||
|
* enable the FPU for the current task and return to the task.
|
||||||
|
*/
|
||||||
|
.globl load_up_fpu
|
||||||
|
load_up_fpu:
|
||||||
|
mfmsr r5
|
||||||
|
ori r5,r5,MSR_FP
|
||||||
|
#ifdef CONFIG_PPC64BRIDGE
|
||||||
|
clrldi r5,r5,1 /* turn off 64-bit mode */
|
||||||
|
#endif /* CONFIG_PPC64BRIDGE */
|
||||||
|
SYNC
|
||||||
|
MTMSRD(r5) /* enable use of fpu now */
|
||||||
|
isync
|
||||||
|
/*
|
||||||
|
* For SMP, we don't do lazy FPU switching because it just gets too
|
||||||
|
* horrendously complex, especially when a task switches from one CPU
|
||||||
|
* to another. Instead we call giveup_fpu in switch_to.
|
||||||
|
*/
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
tophys(r6,0) /* get __pa constant */
|
||||||
|
addis r3,r6,last_task_used_math@ha
|
||||||
|
lwz r4,last_task_used_math@l(r3)
|
||||||
|
cmpwi 0,r4,0
|
||||||
|
beq 1f
|
||||||
|
add r4,r4,r6
|
||||||
|
addi r4,r4,THREAD /* want last_task_used_math->thread */
|
||||||
|
SAVE_32FPRS(0, r4)
|
||||||
|
mffs fr0
|
||||||
|
stfd fr0,THREAD_FPSCR-4(r4)
|
||||||
|
lwz r5,PT_REGS(r4)
|
||||||
|
add r5,r5,r6
|
||||||
|
lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
||||||
|
li r10,MSR_FP|MSR_FE0|MSR_FE1
|
||||||
|
andc r4,r4,r10 /* disable FP for previous task */
|
||||||
|
stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
||||||
|
1:
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
/* enable use of FP after return */
|
||||||
|
mfspr r5,SPRN_SPRG3 /* current task's THREAD (phys) */
|
||||||
|
lwz r4,THREAD_FPEXC_MODE(r5)
|
||||||
|
ori r9,r9,MSR_FP /* enable FP for current */
|
||||||
|
or r9,r9,r4
|
||||||
|
lfd fr0,THREAD_FPSCR-4(r5)
|
||||||
|
mtfsf 0xff,fr0
|
||||||
|
REST_32FPRS(0, r5)
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
subi r4,r5,THREAD
|
||||||
|
sub r4,r4,r6
|
||||||
|
stw r4,last_task_used_math@l(r3)
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
/* restore registers and return */
|
||||||
|
/* we haven't used ctr or xer or lr */
|
||||||
|
b fast_exception_return
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FP unavailable trap from kernel - print a message, but let
|
||||||
|
* the task use FP in the kernel until it returns to user mode.
|
||||||
|
*/
|
||||||
|
.globl KernelFP
|
||||||
|
KernelFP:
|
||||||
|
lwz r3,_MSR(r1)
|
||||||
|
ori r3,r3,MSR_FP
|
||||||
|
stw r3,_MSR(r1) /* enable use of FP after return */
|
||||||
|
lis r3,86f@h
|
||||||
|
ori r3,r3,86f@l
|
||||||
|
mr r4,r2 /* current */
|
||||||
|
lwz r5,_NIP(r1)
|
||||||
|
bl printk
|
||||||
|
b ret_from_except
|
||||||
|
86: .string "floating point used in kernel (task=%p, pc=%x)\n"
|
||||||
|
.align 4,0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* giveup_fpu(tsk)
|
||||||
|
* Disable FP for the task given as the argument,
|
||||||
|
* and save the floating-point registers in its thread_struct.
|
||||||
|
* Enables the FPU for use in the kernel on return.
|
||||||
|
*/
|
||||||
|
.globl giveup_fpu
|
||||||
|
giveup_fpu:
|
||||||
|
mfmsr r5
|
||||||
|
ori r5,r5,MSR_FP
|
||||||
|
SYNC_601
|
||||||
|
ISYNC_601
|
||||||
|
MTMSRD(r5) /* enable use of fpu now */
|
||||||
|
SYNC_601
|
||||||
|
isync
|
||||||
|
cmpwi 0,r3,0
|
||||||
|
beqlr- /* if no previous owner, done */
|
||||||
|
addi r3,r3,THREAD /* want THREAD of task */
|
||||||
|
lwz r5,PT_REGS(r3)
|
||||||
|
cmpwi 0,r5,0
|
||||||
|
SAVE_32FPRS(0, r3)
|
||||||
|
mffs fr0
|
||||||
|
stfd fr0,THREAD_FPSCR-4(r3)
|
||||||
|
beq 1f
|
||||||
|
lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
||||||
|
li r3,MSR_FP|MSR_FE0|MSR_FE1
|
||||||
|
andc r4,r4,r3 /* disable FP for previous task */
|
||||||
|
stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
||||||
|
1:
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
li r5,0
|
||||||
|
lis r4,last_task_used_math@ha
|
||||||
|
stw r5,last_task_used_math@l(r4)
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
blr
|
|
@ -775,133 +775,6 @@ InstructionSegment:
|
||||||
EXC_XFER_STD(0x480, UnknownException)
|
EXC_XFER_STD(0x480, UnknownException)
|
||||||
#endif /* CONFIG_PPC64BRIDGE */
|
#endif /* CONFIG_PPC64BRIDGE */
|
||||||
|
|
||||||
/*
|
|
||||||
* This task wants to use the FPU now.
|
|
||||||
* On UP, disable FP for the task which had the FPU previously,
|
|
||||||
* and save its floating-point registers in its thread_struct.
|
|
||||||
* Load up this task's FP registers from its thread_struct,
|
|
||||||
* enable the FPU for the current task and return to the task.
|
|
||||||
*/
|
|
||||||
load_up_fpu:
|
|
||||||
mfmsr r5
|
|
||||||
ori r5,r5,MSR_FP
|
|
||||||
#ifdef CONFIG_PPC64BRIDGE
|
|
||||||
clrldi r5,r5,1 /* turn off 64-bit mode */
|
|
||||||
#endif /* CONFIG_PPC64BRIDGE */
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r5) /* enable use of fpu now */
|
|
||||||
isync
|
|
||||||
/*
|
|
||||||
* For SMP, we don't do lazy FPU switching because it just gets too
|
|
||||||
* horrendously complex, especially when a task switches from one CPU
|
|
||||||
* to another. Instead we call giveup_fpu in switch_to.
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
tophys(r6,0) /* get __pa constant */
|
|
||||||
addis r3,r6,last_task_used_math@ha
|
|
||||||
lwz r4,last_task_used_math@l(r3)
|
|
||||||
cmpwi 0,r4,0
|
|
||||||
beq 1f
|
|
||||||
add r4,r4,r6
|
|
||||||
addi r4,r4,THREAD /* want last_task_used_math->thread */
|
|
||||||
SAVE_32FPRS(0, r4)
|
|
||||||
mffs fr0
|
|
||||||
stfd fr0,THREAD_FPSCR-4(r4)
|
|
||||||
lwz r5,PT_REGS(r4)
|
|
||||||
add r5,r5,r6
|
|
||||||
lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
|
||||||
li r10,MSR_FP|MSR_FE0|MSR_FE1
|
|
||||||
andc r4,r4,r10 /* disable FP for previous task */
|
|
||||||
stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
|
||||||
1:
|
|
||||||
#endif /* CONFIG_SMP */
|
|
||||||
/* enable use of FP after return */
|
|
||||||
mfspr r5,SPRN_SPRG3 /* current task's THREAD (phys) */
|
|
||||||
lwz r4,THREAD_FPEXC_MODE(r5)
|
|
||||||
ori r9,r9,MSR_FP /* enable FP for current */
|
|
||||||
or r9,r9,r4
|
|
||||||
lfd fr0,THREAD_FPSCR-4(r5)
|
|
||||||
mtfsf 0xff,fr0
|
|
||||||
REST_32FPRS(0, r5)
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
subi r4,r5,THREAD
|
|
||||||
sub r4,r4,r6
|
|
||||||
stw r4,last_task_used_math@l(r3)
|
|
||||||
#endif /* CONFIG_SMP */
|
|
||||||
/* restore registers and return */
|
|
||||||
/* we haven't used ctr or xer or lr */
|
|
||||||
/* fall through to fast_exception_return */
|
|
||||||
|
|
||||||
.globl fast_exception_return
|
|
||||||
fast_exception_return:
|
|
||||||
andi. r10,r9,MSR_RI /* check for recoverable interrupt */
|
|
||||||
beq 1f /* if not, we've got problems */
|
|
||||||
2: REST_4GPRS(3, r11)
|
|
||||||
lwz r10,_CCR(r11)
|
|
||||||
REST_GPR(1, r11)
|
|
||||||
mtcr r10
|
|
||||||
lwz r10,_LINK(r11)
|
|
||||||
mtlr r10
|
|
||||||
REST_GPR(10, r11)
|
|
||||||
mtspr SPRN_SRR1,r9
|
|
||||||
mtspr SPRN_SRR0,r12
|
|
||||||
REST_GPR(9, r11)
|
|
||||||
REST_GPR(12, r11)
|
|
||||||
lwz r11,GPR11(r11)
|
|
||||||
SYNC
|
|
||||||
RFI
|
|
||||||
|
|
||||||
/* check if the exception happened in a restartable section */
|
|
||||||
1: lis r3,exc_exit_restart_end@ha
|
|
||||||
addi r3,r3,exc_exit_restart_end@l
|
|
||||||
cmplw r12,r3
|
|
||||||
bge 3f
|
|
||||||
lis r4,exc_exit_restart@ha
|
|
||||||
addi r4,r4,exc_exit_restart@l
|
|
||||||
cmplw r12,r4
|
|
||||||
blt 3f
|
|
||||||
lis r3,fee_restarts@ha
|
|
||||||
tophys(r3,r3)
|
|
||||||
lwz r5,fee_restarts@l(r3)
|
|
||||||
addi r5,r5,1
|
|
||||||
stw r5,fee_restarts@l(r3)
|
|
||||||
mr r12,r4 /* restart at exc_exit_restart */
|
|
||||||
b 2b
|
|
||||||
|
|
||||||
.comm fee_restarts,4
|
|
||||||
|
|
||||||
/* aargh, a nonrecoverable interrupt, panic */
|
|
||||||
/* aargh, we don't know which trap this is */
|
|
||||||
/* but the 601 doesn't implement the RI bit, so assume it's OK */
|
|
||||||
3:
|
|
||||||
BEGIN_FTR_SECTION
|
|
||||||
b 2b
|
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_601)
|
|
||||||
li r10,-1
|
|
||||||
stw r10,TRAP(r11)
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
|
||||||
li r10,MSR_KERNEL
|
|
||||||
bl transfer_to_handler_full
|
|
||||||
.long nonrecoverable_exception
|
|
||||||
.long ret_from_except
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FP unavailable trap from kernel - print a message, but let
|
|
||||||
* the task use FP in the kernel until it returns to user mode.
|
|
||||||
*/
|
|
||||||
KernelFP:
|
|
||||||
lwz r3,_MSR(r1)
|
|
||||||
ori r3,r3,MSR_FP
|
|
||||||
stw r3,_MSR(r1) /* enable use of FP after return */
|
|
||||||
lis r3,86f@h
|
|
||||||
ori r3,r3,86f@l
|
|
||||||
mr r4,r2 /* current */
|
|
||||||
lwz r5,_NIP(r1)
|
|
||||||
bl printk
|
|
||||||
b ret_from_except
|
|
||||||
86: .string "floating point used in kernel (task=%p, pc=%x)\n"
|
|
||||||
.align 4,0
|
|
||||||
|
|
||||||
#ifdef CONFIG_ALTIVEC
|
#ifdef CONFIG_ALTIVEC
|
||||||
/* Note that the AltiVec support is closely modeled after the FP
|
/* Note that the AltiVec support is closely modeled after the FP
|
||||||
* support. Changes to one are likely to be applicable to the
|
* support. Changes to one are likely to be applicable to the
|
||||||
|
@ -1015,42 +888,6 @@ giveup_altivec:
|
||||||
blr
|
blr
|
||||||
#endif /* CONFIG_ALTIVEC */
|
#endif /* CONFIG_ALTIVEC */
|
||||||
|
|
||||||
/*
|
|
||||||
* giveup_fpu(tsk)
|
|
||||||
* Disable FP for the task given as the argument,
|
|
||||||
* and save the floating-point registers in its thread_struct.
|
|
||||||
* Enables the FPU for use in the kernel on return.
|
|
||||||
*/
|
|
||||||
.globl giveup_fpu
|
|
||||||
giveup_fpu:
|
|
||||||
mfmsr r5
|
|
||||||
ori r5,r5,MSR_FP
|
|
||||||
SYNC_601
|
|
||||||
ISYNC_601
|
|
||||||
MTMSRD(r5) /* enable use of fpu now */
|
|
||||||
SYNC_601
|
|
||||||
isync
|
|
||||||
cmpwi 0,r3,0
|
|
||||||
beqlr- /* if no previous owner, done */
|
|
||||||
addi r3,r3,THREAD /* want THREAD of task */
|
|
||||||
lwz r5,PT_REGS(r3)
|
|
||||||
cmpwi 0,r5,0
|
|
||||||
SAVE_32FPRS(0, r3)
|
|
||||||
mffs fr0
|
|
||||||
stfd fr0,THREAD_FPSCR-4(r3)
|
|
||||||
beq 1f
|
|
||||||
lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
|
||||||
li r3,MSR_FP|MSR_FE0|MSR_FE1
|
|
||||||
andc r4,r4,r3 /* disable FP for previous task */
|
|
||||||
stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
|
|
||||||
1:
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
li r5,0
|
|
||||||
lis r4,last_task_used_math@ha
|
|
||||||
stw r5,last_task_used_math@l(r4)
|
|
||||||
#endif /* CONFIG_SMP */
|
|
||||||
blr
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code is jumped to from the startup code to copy
|
* This code is jumped to from the startup code to copy
|
||||||
* the kernel image to physical address 0.
|
* the kernel image to physical address 0.
|
||||||
|
|
|
@ -426,7 +426,11 @@ interrupt_base:
|
||||||
PROGRAM_EXCEPTION
|
PROGRAM_EXCEPTION
|
||||||
|
|
||||||
/* Floating Point Unavailable Interrupt */
|
/* Floating Point Unavailable Interrupt */
|
||||||
|
#ifdef CONFIG_PPC_FPU
|
||||||
|
FP_UNAVAILABLE_EXCEPTION
|
||||||
|
#else
|
||||||
EXCEPTION(0x2010, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
EXCEPTION(0x2010, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* System Call Interrupt */
|
/* System Call Interrupt */
|
||||||
START_EXCEPTION(SystemCall)
|
START_EXCEPTION(SystemCall)
|
||||||
|
@ -686,8 +690,10 @@ _GLOBAL(giveup_altivec)
|
||||||
*
|
*
|
||||||
* The 44x core does not have an FPU.
|
* The 44x core does not have an FPU.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_PPC_FPU
|
||||||
_GLOBAL(giveup_fpu)
|
_GLOBAL(giveup_fpu)
|
||||||
blr
|
blr
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* extern void abort(void)
|
* extern void abort(void)
|
||||||
|
|
|
@ -337,4 +337,11 @@
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||||
EXC_XFER_LITE(0x0900, timer_interrupt)
|
EXC_XFER_LITE(0x0900, timer_interrupt)
|
||||||
|
|
||||||
|
#define FP_UNAVAILABLE_EXCEPTION \
|
||||||
|
START_EXCEPTION(FloatingPointUnavailable) \
|
||||||
|
NORMAL_EXCEPTION_PROLOG; \
|
||||||
|
bne load_up_fpu; /* if from user, just load it up */ \
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||||
|
EXC_XFER_EE_LITE(0x800, KernelFP)
|
||||||
|
|
||||||
#endif /* __HEAD_BOOKE_H__ */
|
#endif /* __HEAD_BOOKE_H__ */
|
||||||
|
|
|
@ -504,7 +504,11 @@ interrupt_base:
|
||||||
PROGRAM_EXCEPTION
|
PROGRAM_EXCEPTION
|
||||||
|
|
||||||
/* Floating Point Unavailable Interrupt */
|
/* Floating Point Unavailable Interrupt */
|
||||||
|
#ifdef CONFIG_PPC_FPU
|
||||||
|
FP_UNAVAILABLE_EXCEPTION
|
||||||
|
#else
|
||||||
EXCEPTION(0x0800, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
EXCEPTION(0x0800, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* System Call Interrupt */
|
/* System Call Interrupt */
|
||||||
START_EXCEPTION(SystemCall)
|
START_EXCEPTION(SystemCall)
|
||||||
|
@ -916,10 +920,12 @@ _GLOBAL(giveup_spe)
|
||||||
/*
|
/*
|
||||||
* extern void giveup_fpu(struct task_struct *prev)
|
* extern void giveup_fpu(struct task_struct *prev)
|
||||||
*
|
*
|
||||||
* The e500 core does not have an FPU.
|
* Not all FSL Book-E cores have an FPU
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_PPC_FPU
|
||||||
_GLOBAL(giveup_fpu)
|
_GLOBAL(giveup_fpu)
|
||||||
blr
|
blr
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* extern void abort(void)
|
* extern void abort(void)
|
||||||
|
|
|
@ -1096,17 +1096,7 @@ _GLOBAL(_get_SP)
|
||||||
* and exceptions as if the cpu had performed the load or store.
|
* and exceptions as if the cpu had performed the load or store.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CONFIG_4xx) || defined(CONFIG_E500)
|
#ifdef CONFIG_PPC_FPU
|
||||||
_GLOBAL(cvt_fd)
|
|
||||||
lfs 0,0(r3)
|
|
||||||
stfd 0,0(r4)
|
|
||||||
blr
|
|
||||||
|
|
||||||
_GLOBAL(cvt_df)
|
|
||||||
lfd 0,0(r3)
|
|
||||||
stfs 0,0(r4)
|
|
||||||
blr
|
|
||||||
#else
|
|
||||||
_GLOBAL(cvt_fd)
|
_GLOBAL(cvt_fd)
|
||||||
lfd 0,-4(r5) /* load up fpscr value */
|
lfd 0,-4(r5) /* load up fpscr value */
|
||||||
mtfsf 0xff,0
|
mtfsf 0xff,0
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -356,7 +357,7 @@ int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: { /* restart after signal. */
|
case PTRACE_CONT: { /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -389,7 +390,7 @@ int sys_ptrace(long request, long pid, long addr, long data)
|
||||||
|
|
||||||
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
set_single_step(child);
|
set_single_step(child);
|
||||||
|
|
|
@ -176,7 +176,7 @@ static inline int check_io_access(struct pt_regs *regs)
|
||||||
#else
|
#else
|
||||||
#define get_mc_reason(regs) (mfspr(SPRN_MCSR))
|
#define get_mc_reason(regs) (mfspr(SPRN_MCSR))
|
||||||
#endif
|
#endif
|
||||||
#define REASON_FP 0
|
#define REASON_FP ESR_FP
|
||||||
#define REASON_ILLEGAL ESR_PIL
|
#define REASON_ILLEGAL ESR_PIL
|
||||||
#define REASON_PRIVILEGED ESR_PPR
|
#define REASON_PRIVILEGED ESR_PPR
|
||||||
#define REASON_TRAP ESR_PTR
|
#define REASON_TRAP ESR_PTR
|
||||||
|
|
|
@ -64,27 +64,39 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||||
mtspr SPRN_HID0,r4 /* Disable DPM */
|
mtspr SPRN_HID0,r4 /* Disable DPM */
|
||||||
sync
|
sync
|
||||||
|
|
||||||
/* disp-flush L1 */
|
/* Disp-flush L1. We have a weird problem here that I never
|
||||||
li r4,0x4000
|
* totally figured out. On 750FX, using the ROM for the flush
|
||||||
mtctr r4
|
* results in a non-working flush. We use that workaround for
|
||||||
|
* now until I finally understand what's going on. --BenH
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ROM base by default */
|
||||||
lis r4,0xfff0
|
lis r4,0xfff0
|
||||||
1: lwzx r0,r0,r4
|
mfpvr r3
|
||||||
|
srwi r3,r3,16
|
||||||
|
cmplwi cr0,r3,0x7000
|
||||||
|
bne+ 1f
|
||||||
|
/* RAM base on 750FX */
|
||||||
|
li r4,0
|
||||||
|
1: li r4,0x4000
|
||||||
|
mtctr r4
|
||||||
|
1: lwz r0,0(r4)
|
||||||
addi r4,r4,32
|
addi r4,r4,32
|
||||||
bdnz 1b
|
bdnz 1b
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
|
|
||||||
/* disable / invalidate / enable L1 data */
|
/* Disable / invalidate / enable L1 data */
|
||||||
mfspr r3,SPRN_HID0
|
mfspr r3,SPRN_HID0
|
||||||
rlwinm r0,r0,0,~HID0_DCE
|
rlwinm r3,r3,0,~(HID0_DCE | HID0_ICE)
|
||||||
mtspr SPRN_HID0,r3
|
mtspr SPRN_HID0,r3
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
ori r3,r3,HID0_DCE|HID0_DCI
|
ori r3,r3,(HID0_DCE|HID0_DCI|HID0_ICE|HID0_ICFI)
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
mtspr SPRN_HID0,r3
|
mtspr SPRN_HID0,r3
|
||||||
xori r3,r3,HID0_DCI
|
xori r3,r3,(HID0_DCI|HID0_ICFI)
|
||||||
mtspr SPRN_HID0,r3
|
mtspr SPRN_HID0,r3
|
||||||
sync
|
sync
|
||||||
|
|
||||||
|
@ -110,11 +122,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||||
lis r4,2
|
lis r4,2
|
||||||
mtctr r4
|
mtctr r4
|
||||||
lis r4,0xfff0
|
lis r4,0xfff0
|
||||||
1: lwzx r0,r0,r4
|
1: lwz r0,0(r4)
|
||||||
addi r4,r4,32
|
addi r4,r4,32
|
||||||
bdnz 1b
|
bdnz 1b
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
|
lis r4,2
|
||||||
|
mtctr r4
|
||||||
|
lis r4,0xfff0
|
||||||
|
1: dcbf 0,r4
|
||||||
|
addi r4,r4,32
|
||||||
|
bdnz 1b
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
|
||||||
/* now disable L2 */
|
/* now disable L2 */
|
||||||
rlwinm r5,r5,0,~L2CR_L2E
|
rlwinm r5,r5,0,~L2CR_L2E
|
||||||
b 2f
|
b 2f
|
||||||
|
@ -135,6 +156,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||||
mtspr SPRN_L2CR,r4
|
mtspr SPRN_L2CR,r4
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
|
|
||||||
|
/* Wait for the invalidation to complete */
|
||||||
|
1: mfspr r3,SPRN_L2CR
|
||||||
|
rlwinm. r0,r3,0,31,31
|
||||||
|
bne 1b
|
||||||
|
|
||||||
|
/* Clear L2I */
|
||||||
xoris r4,r4,L2CR_L2I@h
|
xoris r4,r4,L2CR_L2I@h
|
||||||
sync
|
sync
|
||||||
mtspr SPRN_L2CR,r4
|
mtspr SPRN_L2CR,r4
|
||||||
|
@ -142,14 +170,16 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||||
|
|
||||||
/* now disable the L1 data cache */
|
/* now disable the L1 data cache */
|
||||||
mfspr r0,SPRN_HID0
|
mfspr r0,SPRN_HID0
|
||||||
rlwinm r0,r0,0,~HID0_DCE
|
rlwinm r0,r0,0,~(HID0_DCE|HID0_ICE)
|
||||||
mtspr SPRN_HID0,r0
|
mtspr SPRN_HID0,r0
|
||||||
sync
|
sync
|
||||||
isync
|
isync
|
||||||
|
|
||||||
/* Restore HID0[DPM] to whatever it was before */
|
/* Restore HID0[DPM] to whatever it was before */
|
||||||
sync
|
sync
|
||||||
mtspr SPRN_HID0,r8
|
mfspr r0,SPRN_HID0
|
||||||
|
rlwimi r0,r8,0,11,11 /* Turn back HID0[DPM] */
|
||||||
|
mtspr SPRN_HID0,r0
|
||||||
sync
|
sync
|
||||||
|
|
||||||
/* restore DR and EE */
|
/* restore DR and EE */
|
||||||
|
@ -201,7 +231,7 @@ flush_disable_745x:
|
||||||
mtctr r4
|
mtctr r4
|
||||||
li r4,0
|
li r4,0
|
||||||
1:
|
1:
|
||||||
lwzx r0,r0,r4
|
lwz r0,0(r4)
|
||||||
addi r4,r4,32 /* Go to start of next cache line */
|
addi r4,r4,32 /* Go to start of next cache line */
|
||||||
bdnz 1b
|
bdnz 1b
|
||||||
isync
|
isync
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue