Merge branches 'tracing/ftrace' and 'tracing/urgent' into tracing/core

Conflicts:
	kernel/trace/ftrace.c

[ We conflicted here because we backported a few fixes to
  tracing/urgent - which has different internal APIs. ]
This commit is contained in:
Ingo Molnar 2008-11-19 10:04:25 +01:00
commit 9676e73a9e
385 changed files with 11807 additions and 2509 deletions

View File

@ -42,14 +42,8 @@ IRQ.txt
- description of what an IRQ is. - description of what an IRQ is.
ManagementStyle ManagementStyle
- how to (attempt to) manage kernel hackers. - how to (attempt to) manage kernel hackers.
MSI-HOWTO.txt
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
RCU/ RCU/
- directory with info on RCU (read-copy update). - directory with info on RCU (read-copy update).
README.DAC960
- info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
README.cycladesZ
- info on Cyclades-Z firmware loading.
SAK.txt SAK.txt
- info on Secure Attention Keys. - info on Secure Attention Keys.
SM501.txt SM501.txt
@ -86,20 +80,16 @@ blackfin/
- directory with documentation for the Blackfin arch. - directory with documentation for the Blackfin arch.
block/ block/
- info on the Block I/O (BIO) layer. - info on the Block I/O (BIO) layer.
blockdev/
- info on block devices & drivers
cachetlb.txt cachetlb.txt
- describes the cache/TLB flushing interfaces Linux uses. - describes the cache/TLB flushing interfaces Linux uses.
cciss.txt
- info, major/minor #'s for Compaq's SMART Array Controllers.
cdrom/ cdrom/
- directory with information on the CD-ROM drivers that Linux has. - directory with information on the CD-ROM drivers that Linux has.
computone.txt
- info on Computone Intelliport II/Plus Multiport Serial Driver.
connector/ connector/
- docs on the netlink based userspace<->kernel space communication mod. - docs on the netlink based userspace<->kernel space communication mod.
console/ console/
- documentation on Linux console drivers. - documentation on Linux console drivers.
cpqarray.txt
- info on using Compaq's SMART2 Intelligent Disk Array Controllers.
cpu-freq/ cpu-freq/
- info on CPU frequency and voltage scaling. - info on CPU frequency and voltage scaling.
cpu-hotplug.txt cpu-hotplug.txt
@ -126,8 +116,6 @@ device-mapper/
- directory with info on Device Mapper. - directory with info on Device Mapper.
devices.txt devices.txt
- plain ASCII listing of all the nodes in /dev/ with major minor #'s. - plain ASCII listing of all the nodes in /dev/ with major minor #'s.
digiepca.txt
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
dontdiff dontdiff
- file containing a list of files that should never be diff'ed. - file containing a list of files that should never be diff'ed.
driver-model/ driver-model/
@ -152,14 +140,10 @@ filesystems/
- info on the vfs and the various filesystems that Linux supports. - info on the vfs and the various filesystems that Linux supports.
firmware_class/ firmware_class/
- request_firmware() hotplug interface info. - request_firmware() hotplug interface info.
floppy.txt
- notes and driver options for the floppy disk driver.
frv/ frv/
- Fujitsu FR-V Linux documentation. - Fujitsu FR-V Linux documentation.
gpio.txt gpio.txt
- overview of GPIO (General Purpose Input/Output) access conventions. - overview of GPIO (General Purpose Input/Output) access conventions.
hayes-esp.txt
- info on using the Hayes ESP serial driver.
highuid.txt highuid.txt
- notes on the change from 16 bit to 32 bit user/group IDs. - notes on the change from 16 bit to 32 bit user/group IDs.
timers/ timers/
@ -186,8 +170,6 @@ io_ordering.txt
- info on ordering I/O writes to memory-mapped addresses. - info on ordering I/O writes to memory-mapped addresses.
ioctl/ ioctl/
- directory with documents describing various IOCTL calls. - directory with documents describing various IOCTL calls.
ioctl-number.txt
- how to implement and register device/driver ioctl calls.
iostats.txt iostats.txt
- info on I/O statistics Linux kernel provides. - info on I/O statistics Linux kernel provides.
irqflags-tracing.txt irqflags-tracing.txt
@ -250,14 +232,10 @@ mips/
- directory with info about Linux on MIPS architecture. - directory with info about Linux on MIPS architecture.
mono.txt mono.txt
- how to execute Mono-based .NET binaries with the help of BINFMT_MISC. - how to execute Mono-based .NET binaries with the help of BINFMT_MISC.
moxa-smartio
- file with info on installing/using Moxa multiport serial driver.
mutex-design.txt mutex-design.txt
- info on the generic mutex subsystem. - info on the generic mutex subsystem.
namespaces/ namespaces/
- directory with various information about namespaces - directory with various information about namespaces
nbd.txt
- info on a TCP implementation of a network block device.
netlabel/ netlabel/
- directory with information on the NetLabel subsystem. - directory with information on the NetLabel subsystem.
networking/ networking/
@ -270,8 +248,6 @@ numastat.txt
- info on how to read Numa policy hit/miss statistics in sysfs. - info on how to read Numa policy hit/miss statistics in sysfs.
oops-tracing.txt oops-tracing.txt
- how to decode those nasty internal kernel error dump messages. - how to decode those nasty internal kernel error dump messages.
paride.txt
- information about the parallel port IDE subsystem.
parisc/ parisc/
- directory with info on using Linux on PA-RISC architecture. - directory with info on using Linux on PA-RISC architecture.
parport.txt parport.txt
@ -290,20 +266,16 @@ powerpc/
- directory with info on using Linux with the PowerPC. - directory with info on using Linux with the PowerPC.
preempt-locking.txt preempt-locking.txt
- info on locking under a preemptive kernel. - info on locking under a preemptive kernel.
printk-formats.txt
- how to get printk format specifiers right
prio_tree.txt prio_tree.txt
- info on radix-priority-search-tree use for indexing vmas. - info on radix-priority-search-tree use for indexing vmas.
ramdisk.txt
- short guide on how to set up and use the RAM disk.
rbtree.txt rbtree.txt
- info on what red-black trees are and what they are for. - info on what red-black trees are and what they are for.
riscom8.txt
- notes on using the RISCom/8 multi-port serial driver.
robust-futex-ABI.txt robust-futex-ABI.txt
- documentation of the robust futex ABI. - documentation of the robust futex ABI.
robust-futexes.txt robust-futexes.txt
- a description of what robust futexes are. - a description of what robust futexes are.
rocket.txt
- info on the Comtrol RocketPort multiport serial driver.
rt-mutex-design.txt rt-mutex-design.txt
- description of the RealTime mutex implementation design. - description of the RealTime mutex implementation design.
rt-mutex.txt rt-mutex.txt
@ -332,8 +304,6 @@ sparc/
- directory with info on using Linux on Sparc architecture. - directory with info on using Linux on Sparc architecture.
sparse.txt sparse.txt
- info on how to obtain and use the sparse tool for typechecking. - info on how to obtain and use the sparse tool for typechecking.
specialix.txt
- info on hardware/driver for specialix IO8+ multiport serial card.
spi/ spi/
- overview of Linux kernel Serial Peripheral Interface (SPI) support. - overview of Linux kernel Serial Peripheral Interface (SPI) support.
spinlocks.txt spinlocks.txt
@ -342,14 +312,10 @@ stable_api_nonsense.txt
- info on why the kernel does not have a stable in-kernel api or abi. - info on why the kernel does not have a stable in-kernel api or abi.
stable_kernel_rules.txt stable_kernel_rules.txt
- rules and procedures for the -stable kernel releases. - rules and procedures for the -stable kernel releases.
stallion.txt
- info on using the Stallion multiport serial driver.
svga.txt svga.txt
- short guide on selecting video modes at boot via VGA BIOS. - short guide on selecting video modes at boot via VGA BIOS.
sysfs-rules.txt sysfs-rules.txt
- How not to use sysfs. - How not to use sysfs.
sx.txt
- info on the Specialix SX/SI multiport serial driver.
sysctl/ sysctl/
- directory with info on the /proc/sys/* files. - directory with info on the /proc/sys/* files.
sysrq.txt sysrq.txt
@ -358,8 +324,6 @@ telephony/
- directory with info on telephony (e.g. voice over IP) support. - directory with info on telephony (e.g. voice over IP) support.
time_interpolators.txt time_interpolators.txt
- info on time interpolators. - info on time interpolators.
tty.txt
- guide to the locking policies of the tty layer.
uml/ uml/
- directory with information about User Mode Linux. - directory with information about User Mode Linux.
unicode.txt unicode.txt

View File

@ -0,0 +1,88 @@
What: /sys/class/c2port/
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/ directory will contain files and
directories that will provide a unified interface to
the C2 port interface.
What: /sys/class/c2port/c2portX
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/ directory is related to X-th
C2 port into the system. Each directory will contain files to
manage and control its C2 port.
What: /sys/class/c2port/c2portX/access
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/access file enable the access
to the C2 port from the system. No commands can be sent
till this entry is set to 0.
What: /sys/class/c2port/c2portX/dev_id
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/dev_id file show the device ID
of the connected micro.
What: /sys/class/c2port/c2portX/flash_access
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_access file enable the
access to the on-board flash of the connected micro.
No commands can be sent till this entry is set to 0.
What: /sys/class/c2port/c2portX/flash_block_size
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_block_size file show
the on-board flash block size of the connected micro.
What: /sys/class/c2port/c2portX/flash_blocks_num
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_blocks_num file show
the on-board flash blocks number of the connected micro.
What: /sys/class/c2port/c2portX/flash_data
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_data file export
the content of the on-board flash of the connected micro.
What: /sys/class/c2port/c2portX/flash_erase
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_erase file execute
the "erase" command on the on-board flash of the connected
micro.
What: /sys/class/c2port/c2portX/flash_erase
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/flash_erase file show the
on-board flash size of the connected micro.
What: /sys/class/c2port/c2portX/reset
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/reset file execute a "reset"
command on the connected micro.
What: /sys/class/c2port/c2portX/rev_id
Date: October 2008
Contact: Rodolfo Giometti <giometti@linux.it>
Description:
The /sys/class/c2port/c2portX/rev_id file show the revision ID
of the connected micro.

View File

@ -89,7 +89,7 @@ Description:
error - an interrupt that can't be accounted for above. error - an interrupt that can't be accounted for above.
invalid: it's either a wakeup GPE or a GPE/Fixed Event that invalid: it's either a GPE or a Fixed Event that
doesn't have an event handler. doesn't have an event handler.
disable: the GPE/Fixed Event is valid but disabled. disable: the GPE/Fixed Event is valid but disabled.
@ -117,30 +117,30 @@ Description:
and other user space applications so that the machine won't shutdown and other user space applications so that the machine won't shutdown
when pressing the power button. when pressing the power button.
# cat ff_pwr_btn # cat ff_pwr_btn
0 0 enabled
# press the power button for 3 times; # press the power button for 3 times;
# cat ff_pwr_btn # cat ff_pwr_btn
3 3 enabled
# echo disable > ff_pwr_btn # echo disable > ff_pwr_btn
# cat ff_pwr_btn # cat ff_pwr_btn
disable 3 disabled
# press the power button for 3 times; # press the power button for 3 times;
# cat ff_pwr_btn # cat ff_pwr_btn
disable 3 disabled
# echo enable > ff_pwr_btn # echo enable > ff_pwr_btn
# cat ff_pwr_btn # cat ff_pwr_btn
4 4 enabled
/* /*
* this is because the status bit is set even if the enable bit is cleared, * this is because the status bit is set even if the enable bit is cleared,
* and it triggers an ACPI fixed event when the enable bit is set again * and it triggers an ACPI fixed event when the enable bit is set again
*/ */
# press the power button for 3 times; # press the power button for 3 times;
# cat ff_pwr_btn # cat ff_pwr_btn
7 7 enabled
# echo disable > ff_pwr_btn # echo disable > ff_pwr_btn
# press the power button for 3 times; # press the power button for 3 times;
# echo clear > ff_pwr_btn /* clear the status bit */ # echo clear > ff_pwr_btn /* clear the status bit */
# echo disable > ff_pwr_btn # echo disable > ff_pwr_btn
# cat ff_pwr_btn # cat ff_pwr_btn
7 7 enabled

View File

@ -1,5 +1,7 @@
00-INDEX 00-INDEX
- this file - this file
MSI-HOWTO.txt
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
PCI-DMA-mapping.txt PCI-DMA-mapping.txt
- info for PCI drivers using DMA portably across all platforms - info for PCI drivers using DMA portably across all platforms
PCIEBUS-HOWTO.txt PCIEBUS-HOWTO.txt

View File

@ -0,0 +1,148 @@
ACPI Debug Output
The ACPI CA, the Linux ACPI core, and some ACPI drivers can generate debug
output. This document describes how to use this facility.
Compile-time configuration
--------------------------
ACPI debug output is globally enabled by CONFIG_ACPI_DEBUG. If this config
option is turned off, the debug messages are not even built into the
kernel.
Boot- and run-time configuration
--------------------------------
When CONFIG_ACPI_DEBUG=y, you can select the component and level of messages
you're interested in. At boot-time, use the acpi.debug_layer and
acpi.debug_level kernel command line options. After boot, you can use the
debug_layer and debug_level files in /sys/module/acpi/parameters/ to control
the debug messages.
debug_layer (component)
-----------------------
The "debug_layer" is a mask that selects components of interest, e.g., a
specific driver or part of the ACPI interpreter. To build the debug_layer
bitmask, look for the "#define _COMPONENT" in an ACPI source file.
You can set the debug_layer mask at boot-time using the acpi.debug_layer
command line argument, and you can change it after boot by writing values
to /sys/module/acpi/parameters/debug_layer.
The possible components are defined in include/acpi/acoutput.h and
include/acpi/acpi_drivers.h. Reading /sys/module/acpi/parameters/debug_layer
shows the supported mask values, currently these:
ACPI_UTILITIES 0x00000001
ACPI_HARDWARE 0x00000002
ACPI_EVENTS 0x00000004
ACPI_TABLES 0x00000008
ACPI_NAMESPACE 0x00000010
ACPI_PARSER 0x00000020
ACPI_DISPATCHER 0x00000040
ACPI_EXECUTER 0x00000080
ACPI_RESOURCES 0x00000100
ACPI_CA_DEBUGGER 0x00000200
ACPI_OS_SERVICES 0x00000400
ACPI_CA_DISASSEMBLER 0x00000800
ACPI_COMPILER 0x00001000
ACPI_TOOLS 0x00002000
ACPI_BUS_COMPONENT 0x00010000
ACPI_AC_COMPONENT 0x00020000
ACPI_BATTERY_COMPONENT 0x00040000
ACPI_BUTTON_COMPONENT 0x00080000
ACPI_SBS_COMPONENT 0x00100000
ACPI_FAN_COMPONENT 0x00200000
ACPI_PCI_COMPONENT 0x00400000
ACPI_POWER_COMPONENT 0x00800000
ACPI_CONTAINER_COMPONENT 0x01000000
ACPI_SYSTEM_COMPONENT 0x02000000
ACPI_THERMAL_COMPONENT 0x04000000
ACPI_MEMORY_DEVICE_COMPONENT 0x08000000
ACPI_VIDEO_COMPONENT 0x10000000
ACPI_PROCESSOR_COMPONENT 0x20000000
debug_level
-----------
The "debug_level" is a mask that selects different types of messages, e.g.,
those related to initialization, method execution, informational messages, etc.
To build debug_level, look at the level specified in an ACPI_DEBUG_PRINT()
statement.
The ACPI interpreter uses several different levels, but the Linux
ACPI core and ACPI drivers generally only use ACPI_LV_INFO.
You can set the debug_level mask at boot-time using the acpi.debug_level
command line argument, and you can change it after boot by writing values
to /sys/module/acpi/parameters/debug_level.
The possible levels are defined in include/acpi/acoutput.h. Reading
/sys/module/acpi/parameters/debug_level shows the supported mask values,
currently these:
ACPI_LV_INIT 0x00000001
ACPI_LV_DEBUG_OBJECT 0x00000002
ACPI_LV_INFO 0x00000004
ACPI_LV_INIT_NAMES 0x00000020
ACPI_LV_PARSE 0x00000040
ACPI_LV_LOAD 0x00000080
ACPI_LV_DISPATCH 0x00000100
ACPI_LV_EXEC 0x00000200
ACPI_LV_NAMES 0x00000400
ACPI_LV_OPREGION 0x00000800
ACPI_LV_BFIELD 0x00001000
ACPI_LV_TABLES 0x00002000
ACPI_LV_VALUES 0x00004000
ACPI_LV_OBJECTS 0x00008000
ACPI_LV_RESOURCES 0x00010000
ACPI_LV_USER_REQUESTS 0x00020000
ACPI_LV_PACKAGE 0x00040000
ACPI_LV_ALLOCATIONS 0x00100000
ACPI_LV_FUNCTIONS 0x00200000
ACPI_LV_OPTIMIZATIONS 0x00400000
ACPI_LV_MUTEX 0x01000000
ACPI_LV_THREADS 0x02000000
ACPI_LV_IO 0x04000000
ACPI_LV_INTERRUPTS 0x08000000
ACPI_LV_AML_DISASSEMBLE 0x10000000
ACPI_LV_VERBOSE_INFO 0x20000000
ACPI_LV_FULL_TABLES 0x40000000
ACPI_LV_EVENTS 0x80000000
Examples
--------
For example, drivers/acpi/bus.c contains this:
#define _COMPONENT ACPI_BUS_COMPONENT
...
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n"));
To turn on this message, set the ACPI_BUS_COMPONENT bit in acpi.debug_layer
and the ACPI_LV_INFO bit in acpi.debug_level. (The ACPI_DEBUG_PRINT
statement uses ACPI_DB_INFO, which is macro based on the ACPI_LV_INFO
definition.)
Enable all AML "Debug" output (stores to the Debug object while interpreting
AML) during boot:
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
Enable PCI and PCI interrupt routing debug messages:
acpi.debug_layer=0x400000 acpi.debug_level=0x4
Enable all ACPI hardware-related messages:
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
Enable all ACPI_DB_INFO messages after boot:
# echo 0x4 > /sys/module/acpi/parameters/debug_level
Show all valid component values:
# cat /sys/module/acpi/parameters/debug_layer

View File

@ -0,0 +1,16 @@
00-INDEX
- this file
README.DAC960
- info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
cciss.txt
- info, major/minor #'s for Compaq's SMART Array Controllers.
cpqarray.txt
- info on using Compaq's SMART2 Intelligent Disk Array Controllers.
floppy.txt
- notes and driver options for the floppy disk driver.
nbd.txt
- info on a TCP implementation of a network block device.
paride.txt
- information about the parallel port IDE subsystem.
ramdisk.txt
- short guide on how to set up and use the RAM disk.

90
Documentation/c2port.txt Normal file
View File

@ -0,0 +1,90 @@
C2 port support
---------------
(C) Copyright 2007 Rodolfo Giometti <giometti@enneenne.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Overview
--------
This driver implements the support for Linux of Silicon Labs (Silabs)
C2 Interface used for in-system programming of micro controllers.
By using this driver you can reprogram the in-system flash without EC2
or EC3 debug adapter. This solution is also useful in those systems
where the micro controller is connected via special GPIOs pins.
References
----------
The C2 Interface main references are at (http://www.silabs.com)
Silicon Laboratories site], see:
- AN127: FLASH Programming via the C2 Interface at
http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/Small_Form_Factor/en/an127.pdf, and
- C2 Specification at
http://www.silabs.com/public/documents/tpub_doc/spec/Microcontrollers/en/C2spec.pdf,
however it implements a two wire serial communication protocol (bit
banging) designed to enable in-system programming, debugging, and
boundary-scan testing on low pin-count Silicon Labs devices. Currently
this code supports only flash programming but extensions are easy to
add.
Using the driver
----------------
Once the driver is loaded you can use sysfs support to get C2port's
info or read/write in-system flash.
# ls /sys/class/c2port/c2port0/
access flash_block_size flash_erase rev_id
dev_id flash_blocks_num flash_size subsystem/
flash_access flash_data reset uevent
Initially the C2port access is disabled since you hardware may have
such lines multiplexed with other devices so, to get access to the
C2port, you need the command:
# echo 1 > /sys/class/c2port/c2port0/access
after that you should read the device ID and revision ID of the
connected micro controller:
# cat /sys/class/c2port/c2port0/dev_id
8
# cat /sys/class/c2port/c2port0/rev_id
1
However, for security reasons, the in-system flash access in not
enabled yet, to do so you need the command:
# echo 1 > /sys/class/c2port/c2port0/flash_access
After that you can read the whole flash:
# cat /sys/class/c2port/c2port0/flash_data > image
erase it:
# echo 1 > /sys/class/c2port/c2port0/flash_erase
and write it:
# cat image > /sys/class/c2port/c2port0/flash_data
after writing you have to reset the device to execute the new code:
# echo 1 > /sys/class/c2port/c2port0/reset

View File

@ -54,9 +54,12 @@ freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the
cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup. cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup.
Reading will return the current state. Reading will return the current state.
Note freezer.state doesn't exist in root cgroup, which means root cgroup
is non-freezable.
* Examples of usage : * Examples of usage :
# mkdir /containers/freezer # mkdir /containers
# mount -t cgroup -ofreezer freezer /containers # mount -t cgroup -ofreezer freezer /containers
# mkdir /containers/0 # mkdir /containers/0
# echo $some_pid > /containers/0/tasks # echo $some_pid > /containers/0/tasks
@ -94,6 +97,6 @@ things happens:
the freezer.state file the freezer.state file
2) Userspace retries the freezing operation by writing "FROZEN" to 2) Userspace retries the freezing operation by writing "FROZEN" to
the freezer.state file (writing "FREEZING" is not legal the freezer.state file (writing "FREEZING" is not legal
and returns EIO) and returns EINVAL)
3) The tasks that blocked the cgroup from entering the "FROZEN" 3) The tasks that blocked the cgroup from entering the "FROZEN"
state disappear from the cgroup's set of tasks. state disappear from the cgroup's set of tasks.

View File

@ -39,10 +39,11 @@ The block device operation is optional, these block devices support it as of
today: today:
- dcssblk: s390 dcss block device driver - dcssblk: s390 dcss block device driver
An address space operation named get_xip_page is used to retrieve reference An address space operation named get_xip_mem is used to retrieve references
to a struct page. To address the target page, a reference to an address_space, to a page frame number and a kernel address. To obtain these values a reference
and a sector number is provided. A 3rd argument indicates whether the to an address_space is provided. This function assigns values to the kmem and
function should allocate blocks if needed. pfn parameters. The third argument indicates whether the function should allocate
blocks if needed.
This address space operation is mutually exclusive with readpage&writepage that This address space operation is mutually exclusive with readpage&writepage that
do page cache read/write operations. do page cache read/write operations.

View File

@ -0,0 +1,67 @@
Kernel driver adt7462
======================
Supported chips:
* Analog Devices ADT7462
Prefix: 'adt7462'
Addresses scanned: I2C 0x58, 0x5C
Datasheet: Publicly available at the Analog Devices website
Author: Darrick J. Wong
Description
-----------
This driver implements support for the Analog Devices ADT7462 chip family.
This chip is a bit of a beast. It has 8 counters for measuring fan speed. It
can also measure 13 voltages or 4 temperatures, or various combinations of the
two. See the chip documentation for more details about the exact set of
configurations. This driver does not allow one to configure the chip; that is
left to the system designer.
A sophisticated control system for the PWM outputs is designed into the ADT7462
that allows fan speed to be adjusted automatically based on any of the three
temperature sensors. Each PWM output is individually adjustable and
programmable. Once configured, the ADT7462 will adjust the PWM outputs in
response to the measured temperatures without further host intervention. This
feature can also be disabled for manual control of the PWM's.
Each of the measured inputs (voltage, temperature, fan speed) has
corresponding high/low limit values. The ADT7462 will signal an ALARM if
any measured value exceeds either limit.
The ADT7462 samples all inputs continuously. The driver will not read
the registers more often than once every other second. Further,
configuration data is only read once per minute.
Special Features
----------------
The ADT7462 have a 10-bit ADC and can therefore measure temperatures
with 0.25 degC resolution.
The Analog Devices datasheet is very detailed and describes a procedure for
determining an optimal configuration for the automatic PWM control.
The driver will report sensor labels when it is able to determine that
information from the configuration registers.
Configuration Notes
-------------------
Besides standard interfaces driver adds the following:
* PWM Control
* pwm#_auto_point1_pwm and temp#_auto_point1_temp and
* pwm#_auto_point2_pwm and temp#_auto_point2_temp -
point1: Set the pwm speed at a lower temperature bound.
point2: Set the pwm speed at a higher temperature bound.
The ADT7462 will scale the pwm between the lower and higher pwm speed when
the temperature is between the two temperature boundaries. PWM values range
from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the
temperature sensor associated with the PWM control exceeds temp#_max.

View File

@ -0,0 +1,49 @@
Kernel driver lis3lv02d
==================
Supported chips:
* STMicroelectronics LIS3LV02DL and LIS3LV02DQ
Author:
Yan Burman <burman.yan@gmail.com>
Eric Piel <eric.piel@tremplin-utc.net>
Description
-----------
This driver provides support for the accelerometer found in various HP laptops
sporting the feature officially called "HP Mobile Data Protection System 3D" or
"HP 3D DriveGuard". It detect automatically laptops with this sensor. Known models
(for now the HP 2133, nc6420, nc2510, nc8510, nc84x0, nw9440 and nx9420) will
have their axis automatically oriented on standard way (eg: you can directly
play neverball). The accelerometer data is readable via
/sys/devices/platform/lis3lv02d.
Sysfs attributes under /sys/devices/platform/lis3lv02d/:
position - 3D position that the accelerometer reports. Format: "(x,y,z)"
calibrate - read: values (x, y, z) that are used as the base for input class device operation.
write: forces the base to be recalibrated with the current position.
rate - reports the sampling rate of the accelerometer device in HZ
This driver also provides an absolute input class device, allowing
the laptop to act as a pinball machine-esque joystick.
Axes orientation
----------------
For better compatibility between the various laptops. The values reported by
the accelerometer are converted into a "standard" organisation of the axes
(aka "can play neverball out of the box"):
* When the laptop is horizontal the position reported is about 0 for X and Y
and a positive value for Z
* If the left side is elevated, X increases (becomes positive)
* If the front side (where the touchpad is) is elevated, Y decreases (becomes negative)
* If the laptop is put upside-down, Z becomes negative
If your laptop model is not recognized (cf "dmesg"), you can send an email to the
authors to add it to the database. When reporting a new laptop, please include
the output of "dmidecode" plus the value of /sys/devices/platform/lis3lv02d/position
in these four cases.

31
Documentation/ics932s401 Normal file
View File

@ -0,0 +1,31 @@
Kernel driver ics932s401
======================
Supported chips:
* IDT ICS932S401
Prefix: 'ics932s401'
Addresses scanned: I2C 0x69
Datasheet: Publically available at the IDT website
Author: Darrick J. Wong
Description
-----------
This driver implements support for the IDT ICS932S401 chip family.
This chip has 4 clock outputs--a base clock for the CPU (which is likely
multiplied to get the real CPU clock), a system clock, a PCI clock, a USB
clock, and a reference clock. The driver reports selected and actual
frequency. If spread spectrum mode is enabled, the driver also reports by what
percent the clock signal is being spread, which should be between 0 and -0.5%.
All frequencies are reported in KHz.
The ICS932S401 monitors all inputs continuously. The driver will not read
the registers more often than once every other second.
Special Features
----------------
The clocks could be reprogrammed to increase system speed. I will not help you
do this, as you risk damaging your system!

View File

@ -0,0 +1,10 @@
00-INDEX
- this file
cdrom.txt
- summary of CDROM ioctl calls
hdio.txt
- summary of HDIO_ ioctl calls
ioctl-decoding.txt
- how to decode the bits of an IOCTL code
ioctl-number.txt
- how to implement and register device/driver ioctl calls

View File

@ -198,59 +198,42 @@ and is between 256 and 4096 characters. It is defined in the file
that require a timer override, but don't have that require a timer override, but don't have
HPET HPET
acpi.debug_layer= [HW,ACPI] acpi_backlight= [HW,ACPI]
acpi_backlight=vendor
acpi_backlight=video
If set to vendor, prefer vendor specific driver
(e.g. thinkpad_acpi, sony_acpi, etc.) instead
of the ACPI video.ko driver.
acpi_display_output= [HW,ACPI]
acpi_display_output=vendor
acpi_display_output=video
See above.
acpi.debug_layer= [HW,ACPI,ACPI_DEBUG]
acpi.debug_level= [HW,ACPI,ACPI_DEBUG]
Format: <int> Format: <int>
Each bit of the <int> indicates an ACPI debug layer, CONFIG_ACPI_DEBUG must be enabled to produce any ACPI
1: enable, 0: disable. It is useful for boot time debug output. Bits in debug_layer correspond to a
debugging. After system has booted up, it can be set _COMPONENT in an ACPI source file, e.g.,
via /sys/module/acpi/parameters/debug_layer. #define _COMPONENT ACPI_PCI_COMPONENT
CONFIG_ACPI_DEBUG must be enabled for this to produce any output. Bits in debug_level correspond to a level in
Available bits (add the numbers together) to enable debug output ACPI_DEBUG_PRINT statements, e.g.,
for specific parts of the ACPI subsystem: ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
0x01 utilities 0x02 hardware 0x04 events 0x08 tables See Documentation/acpi/debug.txt for more information
0x10 namespace 0x20 parser 0x40 dispatcher about debug layers and levels.
0x80 executer 0x100 resources 0x200 acpica debugger
0x400 os services 0x800 acpica disassembler.
The number can be in decimal or prefixed with 0x in hex.
Warning: Many of these options can produce a lot of
output and make your system unusable. Be very careful.
acpi.debug_level= [HW,ACPI] Enable AML "Debug" output, i.e., stores to the Debug
Format: <int> object while interpreting AML:
Each bit of the <int> indicates an ACPI debug level, acpi.debug_layer=0xffffffff acpi.debug_level=0x2
which corresponds to the level in an ACPI_DEBUG_PRINT Enable PCI/PCI interrupt routing info messages:
statement. After system has booted up, this mask acpi.debug_layer=0x400000 acpi.debug_level=0x4
can be set via /sys/module/acpi/parameters/debug_level. Enable all messages related to ACPI hardware:
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
CONFIG_ACPI_DEBUG must be enabled for this to produce Some values produce so much output that the system is
any output. The number can be in decimal or prefixed unusable. The "log_buf_len" parameter may be useful
with 0x in hex. Some of these options produce so much if you need to capture more output.
output that the system is unusable.
The following global components are defined by the
ACPI CA:
0x01 error
0x02 warn
0x04 init
0x08 debug object
0x10 info
0x20 init names
0x40 parse
0x80 load
0x100 dispatch
0x200 execute
0x400 names
0x800 operation region
0x1000 bfield
0x2000 tables
0x4000 values
0x8000 objects
0x10000 resources
0x20000 user requests
0x40000 package
The number can be in decimal or prefixed with 0x in hex.
Warning: Many of these options can produce a lot of
output and make your system unusable. Be very careful.
acpi.power_nocheck= [HW,ACPI] acpi.power_nocheck= [HW,ACPI]
Format: 1/0 enable/disable the check of power state. Format: 1/0 enable/disable the check of power state.
@ -646,7 +629,7 @@ and is between 256 and 4096 characters. It is defined in the file
digiepca= [HW,SERIAL] digiepca= [HW,SERIAL]
See drivers/char/README.epca and See drivers/char/README.epca and
Documentation/digiepca.txt. Documentation/serial/digiepca.txt.
disable_mtrr_cleanup [X86] disable_mtrr_cleanup [X86]
enable_mtrr_cleanup [X86] enable_mtrr_cleanup [X86]
@ -757,7 +740,7 @@ and is between 256 and 4096 characters. It is defined in the file
See header of drivers/scsi/fdomain.c. See header of drivers/scsi/fdomain.c.
floppy= [HW] floppy= [HW]
See Documentation/floppy.txt. See Documentation/blockdev/floppy.txt.
force_pal_cache_flush force_pal_cache_flush
[IA-64] Avoid check_sal_cache_flush which may hang on [IA-64] Avoid check_sal_cache_flush which may hang on
@ -1126,7 +1109,7 @@ and is between 256 and 4096 characters. It is defined in the file
the same attribute, the last one is used. the same attribute, the last one is used.
load_ramdisk= [RAM] List of ramdisks to load from floppy load_ramdisk= [RAM] List of ramdisks to load from floppy
See Documentation/ramdisk.txt. See Documentation/blockdev/ramdisk.txt.
lockd.nlm_grace_period=P [NFS] Assign grace period. lockd.nlm_grace_period=P [NFS] Assign grace period.
Format: <integer> Format: <integer>
@ -1621,7 +1604,7 @@ and is between 256 and 4096 characters. It is defined in the file
pcd. [PARIDE] pcd. [PARIDE]
See header of drivers/block/paride/pcd.c. See header of drivers/block/paride/pcd.c.
See also Documentation/paride.txt. See also Documentation/blockdev/paride.txt.
pci=option[,option...] [PCI] various PCI subsystem options: pci=option[,option...] [PCI] various PCI subsystem options:
off [X86] don't probe for the PCI bus off [X86] don't probe for the PCI bus
@ -1722,7 +1705,7 @@ and is between 256 and 4096 characters. It is defined in the file
pcmv= [HW,PCMCIA] BadgePAD 4 pcmv= [HW,PCMCIA] BadgePAD 4
pd. [PARIDE] pd. [PARIDE]
See Documentation/paride.txt. See Documentation/blockdev/paride.txt.
pdcchassis= [PARISC,HW] Disable/Enable PDC Chassis Status codes at pdcchassis= [PARISC,HW] Disable/Enable PDC Chassis Status codes at
boot time. boot time.
@ -1730,10 +1713,10 @@ and is between 256 and 4096 characters. It is defined in the file
See arch/parisc/kernel/pdc_chassis.c See arch/parisc/kernel/pdc_chassis.c
pf. [PARIDE] pf. [PARIDE]
See Documentation/paride.txt. See Documentation/blockdev/paride.txt.
pg. [PARIDE] pg. [PARIDE]
See Documentation/paride.txt. See Documentation/blockdev/paride.txt.
pirq= [SMP,APIC] Manual mp-table setup pirq= [SMP,APIC] Manual mp-table setup
See Documentation/x86/i386/IO-APIC.txt. See Documentation/x86/i386/IO-APIC.txt.
@ -1803,7 +1786,7 @@ and is between 256 and 4096 characters. It is defined in the file
prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
before loading. before loading.
See Documentation/ramdisk.txt. See Documentation/blockdev/ramdisk.txt.
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
probe for; one of (bare|imps|exps|lifebook|any). probe for; one of (bare|imps|exps|lifebook|any).
@ -1823,7 +1806,7 @@ and is between 256 and 4096 characters. It is defined in the file
<io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq> <io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq>
pt. [PARIDE] pt. [PARIDE]
See Documentation/paride.txt. See Documentation/blockdev/paride.txt.
pty.legacy_count= pty.legacy_count=
[KNL] Number of legacy pty's. Overwrites compiled-in [KNL] Number of legacy pty's. Overwrites compiled-in
@ -1837,10 +1820,10 @@ and is between 256 and 4096 characters. It is defined in the file
See Documentation/md.txt. See Documentation/md.txt.
ramdisk_blocksize= [RAM] ramdisk_blocksize= [RAM]
See Documentation/ramdisk.txt. See Documentation/blockdev/ramdisk.txt.
ramdisk_size= [RAM] Sizes of RAM disks in kilobytes ramdisk_size= [RAM] Sizes of RAM disks in kilobytes
See Documentation/ramdisk.txt. See Documentation/blockdev/ramdisk.txt.
rcupdate.blimit= [KNL,BOOT] rcupdate.blimit= [KNL,BOOT]
Set maximum number of finished RCU callbacks to process Set maximum number of finished RCU callbacks to process
@ -2172,7 +2155,7 @@ and is between 256 and 4096 characters. It is defined in the file
See Documentation/sonypi.txt See Documentation/sonypi.txt
specialix= [HW,SERIAL] Specialix multi-serial port adapter specialix= [HW,SERIAL] Specialix multi-serial port adapter
See Documentation/specialix.txt. See Documentation/serial/specialix.txt.
spia_io_base= [HW,MTD] spia_io_base= [HW,MTD]
spia_fio_base= spia_fio_base=

View File

@ -0,0 +1,35 @@
If variable is of Type, use printk format specifier:
---------------------------------------------------------
int %d or %x
unsigned int %u or %x
long %ld or %lx
unsigned long %lu or %lx
long long %lld or %llx
unsigned long long %llu or %llx
size_t %zu or %zx
ssize_t %zd or %zx
Raw pointer value SHOULD be printed with %p.
u64 SHOULD be printed with %llu/%llx, (unsigned long long):
printk("%llu", (unsigned long long)u64_var);
s64 SHOULD be printed with %lld/%llx, (long long):
printk("%lld", (long long)s64_var);
If <type> is dependent on a config option for its size (e.g., sector_t,
blkcnt_t, phys_addr_t, resource_size_t) or is architecture-dependent
for its size (e.g., tcflag_t), use a format specifier of its largest
possible type and explicitly cast to it. Example:
printk("test: sector number/total blocks: %llu/%llu\n",
(unsigned long long)sector, (unsigned long long)blockcount);
Reminder: sizeof() result is of type size_t.
Thank you for your cooperation and attention.
By Randy Dunlap <rdunlap@xenotime.net>

View File

@ -0,0 +1,24 @@
00-INDEX
- this file.
README.cycladesZ
- info on Cyclades-Z firmware loading.
computone.txt
- info on Computone Intelliport II/Plus Multiport Serial Driver.
digiepca.txt
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
hayes-esp.txt
- info on using the Hayes ESP serial driver.
moxa-smartio
- file with info on installing/using Moxa multiport serial driver.
riscom8.txt
- notes on using the RISCom/8 multi-port serial driver.
rocket.txt
- info on the Comtrol RocketPort multiport serial driver.
specialix.txt
- info on hardware/driver for specialix IO8+ multiport serial card.
stallion.txt
- info on using the Stallion multiport serial driver.
sx.txt
- info on the Specialix SX/SI multiport serial driver.
tty.txt
- guide to the locking policies of the tty layer.

View File

@ -247,7 +247,7 @@ shar archive to make it easier to extract the script from the documentation.
To create the ip2mkdev shell script change to a convenient directory (/tmp To create the ip2mkdev shell script change to a convenient directory (/tmp
works just fine) and run the following command: works just fine) and run the following command:
unshar Documentation/computone.txt unshar Documentation/serial/computone.txt
(This file) (This file)
You should now have a file ip2mkdev in your current working directory with You should now have a file ip2mkdev in your current working directory with

View File

@ -0,0 +1,46 @@
Kernel driver for omap HDQ/1-wire module.
========================================
Supported chips:
================
HDQ/1-wire controller on the TI OMAP 2430/3430 platforms.
A useful link about HDQ basics:
===============================
http://focus.ti.com/lit/an/slua408/slua408.pdf
Description:
============
The HDQ/1-Wire module of TI OMAP2430/3430 platforms implement the hardware
protocol of the master functions of the Benchmark HDQ and the Dallas
Semiconductor 1-Wire protocols. These protocols use a single wire for
communication between the master (HDQ/1-Wire controller) and the slave
(HDQ/1-Wire external compliant device).
A typical application of the HDQ/1-Wire module is the communication with battery
monitor (gas gauge) integrated circuits.
The controller supports operation in both HDQ and 1-wire mode. The essential
difference between the HDQ and 1-wire mode is how the slave device responds to
initialization pulse.In HDQ mode, the firmware does not require the host to
create an initialization pulse to the slave.However, the slave can be reset by
using an initialization pulse (also referred to as a break pulse).The slave
does not respond with a presence pulse as it does in the 1-Wire protocol.
Remarks:
========
The driver (drivers/w1/masters/omap_hdq.c) supports the HDQ mode of the
controller. In this mode, as we can not read the ID which obeys the W1
spec(family:id:crc), a module parameter can be passed to the driver which will
be used to calculate the CRC and pass back an appropriate slave ID to the W1
core.
By default the master driver and the BQ slave i/f
driver(drivers/w1/slaves/w1_bq27000.c) sets the ID to 1.
Please note to load both the modules with a different ID if required, but note
that the ID used should be same for both master and slave driver loading.
e.g:
insmod omap_hdq.ko W1_ID=2
inamod w1_bq27000.ko F_ID=2

View File

@ -2216,6 +2216,13 @@ M: adaplas@gmail.com
L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
S: Maintained S: Maintained
INTEL MENLOW THERMAL DRIVER
P: Sujith Thomas
M: sujith.thomas@intel.com
L: linux-acpi@vger.kernel.org
W: http://www.lesswatts.org/projects/acpi/
S: Supported
INTEL IA32 MICROCODE UPDATE SUPPORT INTEL IA32 MICROCODE UPDATE SUPPORT
P: Tigran Aivazian P: Tigran Aivazian
M: tigran@aivazian.fsnet.co.uk M: tigran@aivazian.fsnet.co.uk
@ -2696,6 +2703,11 @@ P: Arnaldo Carvalho de Melo
M: acme@ghostprotocols.net M: acme@ghostprotocols.net
S: Maintained S: Maintained
LIS3LV02D ACCELEROMETER DRIVER
P: Eric Piel
M: eric.piel@tremplin-utc.net
S: Maintained
LM83 HARDWARE MONITOR DRIVER LM83 HARDWARE MONITOR DRIVER
P: Jean Delvare P: Jean Delvare
M: khali@linux-fr.org M: khali@linux-fr.org
@ -3377,7 +3389,9 @@ S: Maintained
PNP SUPPORT PNP SUPPORT
P: Adam Belay P: Adam Belay
M: ambx1@neo.rr.com M: abelay@mit.edu
P: Bjorn Helgaas
M: bjorn.helgaas@hp.com
S: Maintained S: Maintained
PNXxxxx I2C DRIVER PNXxxxx I2C DRIVER
@ -3914,8 +3928,6 @@ M: bootc@bootc.net
S: Maintained S: Maintained
SOFTWARE RAID (Multiple Disks) SUPPORT SOFTWARE RAID (Multiple Disks) SUPPORT
P: Ingo Molnar
M: mingo@redhat.com
P: Neil Brown P: Neil Brown
M: neilb@suse.de M: neilb@suse.de
L: linux-raid@vger.kernel.org L: linux-raid@vger.kernel.org

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 28 SUBLEVEL = 28
EXTRAVERSION = -rc4 EXTRAVERSION = -rc5
NAME = Killer Bat of Doom NAME = Killer Bat of Doom
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -256,8 +256,17 @@ int dmabounce_sync_for_cpu(struct device *, dma_addr_t, unsigned long,
int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long, int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long,
size_t, enum dma_data_direction); size_t, enum dma_data_direction);
#else #else
#define dmabounce_sync_for_cpu(dev,dma,off,sz,dir) (1) static inline int dmabounce_sync_for_cpu(struct device *d, dma_addr_t addr,
#define dmabounce_sync_for_device(dev,dma,off,sz,dir) (1) unsigned long offset, size_t size, enum dma_data_direction dir)
{
return 1;
}
static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr,
unsigned long offset, size_t size, enum dma_data_direction dir)
{
return 1;
}
/** /**

View File

@ -730,7 +730,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
{ {
/* hw_desc->next_desc is the same location for all channels */ /* hw_desc->next_desc is the same location for all channels */
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, }; union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
BUG_ON(hw_desc.dma->next_desc);
iop_paranoia(hw_desc.dma->next_desc);
hw_desc.dma->next_desc = next_desc_addr; hw_desc.dma->next_desc = next_desc_addr;
} }
@ -760,7 +761,7 @@ static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc)
struct iop3xx_desc_aau *hw_desc = desc->hw_desc; struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field;
BUG_ON(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
return desc_ctrl.zero_result_err; return desc_ctrl.zero_result_err;
} }

View File

@ -23,6 +23,12 @@
#define IOP_ADMA_SLOT_SIZE 32 #define IOP_ADMA_SLOT_SIZE 32
#define IOP_ADMA_THRESHOLD 4 #define IOP_ADMA_THRESHOLD 4
#ifdef DEBUG
#define IOP_PARANOIA 1
#else
#define IOP_PARANOIA 0
#endif
#define iop_paranoia(x) BUG_ON(IOP_PARANOIA && (x))
/** /**
* struct iop_adma_device - internal representation of an ADMA device * struct iop_adma_device - internal representation of an ADMA device

View File

@ -19,12 +19,13 @@ struct map_desc {
}; };
/* types 0-3 are defined in asm/io.h */ /* types 0-3 are defined in asm/io.h */
#define MT_CACHECLEAN 4 #define MT_UNCACHED 4
#define MT_MINICLEAN 5 #define MT_CACHECLEAN 5
#define MT_LOW_VECTORS 6 #define MT_MINICLEAN 6
#define MT_HIGH_VECTORS 7 #define MT_LOW_VECTORS 7
#define MT_MEMORY 8 #define MT_HIGH_VECTORS 8
#define MT_ROM 9 #define MT_MEMORY 9
#define MT_ROM 10
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern void iotable_init(struct map_desc *, int); extern void iotable_init(struct map_desc *, int);

View File

@ -94,20 +94,6 @@
#include <asm/hardware/ep7212.h> #include <asm/hardware/ep7212.h>
#include <asm/hardware/cs89712.h> #include <asm/hardware/cs89712.h>
/* dynamic ioremap() areas */
#define FLASH_START 0x00000000
#define FLASH_SIZE 0x800000
#define FLASH_WIDTH 4
#define SRAM_START 0x60000000
#define SRAM_SIZE 0xc000
#define SRAM_WIDTH 4
#define BOOTROM_START 0x70000000
#define BOOTROM_SIZE 0x80
#define BOOTROM_WIDTH 4
/* static cdb89712_map_io() areas */ /* static cdb89712_map_io() areas */
#define REGISTER_START 0x80000000 #define REGISTER_START 0x80000000
#define REGISTER_SIZE 0x4000 #define REGISTER_SIZE 0x4000
@ -198,14 +184,6 @@
#define CEIVA_FLASH_SIZE 0x100000 #define CEIVA_FLASH_SIZE 0x100000
#define CEIVA_FLASH_WIDTH 2 #define CEIVA_FLASH_WIDTH 2
#define SRAM_START 0x60000000
#define SRAM_SIZE 0xc000
#define SRAM_WIDTH 4
#define BOOTROM_START 0x70000000
#define BOOTROM_SIZE 0x80
#define BOOTROM_WIDTH 4
/* /*
* SED1355 LCD controller * SED1355 LCD controller
*/ */

View File

@ -275,9 +275,9 @@ static struct map_desc cl7500_io_desc[] __initdata = {
.length = ISA_SIZE, .length = ISA_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, { /* Flash */ }, { /* Flash */
.virtual = FLASH_BASE, .virtual = CLPS7500_FLASH_BASE,
.pfn = __phys_to_pfn(FLASH_START), .pfn = __phys_to_pfn(CLPS7500_FLASH_START),
.length = FLASH_SIZE, .length = CLPS7500_FLASH_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, { /* LED */ }, { /* LED */
.virtual = LED_BASE, .virtual = LED_BASE,

View File

@ -39,9 +39,9 @@
#define ISA_SIZE 0x00010000 #define ISA_SIZE 0x00010000
#define ISA_BASE 0xe1000000 #define ISA_BASE 0xe1000000
#define FLASH_START 0x01000000 /* XXX */ #define CLPS7500_FLASH_START 0x01000000 /* XXX */
#define FLASH_SIZE 0x01000000 #define CLPS7500_FLASH_SIZE 0x01000000
#define FLASH_BASE 0xe2000000 #define CLPS7500_FLASH_BASE 0xe2000000
#define LED_START 0x0302B000 #define LED_START 0x0302B000
#define LED_SIZE 0x00001000 #define LED_SIZE 0x00001000

View File

@ -19,9 +19,9 @@
#ifdef CONFIG_ARCH_H7202 #ifdef CONFIG_ARCH_H7202
/* FLASH */ /* FLASH */
#define FLASH_VIRT 0xd0000000 #define H720X_FLASH_VIRT 0xd0000000
#define FLASH_PHYS 0x00000000 #define H720X_FLASH_PHYS 0x00000000
#define FLASH_SIZE 0x02000000 #define H720X_FLASH_SIZE 0x02000000
/* onboard LAN controller */ /* onboard LAN controller */
# define ETH0_PHYS 0x08000000 # define ETH0_PHYS 0x08000000

View File

@ -407,28 +407,11 @@
*/ */
#define uHAL_MEMORY_SIZE INTEGRATOR_SSRAM_SIZE #define uHAL_MEMORY_SIZE INTEGRATOR_SSRAM_SIZE
/*
* Application Flash
*
*/
#define FLASH_BASE INTEGRATOR_FLASH_BASE
#define FLASH_SIZE INTEGRATOR_FLASH_SIZE
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
#define FLASH_BLOCK_SIZE SZ_128K
/*
* Boot Flash
*
*/
#define EPROM_BASE INTEGRATOR_BOOT_ROM_HI
#define EPROM_SIZE INTEGRATOR_BOOT_ROM_SIZE
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
/* /*
* Clean base - dummy * Clean base - dummy
* *
*/ */
#define CLEAN_BASE EPROM_BASE #define CLEAN_BASE INTEGRATOR_BOOT_ROM_HI
/* /*
* Timer definitions * Timer definitions

View File

@ -404,7 +404,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
u32 next_desc_addr) u32 next_desc_addr)
{ {
struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc;
BUG_ON(hw_desc->next_desc);
iop_paranoia(hw_desc->next_desc);
hw_desc->next_desc = next_desc_addr; hw_desc->next_desc = next_desc_addr;
} }

View File

@ -104,7 +104,7 @@ static struct clk uart_clk = {
static struct clk mmci_clk = { static struct clk mmci_clk = {
.name = "MCLK", .name = "MCLK",
.rate = 33000000, .rate = 24000000,
}; };
int clk_register(struct clk *clk) int clk_register(struct clk *clk)

View File

@ -238,28 +238,11 @@
#define REALVIEW_INTREG_OFFSET 0x8 /* Interrupt control */ #define REALVIEW_INTREG_OFFSET 0x8 /* Interrupt control */
#define REALVIEW_DECODE_OFFSET 0xC /* Fitted logic modules */ #define REALVIEW_DECODE_OFFSET 0xC /* Fitted logic modules */
/*
* Application Flash
*
*/
#define FLASH_BASE REALVIEW_FLASH_BASE
#define FLASH_SIZE REALVIEW_FLASH_SIZE
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
#define FLASH_BLOCK_SIZE SZ_128K
/*
* Boot Flash
*
*/
#define EPROM_BASE REALVIEW_BOOT_ROM_HI
#define EPROM_SIZE REALVIEW_BOOT_ROM_SIZE
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
/* /*
* Clean base - dummy * Clean base - dummy
* *
*/ */
#define CLEAN_BASE EPROM_BASE #define CLEAN_BASE REALVIEW_BOOT_ROM_HI
/* /*
* System controller bit assignment * System controller bit assignment

View File

@ -105,7 +105,7 @@ static struct clk uart_clk = {
static struct clk mmci_clk = { static struct clk mmci_clk = {
.name = "MCLK", .name = "MCLK",
.rate = 33000000, .rate = 24000000,
}; };
int clk_register(struct clk *clk) int clk_register(struct clk *clk)

View File

@ -436,28 +436,12 @@
#define SIC_INTMASK_PCI1 (1 << SIC_INT_PCI1) #define SIC_INTMASK_PCI1 (1 << SIC_INT_PCI1)
#define SIC_INTMASK_PCI2 (1 << SIC_INT_PCI2) #define SIC_INTMASK_PCI2 (1 << SIC_INT_PCI2)
#define SIC_INTMASK_PCI3 (1 << SIC_INT_PCI3) #define SIC_INTMASK_PCI3 (1 << SIC_INT_PCI3)
/*
* Application Flash
*
*/
#define FLASH_BASE VERSATILE_FLASH_BASE
#define FLASH_SIZE VERSATILE_FLASH_SIZE
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
#define FLASH_BLOCK_SIZE SZ_128K
/*
* Boot Flash
*
*/
#define EPROM_BASE VERSATILE_BOOT_ROM_HI
#define EPROM_SIZE VERSATILE_BOOT_ROM_SIZE
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
/* /*
* Clean base - dummy * Clean base - dummy
* *
*/ */
#define CLEAN_BASE EPROM_BASE #define CLEAN_BASE VERSATILE_BOOT_ROM_HI
/* /*
* System controller bit assignment * System controller bit assignment

View File

@ -150,7 +150,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
/* /*
* Clean and invalidate partial last cache line. * Clean and invalidate partial last cache line.
*/ */
if (end & (CACHE_LINE_SIZE - 1)) { if (start < end && end & (CACHE_LINE_SIZE - 1)) {
l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1)); l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
end &= ~(CACHE_LINE_SIZE - 1); end &= ~(CACHE_LINE_SIZE - 1);
} }
@ -158,7 +158,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
/* /*
* Invalidate all full cache lines between 'start' and 'end'. * Invalidate all full cache lines between 'start' and 'end'.
*/ */
while (start != end) { while (start < end) {
unsigned long range_end = calc_range_end(start, end); unsigned long range_end = calc_range_end(start, end);
l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE); l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE);
start = range_end; start = range_end;

View File

@ -208,6 +208,12 @@ static struct mem_type mem_types[] = {
.prot_sect = PROT_SECT_DEVICE, .prot_sect = PROT_SECT_DEVICE,
.domain = DOMAIN_IO, .domain = DOMAIN_IO,
}, },
[MT_UNCACHED] = {
.prot_pte = PROT_PTE_DEVICE,
.prot_l1 = PMD_TYPE_TABLE,
.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,
.domain = DOMAIN_IO,
},
[MT_CACHECLEAN] = { [MT_CACHECLEAN] = {
.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,
.domain = DOMAIN_KERNEL, .domain = DOMAIN_KERNEL,

View File

@ -16,14 +16,15 @@
#include <asm/hardware/iop3xx.h> #include <asm/hardware/iop3xx.h>
/* /*
* Standard IO mapping for all IOP3xx based systems * Standard IO mapping for all IOP3xx based systems. Note that
* the IOP3xx OCCDR must be mapped uncached and unbuffered.
*/ */
static struct map_desc iop3xx_std_desc[] __initdata = { static struct map_desc iop3xx_std_desc[] __initdata = {
{ /* mem mapped registers */ { /* mem mapped registers */
.virtual = IOP3XX_PERIPHERAL_VIRT_BASE, .virtual = IOP3XX_PERIPHERAL_VIRT_BASE,
.pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE),
.length = IOP3XX_PERIPHERAL_SIZE, .length = IOP3XX_PERIPHERAL_SIZE,
.type = MT_DEVICE, .type = MT_UNCACHED,
}, { /* PCI IO space */ }, { /* PCI IO space */
.virtual = IOP3XX_PCI_LOWER_IO_VA, .virtual = IOP3XX_PCI_LOWER_IO_VA,
.pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA), .pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA),

View File

@ -101,7 +101,7 @@ extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
extern unsigned long _ramstart, _ramend, _rambase; extern unsigned long _ramstart, _ramend, _rambase;
extern unsigned long memory_start, memory_end, physical_mem_end; extern unsigned long memory_start, memory_end, physical_mem_end;
extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
_ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _ebss_b_l1[], _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[],
_stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[],
_ebss_l2[], _l2_lma_start[]; _ebss_l2[], _l2_lma_start[];

View File

@ -15,7 +15,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
#define dma_mapping_error static inline
int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
{
return 0;
}
/* /*
* Map a single buffer of the indicated size for DMA in streaming mode. * Map a single buffer of the indicated size for DMA in streaming mode.

View File

@ -218,7 +218,7 @@ inline int check_gpio(unsigned gpio)
if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15 if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15
|| gpio == GPIO_PH14 || gpio == GPIO_PH15 || gpio == GPIO_PH14 || gpio == GPIO_PH15
|| gpio == GPIO_PJ14 || gpio == GPIO_PJ15 || gpio == GPIO_PJ14 || gpio == GPIO_PJ15
|| gpio > MAX_BLACKFIN_GPIOS) || gpio >= MAX_BLACKFIN_GPIOS)
return -EINVAL; return -EINVAL;
return 0; return 0;
} }

View File

@ -188,10 +188,11 @@ static struct cplb_desc cplb_data[] = {
static u16 __init lock_kernel_check(u32 start, u32 end) static u16 __init lock_kernel_check(u32 start, u32 end)
{ {
if ((end <= (u32) _end && end >= (u32)_stext) || if (start >= (u32)_end || end <= (u32)_stext)
(start <= (u32) _end && start >= (u32)_stext))
return IN_KERNEL;
return 0; return 0;
/* This cplb block overlapped with kernel area. */
return IN_KERNEL;
} }
static unsigned short __init static unsigned short __init

View File

@ -351,9 +351,14 @@ int _access_ok(unsigned long addr, unsigned long size)
return 1; return 1;
#endif #endif
#if L1_DATA_B_LENGTH != 0 #if L1_DATA_B_LENGTH != 0
if (addr >= L1_DATA_B_START if (addr >= L1_DATA_B_START + (_ebss_b_l1 - _sdata_b_l1)
&& addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH) && addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH)
return 1; return 1;
#endif
#if L2_LENGTH != 0
if (addr >= L2_START + (_ebss_l2 - _stext_l2)
&& addr + size <= L2_START + L2_LENGTH)
return 1;
#endif #endif
return 0; return 0;
} }

View File

@ -119,23 +119,23 @@ void __init bfin_relocate_l1_mem(void)
/* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */ /* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */
dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length); dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length);
l1_data_a_length = _ebss_l1 - _sdata_l1; l1_data_a_length = _sbss_l1 - _sdata_l1;
if (l1_data_a_length > L1_DATA_A_LENGTH) if (l1_data_a_length > L1_DATA_A_LENGTH)
panic("L1 Data SRAM Bank A Overflow\n"); panic("L1 Data SRAM Bank A Overflow\n");
/* Copy _sdata_l1 to _ebss_l1 to L1 data bank A SRAM */ /* Copy _sdata_l1 to _sbss_l1 to L1 data bank A SRAM */
dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length); dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length);
l1_data_b_length = _ebss_b_l1 - _sdata_b_l1; l1_data_b_length = _sbss_b_l1 - _sdata_b_l1;
if (l1_data_b_length > L1_DATA_B_LENGTH) if (l1_data_b_length > L1_DATA_B_LENGTH)
panic("L1 Data SRAM Bank B Overflow\n"); panic("L1 Data SRAM Bank B Overflow\n");
/* Copy _sdata_b_l1 to _ebss_b_l1 to L1 data bank B SRAM */ /* Copy _sdata_b_l1 to _sbss_b_l1 to L1 data bank B SRAM */
dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length +
l1_data_a_length, l1_data_b_length); l1_data_a_length, l1_data_b_length);
if (L2_LENGTH != 0) { if (L2_LENGTH != 0) {
l2_length = _ebss_l2 - _stext_l2; l2_length = _sbss_l2 - _stext_l2;
if (l2_length > L2_LENGTH) if (l2_length > L2_LENGTH)
panic("L2 SRAM Overflow\n"); panic("L2 SRAM Overflow\n");
@ -827,7 +827,7 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
bfin_compiled_revid(), bfin_revid()); bfin_compiled_revid(), bfin_revid());
} }
if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX) if (bfin_revid() < CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n", printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
CPU, bfin_revid()); CPU, bfin_revid());
} }

View File

@ -59,7 +59,7 @@
#endif #endif
#ifdef CONFIG_VERBOSE_DEBUG #ifdef CONFIG_DEBUG_VERBOSE
#define verbose_printk(fmt, arg...) \ #define verbose_printk(fmt, arg...) \
printk(fmt, ##arg) printk(fmt, ##arg)
#else #else
@ -147,9 +147,12 @@ static void decode_address(char *buf, unsigned long address)
char *name = p->comm; char *name = p->comm;
struct file *file = vma->vm_file; struct file *file = vma->vm_file;
if (file) if (file) {
name = d_path(&file->f_path, _tmpbuf, char *d_name = d_path(&file->f_path, _tmpbuf,
sizeof(_tmpbuf)); sizeof(_tmpbuf));
if (!IS_ERR(d_name))
name = d_name;
}
/* FLAT does not have its text aligned to the start of /* FLAT does not have its text aligned to the start of
* the map while FDPIC ELF does ... * the map while FDPIC ELF does ...
@ -571,7 +574,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
#endif #endif
panic("Kernel exception"); panic("Kernel exception");
} else { } else {
#ifdef CONFIG_VERBOSE_DEBUG #ifdef CONFIG_DEBUG_VERBOSE
unsigned long *stack; unsigned long *stack;
/* Dump the user space stack */ /* Dump the user space stack */
stack = (unsigned long *)rdusp(); stack = (unsigned long *)rdusp();

View File

@ -25,9 +25,13 @@
*/ */
.macro do_flush flushins:req optflushins optnopins label .macro do_flush flushins:req optflushins optnopins label
R2 = -L1_CACHE_BYTES;
/* start = (start & -L1_CACHE_BYTES) */
R0 = R0 & R2;
/* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */ /* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */
R1 += -1; R1 += -1;
R2 = -L1_CACHE_BYTES;
R1 = R1 & R2; R1 = R1 & R2;
R1 += L1_CACHE_BYTES; R1 += L1_CACHE_BYTES;
@ -63,7 +67,7 @@ ENDPROC(_blackfin_icache_flush_range)
/* Flush all cache lines assocoiated with this area of memory. */ /* Flush all cache lines assocoiated with this area of memory. */
ENTRY(_blackfin_icache_dcache_flush_range) ENTRY(_blackfin_icache_dcache_flush_range)
do_flush IFLUSH, FLUSH do_flush FLUSH, IFLUSH
ENDPROC(_blackfin_icache_dcache_flush_range) ENDPROC(_blackfin_icache_dcache_flush_range)
/* Throw away all D-cached data in specified region without any obligation to /* Throw away all D-cached data in specified region without any obligation to

View File

@ -72,13 +72,13 @@ unsigned int __bfin_cycles_mod;
/**************************************************************************/ /**************************************************************************/
static unsigned int bfin_getfreq(unsigned int cpu) static unsigned int bfin_getfreq_khz(unsigned int cpu)
{ {
/* The driver only support single cpu */ /* The driver only support single cpu */
if (cpu != 0) if (cpu != 0)
return -1; return -1;
return get_cclk(); return get_cclk() / 1000;
} }
@ -96,7 +96,7 @@ static int bfin_target(struct cpufreq_policy *policy,
cclk_hz = bfin_freq_table[index].frequency; cclk_hz = bfin_freq_table[index].frequency;
freqs.old = bfin_getfreq(0); freqs.old = bfin_getfreq_khz(0);
freqs.new = cclk_hz; freqs.new = cclk_hz;
freqs.cpu = 0; freqs.cpu = 0;
@ -137,8 +137,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
if (policy->cpu != 0) if (policy->cpu != 0)
return -EINVAL; return -EINVAL;
cclk = get_cclk(); cclk = get_cclk() / 1000;
sclk = get_sclk(); sclk = get_sclk() / 1000;
#if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE)) #if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE))
min_cclk = sclk * 2; min_cclk = sclk * 2;
@ -152,7 +152,7 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */
dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1; dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1;
pr_debug("cpufreq: freq:%d csel:%d tscale:%d\n", pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n",
bfin_freq_table[index].frequency, bfin_freq_table[index].frequency,
dpm_state_table[index].csel, dpm_state_table[index].csel,
dpm_state_table[index].tscale); dpm_state_table[index].tscale);
@ -173,7 +173,7 @@ static struct freq_attr *bfin_freq_attr[] = {
static struct cpufreq_driver bfin_driver = { static struct cpufreq_driver bfin_driver = {
.verify = bfin_verify_speed, .verify = bfin_verify_speed,
.target = bfin_target, .target = bfin_target,
.get = bfin_getfreq, .get = bfin_getfreq_khz,
.init = __bfin_cpu_init, .init = __bfin_cpu_init,
.name = "bfin cpufreq", .name = "bfin cpufreq",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -277,7 +277,7 @@ ENTRY(_bfin_return_from_exception)
p5.h = hi(ILAT); p5.h = hi(ILAT);
r6 = [p5]; r6 = [p5];
r7 = 0x20; /* Did I just cause anther HW error? */ r7 = 0x20; /* Did I just cause anther HW error? */
r7 = r7 & r1; r6 = r7 & r6;
CC = R7 == R6; CC = R7 == R6;
if CC JUMP _double_fault; if CC JUMP _double_fault;
#endif #endif

View File

@ -183,10 +183,10 @@ static void __init l2_sram_init(void)
return; return;
} }
free_l2_sram_head.next->paddr = (void *)L2_START + free_l2_sram_head.next->paddr =
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); (void *)L2_START + (_ebss_l2 - _stext_l2);
free_l2_sram_head.next->size = L2_LENGTH - free_l2_sram_head.next->size =
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); L2_LENGTH - (_ebss_l2 - _stext_l2);
free_l2_sram_head.next->pid = 0; free_l2_sram_head.next->pid = 0;
free_l2_sram_head.next->next = NULL; free_l2_sram_head.next->next = NULL;

View File

@ -20,6 +20,8 @@ if VIRTUALIZATION
config KVM config KVM
tristate "Kernel-based Virtual Machine (KVM) support" tristate "Kernel-based Virtual Machine (KVM) support"
depends on HAVE_KVM && EXPERIMENTAL depends on HAVE_KVM && EXPERIMENTAL
# for device assignment:
depends on PCI
select PREEMPT_NOTIFIERS select PREEMPT_NOTIFIERS
select ANON_INODES select ANON_INODES
---help--- ---help---

View File

@ -673,16 +673,16 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
vcpu_load(vcpu); vcpu_load(vcpu);
if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) { if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
kvm_vcpu_block(vcpu); kvm_vcpu_block(vcpu);
clear_bit(KVM_REQ_UNHALT, &vcpu->requests); clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
vcpu_put(vcpu); r = -EAGAIN;
return -EAGAIN; goto out;
} }
if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
if (vcpu->mmio_needed) { if (vcpu->mmio_needed) {
memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8); memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8);
kvm_set_mmio_data(vcpu); kvm_set_mmio_data(vcpu);
@ -690,7 +690,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
vcpu->mmio_needed = 0; vcpu->mmio_needed = 0;
} }
r = __vcpu_run(vcpu, kvm_run); r = __vcpu_run(vcpu, kvm_run);
out:
if (vcpu->sigset_active) if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &sigsaved, NULL); sigprocmask(SIG_SETMASK, &sigsaved, NULL);

View File

@ -384,6 +384,10 @@ static inline u64 __gpfn_is_io(u64 gpfn)
#define MODE_IND(psr) \ #define MODE_IND(psr) \
(((psr).it << 2) + ((psr).dt << 1) + (psr).rt) (((psr).it << 2) + ((psr).dt << 1) + (psr).rt)
#ifndef CONFIG_SMP
#define _vmm_raw_spin_lock(x) do {}while(0)
#define _vmm_raw_spin_unlock(x) do {}while(0)
#else
#define _vmm_raw_spin_lock(x) \ #define _vmm_raw_spin_lock(x) \
do { \ do { \
__u32 *ia64_spinlock_ptr = (__u32 *) (x); \ __u32 *ia64_spinlock_ptr = (__u32 *) (x); \
@ -403,6 +407,7 @@ static inline u64 __gpfn_is_io(u64 gpfn)
do { barrier(); \ do { barrier(); \
((spinlock_t *)x)->raw_lock.lock = 0; } \ ((spinlock_t *)x)->raw_lock.lock = 0; } \
while (0) while (0)
#endif
void vmm_spin_lock(spinlock_t *lock); void vmm_spin_lock(spinlock_t *lock);
void vmm_spin_unlock(spinlock_t *lock); void vmm_spin_unlock(spinlock_t *lock);

View File

@ -133,7 +133,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
{ {
int i; int i;
BUG_ON(IRQ_USER + cnt >= NR_IRQS); BUG_ON(IRQ_USER + cnt > NR_IRQS);
m68k_first_user_vec = vec; m68k_first_user_vec = vec;
for (i = 0; i < cnt; i++) for (i = 0; i < cnt; i++)
irq_controller[IRQ_USER + i] = &user_irq_controller; irq_controller[IRQ_USER + i] = &user_irq_controller;

View File

@ -15,6 +15,15 @@ config DEBUG_DECOMPRESS_KERNEL
decompressing Linux seeing "Uncompressing Linux... " and decompressing Linux seeing "Uncompressing Linux... " and
"Ok, booting the kernel.\n" on console. "Ok, booting the kernel.\n" on console.
config TEST_MISALIGNMENT_HANDLER
bool "Run tests on the misalignment handler"
depends on DEBUG_KERNEL
default n
help
If you say Y here the kernel will execute a list of misaligned memory
accesses to make sure the misalignment handler deals them with
correctly. If it does not, the kernel will throw a BUG.
config KPROBES config KPROBES
bool "Kprobes" bool "Kprobes"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL

View File

@ -37,26 +37,22 @@
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#if 0 #if 0
#define kdebug(FMT, ...) printk(KERN_DEBUG FMT, ##__VA_ARGS__) #define kdebug(FMT, ...) printk(KERN_DEBUG "MISALIGN: "FMT"\n", ##__VA_ARGS__)
#else #else
#define kdebug(FMT, ...) do {} while (0) #define kdebug(FMT, ...) do {} while (0)
#endif #endif
static int misalignment_addr(unsigned long *registers, unsigned params, static int misalignment_addr(unsigned long *registers, unsigned long sp,
unsigned opcode, unsigned disp, unsigned params, unsigned opcode,
void **_address, unsigned long **_postinc); unsigned long disp,
void **_address, unsigned long **_postinc,
unsigned long *_inc);
static int misalignment_reg(unsigned long *registers, unsigned params, static int misalignment_reg(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp, unsigned opcode, unsigned long disp,
unsigned long **_register); unsigned long **_register);
static inline unsigned int_log2(unsigned x) static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode);
{
unsigned y;
asm("bsch %1,%0" : "=r"(y) : "r"(x), "0"(0));
return y;
}
#define log2(x) int_log2(x)
static const unsigned Dreg_index[] = { static const unsigned Dreg_index[] = {
REG_D0 >> 2, REG_D1 >> 2, REG_D2 >> 2, REG_D3 >> 2 REG_D0 >> 2, REG_D1 >> 2, REG_D2 >> 2, REG_D3 >> 2
@ -86,9 +82,10 @@ enum format_id {
FMT_D7, FMT_D7,
FMT_D8, FMT_D8,
FMT_D9, FMT_D9,
FMT_D10,
}; };
struct { static const struct {
u_int8_t opsz, dispsz; u_int8_t opsz, dispsz;
} format_tbl[16] = { } format_tbl[16] = {
[FMT_S0] = { 8, 0 }, [FMT_S0] = { 8, 0 },
@ -103,6 +100,7 @@ struct {
[FMT_D7] = { 24, 8 }, [FMT_D7] = { 24, 8 },
[FMT_D8] = { 24, 24 }, [FMT_D8] = { 24, 24 },
[FMT_D9] = { 24, 32 }, [FMT_D9] = { 24, 32 },
[FMT_D10] = { 32, 0 },
}; };
enum value_id { enum value_id {
@ -128,9 +126,14 @@ enum value_id {
SD24, /* 24-bit signed displacement */ SD24, /* 24-bit signed displacement */
SIMM4_2, /* 4-bit signed displacement in opcode bits 4-7 */ SIMM4_2, /* 4-bit signed displacement in opcode bits 4-7 */
SIMM8, /* 8-bit signed immediate */ SIMM8, /* 8-bit signed immediate */
IMM8, /* 8-bit unsigned immediate */
IMM16, /* 16-bit unsigned immediate */
IMM24, /* 24-bit unsigned immediate */ IMM24, /* 24-bit unsigned immediate */
IMM32, /* 32-bit unsigned immediate */ IMM32, /* 32-bit unsigned immediate */
IMM32_HIGH8, /* 32-bit unsigned immediate, high 8-bits in opcode */ IMM32_HIGH8, /* 32-bit unsigned immediate, LSB in opcode */
IMM32_MEM, /* 32-bit unsigned displacement */
IMM32_HIGH8_MEM, /* 32-bit unsigned displacement, LSB in opcode */
DN0 = DM0, DN0 = DM0,
DN1 = DM1, DN1 = DM1,
@ -149,7 +152,7 @@ enum value_id {
}; };
struct mn10300_opcode { struct mn10300_opcode {
const char *name; const char name[8];
u_int32_t opcode; u_int32_t opcode;
u_int32_t opmask; u_int32_t opmask;
unsigned exclusion; unsigned exclusion;
@ -185,6 +188,10 @@ struct mn10300_opcode {
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
static const struct mn10300_opcode mn10300_opcodes[] = { static const struct mn10300_opcode mn10300_opcodes[] = {
{ "mov", 0x4200, 0xf300, 0, FMT_S1, 0, {DM1, MEM2(IMM8, SP)}},
{ "mov", 0x4300, 0xf300, 0, FMT_S1, 0, {AM1, MEM2(IMM8, SP)}},
{ "mov", 0x5800, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), DN0}},
{ "mov", 0x5c00, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), AN0}},
{ "mov", 0x60, 0xf0, 0, FMT_S0, 0, {DM1, MEM(AN0)}}, { "mov", 0x60, 0xf0, 0, FMT_S0, 0, {DM1, MEM(AN0)}},
{ "mov", 0x70, 0xf0, 0, FMT_S0, 0, {MEM(AM0), DN1}}, { "mov", 0x70, 0xf0, 0, FMT_S0, 0, {MEM(AM0), DN1}},
{ "mov", 0xf000, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), AN1}}, { "mov", 0xf000, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), AN1}},
@ -197,8 +204,6 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
{ "mov", 0xf81000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, { "mov", 0xf81000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}},
{ "mov", 0xf82000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8,AM0), AN1}}, { "mov", 0xf82000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8,AM0), AN1}},
{ "mov", 0xf83000, 0xfff000, 0, FMT_D1, 0, {AM1, MEM2(SD8, AN0)}}, { "mov", 0xf83000, 0xfff000, 0, FMT_D1, 0, {AM1, MEM2(SD8, AN0)}},
{ "mov", 0xf8f000, 0xfffc00, 0, FMT_D1, AM33, {MEM2(SD8, AM0), SP}},
{ "mov", 0xf8f400, 0xfffc00, 0, FMT_D1, AM33, {SP, MEM2(SD8, AN0)}},
{ "mov", 0xf90a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, { "mov", 0xf90a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}},
{ "mov", 0xf91a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, { "mov", 0xf91a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}},
{ "mov", 0xf96a00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, { "mov", 0xf96a00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}},
@ -207,24 +212,46 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
{ "mov", 0xfa100000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, { "mov", 0xfa100000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}},
{ "mov", 0xfa200000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), AN1}}, { "mov", 0xfa200000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), AN1}},
{ "mov", 0xfa300000, 0xfff00000, 0, FMT_D2, 0, {AM1, MEM2(SD16, AN0)}}, { "mov", 0xfa300000, 0xfff00000, 0, FMT_D2, 0, {AM1, MEM2(SD16, AN0)}},
{ "mov", 0xfa900000, 0xfff30000, 0, FMT_D2, 0, {AM1, MEM2(IMM16, SP)}},
{ "mov", 0xfa910000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}},
{ "mov", 0xfab00000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), AN0}},
{ "mov", 0xfab40000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}},
{ "mov", 0xfb0a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, { "mov", 0xfb0a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}},
{ "mov", 0xfb1a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, { "mov", 0xfb1a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}},
{ "mov", 0xfb6a0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, { "mov", 0xfb6a0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}},
{ "mov", 0xfb7a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, { "mov", 0xfb7a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}},
{ "mov", 0xfb8a0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}},
{ "mov", 0xfb8e0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, { "mov", 0xfb8e0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}},
{ "mov", 0xfb9a0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}},
{ "mov", 0xfb9e0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, { "mov", 0xfb9e0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}},
{ "mov", 0xfc000000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, { "mov", 0xfc000000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}},
{ "mov", 0xfc100000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, { "mov", 0xfc100000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}},
{ "mov", 0xfc200000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), AN1}}, { "mov", 0xfc200000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), AN1}},
{ "mov", 0xfc300000, 0xfff00000, 0, FMT_D4, 0, {AM1, MEM2(IMM32,AN0)}}, { "mov", 0xfc300000, 0xfff00000, 0, FMT_D4, 0, {AM1, MEM2(IMM32,AN0)}},
{ "mov", 0xfc800000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM(IMM32_MEM)}},
{ "mov", 0xfc810000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}},
{ "mov", 0xfc900000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM2(IMM32, SP)}},
{ "mov", 0xfc910000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}},
{ "mov", 0xfca00000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), AN0}},
{ "mov", 0xfca40000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}},
{ "mov", 0xfcb00000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), AN0}},
{ "mov", 0xfcb40000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}},
{ "mov", 0xfd0a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, { "mov", 0xfd0a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}},
{ "mov", 0xfd1a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, { "mov", 0xfd1a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}},
{ "mov", 0xfd6a0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, { "mov", 0xfd6a0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}},
{ "mov", 0xfd7a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, { "mov", 0xfd7a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}},
{ "mov", 0xfd8a0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}},
{ "mov", 0xfd9a0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}},
{ "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, { "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
{ "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
{ "mov", 0xfe0e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}},
{ "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, { "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
{ "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
{ "mov", 0xfe1e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}},
{ "mov", 0xfe6a0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, { "mov", 0xfe6a0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}},
{ "mov", 0xfe7a0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, { "mov", 0xfe7a0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}},
{ "mov", 0xfe8a0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}},
{ "mov", 0xfe9a0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}},
{ "movhu", 0xf060, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), DN1}}, { "movhu", 0xf060, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), DN1}},
{ "movhu", 0xf070, 0xfff0, 0, FMT_D0, 0, {DM1, MEM(AN0)}}, { "movhu", 0xf070, 0xfff0, 0, FMT_D0, 0, {DM1, MEM(AN0)}},
@ -232,29 +259,58 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
{ "movhu", 0xf4c0, 0xffc0, 0, FMT_D0, 0, {DM2, MEM2(DI, AN0)}}, { "movhu", 0xf4c0, 0xffc0, 0, FMT_D0, 0, {DM2, MEM2(DI, AN0)}},
{ "movhu", 0xf86000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8, AM0), DN1}}, { "movhu", 0xf86000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8, AM0), DN1}},
{ "movhu", 0xf87000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, { "movhu", 0xf87000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}},
{ "movhu", 0xf89300, 0xfff300, 0, FMT_D1, 0, {DM1, MEM2(IMM8, SP)}},
{ "movhu", 0xf8bc00, 0xfffc00, 0, FMT_D1, 0, {MEM2(IMM8, SP), DN0}},
{ "movhu", 0xf94a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, { "movhu", 0xf94a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}},
{ "movhu", 0xf95a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, { "movhu", 0xf95a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}},
{ "movhu", 0xf9ea00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, { "movhu", 0xf9ea00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}},
{ "movhu", 0xf9fa00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEMINC(RN0)}}, { "movhu", 0xf9fa00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEMINC(RN0)}},
{ "movhu", 0xfa600000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), DN1}}, { "movhu", 0xfa600000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), DN1}},
{ "movhu", 0xfa700000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, { "movhu", 0xfa700000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}},
{ "movhu", 0xfa930000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}},
{ "movhu", 0xfabc0000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}},
{ "movhu", 0xfb4a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, { "movhu", 0xfb4a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}},
{ "movhu", 0xfb5a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, { "movhu", 0xfb5a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}},
{ "movhu", 0xfbca0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}},
{ "movhu", 0xfbce0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, { "movhu", 0xfbce0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}},
{ "movhu", 0xfbda0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}},
{ "movhu", 0xfbde0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, { "movhu", 0xfbde0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}},
{ "movhu", 0xfbea0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, { "movhu", 0xfbea0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}},
{ "movhu", 0xfbfa0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, { "movhu", 0xfbfa0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}},
{ "movhu", 0xfc600000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, { "movhu", 0xfc600000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}},
{ "movhu", 0xfc700000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, { "movhu", 0xfc700000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}},
{ "movhu", 0xfc830000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}},
{ "movhu", 0xfc930000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}},
{ "movhu", 0xfcac0000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}},
{ "movhu", 0xfcbc0000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}},
{ "movhu", 0xfd4a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, { "movhu", 0xfd4a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}},
{ "movhu", 0xfd5a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, { "movhu", 0xfd5a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}},
{ "movhu", 0xfdca0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}},
{ "movhu", 0xfdda0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}},
{ "movhu", 0xfdea0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, { "movhu", 0xfdea0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}},
{ "movhu", 0xfdfa0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, { "movhu", 0xfdfa0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}},
{ "movhu", 0xfe4a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, { "movhu", 0xfe4a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
{ "movhu", 0xfe4e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}},
{ "movhu", 0xfe5a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, { "movhu", 0xfe5a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
{ "movhu", 0xfe5e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}},
{ "movhu", 0xfeca0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}},
{ "movhu", 0xfeda0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}},
{ "movhu", 0xfeea0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, { "movhu", 0xfeea0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}},
{ "movhu", 0xfefa0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, { "movhu", 0xfefa0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}},
{ 0, 0, 0, 0, 0, 0, {0}},
{ "mov_llt", 0xf7e00000, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lgt", 0xf7e00001, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lge", 0xf7e00002, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lle", 0xf7e00003, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lcs", 0xf7e00004, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lhi", 0xf7e00005, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lcc", 0xf7e00006, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lls", 0xf7e00007, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_leq", 0xf7e00008, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lne", 0xf7e00009, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "mov_lra", 0xf7e0000a, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
{ "", 0, 0, 0, 0, 0, {0}},
}; };
/* /*
@ -265,18 +321,21 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
const struct exception_table_entry *fixup; const struct exception_table_entry *fixup;
const struct mn10300_opcode *pop; const struct mn10300_opcode *pop;
unsigned long *registers = (unsigned long *) regs; unsigned long *registers = (unsigned long *) regs;
unsigned long data, *store, *postinc; unsigned long data, *store, *postinc, disp, inc, sp;
mm_segment_t seg; mm_segment_t seg;
siginfo_t info; siginfo_t info;
uint32_t opcode, disp, noc, xo, xm; uint32_t opcode, noc, xo, xm;
uint8_t *pc, byte; uint8_t *pc, byte, datasz;
void *address; void *address;
unsigned tmp, npop; unsigned tmp, npop, dispsz, loop;
kdebug("MISALIGN at %lx\n", regs->pc); /* we don't fix up userspace misalignment faults */
if (user_mode(regs))
goto bus_error;
if (in_interrupt()) sp = (unsigned long) regs + sizeof(*regs);
die("Misalignment trap in interrupt context", regs, code);
kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp);
if (regs->epsw & EPSW_IE) if (regs->epsw & EPSW_IE)
asm volatile("or %0,epsw" : : "i"(EPSW_IE)); asm volatile("or %0,epsw" : : "i"(EPSW_IE));
@ -294,8 +353,8 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
opcode = byte; opcode = byte;
noc = 8; noc = 8;
for (pop = mn10300_opcodes; pop->name; pop++) { for (pop = mn10300_opcodes; pop->name[0]; pop++) {
npop = log2(pop->opcode | pop->opmask); npop = ilog2(pop->opcode | pop->opmask);
if (npop <= 0 || npop > 31) if (npop <= 0 || npop > 31)
continue; continue;
npop = (npop + 8) & ~7; npop = (npop + 8) & ~7;
@ -328,7 +387,6 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
} }
/* didn't manage to find a fixup */ /* didn't manage to find a fixup */
if (!user_mode(regs))
printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n", printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n",
regs->pc, opcode); regs->pc, opcode);
@ -337,6 +395,7 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
if (die_if_no_fixup("misalignment error", regs, code)) if (die_if_no_fixup("misalignment error", regs, code))
return; return;
bus_error:
info.si_signo = SIGBUS; info.si_signo = SIGBUS;
info.si_errno = 0; info.si_errno = 0;
info.si_code = BUS_ADRALN; info.si_code = BUS_ADRALN;
@ -346,28 +405,24 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
/* error reading opcodes */ /* error reading opcodes */
fetch_error: fetch_error:
if (!user_mode(regs))
printk(KERN_CRIT printk(KERN_CRIT
"MISALIGN: %p: fault whilst reading instruction data\n", "MISALIGN: %p: fault whilst reading instruction data\n",
pc); pc);
goto failed; goto failed;
bad_addr_mode: bad_addr_mode:
if (!user_mode(regs))
printk(KERN_CRIT printk(KERN_CRIT
"MISALIGN: %lx: unsupported addressing mode %x\n", "MISALIGN: %lx: unsupported addressing mode %x\n",
regs->pc, opcode); regs->pc, opcode);
goto failed; goto failed;
bad_reg_mode: bad_reg_mode:
if (!user_mode(regs))
printk(KERN_CRIT printk(KERN_CRIT
"MISALIGN: %lx: unsupported register mode %x\n", "MISALIGN: %lx: unsupported register mode %x\n",
regs->pc, opcode); regs->pc, opcode);
goto failed; goto failed;
unsupported_instruction: unsupported_instruction:
if (!user_mode(regs))
printk(KERN_CRIT printk(KERN_CRIT
"MISALIGN: %lx: unsupported instruction %x (%s)\n", "MISALIGN: %lx: unsupported instruction %x (%s)\n",
regs->pc, opcode, pop->name); regs->pc, opcode, pop->name);
@ -391,7 +446,7 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
/* we matched the opcode */ /* we matched the opcode */
found_opcode: found_opcode:
kdebug("MISALIGN: %lx: %x==%x { %x, %x }\n", kdebug("%lx: %x==%x { %x, %x }",
regs->pc, opcode, pop->opcode, pop->params[0], pop->params[1]); regs->pc, opcode, pop->opcode, pop->params[0], pop->params[1]);
tmp = format_tbl[pop->format].opsz; tmp = format_tbl[pop->format].opsz;
@ -406,106 +461,108 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
/* grab the extra displacement (note it's LSB first) */ /* grab the extra displacement (note it's LSB first) */
disp = 0; disp = 0;
tmp = format_tbl[pop->format].dispsz >> 3; dispsz = format_tbl[pop->format].dispsz;
while (tmp > 0) { for (loop = 0; loop < dispsz; loop += 8) {
tmp--;
disp <<= 8;
pc++; pc++;
if (__get_user(byte, pc) != 0) if (__get_user(byte, pc) != 0)
goto fetch_error; goto fetch_error;
disp |= byte; disp |= byte << loop;
kdebug("{%p} disp[%02x]=%02x", pc, loop, byte);
} }
kdebug("disp=%lx", disp);
set_fs(KERNEL_XDS); set_fs(KERNEL_XDS);
if (fixup || regs->epsw & EPSW_nSL) if (fixup)
set_fs(seg); set_fs(seg);
tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000; tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000;
if (!tmp) { if (!tmp) {
if (!user_mode(regs))
printk(KERN_CRIT printk(KERN_CRIT
"MISALIGN: %lx:" "MISALIGN: %lx: insn not move to/from memory %x\n",
" insn not move to/from memory %x\n",
regs->pc, opcode); regs->pc, opcode);
goto failed; goto failed;
} }
/* determine the data transfer size of the move */
if (pop->name[3] == 0 || /* "mov" */
pop->name[4] == 'l') /* mov_lcc */
inc = datasz = 4;
else if (pop->name[3] == 'h') /* movhu */
inc = datasz = 2;
else
goto unsupported_instruction;
if (pop->params[0] & 0x80000000) { if (pop->params[0] & 0x80000000) {
/* move memory to register */ /* move memory to register */
if (!misalignment_addr(registers, pop->params[0], opcode, disp, if (!misalignment_addr(registers, sp,
&address, &postinc)) pop->params[0], opcode, disp,
&address, &postinc, &inc))
goto bad_addr_mode; goto bad_addr_mode;
if (!misalignment_reg(registers, pop->params[1], opcode, disp, if (!misalignment_reg(registers, pop->params[1], opcode, disp,
&store)) &store))
goto bad_reg_mode; goto bad_reg_mode;
if (strcmp(pop->name, "mov") == 0) { kdebug("mov%u (%p),DARn", datasz, address);
kdebug("FIXUP: mov (%p),DARn\n", address); if (copy_from_user(&data, (void *) address, datasz) != 0)
if (copy_from_user(&data, (void *) address, 4) != 0)
goto transfer_failed; goto transfer_failed;
if (pop->params[0] & 0x1000000) if (pop->params[0] & 0x1000000) {
*postinc += 4; kdebug("inc=%lx", inc);
} else if (strcmp(pop->name, "movhu") == 0) { *postinc += inc;
kdebug("FIXUP: movhu (%p),DARn\n", address);
data = 0;
if (copy_from_user(&data, (void *) address, 2) != 0)
goto transfer_failed;
if (pop->params[0] & 0x1000000)
*postinc += 2;
} else {
goto unsupported_instruction;
} }
*store = data; *store = data;
kdebug("loaded %lx", data);
} else { } else {
/* move register to memory */ /* move register to memory */
if (!misalignment_reg(registers, pop->params[0], opcode, disp, if (!misalignment_reg(registers, pop->params[0], opcode, disp,
&store)) &store))
goto bad_reg_mode; goto bad_reg_mode;
if (!misalignment_addr(registers, pop->params[1], opcode, disp, if (!misalignment_addr(registers, sp,
&address, &postinc)) pop->params[1], opcode, disp,
&address, &postinc, &inc))
goto bad_addr_mode; goto bad_addr_mode;
data = *store; data = *store;
if (strcmp(pop->name, "mov") == 0) { kdebug("mov%u %lx,(%p)", datasz, data, address);
kdebug("FIXUP: mov %lx,(%p)\n", data, address); if (copy_to_user((void *) address, &data, datasz) != 0)
if (copy_to_user((void *) address, &data, 4) != 0)
goto transfer_failed; goto transfer_failed;
if (pop->params[1] & 0x1000000) if (pop->params[1] & 0x1000000)
*postinc += 4; *postinc += inc;
} else if (strcmp(pop->name, "movhu") == 0) {
kdebug("FIXUP: movhu %hx,(%p)\n",
(uint16_t) data, address);
if (copy_to_user((void *) address, &data, 2) != 0)
goto transfer_failed;
if (pop->params[1] & 0x1000000)
*postinc += 2;
} else {
goto unsupported_instruction;
}
} }
tmp = format_tbl[pop->format].opsz + format_tbl[pop->format].dispsz; tmp = format_tbl[pop->format].opsz + format_tbl[pop->format].dispsz;
regs->pc += tmp >> 3; regs->pc += tmp >> 3;
/* handle MOV_Lcc, which are currently the only FMT_D10 insns that
* access memory */
if (pop->format == FMT_D10)
misalignment_MOV_Lcc(regs, opcode);
set_fs(seg); set_fs(seg);
return;
} }
/* /*
* determine the address that was being accessed * determine the address that was being accessed
*/ */
static int misalignment_addr(unsigned long *registers, unsigned params, static int misalignment_addr(unsigned long *registers, unsigned long sp,
unsigned opcode, unsigned disp, unsigned params, unsigned opcode,
void **_address, unsigned long **_postinc) unsigned long disp,
void **_address, unsigned long **_postinc,
unsigned long *_inc)
{ {
unsigned long *postinc = NULL, address = 0, tmp; unsigned long *postinc = NULL, address = 0, tmp;
params &= 0x7fffffff; if (!(params & 0x1000000)) {
kdebug("noinc");
*_inc = 0;
_inc = NULL;
}
params &= 0x00ffffff;
do { do {
switch (params & 0xff) { switch (params & 0xff) {
@ -514,11 +571,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
address += *postinc; address += *postinc;
break; break;
case DM1: case DM1:
postinc = &registers[Dreg_index[opcode >> 2 & 0x0c]]; postinc = &registers[Dreg_index[opcode >> 2 & 0x03]];
address += *postinc; address += *postinc;
break; break;
case DM2: case DM2:
postinc = &registers[Dreg_index[opcode >> 4 & 0x30]]; postinc = &registers[Dreg_index[opcode >> 4 & 0x03]];
address += *postinc; address += *postinc;
break; break;
case AM0: case AM0:
@ -526,11 +583,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
address += *postinc; address += *postinc;
break; break;
case AM1: case AM1:
postinc = &registers[Areg_index[opcode >> 2 & 0x0c]]; postinc = &registers[Areg_index[opcode >> 2 & 0x03]];
address += *postinc; address += *postinc;
break; break;
case AM2: case AM2:
postinc = &registers[Areg_index[opcode >> 4 & 0x30]]; postinc = &registers[Areg_index[opcode >> 4 & 0x03]];
address += *postinc; address += *postinc;
break; break;
case RM0: case RM0:
@ -561,33 +618,53 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
postinc = &registers[Rreg_index[disp >> 4 & 0x0f]]; postinc = &registers[Rreg_index[disp >> 4 & 0x0f]];
address += *postinc; address += *postinc;
break; break;
case SP:
address += sp;
break;
/* displacements are either to be added to the address
* before use, or, in the case of post-inc addressing,
* to be added into the base register after use */
case SD8: case SD8:
case SIMM8: case SIMM8:
address += (int32_t) (int8_t) (disp & 0xff); disp = (long) (int8_t) (disp & 0xff);
break; goto displace_or_inc;
case SD16: case SD16:
address += (int32_t) (int16_t) (disp & 0xffff); disp = (long) (int16_t) (disp & 0xffff);
break; goto displace_or_inc;
case SD24: case SD24:
tmp = disp << 8; tmp = disp << 8;
asm("asr 8,%0" : "=r"(tmp) : "0"(tmp)); asm("asr 8,%0" : "=r"(tmp) : "0"(tmp));
address += tmp; disp = (long) tmp;
break; goto displace_or_inc;
case SIMM4_2: case SIMM4_2:
tmp = opcode >> 4 & 0x0f; tmp = opcode >> 4 & 0x0f;
tmp <<= 28; tmp <<= 28;
asm("asr 28,%0" : "=r"(tmp) : "0"(tmp)); asm("asr 28,%0" : "=r"(tmp) : "0"(tmp));
address += tmp; disp = (long) tmp;
break; goto displace_or_inc;
case IMM8:
disp &= 0x000000ff;
goto displace_or_inc;
case IMM16:
disp &= 0x0000ffff;
goto displace_or_inc;
case IMM24: case IMM24:
address += disp & 0x00ffffff; disp &= 0x00ffffff;
break; goto displace_or_inc;
case IMM32: case IMM32:
case IMM32_MEM:
case IMM32_HIGH8: case IMM32_HIGH8:
case IMM32_HIGH8_MEM:
displace_or_inc:
kdebug("%s %lx", _inc ? "incr" : "disp", disp);
if (!_inc)
address += disp; address += disp;
else
*_inc = disp;
break; break;
default: default:
BUG();
return 0; return 0;
} }
} while ((params >>= 8)); } while ((params >>= 8));
@ -601,7 +678,7 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
* determine the register that is acting as source/dest * determine the register that is acting as source/dest
*/ */
static int misalignment_reg(unsigned long *registers, unsigned params, static int misalignment_reg(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp, unsigned opcode, unsigned long disp,
unsigned long **_register) unsigned long **_register)
{ {
params &= 0x7fffffff; params &= 0x7fffffff;
@ -654,8 +731,239 @@ static int misalignment_reg(unsigned long *registers, unsigned params,
break; break;
default: default:
BUG();
return 0; return 0;
} }
return 1; return 1;
} }
/*
* handle the conditional loop part of the move-and-loop instructions
*/
static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode)
{
unsigned long epsw = regs->epsw;
unsigned long NxorV;
kdebug("MOV_Lcc %x [flags=%lx]", opcode, epsw & 0xf);
/* calculate N^V and shift onto the same bit position as Z */
NxorV = ((epsw >> 3) ^ epsw >> 1) & 1;
switch (opcode & 0xf) {
case 0x0: /* MOV_LLT: N^V */
if (NxorV)
goto take_the_loop;
return;
case 0x1: /* MOV_LGT: ~(Z or (N^V))*/
if (!((epsw & EPSW_FLAG_Z) | NxorV))
goto take_the_loop;
return;
case 0x2: /* MOV_LGE: ~(N^V) */
if (!NxorV)
goto take_the_loop;
return;
case 0x3: /* MOV_LLE: Z or (N^V) */
if ((epsw & EPSW_FLAG_Z) | NxorV)
goto take_the_loop;
return;
case 0x4: /* MOV_LCS: C */
if (epsw & EPSW_FLAG_C)
goto take_the_loop;
return;
case 0x5: /* MOV_LHI: ~(C or Z) */
if (!(epsw & (EPSW_FLAG_C | EPSW_FLAG_Z)))
goto take_the_loop;
return;
case 0x6: /* MOV_LCC: ~C */
if (!(epsw & EPSW_FLAG_C))
goto take_the_loop;
return;
case 0x7: /* MOV_LLS: C or Z */
if (epsw & (EPSW_FLAG_C | EPSW_FLAG_Z))
goto take_the_loop;
return;
case 0x8: /* MOV_LEQ: Z */
if (epsw & EPSW_FLAG_Z)
goto take_the_loop;
return;
case 0x9: /* MOV_LNE: ~Z */
if (!(epsw & EPSW_FLAG_Z))
goto take_the_loop;
return;
case 0xa: /* MOV_LRA: always */
goto take_the_loop;
default:
BUG();
}
take_the_loop:
/* wind the PC back to just after the SETLB insn */
kdebug("loop LAR=%lx", regs->lar);
regs->pc = regs->lar - 4;
}
/*
* misalignment handler tests
*/
#ifdef CONFIG_TEST_MISALIGNMENT_HANDLER
static u8 __initdata testbuf[512] __attribute__((aligned(16))) = {
[257] = 0x11,
[258] = 0x22,
[259] = 0x33,
[260] = 0x44,
};
#define ASSERTCMP(X, OP, Y) \
do { \
if (unlikely(!((X) OP (Y)))) { \
printk(KERN_ERR "\n"); \
printk(KERN_ERR "MISALIGN: Assertion failed at line %u\n", \
__LINE__); \
printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
(unsigned long)(X), (unsigned long)(Y)); \
BUG(); \
} \
} while(0)
static int __init test_misalignment(void)
{
register void *r asm("e0");
register u32 y asm("e1");
void *p = testbuf, *q;
u32 tmp, tmp2, x;
printk(KERN_NOTICE "==>test_misalignment() [testbuf=%p]\n", p);
p++;
printk(KERN_NOTICE "___ MOV (Am),Dn ___\n");
q = p + 256;
asm volatile("mov (%0),%1" : "+a"(q), "=d"(x));
ASSERTCMP(q, ==, p + 256);
ASSERTCMP(x, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (256,Am),Dn ___\n");
q = p;
asm volatile("mov (256,%0),%1" : "+a"(q), "=d"(x));
ASSERTCMP(q, ==, p);
ASSERTCMP(x, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (Di,Am),Dn ___\n");
tmp = 256;
q = p;
asm volatile("mov (%2,%0),%1" : "+a"(q), "=d"(x), "+d"(tmp));
ASSERTCMP(q, ==, p);
ASSERTCMP(x, ==, 0x44332211);
ASSERTCMP(tmp, ==, 256);
printk(KERN_NOTICE "___ MOV (256,Rm),Rn ___\n");
r = p;
asm volatile("mov (256,%0),%1" : "+r"(r), "=r"(y));
ASSERTCMP(r, ==, p);
ASSERTCMP(y, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (Rm+),Rn ___\n");
r = p + 256;
asm volatile("mov (%0+),%1" : "+r"(r), "=r"(y));
ASSERTCMP(r, ==, p + 256 + 4);
ASSERTCMP(y, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (Rm+,8),Rn ___\n");
r = p + 256;
asm volatile("mov (%0+,8),%1" : "+r"(r), "=r"(y));
ASSERTCMP(r, ==, p + 256 + 8);
ASSERTCMP(y, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (7,SP),Rn ___\n");
asm volatile(
"add -16,sp \n"
"mov +0x11,%0 \n"
"movbu %0,(7,sp) \n"
"mov +0x22,%0 \n"
"movbu %0,(8,sp) \n"
"mov +0x33,%0 \n"
"movbu %0,(9,sp) \n"
"mov +0x44,%0 \n"
"movbu %0,(10,sp) \n"
"mov (7,sp),%1 \n"
"add +16,sp \n"
: "+a"(q), "=d"(x));
ASSERTCMP(x, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV (259,SP),Rn ___\n");
asm volatile(
"add -264,sp \n"
"mov +0x11,%0 \n"
"movbu %0,(259,sp) \n"
"mov +0x22,%0 \n"
"movbu %0,(260,sp) \n"
"mov +0x33,%0 \n"
"movbu %0,(261,sp) \n"
"mov +0x55,%0 \n"
"movbu %0,(262,sp) \n"
"mov (259,sp),%1 \n"
"add +264,sp \n"
: "+d"(tmp), "=d"(x));
ASSERTCMP(x, ==, 0x55332211);
printk(KERN_NOTICE "___ MOV (260,SP),Rn ___\n");
asm volatile(
"add -264,sp \n"
"mov +0x11,%0 \n"
"movbu %0,(260,sp) \n"
"mov +0x22,%0 \n"
"movbu %0,(261,sp) \n"
"mov +0x33,%0 \n"
"movbu %0,(262,sp) \n"
"mov +0x55,%0 \n"
"movbu %0,(263,sp) \n"
"mov (260,sp),%1 \n"
"add +264,sp \n"
: "+d"(tmp), "=d"(x));
ASSERTCMP(x, ==, 0x55332211);
printk(KERN_NOTICE "___ MOV_LNE ___\n");
tmp = 1;
tmp2 = 2;
q = p + 256;
asm volatile(
"setlb \n"
"mov %2,%3 \n"
"mov %1,%2 \n"
"cmp +0,%1 \n"
"mov_lne (%0+,4),%1"
: "+r"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
:
: "cc");
ASSERTCMP(q, ==, p + 256 + 12);
ASSERTCMP(x, ==, 0x44332211);
printk(KERN_NOTICE "___ MOV in SETLB ___\n");
tmp = 1;
tmp2 = 2;
q = p + 256;
asm volatile(
"setlb \n"
"mov %1,%3 \n"
"mov (%0+),%1 \n"
"cmp +0,%1 \n"
"lne "
: "+a"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
:
: "cc");
ASSERTCMP(q, ==, p + 256 + 8);
ASSERTCMP(x, ==, 0x44332211);
printk(KERN_NOTICE "<==test_misalignment()\n");
return 0;
}
arch_initcall(test_misalignment);
#endif /* CONFIG_TEST_MISALIGNMENT_HANDLER */

View File

@ -44,8 +44,6 @@ extern void arch_send_call_function_ipi(cpumask_t mask);
#define PROC_CHANGE_PENALTY 15 /* Schedule penalty */ #define PROC_CHANGE_PENALTY 15 /* Schedule penalty */
extern unsigned long cpu_present_mask;
#define raw_smp_processor_id() (current_thread_info()->cpu) #define raw_smp_processor_id() (current_thread_info()->cpu)
#else /* CONFIG_SMP */ #else /* CONFIG_SMP */

View File

@ -61,22 +61,25 @@ STACK_SIZE = 1 << STACK_SHIFT
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
.macro TRACE_IRQS_ON .macro TRACE_IRQS_ON
l %r1,BASED(.Ltrace_irq_on) basr %r2,%r0
l %r1,BASED(.Ltrace_irq_on_caller)
basr %r14,%r1 basr %r14,%r1
.endm .endm
.macro TRACE_IRQS_OFF .macro TRACE_IRQS_OFF
l %r1,BASED(.Ltrace_irq_off) basr %r2,%r0
l %r1,BASED(.Ltrace_irq_off_caller)
basr %r14,%r1 basr %r14,%r1
.endm .endm
.macro TRACE_IRQS_CHECK .macro TRACE_IRQS_CHECK
basr %r2,%r0
tm SP_PSW(%r15),0x03 # irqs enabled? tm SP_PSW(%r15),0x03 # irqs enabled?
jz 0f jz 0f
l %r1,BASED(.Ltrace_irq_on) l %r1,BASED(.Ltrace_irq_on_caller)
basr %r14,%r1 basr %r14,%r1
j 1f j 1f
0: l %r1,BASED(.Ltrace_irq_off) 0: l %r1,BASED(.Ltrace_irq_off_caller)
basr %r14,%r1 basr %r14,%r1
1: 1:
.endm .endm
@ -1113,9 +1116,12 @@ cleanup_io_leave_insn:
.Lschedtail: .long schedule_tail .Lschedtail: .long schedule_tail
.Lsysc_table: .long sys_call_table .Lsysc_table: .long sys_call_table
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
.Ltrace_irq_on: .long trace_hardirqs_on .Ltrace_irq_on_caller:
.Ltrace_irq_off: .long trace_hardirqs_on_caller
.long trace_hardirqs_off .Ltrace_irq_off_caller:
.long trace_hardirqs_off_caller
#endif
#ifdef CONFIG_LOCKDEP
.Llockdep_sys_exit: .Llockdep_sys_exit:
.long lockdep_sys_exit .long lockdep_sys_exit
#endif #endif

View File

@ -61,19 +61,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
.macro TRACE_IRQS_ON .macro TRACE_IRQS_ON
brasl %r14,trace_hardirqs_on basr %r2,%r0
brasl %r14,trace_hardirqs_on_caller
.endm .endm
.macro TRACE_IRQS_OFF .macro TRACE_IRQS_OFF
brasl %r14,trace_hardirqs_off basr %r2,%r0
brasl %r14,trace_hardirqs_off_caller
.endm .endm
.macro TRACE_IRQS_CHECK .macro TRACE_IRQS_CHECK
basr %r2,%r0
tm SP_PSW(%r15),0x03 # irqs enabled? tm SP_PSW(%r15),0x03 # irqs enabled?
jz 0f jz 0f
brasl %r14,trace_hardirqs_on brasl %r14,trace_hardirqs_on_caller
j 1f j 1f
0: brasl %r14,trace_hardirqs_off 0: brasl %r14,trace_hardirqs_off_caller
1: 1:
.endm .endm
#else #else

View File

@ -136,9 +136,12 @@ static void default_idle(void)
return; return;
} }
trace_hardirqs_on(); trace_hardirqs_on();
/* Don't trace preempt off for idle. */
stop_critical_timings();
/* Wait for external, I/O or machine check interrupt. */ /* Wait for external, I/O or machine check interrupt. */
__load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
PSW_MASK_IO | PSW_MASK_EXT); PSW_MASK_IO | PSW_MASK_EXT);
start_critical_timings();
} }
void cpu_idle(void) void cpu_idle(void)

View File

@ -604,13 +604,13 @@ setup_memory(void)
if (memory_chunk[i].type != CHUNK_READ_WRITE) if (memory_chunk[i].type != CHUNK_READ_WRITE)
continue; continue;
start_chunk = PFN_DOWN(memory_chunk[i].addr); start_chunk = PFN_DOWN(memory_chunk[i].addr);
end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size);
end_chunk = min(end_chunk, end_pfn); end_chunk = min(end_chunk, end_pfn);
if (start_chunk >= end_chunk) if (start_chunk >= end_chunk)
continue; continue;
add_active_range(0, start_chunk, end_chunk); add_active_range(0, start_chunk, end_chunk);
pfn = max(start_chunk, start_pfn); pfn = max(start_chunk, start_pfn);
for (; pfn <= end_chunk; pfn++) for (; pfn < end_chunk; pfn++)
page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY);
} }

View File

@ -198,7 +198,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name)
{ {
int ret = sys_newuname(name); int ret = sys_newuname(name);
if (current->personality == PER_LINUX32 && !ret) { if (personality(current->personality) == PER_LINUX32 && !ret) {
ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); ret = copy_to_user(name->machine, "s390\0\0\0\0", 8);
if (ret) ret = -EFAULT; if (ret) ret = -EFAULT;
} }

View File

@ -65,18 +65,21 @@ static int machine_has_topology_irq;
static struct timer_list topology_timer; static struct timer_list topology_timer;
static void set_topology_timer(void); static void set_topology_timer(void);
static DECLARE_WORK(topology_work, topology_work_fn); static DECLARE_WORK(topology_work, topology_work_fn);
/* topology_lock protects the core linked list */
static DEFINE_SPINLOCK(topology_lock);
cpumask_t cpu_core_map[NR_CPUS]; cpumask_t cpu_core_map[NR_CPUS];
cpumask_t cpu_coregroup_map(unsigned int cpu) cpumask_t cpu_coregroup_map(unsigned int cpu)
{ {
struct core_info *core = &core_info; struct core_info *core = &core_info;
unsigned long flags;
cpumask_t mask; cpumask_t mask;
cpus_clear(mask); cpus_clear(mask);
if (!machine_has_topology) if (!machine_has_topology)
return cpu_present_map; return cpu_present_map;
mutex_lock(&smp_cpu_state_mutex); spin_lock_irqsave(&topology_lock, flags);
while (core) { while (core) {
if (cpu_isset(cpu, core->mask)) { if (cpu_isset(cpu, core->mask)) {
mask = core->mask; mask = core->mask;
@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu)
} }
core = core->next; core = core->next;
} }
mutex_unlock(&smp_cpu_state_mutex); spin_unlock_irqrestore(&topology_lock, flags);
if (cpus_empty(mask)) if (cpus_empty(mask))
mask = cpumask_of_cpu(cpu); mask = cpumask_of_cpu(cpu);
return mask; return mask;
@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info)
union tl_entry *tle, *end; union tl_entry *tle, *end;
struct core_info *core = &core_info; struct core_info *core = &core_info;
mutex_lock(&smp_cpu_state_mutex); spin_lock_irq(&topology_lock);
clear_cores(); clear_cores();
tle = info->tle; tle = info->tle;
end = (union tl_entry *)((unsigned long)info + info->length); end = (union tl_entry *)((unsigned long)info + info->length);
@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info)
} }
tle = next_tle(tle); tle = next_tle(tle);
} }
mutex_unlock(&smp_cpu_state_mutex); spin_unlock_irq(&topology_lock);
} }
static void topology_update_polarization_simple(void) static void topology_update_polarization_simple(void)

View File

@ -293,6 +293,10 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
*/ */
#define xlate_dev_kmem_ptr(p) p #define xlate_dev_kmem_ptr(p) p
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
int valid_phys_addr_range(unsigned long addr, size_t size);
int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __ASM_SH_IO_H */ #endif /* __ASM_SH_IO_H */

View File

@ -148,6 +148,12 @@ extern void paging_init(void);
extern void page_table_range_init(unsigned long start, unsigned long end, extern void page_table_range_init(unsigned long start, unsigned long end,
pgd_t *pgd); pgd_t *pgd);
#if !defined(CONFIG_CACHE_OFF) && defined(CONFIG_CPU_SH4) && defined(CONFIG_MMU)
extern void kmap_coherent_init(void);
#else
#define kmap_coherent_init() do { } while (0)
#endif
#include <asm-generic/pgtable.h> #include <asm-generic/pgtable.h>
#endif /* __ASM_SH_PGTABLE_H */ #endif /* __ASM_SH_PGTABLE_H */

View File

@ -119,17 +119,17 @@ static struct plat_sci_port sci_platform_data[] = {
},{ },{
.mapbase = 0xa4e30000, .mapbase = 0xa4e30000,
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.type = PORT_SCI, .type = PORT_SCIFA,
.irqs = { 56, 56, 56, 56 }, .irqs = { 56, 56, 56, 56 },
},{ },{
.mapbase = 0xa4e40000, .mapbase = 0xa4e40000,
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.type = PORT_SCI, .type = PORT_SCIFA,
.irqs = { 88, 88, 88, 88 }, .irqs = { 88, 88, 88, 88 },
},{ },{
.mapbase = 0xa4e50000, .mapbase = 0xa4e50000,
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.type = PORT_SCI, .type = PORT_SCIFA,
.irqs = { 109, 109, 109, 109 }, .irqs = { 109, 109, 109, 109 },
}, { }, {
.flags = 0, .flags = 0,

View File

@ -75,6 +75,7 @@ static struct console bios_console = {
#endif #endif
static struct uart_port scif_port = { static struct uart_port scif_port = {
.type = PORT_SCIF,
.mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT, .mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT,
.membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT, .membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT,
}; };
@ -84,9 +85,9 @@ static void scif_sercon_putc(int c)
while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE))
; ;
sci_out(&scif_port, SCxTDR, c);
sci_in(&scif_port, SCxSR); sci_in(&scif_port, SCxSR);
sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40));
sci_out(&scif_port, SCxTDR, c);
while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) while ((sci_in(&scif_port, SCxSR) & 0x40) == 0)
; ;

View File

@ -120,7 +120,7 @@ static void tmu_set_mode(enum clock_event_mode mode,
{ {
switch (mode) { switch (mode) {
case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC:
ctrl_outl(ctrl_inl(TMU0_TCNT), TMU0_TCOR); ctrl_outl(tmu_latest_interval[TMU0], TMU0_TCOR);
break; break;
case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT:
ctrl_outl(0, TMU0_TCOR); ctrl_outl(0, TMU0_TCOR);

View File

@ -80,6 +80,11 @@ ENTRY(copy_page)
.section __ex_table, "a"; \ .section __ex_table, "a"; \
.long 9999b, 6000f ; \ .long 9999b, 6000f ; \
.previous .previous
#define EX_NO_POP(...) \
9999: __VA_ARGS__ ; \
.section __ex_table, "a"; \
.long 9999b, 6005f ; \
.previous
ENTRY(__copy_user) ENTRY(__copy_user)
! Check if small number of bytes ! Check if small number of bytes
mov #11,r0 mov #11,r0
@ -139,9 +144,9 @@ EX( mov.b r1,@r4 )
bt 1f bt 1f
2: 2:
EX( mov.b @r5+,r0 ) EX_NO_POP( mov.b @r5+,r0 )
dt r6 dt r6
EX( mov.b r0,@r4 ) EX_NO_POP( mov.b r0,@r4 )
bf/s 2b bf/s 2b
add #1,r4 add #1,r4
@ -150,7 +155,7 @@ EX( mov.b r0,@r4 )
# Exception handler: # Exception handler:
.section .fixup, "ax" .section .fixup, "ax"
6000: 6005:
mov.l 8000f,r1 mov.l 8000f,r1
mov r3,r0 mov r3,r0
jmp @r1 jmp @r1

View File

@ -2,7 +2,7 @@
# Makefile for the Linux SuperH-specific parts of the memory manager. # Makefile for the Linux SuperH-specific parts of the memory manager.
# #
obj-y := init.o extable_32.o consistent.o obj-y := init.o extable_32.o consistent.o mmap.o
ifndef CONFIG_CACHE_OFF ifndef CONFIG_CACHE_OFF
cache-$(CONFIG_CPU_SH2) := cache-sh2.o cache-$(CONFIG_CPU_SH2) := cache-sh2.o

View File

@ -2,7 +2,7 @@
# Makefile for the Linux SuperH-specific parts of the memory manager. # Makefile for the Linux SuperH-specific parts of the memory manager.
# #
obj-y := init.o consistent.o obj-y := init.o consistent.o mmap.o
mmu-y := tlb-nommu.o pg-nommu.o extable_32.o mmu-y := tlb-nommu.o pg-nommu.o extable_32.o
mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \

View File

@ -137,6 +137,7 @@ void __init page_table_range_init(unsigned long start, unsigned long end,
void __init paging_init(void) void __init paging_init(void)
{ {
unsigned long max_zone_pfns[MAX_NR_ZONES]; unsigned long max_zone_pfns[MAX_NR_ZONES];
unsigned long vaddr;
int nid; int nid;
/* We don't need to map the kernel through the TLB, as /* We don't need to map the kernel through the TLB, as
@ -148,10 +149,15 @@ void __init paging_init(void)
* check for a null value. */ * check for a null value. */
set_TTB(swapper_pg_dir); set_TTB(swapper_pg_dir);
/* Populate the relevant portions of swapper_pg_dir so that /*
* Populate the relevant portions of swapper_pg_dir so that
* we can use the fixmap entries without calling kmalloc. * we can use the fixmap entries without calling kmalloc.
* pte's will be filled in by __set_fixmap(). */ * pte's will be filled in by __set_fixmap().
page_table_range_init(FIXADDR_START, FIXADDR_TOP, swapper_pg_dir); */
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
page_table_range_init(vaddr, 0, swapper_pg_dir);
kmap_coherent_init();
memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); memset(max_zone_pfns, 0, sizeof(max_zone_pfns));

31
arch/sh/mm/mmap.c Normal file
View File

@ -0,0 +1,31 @@
/*
* arch/sh/mm/mmap.c
*
* Copyright (C) 2008 Paul Mundt
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#include <linux/io.h>
#include <linux/mm.h>
#include <asm/page.h>
/*
* You really shouldn't be using read() or write() on /dev/mem. This
* might go away in the future.
*/
int valid_phys_addr_range(unsigned long addr, size_t count)
{
if (addr < __MEMORY_START)
return 0;
if (addr + count > __pa(high_memory))
return 0;
return 1;
}
int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
{
return 1;
}

View File

@ -7,6 +7,7 @@
* Released under the terms of the GNU GPL v2.0. * Released under the terms of the GNU GPL v2.0.
*/ */
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/highmem.h> #include <linux/highmem.h>
@ -16,6 +17,20 @@
#define CACHE_ALIAS (current_cpu_data.dcache.alias_mask) #define CACHE_ALIAS (current_cpu_data.dcache.alias_mask)
#define kmap_get_fixmap_pte(vaddr) \
pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr))
static pte_t *kmap_coherent_pte;
void __init kmap_coherent_init(void)
{
unsigned long vaddr;
/* cache the first coherent kmap pte */
vaddr = __fix_to_virt(FIX_CMAP_BEGIN);
kmap_coherent_pte = kmap_get_fixmap_pte(vaddr);
}
static inline void *kmap_coherent(struct page *page, unsigned long addr) static inline void *kmap_coherent(struct page *page, unsigned long addr)
{ {
enum fixed_addresses idx; enum fixed_addresses idx;
@ -34,6 +49,8 @@ static inline void *kmap_coherent(struct page *page, unsigned long addr)
update_mmu_cache(NULL, vaddr, pte); update_mmu_cache(NULL, vaddr, pte);
set_pte(kmap_coherent_pte - (FIX_CMAP_END - idx), pte);
return (void *)vaddr; return (void *)vaddr;
} }

View File

@ -29,10 +29,11 @@ struct termios {
tcflag_t c_cflag; /* control mode flags */ tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */ tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */ cc_t c_line; /* line discipline */
#ifndef __KERNEL__
cc_t c_cc[NCCS]; /* control characters */ cc_t c_cc[NCCS]; /* control characters */
#ifdef __KERNEL__ #else
cc_t c_cc[NCCS+2]; /* kernel needs 2 more to hold vmin/vtime */
#define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t)) #define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t))
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
#endif #endif
}; };
@ -42,8 +43,7 @@ struct termios2 {
tcflag_t c_cflag; /* control mode flags */ tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */ tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */ cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */ cc_t c_cc[NCCS+2]; /* control characters */
cc_t _x_cc[2]; /* padding to match ktermios */
speed_t c_ispeed; /* input speed */ speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */ speed_t c_ospeed; /* output speed */
}; };
@ -54,8 +54,7 @@ struct ktermios {
tcflag_t c_cflag; /* control mode flags */ tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */ tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */ cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */ cc_t c_cc[NCCS+2]; /* control characters */
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
speed_t c_ispeed; /* input speed */ speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */ speed_t c_ospeed; /* output speed */
}; };

View File

@ -563,9 +563,9 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
op->dev.parent = parent; op->dev.parent = parent;
op->dev.bus = &of_platform_bus_type; op->dev.bus = &of_platform_bus_type;
if (!parent) if (!parent)
strcpy(op->dev.bus_id, "root"); dev_set_name(&op->dev, "root");
else else
sprintf(op->dev.bus_id, "%08x", dp->node); dev_set_name(&op->dev, "%08x", dp->node);
if (of_device_register(op)) { if (of_device_register(op)) {
printk("%s: Could not register of device.\n", printk("%s: Could not register of device.\n",

View File

@ -113,7 +113,6 @@ static inline void acpi_disable_pci(void)
acpi_pci_disabled = 1; acpi_pci_disabled = 1;
acpi_noirq_set(); acpi_noirq_set();
} }
extern int acpi_irq_balance_set(char *str);
/* routines for saving/restoring kernel state */ /* routines for saving/restoring kernel state */
extern int acpi_save_state_mem(void); extern int acpi_save_state_mem(void);

View File

@ -6,7 +6,6 @@ extern void no_iommu_init(void);
extern struct dma_mapping_ops nommu_dma_ops; extern struct dma_mapping_ops nommu_dma_ops;
extern int force_iommu, no_iommu; extern int force_iommu, no_iommu;
extern int iommu_detected; extern int iommu_detected;
extern int dmar_disabled;
extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len); extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len);

View File

@ -1343,7 +1343,6 @@ static void __init acpi_process_madt(void)
error = acpi_parse_madt_ioapic_entries(); error = acpi_parse_madt_ioapic_entries();
if (!error) { if (!error) {
acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
acpi_irq_balance_set(NULL);
acpi_ioapic = 1; acpi_ioapic = 1;
smp_found_config = 1; smp_found_config = 1;

View File

@ -188,20 +188,6 @@ static void __init ati_bugs_contd(int num, int slot, int func)
} }
#endif #endif
#ifdef CONFIG_DMAR
static void __init intel_g33_dmar(int num, int slot, int func)
{
struct acpi_table_header *dmar_tbl;
acpi_status status;
status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl);
if (ACPI_SUCCESS(status)) {
printk(KERN_INFO "BIOS BUG: DMAR advertised on Intel G31/G33 chipset -- ignoring\n");
dmar_disabled = 1;
}
}
#endif
#define QFLAG_APPLY_ONCE 0x1 #define QFLAG_APPLY_ONCE 0x1
#define QFLAG_APPLIED 0x2 #define QFLAG_APPLIED 0x2
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
@ -225,10 +211,6 @@ static struct chipset early_qrk[] __initdata = {
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
#ifdef CONFIG_DMAR
{ PCI_VENDOR_ID_INTEL, 0x29c0,
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar },
#endif
{} {}
}; };

View File

@ -128,7 +128,7 @@ static int kvm_register_clock(char *txt)
} }
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
static void kvm_setup_secondary_clock(void) static void __devinit kvm_setup_secondary_clock(void)
{ {
/* /*
* Now that the first cpu already had this clocksource initialized, * Now that the first cpu already had this clocksource initialized,

View File

@ -20,6 +20,8 @@ if VIRTUALIZATION
config KVM config KVM
tristate "Kernel-based Virtual Machine (KVM) support" tristate "Kernel-based Virtual Machine (KVM) support"
depends on HAVE_KVM depends on HAVE_KVM
# for device assignment:
depends on PCI
select PREEMPT_NOTIFIERS select PREEMPT_NOTIFIERS
select MMU_NOTIFIER select MMU_NOTIFIER
select ANON_INODES select ANON_INODES

View File

@ -548,8 +548,10 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm)
mutex_lock(&kvm->lock); mutex_lock(&kvm->lock);
pit->irq_source_id = kvm_request_irq_source_id(kvm); pit->irq_source_id = kvm_request_irq_source_id(kvm);
mutex_unlock(&kvm->lock); mutex_unlock(&kvm->lock);
if (pit->irq_source_id < 0) if (pit->irq_source_id < 0) {
kfree(pit);
return NULL; return NULL;
}
mutex_init(&pit->pit_state.lock); mutex_init(&pit->pit_state.lock);
mutex_lock(&pit->pit_state.lock); mutex_lock(&pit->pit_state.lock);

Some files were not shown because too many files have changed in this diff Show More