Merge with master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
This commit is contained in:
Коммит
27b030d58c
|
@ -357,14 +357,14 @@ Quota-tools
|
|||
----------
|
||||
o <http://sourceforge.net/projects/linuxquota/>
|
||||
|
||||
Jade
|
||||
----
|
||||
o <ftp://ftp.jclark.com/pub/jade/jade-1.2.1.tar.gz>
|
||||
|
||||
DocBook Stylesheets
|
||||
-------------------
|
||||
o <http://nwalsh.com/docbook/dsssl/>
|
||||
|
||||
XMLTO XSLT Frontend
|
||||
-------------------
|
||||
o <http://cyberelk.net/tim/xmlto/>
|
||||
|
||||
Intel P6 microcode
|
||||
------------------
|
||||
o <http://www.urbanmyth.org/microcode/>
|
||||
|
|
|
@ -7,10 +7,9 @@
|
|||
# list of DOCBOOKS.
|
||||
|
||||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||
kernel-hacking.xml kernel-locking.xml via-audio.xml \
|
||||
deviceiobook.xml procfs-guide.xml tulip-user.xml \
|
||||
writing_usb_driver.xml scsidrivers.xml sis900.xml \
|
||||
kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||
procfs-guide.xml writing_usb_driver.xml scsidrivers.xml \
|
||||
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||
gadget.xml libata.xml mtdnand.xml librs.xml
|
||||
|
||||
###
|
||||
|
@ -42,14 +41,16 @@ MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
|||
mandocs: $(MAN)
|
||||
|
||||
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
|
||||
KERNELDOC = scripts/kernel-doc
|
||||
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:
|
||||
|
@ -96,45 +97,44 @@ $(obj)/procfs-guide.xml: $(C-procfs-example2)
|
|||
# Rules to generate postscript, PDF and HTML
|
||||
# db2html creates a directory. Generate a html file used for timestamp
|
||||
|
||||
quiet_cmd_db2ps = DB2PS $@
|
||||
cmd_db2ps = db2ps -o $(dir $@) $<
|
||||
quiet_cmd_db2ps = XMLTO $@
|
||||
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
%.ps : %.xml
|
||||
@(which db2ps > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2ps)
|
||||
|
||||
quiet_cmd_db2pdf = DB2PDF $@
|
||||
cmd_db2pdf = db2pdf -o $(dir $@) $<
|
||||
quiet_cmd_db2pdf = XMLTO $@
|
||||
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
%.pdf : %.xml
|
||||
@(which db2pdf > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2pdf)
|
||||
|
||||
quiet_cmd_db2html = DB2HTML $@
|
||||
cmd_db2html = db2html -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/book1.html"> \
|
||||
quiet_cmd_db2html = XMLTO $@
|
||||
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||
|
||||
%.html: %.xml
|
||||
@(which db2html > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
@rm -rf $@ $(patsubst %.html,%,$@)
|
||||
$(call cmd,db2html)
|
||||
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
||||
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
||||
|
||||
###
|
||||
# Rule to generate man files - output is placed in the man subdirectory
|
||||
|
||||
%.9: %.xml
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p $(objtree)/Documentation/DocBook/man
|
||||
endif
|
||||
$(SPLITMAN) $< $(objtree)/Documentation/DocBook/man "$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)"
|
||||
$(MAKEMAN) convert $(objtree)/Documentation/DocBook/man $<
|
||||
quiet_cmd_db2man = XMLTO $@
|
||||
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
|
||||
%.9 : %.xml
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2man)
|
||||
@touch $@
|
||||
|
||||
###
|
||||
# Rules to generate postscripts and PNG imgages from .fig format files
|
||||
|
|
|
@ -49,13 +49,33 @@
|
|||
!Iinclude/asm-i386/unaligned.h
|
||||
</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>
|
||||
X!Ekernel/sched.c
|
||||
!Iinclude/linux/sched.h
|
||||
!Ekernel/sched.c
|
||||
!Ekernel/timer.c
|
||||
</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 id="adt">
|
||||
|
@ -81,7 +101,9 @@ KAO -->
|
|||
!Elib/vsprintf.c
|
||||
</sect1>
|
||||
<sect1><title>String Manipulation</title>
|
||||
!Ilib/string.c
|
||||
<!-- All functions are exported at now
|
||||
X!Ilib/string.c
|
||||
-->
|
||||
!Elib/string.c
|
||||
</sect1>
|
||||
<sect1><title>Bit Operations</title>
|
||||
|
@ -98,6 +120,25 @@ KAO -->
|
|||
!Iinclude/asm-i386/uaccess.h
|
||||
!Iarch/i386/lib/usercopy.c
|
||||
</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 id="kfifo">
|
||||
|
@ -114,6 +155,10 @@ KAO -->
|
|||
<sect1><title>sysctl interface</title>
|
||||
!Ekernel/sysctl.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>proc filesystem interface</title>
|
||||
!Ifs/proc/base.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="debugfs">
|
||||
|
@ -127,6 +172,10 @@ KAO -->
|
|||
|
||||
<chapter id="vfs">
|
||||
<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>
|
||||
!Efs/dcache.c
|
||||
!Iinclude/linux/dcache.h
|
||||
|
@ -142,13 +191,31 @@ KAO -->
|
|||
!Efs/locks.c
|
||||
!Ifs/locks.c
|
||||
</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 id="netcore">
|
||||
<title>Linux Networking</title>
|
||||
<sect1><title>Networking Base Types</title>
|
||||
!Iinclude/linux/net.h
|
||||
</sect1>
|
||||
<sect1><title>Socket Buffer Functions</title>
|
||||
!Iinclude/linux/skbuff.h
|
||||
!Iinclude/net/sock.h
|
||||
!Enet/socket.c
|
||||
!Enet/core/skbuff.c
|
||||
!Enet/core/sock.c
|
||||
!Enet/core/datagram.c
|
||||
!Enet/core/stream.c
|
||||
</sect1>
|
||||
<sect1><title>Socket Filter</title>
|
||||
!Enet/core/filter.c
|
||||
|
@ -158,6 +225,14 @@ KAO -->
|
|||
!Enet/core/gen_stats.c
|
||||
!Enet/core/gen_estimator.c
|
||||
</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 id="netdev">
|
||||
|
@ -194,11 +269,26 @@ X!Ekernel/module.c
|
|||
!Iarch/i386/kernel/irq.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>Resources Management</title>
|
||||
!Ekernel/resource.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>MTRR Handling</title>
|
||||
!Earch/i386/kernel/cpu/mtrr/main.c
|
||||
</sect1>
|
||||
<sect1><title>PCI Support Library</title>
|
||||
!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><title>PCI Hotplug Support Library</title>
|
||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||
|
@ -223,6 +313,14 @@ X!Earch/i386/kernel/mca.c
|
|||
!Efs/devfs/base.c
|
||||
</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">
|
||||
<title>Security Framework</title>
|
||||
!Esecurity/security.c
|
||||
|
@ -233,6 +331,61 @@ X!Earch/i386/kernel/mca.c
|
|||
!Ekernel/power/pm.c
|
||||
</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">
|
||||
<title>Block Devices</title>
|
||||
!Edrivers/block/ll_rw_blk.c
|
||||
|
@ -250,7 +403,23 @@ X!Earch/i386/kernel/mca.c
|
|||
|
||||
<chapter id="snddev">
|
||||
<title>Sound Devices</title>
|
||||
!Iinclude/sound/core.h
|
||||
!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
|
||||
X!Isound/sound_firmware.c
|
||||
-->
|
||||
|
@ -258,6 +427,7 @@ X!Isound/sound_firmware.c
|
|||
|
||||
<chapter id="uart16x50">
|
||||
<title>16x50 UART Driver</title>
|
||||
!Iinclude/linux/serial_core.h
|
||||
!Edrivers/serial/serial_core.c
|
||||
!Edrivers/serial/8250.c
|
||||
</chapter>
|
||||
|
@ -310,9 +480,11 @@ X!Isound/sound_firmware.c
|
|||
<sect1><title>Frame Buffer Memory</title>
|
||||
!Edrivers/video/fbmem.c
|
||||
</sect1>
|
||||
<!--
|
||||
<sect1><title>Frame Buffer Console</title>
|
||||
!Edrivers/video/console/fbcon.c
|
||||
X!Edrivers/video/console/fbcon.c
|
||||
</sect1>
|
||||
-->
|
||||
<sect1><title>Frame Buffer Colormap</title>
|
||||
!Edrivers/video/fbcmap.c
|
||||
</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
|
||||
[McKenney04a], a performance comparison of locking to RCU on several
|
||||
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], and a paper
|
||||
describing how to make RCU safe for soft-realtime applications [Sarma04c].
|
||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
|
||||
describing how to make RCU safe for soft-realtime applications [Sarma04c],
|
||||
and a paper describing SELinux performance with RCU [JamesMorris04b].
|
||||
|
||||
|
||||
Bibtex Entries
|
||||
|
@ -341,6 +342,17 @@ Dipankar Sarma"
|
|||
,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
|
||||
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
||||
,title="Scaling dcache with {RCU}"
|
||||
|
@ -373,6 +385,9 @@ in Operating System Kernels"
|
|||
,school="OGI School of Science and Engineering at
|
||||
Oregon Health and Sciences University"
|
||||
,year="2004"
|
||||
,note="Available:
|
||||
\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf}
|
||||
[Viewed October 15, 2004]"
|
||||
}
|
||||
|
||||
@Conference{Sarma04c
|
||||
|
@ -385,3 +400,13 @@ Oregon Health and Sciences University"
|
|||
,month="June"
|
||||
,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
|
||||
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
|
||||
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
|
||||
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.
|
||||
This document presents two examples that demonstrate exactly how bad an
|
||||
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
|
||||
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?
|
||||
|
||||
|
||||
Summary
|
||||
|
||||
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-
|
||||
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
|
||||
to explain why this added complexity is worthwhile. If you
|
||||
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
|
||||
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
|
||||
list_for_each_entry_rcu().
|
||||
|
||||
b. If the list macros are being used, the list_del_rcu(),
|
||||
list_add_tail_rcu(), and list_del_rcu() primitives must
|
||||
be used in order to prevent weakly ordered machines from
|
||||
misordering structure initialization and pointer planting.
|
||||
b. If the list macros are being used, the list_add_tail_rcu()
|
||||
and list_add_rcu() primitives must be used in order
|
||||
to prevent weakly ordered machines from misordering
|
||||
structure initialization and pointer planting.
|
||||
Similarly, if the hlist macros are being used, the
|
||||
hlist_del_rcu() and hlist_add_head_rcu() primitives
|
||||
are required.
|
||||
hlist_add_head_rcu() primitive is 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
|
||||
publicized. Use the rcu_assign_pointer() primitive
|
||||
when publicizing a pointer to a structure that can
|
||||
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(),
|
||||
is used, the callback function must be written to be called
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
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().
|
||||
|
||||
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.
|
||||
Failing to do so will break Alpha and confuse people reading
|
||||
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;
|
||||
|
||||
read_lock(&auditsc_lock);
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry(e, &audit_tsklist, list) {
|
||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||
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;
|
||||
|
||||
rcu_read_lock();
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||
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
|
||||
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
||||
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
|
||||
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
||||
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
|
||||
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;
|
||||
|
||||
write_lock(&auditsc_lock);
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry(e, list, list) {
|
||||
if (!audit_compare_rule(rule, &e->rule)) {
|
||||
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);
|
||||
ne->rule.action = newaction;
|
||||
ne->rule.file_count = newfield_count;
|
||||
list_add_rcu(ne, e);
|
||||
list_del(e);
|
||||
list_replace_rcu(e, ne);
|
||||
call_rcu(&e->rcu, audit_free_rule, e);
|
||||
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?
|
||||
|
||||
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?
|
||||
|
||||
|
|
|
@ -1,137 +1,137 @@
|
|||
.*
|
||||
*~
|
||||
53c8xx_d.h*
|
||||
*.a
|
||||
aic7*reg.h*
|
||||
aic7*seq.h*
|
||||
aic7*reg_print.c*
|
||||
*.aux
|
||||
*.bin
|
||||
*.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
|
||||
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
|
||||
aicdb.h*
|
||||
asm
|
||||
asm_offsets.*
|
||||
autoconf.h*
|
||||
*.aux
|
||||
bbootsect
|
||||
*.bin
|
||||
bin2c
|
||||
binkernel.spec
|
||||
BitKeeper
|
||||
bootsect
|
||||
bsetup
|
||||
btfixupprep
|
||||
build
|
||||
bvmlinux
|
||||
bzImage*
|
||||
ChangeSet
|
||||
classlist.h*
|
||||
compile.h*
|
||||
comp*.log
|
||||
compile.h*
|
||||
config
|
||||
config-*
|
||||
config_data.h*
|
||||
conmakehash
|
||||
consolemap_deftbl.c*
|
||||
COPYING
|
||||
CREDITS
|
||||
.cscope
|
||||
*cscope*
|
||||
crc32table.h*
|
||||
cscope.*
|
||||
*.out
|
||||
*.css
|
||||
CVS
|
||||
defkeymap.c*
|
||||
devlist.h*
|
||||
docproc
|
||||
dummy_sym.c*
|
||||
*.dvi
|
||||
*.eps
|
||||
elfconfig.h*
|
||||
filelist
|
||||
fixdep
|
||||
fore200e_mkfirm
|
||||
fore200e_pca_fw.c*
|
||||
gen-devlist
|
||||
gen_init_cpio
|
||||
gen_crc32table
|
||||
crc32table.h*
|
||||
*.cpio
|
||||
gen-kdb_cmds.c*
|
||||
gentbl
|
||||
gen_crc32table
|
||||
gen_init_cpio
|
||||
genksyms
|
||||
*.gif
|
||||
*.gz
|
||||
*.html
|
||||
gentbl
|
||||
ikconfig.h*
|
||||
initramfs_list
|
||||
*.jpeg
|
||||
kallsyms
|
||||
kconfig
|
||||
kconfig.tk
|
||||
Kerntypes
|
||||
keywords.c*
|
||||
ksym.c*
|
||||
ksym.h*
|
||||
kallsyms
|
||||
mk_elfconfig
|
||||
elfconfig.h*
|
||||
modpost
|
||||
pnmtologo
|
||||
logo_*.c
|
||||
*.log
|
||||
lex.c*
|
||||
logo_*.c
|
||||
logo_*_clut224.c
|
||||
logo_*_mono.c
|
||||
lxdialog
|
||||
make_times_h
|
||||
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
|
||||
pss_boot.h
|
||||
trix_boot.h
|
||||
*.pdf
|
||||
mk_elfconfig
|
||||
mkdep
|
||||
mktables
|
||||
modpost
|
||||
modversions.h*
|
||||
oui.c*
|
||||
parse.c*
|
||||
parse.h*
|
||||
PENDING
|
||||
pnmtologo
|
||||
ppc_defs.h*
|
||||
promcon_tbl.c*
|
||||
*.png
|
||||
*.ps
|
||||
*.rej
|
||||
SCCS
|
||||
pss_boot.h
|
||||
raid6altivec*.c
|
||||
raid6int*.c
|
||||
raid6tables.c
|
||||
setup
|
||||
*.s
|
||||
*.so
|
||||
*.sgml
|
||||
sim710_d.h*
|
||||
sm_tbl*
|
||||
split-include
|
||||
System.map*
|
||||
tags
|
||||
TAGS
|
||||
*.tex
|
||||
times.h*
|
||||
tkparse
|
||||
*.ver
|
||||
trix_boot.h
|
||||
version.h*
|
||||
*_vga16.c
|
||||
vmlinux
|
||||
vmlinux.lds
|
||||
vmlinux-*
|
||||
vmlinux.lds
|
||||
vsyscall.lds
|
||||
wanxlfw.inc
|
||||
zImage
|
||||
|
|
|
@ -48,3 +48,18 @@ When: April 2005
|
|||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||
vecors.
|
||||
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
|
||||
in-progress I/O and then start new I/O.
|
||||
|
||||
The filesystem should unlock the page synchronously, before returning
|
||||
to the caller.
|
||||
The filesystem should unlock the page synchronously, before returning to the
|
||||
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
|
||||
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
|
||||
(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
|
||||
---------------------
|
||||
|
||||
|
|
|
@ -79,6 +79,6 @@ Offset Type Description
|
|||
0x22c unsigned long ramdisk_max
|
||||
0x230 16 bytes trampoline
|
||||
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
||||
0x2d0 - 0x600 E820MAP
|
||||
0x600 - 0x7ff EDDBUF (edd.S) for disk signature read sector
|
||||
0x600 - 0x7eb EDDBUF (edd.S) for edd data
|
||||
0x2d0 - 0xd00 E820MAP
|
||||
0xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector
|
||||
0xd00 - 0xeeb EDDBUF (edd.S) for edd data
|
||||
|
|
|
@ -56,12 +56,16 @@ read_dev_chars()
|
|||
read device characteristics
|
||||
|
||||
read_conf_data()
|
||||
read_conf_data_lpm()
|
||||
read configuration data.
|
||||
|
||||
ccw_device_get_ciw()
|
||||
get commands from extended sense data.
|
||||
|
||||
ccw_device_start()
|
||||
ccw_device_start_timeout()
|
||||
ccw_device_start_key()
|
||||
ccw_device_start_key_timeout()
|
||||
initiate an I/O request.
|
||||
|
||||
ccw_device_resume()
|
||||
|
@ -197,19 +201,21 @@ The read_dev_chars() function returns :
|
|||
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
|
||||
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.
|
||||
|
||||
The function may be called enabled or disabled, but the device must not be
|
||||
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.
|
||||
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,
|
||||
__u8 lpm,
|
||||
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
|
||||
cpa : logical start address of channel program
|
||||
|
@ -272,7 +297,12 @@ user_intparm : user specific interrupt information; will be presented
|
|||
particular I/O request.
|
||||
lpm : defines the channel path to be used for a specific I/O
|
||||
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
|
||||
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 :
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
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
|
||||
|
|
|
@ -2113,6 +2113,13 @@ M: perex@suse.cz
|
|||
L: alsa-devel@alsa-project.org
|
||||
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):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
|
|
10
Makefile
10
Makefile
|
@ -332,9 +332,7 @@ KALLSYMS = scripts/kallsyms
|
|||
PERL = perl
|
||||
CHECK = sparse
|
||||
|
||||
NOSTDINC_FLAGS = -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
||||
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
||||
MODFLAGS = -DMODULE
|
||||
CFLAGS_MODULE = $(MODFLAGS)
|
||||
AFLAGS_MODULE = $(MODFLAGS)
|
||||
|
@ -531,6 +529,10 @@ endif
|
|||
|
||||
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
|
||||
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||
|
||||
|
@ -1188,8 +1190,8 @@ cmd_TAGS = $(all-sources) | etags -
|
|||
quiet_cmd_tags = MAKE $@
|
||||
define cmd_tags
|
||||
rm -f $@; \
|
||||
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL"`; \
|
||||
$(all-sources) | xargs ctags $$CTAGSF -a --extra=+f
|
||||
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
|
||||
endef
|
||||
|
||||
TAGS: FORCE
|
||||
|
|
|
@ -457,22 +457,6 @@ osf_getdomainname(char __user *name, int namelen)
|
|||
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
|
||||
* be labeled "officially supported." Right now, there is just enough
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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 */
|
||||
case PTRACE_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
/* Mark single stepping. */
|
||||
child->thread_info->bpt_nsaved = -1;
|
||||
|
|
|
@ -227,7 +227,7 @@ sys_call_table:
|
|||
.quad sys_semop
|
||||
.quad osf_utsname
|
||||
.quad sys_lchown
|
||||
.quad osf_shmat
|
||||
.quad sys_shmat
|
||||
.quad sys_shmctl /* 210 */
|
||||
.quad sys_shmdt
|
||||
.quad sys_shmget
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
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));
|
||||
ops->read_time(tm);
|
||||
return ops->read_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;
|
||||
if (ops->read_alarm) {
|
||||
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
||||
ops->read_alarm(alrm);
|
||||
ret = 0;
|
||||
ret = ops->read_alarm(alrm);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
break;
|
||||
|
||||
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));
|
||||
if (ret)
|
||||
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;
|
||||
char *p = page;
|
||||
|
||||
rtc_read_time(ops, &tm);
|
||||
|
||||
p += sprintf(p,
|
||||
"rtc_time\t: %02d:%02d:%02d\n"
|
||||
"rtc_date\t: %04d-%02d-%02d\n"
|
||||
"rtc_epoch\t: %04lu\n",
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
rtc_epoch);
|
||||
if (rtc_read_time(ops, &tm) == 0) {
|
||||
p += sprintf(p,
|
||||
"rtc_time\t: %02d:%02d:%02d\n"
|
||||
"rtc_date\t: %04d-%02d-%02d\n"
|
||||
"rtc_epoch\t: %04lu\n",
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
rtc_epoch);
|
||||
}
|
||||
|
||||
if (rtc_read_alarm(ops, &alrm) == 0) {
|
||||
p += sprintf(p, "alrm_time\t: ");
|
||||
|
|
|
@ -133,7 +133,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=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
|
||||
|
||||
#
|
||||
|
|
|
@ -269,6 +269,12 @@ __pabt_svc:
|
|||
add r5, sp, #S_PC
|
||||
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:
|
||||
@
|
||||
|
@ -499,8 +505,12 @@ ENTRY(__switch_to)
|
|||
mra r4, r5, acc0
|
||||
stmia ip, {r4, r5}
|
||||
#endif
|
||||
#ifdef CONFIG_HAS_TLS_REG
|
||||
mcr p15, 0, r3, c13, c0, 3 @ set TLS register
|
||||
#else
|
||||
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
|
||||
#ifdef CONFIG_VFP
|
||||
@ 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
|
||||
|
||||
__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.
|
||||
*
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
child->ptrace |= PT_SINGLESTEP;
|
||||
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.
|
||||
* 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):
|
||||
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.
|
||||
* On SMP read access to this address must raise a fault
|
||||
* and be emulated from the data abort handler.
|
||||
* m
|
||||
* User space must never try to access this directly.
|
||||
* Expect your app to break eventually if you do so.
|
||||
* The user helper at 0xffff0fe0 must be used instead.
|
||||
* (see entry-armv.S for details)
|
||||
*/
|
||||
*((unsigned long *)0xffff0ffc) = thread->tp_value;
|
||||
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
default:
|
||||
|
@ -493,6 +497,41 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||
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)
|
||||
{
|
||||
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 __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
|
||||
* vector page, mapped at 0xffff0000, and ensure these are
|
||||
* visible to the instruction stream.
|
||||
* Copy the vectors, stubs and kuser helpers (in entry-armv.S)
|
||||
* into the vector page, mapped at 0xffff0000, and ensure these
|
||||
* are visible to the instruction stream.
|
||||
*/
|
||||
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_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);
|
||||
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
||||
}
|
||||
|
|
|
@ -420,7 +420,22 @@ static struct clcd_panel vga = {
|
|||
*/
|
||||
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;
|
||||
|
|
|
@ -40,25 +40,32 @@ static int integrator_set_rtc(void)
|
|||
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);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||
static inline int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||
{
|
||||
unsigned long time;
|
||||
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)
|
||||
writel(time, rtc_base + RTC_MR);
|
||||
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);
|
||||
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
|
||||
* in advance.
|
||||
*/
|
||||
static int rtc_set_time(struct rtc_time *tm)
|
||||
static inline int rtc_set_time(struct rtc_time *tm)
|
||||
{
|
||||
unsigned long time;
|
||||
int ret;
|
||||
|
|
|
@ -65,19 +65,102 @@ static struct sys_timer ixdp2800_timer = {
|
|||
/*************************************************************************
|
||||
* 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)
|
||||
{
|
||||
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_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -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 */
|
||||
}
|
||||
|
||||
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()) {
|
||||
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);
|
||||
printk(KERN_INFO "IXDP2800: enabling slave NPU\n");
|
||||
|
||||
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();
|
||||
ixdp2800_slave_signal_bus_scan_completion();
|
||||
}
|
||||
}
|
||||
|
||||
struct hw_pci ixdp2800_pci __initdata = {
|
||||
struct __initdata hw_pci ixdp2800_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.setup = ixdp2800_pci_setup,
|
||||
.preinit = ixdp2800_pci_preinit,
|
||||
|
@ -155,8 +263,21 @@ struct hw_pci ixdp2800_pci __initdata = {
|
|||
|
||||
int __init ixdp2800_pci_init(void)
|
||||
{
|
||||
if (machine_is_ixdp2800())
|
||||
if (machine_is_ixdp2800()) {
|
||||
struct pci_dev *dev;
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ static int pci_master_aborts = 0;
|
|||
|
||||
static int clear_master_aborts(void);
|
||||
|
||||
static u32 *
|
||||
u32 *
|
||||
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
||||
{
|
||||
u32 *paddress;
|
||||
|
@ -208,15 +208,15 @@ ixp2000_pci_preinit(void)
|
|||
* use our own resource space.
|
||||
*/
|
||||
static struct resource ixp2000_pci_mem_space = {
|
||||
.start = 0x00000000,
|
||||
.start = 0xe0000000,
|
||||
.end = 0xffffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
.name = "PCI Mem Space"
|
||||
};
|
||||
|
||||
static struct resource ixp2000_pci_io_space = {
|
||||
.start = 0x00000000,
|
||||
.end = 0xffffffff,
|
||||
.start = 0x00010000,
|
||||
.end = 0x0001ffff,
|
||||
.flags = IORESOURCE_IO,
|
||||
.name = "PCI I/O Space"
|
||||
};
|
||||
|
|
|
@ -220,6 +220,30 @@ static struct platform_device stuart_device = {
|
|||
.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 = {
|
||||
&pxamci_device,
|
||||
&udc_device,
|
||||
|
@ -227,6 +251,7 @@ static struct platform_device *devices[] __initdata = {
|
|||
&ffuart_device,
|
||||
&btuart_device,
|
||||
&stuart_device,
|
||||
&i2c_device,
|
||||
};
|
||||
|
||||
static int __init pxa_init(void)
|
||||
|
|
|
@ -409,3 +409,17 @@ config CPU_BPREDICT_DISABLE
|
|||
depends on CPU_ARM1020
|
||||
help
|
||||
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
|
||||
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 <asm/assembler.h>
|
||||
#include "abort-macro.S"
|
||||
/*
|
||||
* Function: v6_early_abort
|
||||
*
|
||||
|
@ -13,11 +14,26 @@
|
|||
* : sp = pointer to registers
|
||||
*
|
||||
* 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
|
||||
ENTRY(v6_early_abort)
|
||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||
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
|
||||
|
||||
|
||||
|
|
|
@ -411,9 +411,10 @@ static void __init build_mem_type_table(void)
|
|||
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
||||
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
||||
/*
|
||||
* Mark cache clean areas read only from SVC mode
|
||||
* and no access from userspace.
|
||||
* Mark cache clean areas and XIP ROM read only
|
||||
* 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_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
child->ptrace |= PT_SINGLESTEP;
|
||||
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);
|
||||
again:
|
||||
#ifdef PEDANTIC
|
||||
if (USED_MAP(page) & ~order->all_used)
|
||||
PAGE_BUG(page);
|
||||
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||
#endif
|
||||
offset = ffz(USED_MAP(page));
|
||||
SET_USED(page, offset);
|
||||
|
@ -141,8 +140,7 @@ static void __free_small_page(unsigned long spage, struct order *order)
|
|||
goto non_small;
|
||||
|
||||
#ifdef PEDANTIC
|
||||
if (USED_MAP(page) & ~order->all_used)
|
||||
PAGE_BUG(page);
|
||||
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||
#endif
|
||||
|
||||
spage = spage >> order->shift;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
|
@ -184,7 +185,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||
case PTRACE_CONT:
|
||||
ret = -EIO;
|
||||
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
|
@ -219,7 +220,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||
case PTRACE_SINGLESTEP:
|
||||
ret = -EIO;
|
||||
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
ptrace_enable(child);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: { /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data >= _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break ;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
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 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
|
||||
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
||||
---help---
|
||||
|
|
|
@ -123,7 +123,7 @@ AFLAGS += $(mflags-y)
|
|||
boot := arch/i386/boot
|
||||
|
||||
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 install
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 install kernel_install
|
||||
|
||||
all: bzImage
|
||||
|
||||
|
@ -145,8 +145,9 @@ zdisk bzdisk: vmlinux
|
|||
fdimage fdimage144 fdimage288: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||
|
||||
install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||
install: vmlinux
|
||||
install kernel_install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
|
||||
|
||||
prepare: include/asm-$(ARCH)/asm_offsets.h
|
||||
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/tty.h>
|
||||
#include <video/edid.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -164,7 +164,7 @@ ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
|
|||
trampoline: call start_of_setup
|
||||
.align 16
|
||||
# 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 #####################################################
|
||||
|
||||
start_of_setup:
|
||||
|
@ -333,9 +333,9 @@ jmpe820:
|
|||
# sizeof(e820rec).
|
||||
#
|
||||
good820:
|
||||
movb (E820NR), %al # up to 32 entries
|
||||
movb (E820NR), %al # up to 128 entries
|
||||
cmpb $E820MAX, %al
|
||||
jnl bail820
|
||||
jae bail820
|
||||
|
||||
incb (E820NR)
|
||||
movw %di, %ax
|
||||
|
|
|
@ -23,6 +23,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
|
|||
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
||||
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.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_SUMMIT_NUMA) += summit.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
|
|
@ -1265,8 +1265,6 @@ int __init APIC_init_uniprocessor (void)
|
|||
|
||||
setup_local_APIC();
|
||||
|
||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
||||
check_nmi_watchdog();
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (smp_found_config)
|
||||
if (!skip_ioapic_setup && nr_ioapics)
|
||||
|
|
|
@ -124,8 +124,8 @@ int generic_get_free_region(unsigned long base, unsigned long size)
|
|||
return -ENOSPC;
|
||||
}
|
||||
|
||||
void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned int *size, mtrr_type * type)
|
||||
static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned int *size, mtrr_type * type)
|
||||
{
|
||||
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)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
u8 rev;
|
||||
|
||||
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 */
|
||||
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
||||
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
||||
printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
|
||||
pci_dev_put(dev);
|
||||
return 0;
|
||||
pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
|
||||
if (rev <= 5) {
|
||||
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 */
|
||||
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
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",
|
||||
|
||||
/* 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, "mp", "nx", NULL, "mmxext", NULL,
|
||||
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
||||
|
|
|
@ -260,11 +260,9 @@ restore_nocheck:
|
|||
.section .fixup,"ax"
|
||||
iret_exc:
|
||||
sti
|
||||
movl $__USER_DS, %edx
|
||||
movl %edx, %ds
|
||||
movl %edx, %es
|
||||
movl $11,%eax
|
||||
call do_exit
|
||||
pushl $0 # no error code
|
||||
pushl $do_iret_error
|
||||
jmp error_code
|
||||
.previous
|
||||
.section __ex_table,"a"
|
||||
.align 4
|
||||
|
@ -516,8 +514,6 @@ debug_stack_correct:
|
|||
xorl %edx,%edx # error code 0
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_debug
|
||||
testl %eax,%eax
|
||||
jnz restore_all
|
||||
jmp ret_from_exception
|
||||
|
||||
/*
|
||||
|
@ -598,8 +594,6 @@ ENTRY(int3)
|
|||
xorl %edx,%edx # zero error code
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_int3
|
||||
testl %eax,%eax
|
||||
jnz restore_all
|
||||
jmp ret_from_exception
|
||||
|
||||
ENTRY(overflow)
|
||||
|
@ -658,296 +652,6 @@ ENTRY(spurious_interrupt_bug)
|
|||
pushl $do_spurious_interrupt_bug
|
||||
jmp error_code
|
||||
|
||||
.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
|
||||
#include "syscall_table.S"
|
||||
|
||||
syscall_table_size=(.-sys_call_table)
|
||||
|
|
|
@ -380,6 +380,7 @@ rp_sidt:
|
|||
ALIGN
|
||||
ignore_int:
|
||||
cld
|
||||
#ifdef CONFIG_PRINTK
|
||||
pushl %eax
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
|
@ -400,6 +401,7 @@ ignore_int:
|
|||
popl %edx
|
||||
popl %ecx
|
||||
popl %eax
|
||||
#endif
|
||||
iret
|
||||
|
||||
/*
|
||||
|
|
|
@ -2175,7 +2175,6 @@ static inline void check_timer(void)
|
|||
disable_8259A_irq(0);
|
||||
setup_nmi();
|
||||
enable_8259A_irq(0);
|
||||
check_nmi_watchdog();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -2198,7 +2197,6 @@ static inline void check_timer(void)
|
|||
add_pin_to_irq(0, 0, pin2);
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
setup_nmi();
|
||||
check_nmi_watchdog();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -102,20 +102,21 @@ int nmi_active;
|
|||
(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)
|
||||
|
||||
int __init check_nmi_watchdog (void)
|
||||
static int __init check_nmi_watchdog(void)
|
||||
{
|
||||
unsigned int prev_nmi_count[NR_CPUS];
|
||||
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++)
|
||||
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
||||
local_irq_enable();
|
||||
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++) {
|
||||
#ifdef CONFIG_SMP
|
||||
/* Check cpu_callin_map here because that is set
|
||||
|
@ -139,6 +140,8 @@ int __init check_nmi_watchdog (void)
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
* those are always kernel segments while inside the kernel.
|
||||
*/
|
||||
asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs));
|
||||
asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs));
|
||||
asm volatile("mov %%fs,%0":"=m" (prev->fs));
|
||||
asm volatile("mov %%gs,%0":"=m" (prev->gs));
|
||||
|
||||
/*
|
||||
* Restore %fs and %gs if needed.
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/security.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
set_singlestep(child);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/apic.h>
|
||||
#include "mach_reboot.h"
|
||||
#include <linux/reboot_fixups.h>
|
||||
|
||||
/*
|
||||
* Power off function, if any
|
||||
|
@ -348,6 +349,7 @@ void machine_restart(char * __unused)
|
|||
/* rebooting needs to touch the page at absolute addr 0 */
|
||||
*((unsigned short *)__va(0x472)) = reboot_mode;
|
||||
for (;;) {
|
||||
mach_reboot_fixups(); /* for board specific fixups */
|
||||
mach_reboot();
|
||||
/* That didn't work - force a triple fault.. */
|
||||
__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();
|
||||
|
||||
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,
|
||||
-xtime.tv_sec, -xtime.tv_nsec);
|
||||
|
||||
if (hpet_enable() >= 0) {
|
||||
if ((hpet_enable() >= 0) && hpet_use_timer) {
|
||||
printk("Using HPET for base-timer\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
static unsigned long hpet_period; /* fsecs / HPET clock */
|
||||
unsigned long hpet_tick; /* hpet clks count per tick */
|
||||
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 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 + 4);
|
||||
|
||||
/*
|
||||
* 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 |
|
||||
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);
|
||||
if (hpet_use_timer) {
|
||||
/*
|
||||
* 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 |
|
||||
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);
|
||||
}
|
||||
/*
|
||||
* Go!
|
||||
*/
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
@ -128,12 +132,11 @@ int __init hpet_enable(void)
|
|||
* However, we can do with one timer otherwise using the
|
||||
* the single HPET timer for system time.
|
||||
*/
|
||||
if (
|
||||
#ifdef CONFIG_HPET_EMULATE_RTC
|
||||
!(id & HPET_ID_NUMBER) ||
|
||||
#endif
|
||||
!(id & HPET_ID_LEGSUP))
|
||||
if (!(id & HPET_ID_NUMBER))
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
|
||||
hpet_period = hpet_readl(HPET_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))
|
||||
hpet_tick++; /* rounding the result */
|
||||
|
||||
hpet_use_timer = id & HPET_ID_LEGSUP;
|
||||
|
||||
if (hpet_timer_stop_set_go(hpet_tick))
|
||||
return -1;
|
||||
|
||||
|
@ -202,7 +207,8 @@ int __init hpet_enable(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
wait_timer_tick = wait_hpet_tick;
|
||||
if (hpet_use_timer)
|
||||
wait_timer_tick = wait_hpet_tick;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ static unsigned long get_offset_hpet(void)
|
|||
|
||||
eax = hpet_readl(HPET_COUNTER);
|
||||
eax -= hpet_last; /* hpet delta */
|
||||
|
||||
eax = min(hpet_tick, eax);
|
||||
/*
|
||||
* Time offset = (hpet delta) * ( usecs per HPET clock )
|
||||
* = (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;
|
||||
rdtsc(last_tsc_low, last_tsc_high);
|
||||
|
||||
offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
|
||||
if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
|
||||
int lost_ticks = (offset - hpet_last) / hpet_tick;
|
||||
if (hpet_use_timer)
|
||||
offset = hpet_readl(HPET_T0_CMP) - 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;
|
||||
}
|
||||
hpet_last = offset;
|
||||
|
|
|
@ -477,7 +477,7 @@ static int __init init_tsc(char* override)
|
|||
if (cpu_has_tsc) {
|
||||
unsigned long tsc_quotient;
|
||||
#ifdef CONFIG_HPET_TIMER
|
||||
if (is_hpet_enabled()){
|
||||
if (is_hpet_enabled() && hpet_use_timer) {
|
||||
unsigned long result, remain;
|
||||
printk("Using TSC for gettimeofday\n");
|
||||
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(12, SIGBUS, "stack segment", stack_segment)
|
||||
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)
|
||||
{
|
||||
|
@ -642,16 +643,15 @@ void unset_nmi_callback(void)
|
|||
}
|
||||
|
||||
#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)
|
||||
== NOTIFY_STOP)
|
||||
return 1;
|
||||
return;
|
||||
/* This is an interrupt gate, because kprobes wants interrupts
|
||||
disabled. Normal trap handlers don't. */
|
||||
restore_interrupts(regs);
|
||||
do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ asmlinkage int sys_vm86(struct pt_regs regs)
|
|||
goto out;
|
||||
case VM86_PLUS_INSTALL_CHECK:
|
||||
/* 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.
|
||||
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;
|
||||
tsk->thread.saved_esp0 = tsk->thread.esp0;
|
||||
asm volatile("movl %%fs,%0":"=m" (tsk->thread.saved_fs));
|
||||
asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));
|
||||
asm volatile("mov %%fs,%0":"=m" (tsk->thread.saved_fs));
|
||||
asm volatile("mov %%gs,%0":"=m" (tsk->thread.saved_gs));
|
||||
|
||||
tss = &per_cpu(init_tss, get_cpu());
|
||||
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;
|
||||
if (vm86_irqs[intno].sig)
|
||||
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
|
||||
* polling or as a result of the signal)
|
||||
*/
|
||||
disable_irq(intno);
|
||||
disable_irq_nosync(intno);
|
||||
spin_unlock_irqrestore(&irqbits_lock, flags);
|
||||
return IRQ_HANDLED;
|
||||
|
||||
out:
|
||||
|
@ -754,17 +754,20 @@ static inline int get_and_reset_irq(int irqnumber)
|
|||
{
|
||||
int bit;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
if (invalid_vm86_irq(irqnumber)) return 0;
|
||||
if (vm86_irqs[irqnumber].tsk != current) return 0;
|
||||
spin_lock_irqsave(&irqbits_lock, flags);
|
||||
bit = irqbits & (1 << irqnumber);
|
||||
irqbits &= ~bit;
|
||||
if (bit) {
|
||||
enable_irq(irqnumber);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&irqbits_lock, flags);
|
||||
if (!bit)
|
||||
return 0;
|
||||
enable_irq(irqnumber);
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ static void timer_stop(void)
|
|||
{
|
||||
enable_timer_nmi_watchdog();
|
||||
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_ICH7_0:
|
||||
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:
|
||||
r->name = "PIIX/ICH";
|
||||
r->get = pirq_piix_get;
|
||||
|
|
|
@ -1417,7 +1417,7 @@ sys_call_table:
|
|||
data8 sys_msgrcv
|
||||
data8 sys_msgctl
|
||||
data8 sys_shmget
|
||||
data8 ia64_shmat
|
||||
data8 sys_shmat
|
||||
data8 sys_shmdt // 1115
|
||||
data8 sys_shmctl
|
||||
data8 sys_syslog
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/processor.h>
|
||||
|
@ -1481,7 +1482,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
|
|||
case PTRACE_CONT:
|
||||
/* restart after signal. */
|
||||
ret = -EIO;
|
||||
if (data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
goto out_tsk;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
|
@ -1520,7 +1521,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
|
|||
/* let child execute for one instruction */
|
||||
case PTRACE_SINGLEBLOCK:
|
||||
ret = -EIO;
|
||||
if (data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
goto out_tsk;
|
||||
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
|
|
|
@ -92,20 +92,6 @@ sys_getpagesize (void)
|
|||
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
|
||||
ia64_brk (unsigned long brk)
|
||||
{
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/cacheflush.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_CONT:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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;
|
||||
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
if ((child->ptrace & PT_DTRACE) == 0) {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
|
@ -251,7 +252,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||
long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
child->thread.work.syscall_trace = ~0;
|
||||
|
@ -292,7 +293,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||
long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
child->thread.work.syscall_trace = 0;
|
||||
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
|
@ -240,7 +241,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||
long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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;
|
||||
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/smp_lock.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/cpu.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_CONT: { /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/smp_lock.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/cpu.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_CONT: { /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned int) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
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 ...
|
||||
*/
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/personality.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -285,7 +286,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
|||
ret = -EIO;
|
||||
DBG("sys_ptrace(%s)\n",
|
||||
request == PTRACE_SYSCALL ? "SYSCALL" : "CONT");
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
goto out_tsk;
|
||||
child->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP);
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
|
@ -311,7 +312,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
|||
case PTRACE_SINGLEBLOCK:
|
||||
DBG("sys_ptrace(SINGLEBLOCK)\n");
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
goto out_tsk;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
child->ptrace &= ~PT_SINGLESTEP;
|
||||
|
@ -328,7 +329,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
|
|||
case PTRACE_SINGLESTEP:
|
||||
DBG("sys_ptrace(SINGLESTEP)\n");
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
goto out_tsk;
|
||||
|
||||
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 */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
|
|
@ -297,7 +297,7 @@
|
|||
ENTRY_DIFF(msgrcv)
|
||||
ENTRY_SAME(msgget) /* 190 */
|
||||
ENTRY_SAME(msgctl)
|
||||
ENTRY_SAME(shmat_wrapper)
|
||||
ENTRY_SAME(shmat)
|
||||
ENTRY_SAME(shmdt)
|
||||
ENTRY_SAME(shmget)
|
||||
ENTRY_SAME(shmctl) /* 195 */
|
||||
|
|
|
@ -53,6 +53,7 @@ choice
|
|||
|
||||
config 6xx
|
||||
bool "6xx/7xx/74xx/52xx/82xx/83xx"
|
||||
select PPC_FPU
|
||||
help
|
||||
There are four types of PowerPC chips supported. The more common
|
||||
types (601, 603, 604, 740, 750, 7400), the Motorola embedded
|
||||
|
@ -86,6 +87,9 @@ config E500
|
|||
|
||||
endchoice
|
||||
|
||||
config PPC_FPU
|
||||
bool
|
||||
|
||||
config BOOKE
|
||||
bool
|
||||
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_POWER4) += arch/ppc/kernel/idle_power4.o
|
||||
head-$(CONFIG_PPC_FPU) += arch/ppc/kernel/fpu.o
|
||||
|
||||
core-y += arch/ppc/kernel/ arch/ppc/platforms/ \
|
||||
arch/ppc/mm/ arch/ppc/lib/ arch/ppc/syslib/
|
||||
|
|
|
@ -20,8 +20,9 @@ quiet_cmd_uimage = UIMAGE $@
|
|||
|
||||
targets += uImage
|
||||
$(obj)/uImage: $(obj)/vmlinux.gz
|
||||
$(Q)rm -f $@
|
||||
$(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
|
||||
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_6xx) += idle_6xx.o
|
||||
extra-$(CONFIG_POWER4) += idle_power4.o
|
||||
extra-$(CONFIG_PPC_FPU) += fpu.o
|
||||
extra-y += vmlinux.lds
|
||||
|
||||
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 */
|
||||
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];
|
||||
if (flags & LD) {
|
||||
for (i = 0; i < nb; ++i)
|
||||
|
@ -368,16 +372,24 @@ fix_alignment(struct pt_regs *regs)
|
|||
|
||||
/* Single-precision FP load and store require conversions... */
|
||||
case LD+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_fd(&data.f, &data.d, ¤t->thread.fpscr);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
case ST+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_df(&data.d, &data.f, ¤t->thread.fpscr);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,12 +30,14 @@ _GLOBAL(__setup_cpu_604)
|
|||
blr
|
||||
_GLOBAL(__setup_cpu_750)
|
||||
mflr r4
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
mtlr r4
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750cx)
|
||||
mflr r4
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750cx
|
||||
|
@ -43,6 +45,7 @@ _GLOBAL(__setup_cpu_750cx)
|
|||
blr
|
||||
_GLOBAL(__setup_cpu_750fx)
|
||||
mflr r4
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750fx
|
||||
|
@ -50,6 +53,7 @@ _GLOBAL(__setup_cpu_750fx)
|
|||
blr
|
||||
_GLOBAL(__setup_cpu_7400)
|
||||
mflr r4
|
||||
bl __init_fpu_registers
|
||||
bl setup_7400_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
|
@ -57,6 +61,7 @@ _GLOBAL(__setup_cpu_7400)
|
|||
blr
|
||||
_GLOBAL(__setup_cpu_7410)
|
||||
mflr r4
|
||||
bl __init_fpu_registers
|
||||
bl setup_7410_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
|
@ -80,7 +85,7 @@ setup_common_caches:
|
|||
bne 1f /* don't invalidate the D-cache */
|
||||
ori r8,r8,HID0_DCI /* unless it wasn't enabled */
|
||||
1: sync
|
||||
mtspr SPRN_HID0,r8 /* enable and invalidate caches */
|
||||
mtspr SPRN_HID0,r8 /* enable and invalidate caches */
|
||||
sync
|
||||
mtspr SPRN_HID0,r11 /* enable caches */
|
||||
sync
|
||||
|
@ -152,9 +157,13 @@ setup_7410_workarounds:
|
|||
setup_750_7400_hid0:
|
||||
mfspr r11,SPRN_HID0
|
||||
ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC
|
||||
oris r11,r11,HID0_DPM@h
|
||||
BEGIN_FTR_SECTION
|
||||
oris r11,r11,HID0_DPM@h /* enable dynamic power mgmt */
|
||||
END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
||||
xori r11,r11,HID0_BTIC
|
||||
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
|
||||
andc r11,r11,r3 /* clear SPD: enable speculative */
|
||||
li r3,0
|
||||
|
@ -218,13 +227,15 @@ setup_745x_specifics:
|
|||
|
||||
/* 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
|
||||
xori r11,r11,HID0_BTIC
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC)
|
||||
BEGIN_FTR_SECTION
|
||||
oris r11,r11,HID0_DPM@h /* enable dynamic power mgmt */
|
||||
END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
||||
xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM)
|
||||
|
||||
/* All of the bits we have to clear....
|
||||
*/
|
||||
|
@ -248,6 +259,25 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM)
|
|||
isync
|
||||
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 */
|
||||
#define CS_HID0 0
|
||||
#define CS_HID1 4
|
||||
|
|
|
@ -563,6 +563,65 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
addi r1,r1,INT_FRAME_SIZE
|
||||
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
|
||||
sigreturn_exit:
|
||||
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)
|
||||
#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
|
||||
/* Note that the AltiVec support is closely modeled after the FP
|
||||
* support. Changes to one are likely to be applicable to the
|
||||
|
@ -1015,42 +888,6 @@ giveup_altivec:
|
|||
blr
|
||||
#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
|
||||
* the kernel image to physical address 0.
|
||||
|
|
|
@ -426,7 +426,11 @@ interrupt_base:
|
|||
PROGRAM_EXCEPTION
|
||||
|
||||
/* Floating Point Unavailable Interrupt */
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
FP_UNAVAILABLE_EXCEPTION
|
||||
#else
|
||||
EXCEPTION(0x2010, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
||||
#endif
|
||||
|
||||
/* System Call Interrupt */
|
||||
START_EXCEPTION(SystemCall)
|
||||
|
@ -686,8 +690,10 @@ _GLOBAL(giveup_altivec)
|
|||
*
|
||||
* The 44x core does not have an FPU.
|
||||
*/
|
||||
#ifndef CONFIG_PPC_FPU
|
||||
_GLOBAL(giveup_fpu)
|
||||
blr
|
||||
#endif
|
||||
|
||||
/*
|
||||
* extern void abort(void)
|
||||
|
|
|
@ -337,4 +337,11 @@ label:
|
|||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
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__ */
|
||||
|
|
|
@ -504,7 +504,11 @@ interrupt_base:
|
|||
PROGRAM_EXCEPTION
|
||||
|
||||
/* Floating Point Unavailable Interrupt */
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
FP_UNAVAILABLE_EXCEPTION
|
||||
#else
|
||||
EXCEPTION(0x0800, FloatingPointUnavailable, UnknownException, EXC_XFER_EE)
|
||||
#endif
|
||||
|
||||
/* System Call Interrupt */
|
||||
START_EXCEPTION(SystemCall)
|
||||
|
@ -916,10 +920,12 @@ _GLOBAL(giveup_spe)
|
|||
/*
|
||||
* 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)
|
||||
blr
|
||||
#endif
|
||||
|
||||
/*
|
||||
* extern void abort(void)
|
||||
|
|
|
@ -1096,17 +1096,7 @@ _GLOBAL(_get_SP)
|
|||
* and exceptions as if the cpu had performed the load or store.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_4xx) || defined(CONFIG_E500)
|
||||
_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
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
_GLOBAL(cvt_fd)
|
||||
lfd 0,-4(r5) /* load up fpscr value */
|
||||
mtfsf 0xff,0
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: { /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
set_single_step(child);
|
||||
|
|
|
@ -176,7 +176,7 @@ static inline int check_io_access(struct pt_regs *regs)
|
|||
#else
|
||||
#define get_mc_reason(regs) (mfspr(SPRN_MCSR))
|
||||
#endif
|
||||
#define REASON_FP 0
|
||||
#define REASON_FP ESR_FP
|
||||
#define REASON_ILLEGAL ESR_PIL
|
||||
#define REASON_PRIVILEGED ESR_PPR
|
||||
#define REASON_TRAP ESR_PTR
|
||||
|
|
|
@ -64,27 +64,39 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
mtspr SPRN_HID0,r4 /* Disable DPM */
|
||||
sync
|
||||
|
||||
/* disp-flush L1 */
|
||||
li r4,0x4000
|
||||
mtctr r4
|
||||
/* Disp-flush L1. We have a weird problem here that I never
|
||||
* totally figured out. On 750FX, using the ROM for the flush
|
||||
* 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
|
||||
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
|
||||
bdnz 1b
|
||||
sync
|
||||
isync
|
||||
|
||||
/* disable / invalidate / enable L1 data */
|
||||
/* Disable / invalidate / enable L1 data */
|
||||
mfspr r3,SPRN_HID0
|
||||
rlwinm r0,r0,0,~HID0_DCE
|
||||
rlwinm r3,r3,0,~(HID0_DCE | HID0_ICE)
|
||||
mtspr SPRN_HID0,r3
|
||||
sync
|
||||
isync
|
||||
ori r3,r3,HID0_DCE|HID0_DCI
|
||||
ori r3,r3,(HID0_DCE|HID0_DCI|HID0_ICE|HID0_ICFI)
|
||||
sync
|
||||
isync
|
||||
mtspr SPRN_HID0,r3
|
||||
xori r3,r3,HID0_DCI
|
||||
xori r3,r3,(HID0_DCI|HID0_ICFI)
|
||||
mtspr SPRN_HID0,r3
|
||||
sync
|
||||
|
||||
|
@ -110,11 +122,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
lis r4,2
|
||||
mtctr r4
|
||||
lis r4,0xfff0
|
||||
1: lwzx r0,r0,r4
|
||||
1: lwz r0,0(r4)
|
||||
addi r4,r4,32
|
||||
bdnz 1b
|
||||
sync
|
||||
isync
|
||||
lis r4,2
|
||||
mtctr r4
|
||||
lis r4,0xfff0
|
||||
1: dcbf 0,r4
|
||||
addi r4,r4,32
|
||||
bdnz 1b
|
||||
sync
|
||||
isync
|
||||
|
||||
/* now disable L2 */
|
||||
rlwinm r5,r5,0,~L2CR_L2E
|
||||
b 2f
|
||||
|
@ -135,6 +156,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
mtspr SPRN_L2CR,r4
|
||||
sync
|
||||
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
|
||||
sync
|
||||
mtspr SPRN_L2CR,r4
|
||||
|
@ -142,14 +170,16 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
|
||||
/* now disable the L1 data cache */
|
||||
mfspr r0,SPRN_HID0
|
||||
rlwinm r0,r0,0,~HID0_DCE
|
||||
rlwinm r0,r0,0,~(HID0_DCE|HID0_ICE)
|
||||
mtspr SPRN_HID0,r0
|
||||
sync
|
||||
isync
|
||||
|
||||
/* Restore HID0[DPM] to whatever it was before */
|
||||
sync
|
||||
mtspr SPRN_HID0,r8
|
||||
mfspr r0,SPRN_HID0
|
||||
rlwimi r0,r8,0,11,11 /* Turn back HID0[DPM] */
|
||||
mtspr SPRN_HID0,r0
|
||||
sync
|
||||
|
||||
/* restore DR and EE */
|
||||
|
@ -201,7 +231,7 @@ flush_disable_745x:
|
|||
mtctr r4
|
||||
li r4,0
|
||||
1:
|
||||
lwzx r0,r0,r4
|
||||
lwz r0,0(r4)
|
||||
addi r4,r4,32 /* Go to start of next cache line */
|
||||
bdnz 1b
|
||||
isync
|
||||
|
|
|
@ -1590,6 +1590,114 @@ intrepid_shutdown(struct macio_chip* macio, int sleep_mode)
|
|||
mdelay(10);
|
||||
}
|
||||
|
||||
|
||||
void __pmac pmac_tweak_clock_spreading(int enable)
|
||||
{
|
||||
struct macio_chip* macio = &macio_chips[0];
|
||||
|
||||
/* Hack for doing clock spreading on some machines PowerBooks and
|
||||
* iBooks. This implements the "platform-do-clockspreading" OF
|
||||
* property as decoded manually on various models. For safety, we also
|
||||
* check the product ID in the device-tree in cases we'll whack the i2c
|
||||
* chip to make reasonably sure we won't set wrong values in there
|
||||
*
|
||||
* Of course, ultimately, we have to implement a real parser for
|
||||
* the platform-do-* stuff...
|
||||
*/
|
||||
|
||||
if (macio->type == macio_intrepid) {
|
||||
if (enable)
|
||||
UN_OUT(UNI_N_CLOCK_SPREADING, 2);
|
||||
else
|
||||
UN_OUT(UNI_N_CLOCK_SPREADING, 0);
|
||||
mdelay(40);
|
||||
}
|
||||
|
||||
while (machine_is_compatible("PowerBook5,2") ||
|
||||
machine_is_compatible("PowerBook5,3") ||
|
||||
machine_is_compatible("PowerBook6,2") ||
|
||||
machine_is_compatible("PowerBook6,3")) {
|
||||
struct device_node *ui2c = of_find_node_by_type(NULL, "i2c");
|
||||
struct device_node *dt = of_find_node_by_name(NULL, "device-tree");
|
||||
u8 buffer[9];
|
||||
u32 *productID;
|
||||
int i, rc, changed = 0;
|
||||
|
||||
if (dt == NULL)
|
||||
break;
|
||||
productID = (u32 *)get_property(dt, "pid#", NULL);
|
||||
if (productID == NULL)
|
||||
break;
|
||||
while(ui2c) {
|
||||
struct device_node *p = of_get_parent(ui2c);
|
||||
if (p && !strcmp(p->name, "uni-n"))
|
||||
break;
|
||||
ui2c = of_find_node_by_type(ui2c, "i2c");
|
||||
}
|
||||
if (ui2c == NULL)
|
||||
break;
|
||||
DBG("Trying to bump clock speed for PID: %08x...\n", *productID);
|
||||
rc = pmac_low_i2c_open(ui2c, 1);
|
||||
if (rc != 0)
|
||||
break;
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9);
|
||||
DBG("read result: %d,", rc);
|
||||
if (rc != 0) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
for (i=0; i<9; i++)
|
||||
DBG(" %02x", buffer[i]);
|
||||
DBG("\n");
|
||||
|
||||
switch(*productID) {
|
||||
case 0x1182: /* AlBook 12" rev 2 */
|
||||
case 0x1183: /* iBook G4 12" */
|
||||
buffer[0] = (buffer[0] & 0x8f) | 0x70;
|
||||
buffer[2] = (buffer[2] & 0x7f) | 0x00;
|
||||
buffer[5] = (buffer[5] & 0x80) | 0x31;
|
||||
buffer[6] = (buffer[6] & 0x40) | 0xb0;
|
||||
buffer[7] = (buffer[7] & 0x00) | (enable ? 0xc0 : 0xba);
|
||||
buffer[8] = (buffer[8] & 0x00) | 0x30;
|
||||
changed = 1;
|
||||
break;
|
||||
case 0x3142: /* AlBook 15" (ATI M10) */
|
||||
case 0x3143: /* AlBook 17" (ATI M10) */
|
||||
buffer[0] = (buffer[0] & 0xaf) | 0x50;
|
||||
buffer[2] = (buffer[2] & 0x7f) | 0x00;
|
||||
buffer[5] = (buffer[5] & 0x80) | 0x31;
|
||||
buffer[6] = (buffer[6] & 0x40) | 0xb0;
|
||||
buffer[7] = (buffer[7] & 0x00) | (enable ? 0xd0 : 0xc0);
|
||||
buffer[8] = (buffer[8] & 0x00) | 0x30;
|
||||
changed = 1;
|
||||
break;
|
||||
default:
|
||||
DBG("i2c-hwclock: Machine model not handled\n");
|
||||
break;
|
||||
}
|
||||
if (!changed) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_stdsub);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_write, 0x80, buffer, 9);
|
||||
DBG("write result: %d,", rc);
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9);
|
||||
DBG("read result: %d,", rc);
|
||||
if (rc != 0) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
for (i=0; i<9; i++)
|
||||
DBG(" %02x", buffer[i]);
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int __pmac
|
||||
core99_sleep(void)
|
||||
{
|
||||
|
@ -1601,12 +1709,6 @@ core99_sleep(void)
|
|||
macio->type != macio_intrepid)
|
||||
return -ENODEV;
|
||||
|
||||
/* The device-tree contains that in the hwclock node */
|
||||
if (macio->type == macio_intrepid) {
|
||||
UN_OUT(UNI_N_CLOCK_SPREADING, 0);
|
||||
mdelay(40);
|
||||
}
|
||||
|
||||
/* We power off the wireless slot in case it was not done
|
||||
* by the driver. We don't power it on automatically however
|
||||
*/
|
||||
|
@ -1749,12 +1851,6 @@ core99_wake_up(void)
|
|||
UN_OUT(UNI_N_CLOCK_CNTL, save_unin_clock_ctl);
|
||||
udelay(100);
|
||||
|
||||
/* Restore clock spreading */
|
||||
if (macio->type == macio_intrepid) {
|
||||
UN_OUT(UNI_N_CLOCK_SPREADING, 2);
|
||||
mdelay(40);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2149,7 +2245,7 @@ static struct pmac_mb_def pmac_mb_defs[] __pmacdata = {
|
|||
},
|
||||
{ "PowerBook1,1", "PowerBook 101 (Lombard)",
|
||||
PMAC_TYPE_101_PBOOK, paddington_features,
|
||||
PMAC_MB_MAY_SLEEP | PMAC_MB_MOBILE
|
||||
PMAC_MB_CAN_SLEEP | PMAC_MB_MOBILE
|
||||
},
|
||||
{ "PowerBook2,1", "iBook (first generation)",
|
||||
PMAC_TYPE_ORIG_IBOOK, core99_features,
|
||||
|
@ -2718,97 +2814,11 @@ set_initial_features(void)
|
|||
MACIO_BIC(HEATHROW_FCR, HRW_SOUND_POWER_N);
|
||||
}
|
||||
|
||||
/* Hack for bumping clock speed on the new PowerBooks and the
|
||||
* iBook G4. This implements the "platform-do-clockspreading" OF
|
||||
* property. For safety, we also check the product ID in the
|
||||
* device-tree to make reasonably sure we won't set wrong values
|
||||
* in the clock chip.
|
||||
*
|
||||
* Of course, ultimately, we have to implement a real parser for
|
||||
* the platform-do-* stuff...
|
||||
/* Some machine models need the clock chip to be properly setup for
|
||||
* clock spreading now. This should be a platform function but we
|
||||
* don't do these at the moment
|
||||
*/
|
||||
while (machine_is_compatible("PowerBook5,2") ||
|
||||
machine_is_compatible("PowerBook5,3") ||
|
||||
machine_is_compatible("PowerBook6,2") ||
|
||||
machine_is_compatible("PowerBook6,3")) {
|
||||
struct device_node *ui2c = of_find_node_by_type(NULL, "i2c");
|
||||
struct device_node *dt = of_find_node_by_name(NULL, "device-tree");
|
||||
u8 buffer[9];
|
||||
u32 *productID;
|
||||
int i, rc, changed = 0;
|
||||
|
||||
if (dt == NULL)
|
||||
break;
|
||||
productID = (u32 *)get_property(dt, "pid#", NULL);
|
||||
if (productID == NULL)
|
||||
break;
|
||||
while(ui2c) {
|
||||
struct device_node *p = of_get_parent(ui2c);
|
||||
if (p && !strcmp(p->name, "uni-n"))
|
||||
break;
|
||||
ui2c = of_find_node_by_type(ui2c, "i2c");
|
||||
}
|
||||
if (ui2c == NULL)
|
||||
break;
|
||||
DBG("Trying to bump clock speed for PID: %08x...\n", *productID);
|
||||
rc = pmac_low_i2c_open(ui2c, 1);
|
||||
if (rc != 0)
|
||||
break;
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9);
|
||||
DBG("read result: %d,", rc);
|
||||
if (rc != 0) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
for (i=0; i<9; i++)
|
||||
DBG(" %02x", buffer[i]);
|
||||
DBG("\n");
|
||||
|
||||
switch(*productID) {
|
||||
case 0x1182: /* AlBook 12" rev 2 */
|
||||
case 0x1183: /* iBook G4 12" */
|
||||
buffer[0] = (buffer[0] & 0x8f) | 0x70;
|
||||
buffer[2] = (buffer[2] & 0x7f) | 0x00;
|
||||
buffer[5] = (buffer[5] & 0x80) | 0x31;
|
||||
buffer[6] = (buffer[6] & 0x40) | 0xb0;
|
||||
buffer[7] = (buffer[7] & 0x00) | 0xc0;
|
||||
buffer[8] = (buffer[8] & 0x00) | 0x30;
|
||||
changed = 1;
|
||||
break;
|
||||
case 0x3142: /* AlBook 15" (ATI M10) */
|
||||
case 0x3143: /* AlBook 17" (ATI M10) */
|
||||
buffer[0] = (buffer[0] & 0xaf) | 0x50;
|
||||
buffer[2] = (buffer[2] & 0x7f) | 0x00;
|
||||
buffer[5] = (buffer[5] & 0x80) | 0x31;
|
||||
buffer[6] = (buffer[6] & 0x40) | 0xb0;
|
||||
buffer[7] = (buffer[7] & 0x00) | 0xd0;
|
||||
buffer[8] = (buffer[8] & 0x00) | 0x30;
|
||||
changed = 1;
|
||||
break;
|
||||
default:
|
||||
DBG("i2c-hwclock: Machine model not handled\n");
|
||||
break;
|
||||
}
|
||||
if (!changed) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_stdsub);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_write, 0x80, buffer, 9);
|
||||
DBG("write result: %d,", rc);
|
||||
pmac_low_i2c_setmode(ui2c, pmac_low_i2c_mode_combined);
|
||||
rc = pmac_low_i2c_xfer(ui2c, 0xd2 | pmac_low_i2c_read, 0x80, buffer, 9);
|
||||
DBG("read result: %d,", rc);
|
||||
if (rc != 0) {
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
for (i=0; i<9; i++)
|
||||
DBG(" %02x", buffer[i]);
|
||||
pmac_low_i2c_close(ui2c);
|
||||
break;
|
||||
}
|
||||
pmac_tweak_clock_spreading(1);
|
||||
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
|
|
|
@ -267,6 +267,10 @@ grackle_wake_up:
|
|||
/* Restore various CPU config stuffs */
|
||||
bl __restore_cpu_setup
|
||||
|
||||
/* Make sure all FPRs have been initialized */
|
||||
bl reloc_offset
|
||||
bl __init_fpu_registers
|
||||
|
||||
/* Invalidate & enable L1 cache, we don't care about
|
||||
* whatever the ROM may have tried to write to memory
|
||||
*/
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
#define PPC7D_RST_PIN 17 /* GPP17 */
|
||||
|
||||
extern u32 mv64360_irq_base;
|
||||
extern spinlock_t rtc_lock;
|
||||
|
||||
static struct mv64x60_handle bh;
|
||||
static int ppc7d_has_alma;
|
||||
|
@ -75,6 +76,11 @@ static int ppc7d_has_alma;
|
|||
extern void gen550_progress(char *, unsigned short);
|
||||
extern void gen550_init(int, struct uart_port *);
|
||||
|
||||
/* FIXME - move to h file */
|
||||
extern int ds1337_do_command(int id, int cmd, void *arg);
|
||||
#define DS1337_GET_DATE 0
|
||||
#define DS1337_SET_DATE 1
|
||||
|
||||
/* residual data */
|
||||
unsigned char __res[sizeof(bd_t)];
|
||||
|
||||
|
@ -253,6 +259,8 @@ static int ppc7d_show_cpuinfo(struct seq_file *m)
|
|||
u8 val1, val2;
|
||||
static int flash_sizes[4] = { 64, 32, 0, 16 };
|
||||
static int flash_banks[4] = { 4, 3, 2, 1 };
|
||||
static int sdram_bank_sizes[4] = { 128, 256, 512, 1 };
|
||||
int sdram_num_banks = 2;
|
||||
static char *pci_modes[] = { "PCI33", "PCI66",
|
||||
"Unknown", "Unknown",
|
||||
"PCIX33", "PCIX66",
|
||||
|
@ -279,13 +287,17 @@ static int ppc7d_show_cpuinfo(struct seq_file *m)
|
|||
(val1 == PPC7D_CPLD_MB_TYPE_PLL_100) ? 100 :
|
||||
(val1 == PPC7D_CPLD_MB_TYPE_PLL_64) ? 64 : 0);
|
||||
|
||||
val = inb(PPC7D_CPLD_MEM_CONFIG);
|
||||
if (val & PPC7D_CPLD_SDRAM_BANK_NUM_MASK) sdram_num_banks--;
|
||||
|
||||
val = inb(PPC7D_CPLD_MEM_CONFIG_EXTEND);
|
||||
val1 = val & PPC7D_CPLD_SDRAM_BANK_SIZE_MASK;
|
||||
seq_printf(m, "SDRAM\t\t: %d%c",
|
||||
(val1 == PPC7D_CPLD_SDRAM_BANK_SIZE_128M) ? 128 :
|
||||
(val1 == PPC7D_CPLD_SDRAM_BANK_SIZE_256M) ? 256 :
|
||||
(val1 == PPC7D_CPLD_SDRAM_BANK_SIZE_512M) ? 512 : 1,
|
||||
(val1 == PPC7D_CPLD_SDRAM_BANK_SIZE_1G) ? 'G' : 'M');
|
||||
val1 = (val & PPC7D_CPLD_SDRAM_BANK_SIZE_MASK) >> 6;
|
||||
seq_printf(m, "SDRAM\t\t: %d banks of %d%c, total %d%c",
|
||||
sdram_num_banks,
|
||||
sdram_bank_sizes[val1],
|
||||
(sdram_bank_sizes[val1] < 128) ? 'G' : 'M',
|
||||
sdram_num_banks * sdram_bank_sizes[val1],
|
||||
(sdram_bank_sizes[val1] < 128) ? 'G' : 'M');
|
||||
if (val2 & PPC7D_CPLD_MB_TYPE_ECC_FITTED_MASK) {
|
||||
seq_printf(m, " [ECC %sabled]",
|
||||
(val2 & PPC7D_CPLD_MB_TYPE_ECC_ENABLE_MASK) ? "en" :
|
||||
|
@ -1236,6 +1248,38 @@ static void __init ppc7d_setup_arch(void)
|
|||
printk(KERN_INFO "Radstone Technology PPC7D\n");
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("ppc7d_setup_arch: exit", 0);
|
||||
|
||||
}
|
||||
|
||||
/* Real Time Clock support.
|
||||
* PPC7D has a DS1337 accessed by I2C.
|
||||
*/
|
||||
static ulong ppc7d_get_rtc_time(void)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
int result;
|
||||
|
||||
spin_lock(&rtc_lock);
|
||||
result = ds1337_do_command(0, DS1337_GET_DATE, &tm);
|
||||
spin_unlock(&rtc_lock);
|
||||
|
||||
if (result == 0)
|
||||
result = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int ppc7d_set_rtc_time(unsigned long nowtime)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
int result;
|
||||
|
||||
spin_lock(&rtc_lock);
|
||||
to_tm(nowtime, &tm);
|
||||
result = ds1337_do_command(0, DS1337_SET_DATE, &tm);
|
||||
spin_unlock(&rtc_lock);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* This kernel command line parameter can be used to have the target
|
||||
|
@ -1293,6 +1337,10 @@ static void ppc7d_init2(void)
|
|||
data8 |= 0x07;
|
||||
outb(data8, PPC7D_CPLD_LEDS);
|
||||
|
||||
/* Hook up RTC. We couldn't do this earlier because we need the I2C subsystem */
|
||||
ppc_md.set_rtc_time = ppc7d_set_rtc_time;
|
||||
ppc_md.get_rtc_time = ppc7d_get_rtc_time;
|
||||
|
||||
pr_debug("%s: exit\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
#define PPC7D_CPLD_FLASH_CNTL 0x086E
|
||||
|
||||
/* MEMORY_CONFIG_EXTEND */
|
||||
#define PPC7D_CPLD_SDRAM_BANK_NUM_MASK 0x02
|
||||
#define PPC7D_CPLD_SDRAM_BANK_SIZE_MASK 0xc0
|
||||
#define PPC7D_CPLD_SDRAM_BANK_SIZE_128M 0
|
||||
#define PPC7D_CPLD_SDRAM_BANK_SIZE_256M 0x40
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче