mirror of https://gitee.com/openkylin/linux.git
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:
commit
9676e73a9e
|
@ -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
|
||||||
|
|
|
@ -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.
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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!
|
|
@ -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
|
|
@ -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=
|
||||||
|
|
|
@ -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>
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
||||||
|
|
18
MAINTAINERS
18
MAINTAINERS
|
@ -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
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -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*
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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[];
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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---
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = ®isters[Dreg_index[opcode >> 2 & 0x0c]];
|
postinc = ®isters[Dreg_index[opcode >> 2 & 0x03]];
|
||||||
address += *postinc;
|
address += *postinc;
|
||||||
break;
|
break;
|
||||||
case DM2:
|
case DM2:
|
||||||
postinc = ®isters[Dreg_index[opcode >> 4 & 0x30]];
|
postinc = ®isters[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 = ®isters[Areg_index[opcode >> 2 & 0x0c]];
|
postinc = ®isters[Areg_index[opcode >> 2 & 0x03]];
|
||||||
address += *postinc;
|
address += *postinc;
|
||||||
break;
|
break;
|
||||||
case AM2:
|
case AM2:
|
||||||
postinc = ®isters[Areg_index[opcode >> 4 & 0x30]];
|
postinc = ®isters[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 = ®isters[Rreg_index[disp >> 4 & 0x0f]];
|
postinc = ®isters[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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
;
|
;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue