Merge branch 'master'

This commit is contained in:
Jeff Garzik 2005-10-11 01:48:37 -04:00
commit 1a04392bd6
228 changed files with 6657 additions and 788 deletions

View File

@ -0,0 +1,161 @@
===================
KEY REQUEST SERVICE
===================
The key request service is part of the key retention service (refer to
Documentation/keys.txt). This document explains more fully how that the
requesting algorithm works.
The process starts by either the kernel requesting a service by calling
request_key():
struct key *request_key(const struct key_type *type,
const char *description,
const char *callout_string);
Or by userspace invoking the request_key system call:
key_serial_t request_key(const char *type,
const char *description,
const char *callout_info,
key_serial_t dest_keyring);
The main difference between the two access points is that the in-kernel
interface does not need to link the key to a keyring to prevent it from being
immediately destroyed. The kernel interface returns a pointer directly to the
key, and it's up to the caller to destroy the key.
The userspace interface links the key to a keyring associated with the process
to prevent the key from going away, and returns the serial number of the key to
the caller.
===========
THE PROCESS
===========
A request proceeds in the following manner:
(1) Process A calls request_key() [the userspace syscall calls the kernel
interface].
(2) request_key() searches the process's subscribed keyrings to see if there's
a suitable key there. If there is, it returns the key. If there isn't, and
callout_info is not set, an error is returned. Otherwise the process
proceeds to the next step.
(3) request_key() sees that A doesn't have the desired key yet, so it creates
two things:
(a) An uninstantiated key U of requested type and description.
(b) An authorisation key V that refers to key U and notes that process A
is the context in which key U should be instantiated and secured, and
from which associated key requests may be satisfied.
(4) request_key() then forks and executes /sbin/request-key with a new session
keyring that contains a link to auth key V.
(5) /sbin/request-key execs an appropriate program to perform the actual
instantiation.
(6) The program may want to access another key from A's context (say a
Kerberos TGT key). It just requests the appropriate key, and the keyring
search notes that the session keyring has auth key V in its bottom level.
This will permit it to then search the keyrings of process A with the
UID, GID, groups and security info of process A as if it was process A,
and come up with key W.
(7) The program then does what it must to get the data with which to
instantiate key U, using key W as a reference (perhaps it contacts a
Kerberos server using the TGT) and then instantiates key U.
(8) Upon instantiating key U, auth key V is automatically revoked so that it
may not be used again.
(9) The program then exits 0 and request_key() deletes key V and returns key
U to the caller.
This also extends further. If key W (step 5 above) didn't exist, key W would be
created uninstantiated, another auth key (X) would be created [as per step 3]
and another copy of /sbin/request-key spawned [as per step 4]; but the context
specified by auth key X will still be process A, as it was in auth key V.
This is because process A's keyrings can't simply be attached to
/sbin/request-key at the appropriate places because (a) execve will discard two
of them, and (b) it requires the same UID/GID/Groups all the way through.
======================
NEGATIVE INSTANTIATION
======================
Rather than instantiating a key, it is possible for the possessor of an
authorisation key to negatively instantiate a key that's under construction.
This is a short duration placeholder that causes any attempt at re-requesting
the key whilst it exists to fail with error ENOKEY.
This is provided to prevent excessive repeated spawning of /sbin/request-key
processes for a key that will never be obtainable.
Should the /sbin/request-key process exit anything other than 0 or die on a
signal, the key under construction will be automatically negatively
instantiated for a short amount of time.
====================
THE SEARCH ALGORITHM
====================
A search of any particular keyring proceeds in the following fashion:
(1) When the key management code searches for a key (keyring_search_aux) it
firstly calls key_permission(SEARCH) on the keyring it's starting with,
if this denies permission, it doesn't search further.
(2) It considers all the non-keyring keys within that keyring and, if any key
matches the criteria specified, calls key_permission(SEARCH) on it to see
if the key is allowed to be found. If it is, that key is returned; if
not, the search continues, and the error code is retained if of higher
priority than the one currently set.
(3) It then considers all the keyring-type keys in the keyring it's currently
searching. It calls key_permission(SEARCH) on each keyring, and if this
grants permission, it recurses, executing steps (2) and (3) on that
keyring.
The process stops immediately a valid key is found with permission granted to
use it. Any error from a previous match attempt is discarded and the key is
returned.
When search_process_keyrings() is invoked, it performs the following searches
until one succeeds:
(1) If extant, the process's thread keyring is searched.
(2) If extant, the process's process keyring is searched.
(3) The process's session keyring is searched.
(4) If the process has a request_key() authorisation key in its session
keyring then:
(a) If extant, the calling process's thread keyring is searched.
(b) If extant, the calling process's process keyring is searched.
(c) The calling process's session keyring is searched.
The moment one succeeds, all pending errors are discarded and the found key is
returned.
Only if all these fail does the whole thing fail with the highest priority
error. Note that several errors may have come from LSM.
The error priority is:
EKEYREVOKED > EKEYEXPIRED > ENOKEY
EACCES/EPERM are only returned on a direct search of a specific keyring where
the basal keyring does not grant Search permission.

View File

@ -361,6 +361,8 @@ The main syscalls are:
/sbin/request-key will be invoked in an attempt to obtain a key. The /sbin/request-key will be invoked in an attempt to obtain a key. The
callout_info string will be passed as an argument to the program. callout_info string will be passed as an argument to the program.
See also Documentation/keys-request-key.txt.
The keyctl syscall functions are: The keyctl syscall functions are:
@ -533,7 +535,7 @@ The keyctl syscall functions are:
(*) Read the payload data from a key: (*) Read the payload data from a key:
key_serial_t keyctl(KEYCTL_READ, key_serial_t keyring, char *buffer, long keyctl(KEYCTL_READ, key_serial_t keyring, char *buffer,
size_t buflen); size_t buflen);
This function attempts to read the payload data from the specified key This function attempts to read the payload data from the specified key
@ -555,7 +557,7 @@ The keyctl syscall functions are:
(*) Instantiate a partially constructed key. (*) Instantiate a partially constructed key.
key_serial_t keyctl(KEYCTL_INSTANTIATE, key_serial_t key, long keyctl(KEYCTL_INSTANTIATE, key_serial_t key,
const void *payload, size_t plen, const void *payload, size_t plen,
key_serial_t keyring); key_serial_t keyring);
@ -576,7 +578,7 @@ The keyctl syscall functions are:
(*) Negatively instantiate a partially constructed key. (*) Negatively instantiate a partially constructed key.
key_serial_t keyctl(KEYCTL_NEGATE, key_serial_t key, long keyctl(KEYCTL_NEGATE, key_serial_t key,
unsigned timeout, key_serial_t keyring); unsigned timeout, key_serial_t keyring);
If the kernel calls back to userspace to complete the instantiation of a If the kernel calls back to userspace to complete the instantiation of a
@ -688,6 +690,8 @@ payload contents" for more information.
If successful, the key will have been attached to the default keyring for If successful, the key will have been attached to the default keyring for
implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING. implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
See also Documentation/keys-request-key.txt.
(*) When it is no longer required, the key should be released using: (*) When it is no longer required, the key should be released using:

View File

@ -26,6 +26,8 @@ struct scoop_pcmcia_dev *scoop_devs;
struct scoop_dev { struct scoop_dev {
void *base; void *base;
spinlock_t scoop_lock; spinlock_t scoop_lock;
unsigned short suspend_clr;
unsigned short suspend_set;
u32 scoop_gpwr; u32 scoop_gpwr;
}; };
@ -90,14 +92,24 @@ EXPORT_SYMBOL(reset_scoop);
EXPORT_SYMBOL(read_scoop_reg); EXPORT_SYMBOL(read_scoop_reg);
EXPORT_SYMBOL(write_scoop_reg); EXPORT_SYMBOL(write_scoop_reg);
static void check_scoop_reg(struct scoop_dev *sdev)
{
unsigned short mcr;
mcr = SCOOP_REG(sdev->base, SCOOP_MCR);
if ((mcr & 0x100) == 0)
SCOOP_REG(sdev->base, SCOOP_MCR) = 0x0101;
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int scoop_suspend(struct device *dev, pm_message_t state, uint32_t level) static int scoop_suspend(struct device *dev, pm_message_t state, uint32_t level)
{ {
if (level == SUSPEND_POWER_DOWN) { if (level == SUSPEND_POWER_DOWN) {
struct scoop_dev *sdev = dev_get_drvdata(dev); struct scoop_dev *sdev = dev_get_drvdata(dev);
check_scoop_reg(sdev);
sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR); sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
SCOOP_REG(sdev->base,SCOOP_GPWR) = 0; SCOOP_REG(sdev->base, SCOOP_GPWR) = (sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set;
} }
return 0; return 0;
} }
@ -107,6 +119,7 @@ static int scoop_resume(struct device *dev, uint32_t level)
if (level == RESUME_POWER_ON) { if (level == RESUME_POWER_ON) {
struct scoop_dev *sdev = dev_get_drvdata(dev); struct scoop_dev *sdev = dev_get_drvdata(dev);
check_scoop_reg(sdev);
SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr; SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
} }
return 0; return 0;
@ -151,6 +164,9 @@ int __init scoop_probe(struct device *dev)
SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff; SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff; SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;
devptr->suspend_clr = inf->suspend_clr;
devptr->suspend_set = inf->suspend_set;
return 0; return 0;
} }

View File

@ -0,0 +1,888 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.14-rc3
# Sun Oct 9 16:55:14 2005
#
CONFIG_ARM=y
CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not set
CONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set
CONFIG_INITRAMFS_SOURCE=""
CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_OBSOLETE_MODPARM=y
CONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
#
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set
# CONFIG_ARCH_IXP4XX is not set
# CONFIG_ARCH_IXP2000 is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_RPC is not set
CONFIG_ARCH_SA1100=y
# CONFIG_ARCH_S3C2410 is not set
# CONFIG_ARCH_SHARK is not set
# CONFIG_ARCH_LH7A40X is not set
# CONFIG_ARCH_OMAP is not set
# CONFIG_ARCH_VERSATILE is not set
# CONFIG_ARCH_IMX is not set
# CONFIG_ARCH_H720X is not set
# CONFIG_ARCH_AAEC2000 is not set
#
# SA11x0 Implementations
#
# CONFIG_SA1100_ASSABET is not set
# CONFIG_SA1100_CERF is not set
CONFIG_SA1100_COLLIE=y
# CONFIG_SA1100_H3100 is not set
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_H3800 is not set
# CONFIG_SA1100_BADGE4 is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HACKKIT is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_SHANNON is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_SSP is not set
#
# Processor Type
#
CONFIG_CPU_32=y
CONFIG_CPU_SA1100=y
CONFIG_CPU_32v4=y
CONFIG_CPU_ABRT_EV4=y
CONFIG_CPU_CACHE_V4WB=y
CONFIG_CPU_CACHE_VIVT=y
CONFIG_CPU_TLB_V4WB=y
#
# Processor Features
#
CONFIG_SHARP_LOCOMO=y
CONFIG_SHARP_PARAM=y
CONFIG_SHARP_SCOOP=y
#
# Bus support
#
CONFIG_ISA=y
CONFIG_ISA_DMA_API=y
#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# Kernel Features
#
# CONFIG_SMP is not set
CONFIG_PREEMPT=y
# CONFIG_NO_IDLE_HZ is not set
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
CONFIG_DISCONTIGMEM_MANUAL=y
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_DISCONTIGMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_NEED_MULTIPLE_NODES=y
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_LEDS is not set
CONFIG_ALIGNMENT_TRAP=y
#
# Boot options
#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 debug"
# CONFIG_XIP_KERNEL is not set
#
# CPU Frequency scaling
#
# CONFIG_CPU_FREQ is not set
#
# Floating point emulation
#
#
# At least one emulation must be selected
#
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_NWFPE_XP is not set
# CONFIG_FPE_FASTFPE is not set
#
# Userspace binary formats
#
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_MISC=m
# CONFIG_ARTHUR is not set
#
# Power management options
#
CONFIG_PM=y
CONFIG_APM=y
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set
# CONFIG_NETFILTER is not set
#
# DCCP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP is not set
#
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=m
# CONFIG_DEBUG_DRIVER is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
# CONFIG_MTD_CONCAT is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_CMDLINE_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
# CONFIG_INFTL is not set
#
# RAM/ROM/Flash chip drivers
#
# CONFIG_MTD_CFI is not set
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
CONFIG_MTD_OBSOLETE_CHIPS=y
# CONFIG_MTD_AMDSTD is not set
CONFIG_MTD_SHARP=y
# CONFIG_MTD_JEDEC is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
# CONFIG_MTD_PLATRAM is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
# CONFIG_MTD_BLOCK2MTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOC2001PLUS is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Plug and Play support
#
# CONFIG_PNP is not set
#
# Block devices
#
# CONFIG_BLK_DEV_XD is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=1024
CONFIG_BLK_DEV_INITRD=y
# CONFIG_CDROM_PKTCDVD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=m
#
# ATA/ATAPI/MFM/RLL support
#
# CONFIG_IDE is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set
#
# I2O device support
#
#
# Network device support
#
# CONFIG_NETDEVICES is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input device support
#
CONFIG_INPUT=y
#
# Userland interfaces
#
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_TSDEV=y
CONFIG_INPUT_TSDEV_SCREEN_X=240
CONFIG_INPUT_TSDEV_SCREEN_Y=320
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_EVBUG=y
#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
CONFIG_KEYBOARD_LOCOMO=y
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#
CONFIG_SERIO=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_LIBPS2 is not set
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
# CONFIG_SERIAL_8250 is not set
#
# Non-8250 serial port support
#
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_RAW_DRIVER is not set
#
# TPM devices
#
#
# I2C support
#
CONFIG_I2C=m
# CONFIG_I2C_CHARDEV is not set
#
# I2C Algorithms
#
CONFIG_I2C_ALGOBIT=m
# CONFIG_I2C_ALGOPCF is not set
# CONFIG_I2C_ALGOPCA is not set
#
# I2C Hardware Bus support
#
# CONFIG_I2C_ELEKTOR is not set
# CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_STUB is not set
# CONFIG_I2C_PCA_ISA is not set
#
# Miscellaneous I2C Chip support
#
# CONFIG_SENSORS_DS1337 is not set
# CONFIG_SENSORS_DS1374 is not set
# CONFIG_SENSORS_EEPROM is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set
#
# Hardware Monitoring support
#
CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1031 is not set
# CONFIG_SENSORS_ADM9240 is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_FSCHER is not set
# CONFIG_SENSORS_FSCPOS is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM87 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_LM92 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83792D is not set
# CONFIG_SENSORS_W83L785TS is not set
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_HWMON_DEBUG_CHIP is not set
#
# Misc devices
#
#
# Multimedia Capabilities Port drivers
#
# CONFIG_MCP_SA11X0 is not set
#
# Multimedia devices
#
CONFIG_VIDEO_DEV=m
#
# Video For Linux
#
#
# Video Adapters
#
# CONFIG_VIDEO_PMS is not set
# CONFIG_VIDEO_CPIA is not set
# CONFIG_VIDEO_SAA5246A is not set
# CONFIG_VIDEO_SAA5249 is not set
# CONFIG_TUNER_3036 is not set
# CONFIG_VIDEO_OVCAMCHIP is not set
#
# Radio Adapters
#
# CONFIG_RADIO_CADET is not set
# CONFIG_RADIO_RTRACK is not set
# CONFIG_RADIO_RTRACK2 is not set
# CONFIG_RADIO_AZTECH is not set
# CONFIG_RADIO_GEMTEK is not set
# CONFIG_RADIO_MAESTRO is not set
# CONFIG_RADIO_SF16FMI is not set
# CONFIG_RADIO_SF16FMR2 is not set
# CONFIG_RADIO_TERRATEC is not set
# CONFIG_RADIO_TRUST is not set
# CONFIG_RADIO_TYPHOON is not set
# CONFIG_RADIO_ZOLTRIX is not set
#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set
#
# Graphics support
#
CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
# CONFIG_FB_MACMODES is not set
CONFIG_FB_MODE_HELPERS=y
# CONFIG_FB_TILEBLITTING is not set
CONFIG_FB_SA1100=y
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set
#
# Console display driver support
#
# CONFIG_VGA_CONSOLE is not set
# CONFIG_MDA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
# CONFIG_FONT_8x16 is not set
# CONFIG_FONT_6x11 is not set
# CONFIG_FONT_7x14 is not set
# CONFIG_FONT_PEARL_8x8 is not set
# CONFIG_FONT_ACORN_8x8 is not set
# CONFIG_FONT_MINI_4x6 is not set
# CONFIG_FONT_SUN8x16 is not set
# CONFIG_FONT_SUN12x22 is not set
# CONFIG_FONT_10x18 is not set
#
# Logo configuration
#
# CONFIG_LOGO is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
#
# Sound
#
# CONFIG_SOUND is not set
#
# USB support
#
CONFIG_USB_ARCH_HAS_HCD=y
# CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB is not set
#
# USB Gadget Support
#
CONFIG_USB_GADGET=y
# CONFIG_USB_GADGET_DEBUG_FILES is not set
# CONFIG_USB_GADGET_NET2280 is not set
# CONFIG_USB_GADGET_PXA2XX is not set
# CONFIG_USB_GADGET_GOKU is not set
# CONFIG_USB_GADGET_LH7A40X is not set
# CONFIG_USB_GADGET_OMAP is not set
# CONFIG_USB_GADGET_DUMMY_HCD is not set
# CONFIG_USB_GADGET_DUALSPEED is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
# CONFIG_EXT2_FS_XIP is not set
# CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
# CONFIG_XFS_FS is not set
# CONFIG_MINIX_FS is not set
CONFIG_ROMFS_FS=y
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set
# CONFIG_DNOTIFY is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set
#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
CONFIG_CRAMFS=y
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
#
# Network File Systems
#
# CONFIG_NFS_FS is not set
# CONFIG_NFSD is not set
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
#
# Native Language Support
#
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="cp437"
CONFIG_NLS_CODEPAGE_437=m
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
CONFIG_NLS_ISO8859_1=m
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=m
#
# Profiling support
#
# CONFIG_PROFILING is not set
#
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
CONFIG_DEBUG_PREEMPT=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_FS is not set
CONFIG_FRAME_POINTER=y
# CONFIG_DEBUG_USER is not set
# CONFIG_DEBUG_WAITQ is not set
CONFIG_DEBUG_ERRORS=y
# CONFIG_DEBUG_LL is not set
#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
#
# Cryptographic options
#
# CONFIG_CRYPTO is not set
#
# Hardware crypto devices
#
#
# Library routines
#
# CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set
CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -36,6 +36,7 @@
#include <asm/arch/mmc.h> #include <asm/arch/mmc.h>
#include <asm/arch/udc.h> #include <asm/arch/udc.h>
#include <asm/arch/corgi.h> #include <asm/arch/corgi.h>
#include <asm/arch/sharpsl.h>
#include <asm/mach/sharpsl_param.h> #include <asm/mach/sharpsl_param.h>
#include <asm/hardware/scoop.h> #include <asm/hardware/scoop.h>

View File

@ -111,11 +111,11 @@ static struct mtd_partition collie_partitions[] = {
static void collie_set_vpp(int vpp) static void collie_set_vpp(int vpp)
{ {
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN); write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR) | COLLIE_SCP_VPEN);
if (vpp) if (vpp)
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN); write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) | COLLIE_SCP_VPEN);
else else
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN); write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
} }
static struct flash_platform_data collie_flash_data = { static struct flash_platform_data collie_flash_data = {

View File

@ -330,6 +330,9 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
{ {
unsigned int rd = RD_BITS(instr); unsigned int rd = RD_BITS(instr);
if (((rd & 1) == 1) || (rd == 14))
goto bad;
ai_dword += 1; ai_dword += 1;
if (user_mode(regs)) if (user_mode(regs))
@ -361,7 +364,8 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
} }
return TYPE_LDST; return TYPE_LDST;
bad:
return TYPE_ERROR;
fault: fault:
return TYPE_FAULT; return TYPE_FAULT;
} }
@ -663,6 +667,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
else if ((instr & 0x001000f0) == 0x000000d0 || /* LDRD */ else if ((instr & 0x001000f0) == 0x000000d0 || /* LDRD */
(instr & 0x001000f0) == 0x000000f0) /* STRD */ (instr & 0x001000f0) == 0x000000f0) /* STRD */
handler = do_alignment_ldrdstrd; handler = do_alignment_ldrdstrd;
else if ((instr & 0x01f00ff0) == 0x01000090) /* SWP */
goto swp;
else else
goto bad; goto bad;
break; break;
@ -733,6 +739,9 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
do_bad_area(current, current->mm, addr, fsr, regs); do_bad_area(current, current->mm, addr, fsr, regs);
return 0; return 0;
swp:
printk(KERN_ERR "Alignment trap: not handling swp instruction\n");
bad: bad:
/* /*
* Oops, we didn't handle the instruction. * Oops, we didn't handle the instruction.

View File

@ -2,11 +2,17 @@
# #
# This file is linux/arch/arm/tools/mach-types # This file is linux/arch/arm/tools/mach-types
# #
# Up to date versions of this file can be obtained from:
#
# http://www.arm.linux.org.uk/developer/machines/?action=download
#
# Please do not send patches to this file; it is automatically generated! # Please do not send patches to this file; it is automatically generated!
# To add an entry into this database, please see Documentation/arm/README, # To add an entry into this database, please see Documentation/arm/README,
# or contact rmk@arm.linux.org.uk # or visit:
# #
# Last update: Thu Jun 23 20:19:33 2005 # http://www.arm.linux.org.uk/developer/machines/?action=new
#
# Last update: Mon Oct 10 09:46:25 2005
# #
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
# #
@ -421,7 +427,7 @@ mt02 MACH_MT02 MT02 410
mport3s MACH_MPORT3S MPORT3S 411 mport3s MACH_MPORT3S MPORT3S 411
ra_alpha MACH_RA_ALPHA RA_ALPHA 412 ra_alpha MACH_RA_ALPHA RA_ALPHA 412
xcep MACH_XCEP XCEP 413 xcep MACH_XCEP XCEP 413
arcom_mercury MACH_ARCOM_MERCURY ARCOM_MERCURY 414 arcom_vulcan MACH_ARCOM_VULCAN ARCOM_VULCAN 414
stargate MACH_STARGATE STARGATE 415 stargate MACH_STARGATE STARGATE 415
armadilloj MACH_ARMADILLOJ ARMADILLOJ 416 armadilloj MACH_ARMADILLOJ ARMADILLOJ 416
elroy_jack MACH_ELROY_JACK ELROY_JACK 417 elroy_jack MACH_ELROY_JACK ELROY_JACK 417
@ -454,7 +460,7 @@ esl_sarva MACH_ESL_SARVA ESL_SARVA 443
xm250 MACH_XM250 XM250 444 xm250 MACH_XM250 XM250 444
t6tc1xb MACH_T6TC1XB T6TC1XB 445 t6tc1xb MACH_T6TC1XB T6TC1XB 445
ess710 MACH_ESS710 ESS710 446 ess710 MACH_ESS710 ESS710 446
mx3ads MACH_MX3ADS MX3ADS 447 mx31ads MACH_MX3ADS MX3ADS 447
himalaya MACH_HIMALAYA HIMALAYA 448 himalaya MACH_HIMALAYA HIMALAYA 448
bolfenk MACH_BOLFENK BOLFENK 449 bolfenk MACH_BOLFENK BOLFENK 449
at91rm9200kr MACH_AT91RM9200KR AT91RM9200KR 450 at91rm9200kr MACH_AT91RM9200KR AT91RM9200KR 450
@ -787,3 +793,79 @@ ez_ixp42x MACH_EZ_IXP42X EZ_IXP42X 778
tapwave_zodiac MACH_TAPWAVE_ZODIAC TAPWAVE_ZODIAC 779 tapwave_zodiac MACH_TAPWAVE_ZODIAC TAPWAVE_ZODIAC 779
universalmeter MACH_UNIVERSALMETER UNIVERSALMETER 780 universalmeter MACH_UNIVERSALMETER UNIVERSALMETER 780
hicoarm9 MACH_HICOARM9 HICOARM9 781 hicoarm9 MACH_HICOARM9 HICOARM9 781
pnx4008 MACH_PNX4008 PNX4008 782
kws6000 MACH_KWS6000 KWS6000 783
portux920t MACH_PORTUX920T PORTUX920T 784
ez_x5 MACH_EZ_X5 EZ_X5 785
omap_rudolph MACH_OMAP_RUDOLPH OMAP_RUDOLPH 786
cpuat91 MACH_CPUAT91 CPUAT91 787
rea9200 MACH_REA9200 REA9200 788
acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789
ixp425 MACH_IXP425 IXP425 790
argonplusodyssey MACH_ODYSSEY ODYSSEY 791
perch MACH_PERCH PERCH 792
eis05r1 MACH_EIS05R1 EIS05R1 793
pepperpad MACH_PEPPERPAD PEPPERPAD 794
sb3010 MACH_SB3010 SB3010 795
rm9200 MACH_RM9200 RM9200 796
dma03 MACH_DMA03 DMA03 797
road_s101 MACH_ROAD_S101 ROAD_S101 798
iq_nextgen_a MACH_IQ_NEXTGEN_A IQ_NEXTGEN_A 799
iq_nextgen_b MACH_IQ_NEXTGEN_B IQ_NEXTGEN_B 800
iq_nextgen_c MACH_IQ_NEXTGEN_C IQ_NEXTGEN_C 801
iq_nextgen_d MACH_IQ_NEXTGEN_D IQ_NEXTGEN_D 802
iq_nextgen_e MACH_IQ_NEXTGEN_E IQ_NEXTGEN_E 803
mallow_at91 MACH_MALLOW_AT91 MALLOW_AT91 804
cybertracker MACH_CYBERTRACKER CYBERTRACKER 805
gesbc931x MACH_GESBC931X GESBC931X 806
centipad MACH_CENTIPAD CENTIPAD 807
armsoc MACH_ARMSOC ARMSOC 808
se4200 MACH_SE4200 SE4200 809
ems197a MACH_EMS197A EMS197A 810
micro9 MACH_MICRO9 MICRO9 811
micro9l MACH_MICRO9L MICRO9L 812
uc5471dsp MACH_UC5471DSP UC5471DSP 813
sj5471eng MACH_SJ5471ENG SJ5471ENG 814
none MACH_CMPXA26X CMPXA26X 815
nc MACH_NC NC 816
omap_palmte MACH_OMAP_PALMTE OMAP_PALMTE 817
ajax52x MACH_AJAX52X AJAX52X 818
siriustar MACH_SIRIUSTAR SIRIUSTAR 819
iodata_hdlg MACH_IODATA_HDLG IODATA_HDLG 820
at91rm9200utl MACH_AT91RM9200UTL AT91RM9200UTL 821
biosafe MACH_BIOSAFE BIOSAFE 822
mp1000 MACH_MP1000 MP1000 823
parsy MACH_PARSY PARSY 824
ccxp270 MACH_CCXP CCXP 825
omap_gsample MACH_OMAP_GSAMPLE OMAP_GSAMPLE 826
realview_eb MACH_REALVIEW_EB REALVIEW_EB 827
samoa MACH_SAMOA SAMOA 828
t3xscale MACH_T3XSCALE T3XSCALE 829
i878 MACH_I878 I878 830
borzoi MACH_BORZOI BORZOI 831
gecko MACH_GECKO GECKO 832
ds101 MACH_DS101 DS101 833
omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834
xscale_palmld MACH_XSCALE_PALMLD XSCALE_PALMLD 835
cc9c MACH_CC9C CC9C 836
sbc1670 MACH_SBC1670 SBC1670 837
ixdp28x5 MACH_IXDP28X5 IXDP28X5 838
omap_palmtt MACH_OMAP_PALMTT OMAP_PALMTT 839
ml696k MACH_ML696K ML696K 840
arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841
osiris MACH_OSIRIS OSIRIS 842
maestro MACH_MAESTRO MAESTRO 843
tunge2 MACH_TUNGE2 TUNGE2 844
ixbbm MACH_IXBBM IXBBM 845
mx27 MACH_MX27 MX27 846
ax8004 MACH_AX8004 AX8004 847
at91sam9261ek MACH_AT91SAM9261EK AT91SAM9261EK 848
loft MACH_LOFT LOFT 849
magpie MACH_MAGPIE MAGPIE 850
mx21 MACH_MX21 MX21 851
mb87m3400 MACH_MB87M3400 MB87M3400 852
mguard_delta MACH_MGUARD_DELTA MGUARD_DELTA 853
davinci_dvdp MACH_DAVINCI_DVDP DAVINCI_DVDP 854
htcuniversal MACH_HTCUNIVERSAL HTCUNIVERSAL 855
tpad MACH_TPAD TPAD 856
roverp3 MACH_ROVERP3 ROVERP3 857

View File

@ -24,7 +24,7 @@ struct dma_coherent_mem {
}; };
void *dma_alloc_coherent(struct device *dev, size_t size, void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast gfp) dma_addr_t *dma_handle, gfp_t gfp)
{ {
void *ret; void *ret;
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;

View File

@ -29,7 +29,7 @@ static void __init init_amd(struct cpuinfo_x86 *c)
int r; int r;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
unsigned long value; unsigned long long value;
/* Disable TLB flush filter by setting HWCR.FFDIS on K8 /* Disable TLB flush filter by setting HWCR.FFDIS on K8
* bit 6 of msr C001_0015 * bit 6 of msr C001_0015

View File

@ -23,7 +23,7 @@ struct dma_coherent_mem {
}; };
void *dma_alloc_coherent(struct device *dev, size_t size, void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast gfp) dma_addr_t *dma_handle, gfp_t gfp)
{ {
void *ret; void *ret;
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;

View File

@ -338,7 +338,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
esp = (unsigned long) ka->sa.sa_restorer; esp = (unsigned long) ka->sa.sa_restorer;
} }
return (void __user *)((esp - frame_size) & -8ul); esp -= frame_size;
/* Align the stack pointer according to the i386 ABI,
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
esp = ((esp + 4) & -16ul) - 4;
return (void __user *) esp;
} }
/* These symbols are defined with the addresses in the vsyscall page. /* These symbols are defined with the addresses in the vsyscall page.

View File

@ -310,7 +310,7 @@ static void bpa_map_iommu(void)
static void *bpa_alloc_coherent(struct device *hwdev, size_t size, static void *bpa_alloc_coherent(struct device *hwdev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
void *ret; void *ret;

View File

@ -53,7 +53,7 @@ int dma_set_mask(struct device *dev, u64 dma_mask)
EXPORT_SYMBOL(dma_set_mask); EXPORT_SYMBOL(dma_set_mask);
void *dma_alloc_coherent(struct device *dev, size_t size, void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
struct dma_mapping_ops *dma_ops = get_dma_ops(dev); struct dma_mapping_ops *dma_ops = get_dma_ops(dev);

View File

@ -519,7 +519,7 @@ void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
* to the dma address (mapping) of the first page. * to the dma address (mapping) of the first page.
*/ */
void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
void *ret = NULL; void *ret = NULL;
dma_addr_t mapping; dma_addr_t mapping;

View File

@ -31,7 +31,7 @@
#include "pci.h" #include "pci.h"
static void *pci_direct_alloc_coherent(struct device *hwdev, size_t size, static void *pci_direct_alloc_coherent(struct device *hwdev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
void *ret; void *ret;

View File

@ -76,7 +76,7 @@ static inline struct iommu_table *devnode_table(struct device *dev)
* to the dma address (mapping) of the first page. * to the dma address (mapping) of the first page.
*/ */
static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size, static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
return iommu_alloc_coherent(devnode_table(hwdev), size, dma_handle, return iommu_alloc_coherent(devnode_table(hwdev), size, dma_handle,
flag); flag);

View File

@ -218,7 +218,7 @@ static void vio_unmap_sg(struct device *dev, struct scatterlist *sglist,
} }
static void *vio_alloc_coherent(struct device *dev, size_t size, static void *vio_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size, return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size,
dma_handle, flag); dma_handle, flag);

View File

@ -21,6 +21,10 @@ config GENERIC_ISA_DMA
bool bool
default y default y
config GENERIC_IOMAP
bool
default y
source "init/Kconfig" source "init/Kconfig"
menu "General machine setup" menu "General machine setup"

View File

@ -5,6 +5,7 @@ CONFIG_MMU=y
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_HIGHMEM=y CONFIG_HIGHMEM=y
CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
# #
# Code maturity level options # Code maturity level options

View File

@ -33,7 +33,7 @@
/* This is trivial with the new code... */ /* This is trivial with the new code... */
.globl do_fpdis .globl do_fpdis
do_fpdis: do_fpdis:
sethi %hi(TSTATE_PEF), %g4 ! IEU0 sethi %hi(TSTATE_PEF), %g4
rdpr %tstate, %g5 rdpr %tstate, %g5
andcc %g5, %g4, %g0 andcc %g5, %g4, %g0
be,pt %xcc, 1f be,pt %xcc, 1f
@ -50,18 +50,18 @@ do_fpdis:
add %g0, %g0, %g0 add %g0, %g0, %g0
ba,a,pt %xcc, rtrap_clr_l6 ba,a,pt %xcc, rtrap_clr_l6
1: ldub [%g6 + TI_FPSAVED], %g5 ! Load Group 1: ldub [%g6 + TI_FPSAVED], %g5
wr %g0, FPRS_FEF, %fprs ! LSU Group+4bubbles wr %g0, FPRS_FEF, %fprs
andcc %g5, FPRS_FEF, %g0 ! IEU1 Group andcc %g5, FPRS_FEF, %g0
be,a,pt %icc, 1f ! CTI be,a,pt %icc, 1f
clr %g7 ! IEU0 clr %g7
ldx [%g6 + TI_GSR], %g7 ! Load Group ldx [%g6 + TI_GSR], %g7
1: andcc %g5, FPRS_DL, %g0 ! IEU1 1: andcc %g5, FPRS_DL, %g0
bne,pn %icc, 2f ! CTI bne,pn %icc, 2f
fzero %f0 ! FPA fzero %f0
andcc %g5, FPRS_DU, %g0 ! IEU1 Group andcc %g5, FPRS_DU, %g0
bne,pn %icc, 1f ! CTI bne,pn %icc, 1f
fzero %f2 ! FPA fzero %f2
faddd %f0, %f2, %f4 faddd %f0, %f2, %f4
fmuld %f0, %f2, %f6 fmuld %f0, %f2, %f6
faddd %f0, %f2, %f8 faddd %f0, %f2, %f8
@ -104,8 +104,10 @@ do_fpdis:
add %g6, TI_FPREGS + 0xc0, %g2 add %g6, TI_FPREGS + 0xc0, %g2
faddd %f0, %f2, %f8 faddd %f0, %f2, %f8
fmuld %f0, %f2, %f10 fmuld %f0, %f2, %f10
ldda [%g1] ASI_BLK_S, %f32 ! grrr, where is ASI_BLK_NUCLEUS 8-( membar #Sync
ldda [%g1] ASI_BLK_S, %f32
ldda [%g2] ASI_BLK_S, %f48 ldda [%g2] ASI_BLK_S, %f48
membar #Sync
faddd %f0, %f2, %f12 faddd %f0, %f2, %f12
fmuld %f0, %f2, %f14 fmuld %f0, %f2, %f14
faddd %f0, %f2, %f16 faddd %f0, %f2, %f16
@ -116,7 +118,6 @@ do_fpdis:
fmuld %f0, %f2, %f26 fmuld %f0, %f2, %f26
faddd %f0, %f2, %f28 faddd %f0, %f2, %f28
fmuld %f0, %f2, %f30 fmuld %f0, %f2, %f30
membar #Sync
b,pt %xcc, fpdis_exit b,pt %xcc, fpdis_exit
nop nop
2: andcc %g5, FPRS_DU, %g0 2: andcc %g5, FPRS_DU, %g0
@ -133,8 +134,10 @@ do_fpdis:
add %g6, TI_FPREGS + 0x40, %g2 add %g6, TI_FPREGS + 0x40, %g2
faddd %f32, %f34, %f36 faddd %f32, %f34, %f36
fmuld %f32, %f34, %f38 fmuld %f32, %f34, %f38
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-( membar #Sync
ldda [%g1] ASI_BLK_S, %f0
ldda [%g2] ASI_BLK_S, %f16 ldda [%g2] ASI_BLK_S, %f16
membar #Sync
faddd %f32, %f34, %f40 faddd %f32, %f34, %f40
fmuld %f32, %f34, %f42 fmuld %f32, %f34, %f42
faddd %f32, %f34, %f44 faddd %f32, %f34, %f44
@ -147,7 +150,6 @@ do_fpdis:
fmuld %f32, %f34, %f58 fmuld %f32, %f34, %f58
faddd %f32, %f34, %f60 faddd %f32, %f34, %f60
fmuld %f32, %f34, %f62 fmuld %f32, %f34, %f62
membar #Sync
ba,pt %xcc, fpdis_exit ba,pt %xcc, fpdis_exit
nop nop
3: mov SECONDARY_CONTEXT, %g3 3: mov SECONDARY_CONTEXT, %g3
@ -158,7 +160,8 @@ do_fpdis:
stxa %g2, [%g3] ASI_DMMU stxa %g2, [%g3] ASI_DMMU
membar #Sync membar #Sync
mov 0x40, %g2 mov 0x40, %g2
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-( membar #Sync
ldda [%g1] ASI_BLK_S, %f0
ldda [%g1 + %g2] ASI_BLK_S, %f16 ldda [%g1 + %g2] ASI_BLK_S, %f16
add %g1, 0x80, %g1 add %g1, 0x80, %g1
ldda [%g1] ASI_BLK_S, %f32 ldda [%g1] ASI_BLK_S, %f32

View File

@ -382,32 +382,79 @@ tlb_fixup_done:
nop nop
/* Not reached... */ /* Not reached... */
/* IMPORTANT NOTE: Whenever making changes here, check /* This is meant to allow the sharing of this code between
* trampoline.S as well. -jj */ * boot processor invocation (via setup_tba() below) and
.globl setup_tba * secondary processor startup (via trampoline.S). The
setup_tba: /* i0 = is_starfire */ * former does use this code, the latter does not yet due
save %sp, -160, %sp * to some complexities. That should be fixed up at some
* point.
*/
.globl setup_trap_table
setup_trap_table:
save %sp, -192, %sp
rdpr %tba, %g7 /* Force interrupts to be disabled. Transferring over to
sethi %hi(prom_tba), %o1 * the Linux trap table is a very delicate operation.
or %o1, %lo(prom_tba), %o1 * Until we are actually on the Linux trap table, we cannot
stx %g7, [%o1] * get the PAGE_OFFSET linear mappings translated. We need
* that mapping to be setup in order to initialize the firmware
* page tables.
*
* So there is this window of time, from the return from
* prom_set_trap_table() until inherit_prom_mappings_post()
* (in arch/sparc64/mm/init.c) completes, during which no
* firmware address space accesses can be made.
*/
rdpr %pstate, %o1
andn %o1, PSTATE_IE, %o1
wrpr %o1, 0x0, %pstate
wrpr %g0, 15, %pil
/* Ok, now make the final valid firmware call to jump over
* to the Linux trap table.
*/
call prom_set_trap_table
sethi %hi(sparc64_ttable_tl0), %o0
/* Start using proper page size encodings in ctx register. */
sethi %hi(sparc64_kern_pri_context), %g3
ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
mov PRIMARY_CONTEXT, %g1
stxa %g2, [%g1] ASI_DMMU
membar #Sync
/* The Linux trap handlers expect various trap global registers
* to be setup with some fixed values. So here we set these
* up very carefully. These globals are:
*
* Alternate Globals (PSTATE_AG):
*
* %g6 --> current_thread_info()
*
* MMU Globals (PSTATE_MG):
*
* %g1 --> TLB_SFSR
* %g2 --> ((_PAGE_VALID | _PAGE_SZ4MB |
* _PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
* ^ 0xfffff80000000000)
* (this %g2 value is used for computing the PAGE_OFFSET kernel
* TLB entries quickly, the virtual address of the fault XOR'd
* with this %g2 value is the PTE to load into the TLB)
* %g3 --> VPTE_BASE_CHEETAH or VPTE_BASE_SPITFIRE
*
* Interrupt Globals (PSTATE_IG, setup by init_irqwork_curcpu()):
*
* %g6 --> __irq_work[smp_processor_id()]
*/
/* Setup "Linux" globals 8-) */
rdpr %pstate, %o1 rdpr %pstate, %o1
mov %g6, %o2 mov %g6, %o2
wrpr %o1, (PSTATE_AG|PSTATE_IE), %pstate wrpr %o1, PSTATE_AG, %pstate
sethi %hi(sparc64_ttable_tl0), %g1
wrpr %g1, %tba
mov %o2, %g6 mov %o2, %g6
/* Set up MMU globals */
wrpr %o1, (PSTATE_MG|PSTATE_IE), %pstate
/* Set fixed globals used by dTLB miss handler. */
#define KERN_HIGHBITS ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000) #define KERN_HIGHBITS ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000)
#define KERN_LOWBITS (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W) #define KERN_LOWBITS (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
wrpr %o1, PSTATE_MG, %pstate
mov TSB_REG, %g1 mov TSB_REG, %g1
stxa %g0, [%g1] ASI_DMMU stxa %g0, [%g1] ASI_DMMU
membar #Sync membar #Sync
@ -419,17 +466,17 @@ setup_tba: /* i0 = is_starfire */
sllx %g2, 32, %g2 sllx %g2, 32, %g2
or %g2, KERN_LOWBITS, %g2 or %g2, KERN_LOWBITS, %g2
BRANCH_IF_ANY_CHEETAH(g3,g7,cheetah_vpte_base) BRANCH_IF_ANY_CHEETAH(g3,g7,8f)
ba,pt %xcc, spitfire_vpte_base ba,pt %xcc, 9f
nop nop
cheetah_vpte_base: 8:
sethi %uhi(VPTE_BASE_CHEETAH), %g3 sethi %uhi(VPTE_BASE_CHEETAH), %g3
or %g3, %ulo(VPTE_BASE_CHEETAH), %g3 or %g3, %ulo(VPTE_BASE_CHEETAH), %g3
ba,pt %xcc, 2f ba,pt %xcc, 2f
sllx %g3, 32, %g3 sllx %g3, 32, %g3
spitfire_vpte_base: 9:
sethi %uhi(VPTE_BASE_SPITFIRE), %g3 sethi %uhi(VPTE_BASE_SPITFIRE), %g3
or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3 or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
sllx %g3, 32, %g3 sllx %g3, 32, %g3
@ -455,29 +502,37 @@ spitfire_vpte_base:
sllx %o2, 32, %o2 sllx %o2, 32, %o2
wr %o2, %asr25 wr %o2, %asr25
/* Ok, we're done setting up all the state our trap mechanims needs,
* now get back into normal globals and let the PROM know what is up.
*/
2: 2:
wrpr %g0, %g0, %wstate wrpr %g0, %g0, %wstate
wrpr %o1, PSTATE_IE, %pstate wrpr %o1, 0x0, %pstate
call init_irqwork_curcpu call init_irqwork_curcpu
nop nop
call prom_set_trap_table /* Now we can turn interrupts back on. */
sethi %hi(sparc64_ttable_tl0), %o0
/* Start using proper page size encodings in ctx register. */
sethi %hi(sparc64_kern_pri_context), %g3
ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
mov PRIMARY_CONTEXT, %g1
stxa %g2, [%g1] ASI_DMMU
membar #Sync
rdpr %pstate, %o1 rdpr %pstate, %o1
or %o1, PSTATE_IE, %o1 or %o1, PSTATE_IE, %o1
wrpr %o1, 0, %pstate wrpr %o1, 0, %pstate
wrpr %g0, 0x0, %pil
ret
restore
.globl setup_tba
setup_tba: /* i0 = is_starfire */
save %sp, -192, %sp
/* The boot processor is the only cpu which invokes this
* routine, the other cpus set things up via trampoline.S.
* So save the OBP trap table address here.
*/
rdpr %tba, %g7
sethi %hi(prom_tba), %o1
or %o1, %lo(prom_tba), %o1
stx %g7, [%o1]
call setup_trap_table
nop
ret ret
restore restore

View File

@ -27,6 +27,7 @@
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/io.h>
#include <asm/sbus.h> #include <asm/sbus.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/upa.h> #include <asm/upa.h>

View File

@ -17,6 +17,7 @@
#include <asm/system.h> #include <asm/system.h>
#include <asm/ebus.h> #include <asm/ebus.h>
#include <asm/isa.h>
#include <asm/auxio.h> #include <asm/auxio.h>
#include <linux/unistd.h> #include <linux/unistd.h>
@ -100,46 +101,83 @@ again:
return 0; return 0;
} }
static int __init has_button_interrupt(struct linux_ebus_device *edev) static int __init has_button_interrupt(unsigned int irq, int prom_node)
{ {
if (edev->irqs[0] == PCI_IRQ_NONE) if (irq == PCI_IRQ_NONE)
return 0; return 0;
if (!prom_node_has_property(edev->prom_node, "button")) if (!prom_node_has_property(prom_node, "button"))
return 0; return 0;
return 1; return 1;
} }
void __init power_init(void) static int __init power_probe_ebus(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
{ {
struct linux_ebus *ebus; struct linux_ebus *ebus;
struct linux_ebus_device *edev; struct linux_ebus_device *edev;
for_each_ebus(ebus) {
for_each_ebusdev(edev, ebus) {
if (!strcmp(edev->prom_name, "power")) {
*resp = &edev->resource[0];
*irq_p = edev->irqs[0];
*prom_node_p = edev->prom_node;
return 0;
}
}
}
return -ENODEV;
}
static int __init power_probe_isa(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
{
struct sparc_isa_bridge *isa_bus;
struct sparc_isa_device *isa_dev;
for_each_isa(isa_bus) {
for_each_isadev(isa_dev, isa_bus) {
if (!strcmp(isa_dev->prom_name, "power")) {
*resp = &isa_dev->resource;
*irq_p = isa_dev->irq;
*prom_node_p = isa_dev->prom_node;
return 0;
}
}
}
return -ENODEV;
}
void __init power_init(void)
{
struct resource *res = NULL;
unsigned int irq;
int prom_node;
static int invoked; static int invoked;
if (invoked) if (invoked)
return; return;
invoked = 1; invoked = 1;
for_each_ebus(ebus) { if (!power_probe_ebus(&res, &irq, &prom_node))
for_each_ebusdev(edev, ebus) {
if (!strcmp(edev->prom_name, "power"))
goto found; goto found;
}
} if (!power_probe_isa(&res, &irq, &prom_node))
goto found;
return; return;
found: found:
power_reg = ioremap(edev->resource[0].start, 0x4); power_reg = ioremap(res->start, 0x4);
printk("power: Control reg at %p ... ", power_reg); printk("power: Control reg at %p ... ", power_reg);
poweroff_method = machine_halt; /* able to use the standard halt */ poweroff_method = machine_halt; /* able to use the standard halt */
if (has_button_interrupt(edev)) { if (has_button_interrupt(irq, prom_node)) {
if (kernel_thread(powerd, NULL, CLONE_FS) < 0) { if (kernel_thread(powerd, NULL, CLONE_FS) < 0) {
printk("Failed to start power daemon.\n"); printk("Failed to start power daemon.\n");
return; return;
} }
printk("powerd running.\n"); printk("powerd running.\n");
if (request_irq(edev->irqs[0], if (request_irq(irq,
power_handler, SA_SHIRQ, "power", NULL) < 0) power_handler, SA_SHIRQ, "power", NULL) < 0)
printk("power: Error, cannot register IRQ handler.\n"); printk("power: Error, cannot register IRQ handler.\n");
} else { } else {

View File

@ -312,32 +312,33 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
wr %g1, FPRS_FEF, %fprs wr %g1, FPRS_FEF, %fprs
ldx [%o1 + %o5], %g1 ldx [%o1 + %o5], %g1
add %g6, TI_XFSR, %o1 add %g6, TI_XFSR, %o1
membar #StoreLoad | #LoadLoad
sll %o0, 8, %o2 sll %o0, 8, %o2
add %g6, TI_FPREGS, %o3 add %g6, TI_FPREGS, %o3
brz,pn %l6, 1f brz,pn %l6, 1f
add %g6, TI_FPREGS+0x40, %o4 add %g6, TI_FPREGS+0x40, %o4
membar #Sync
ldda [%o3 + %o2] ASI_BLK_P, %f0 ldda [%o3 + %o2] ASI_BLK_P, %f0
ldda [%o4 + %o2] ASI_BLK_P, %f16 ldda [%o4 + %o2] ASI_BLK_P, %f16
membar #Sync
1: andcc %l2, FPRS_DU, %g0 1: andcc %l2, FPRS_DU, %g0
be,pn %icc, 1f be,pn %icc, 1f
wr %g1, 0, %gsr wr %g1, 0, %gsr
add %o2, 0x80, %o2 add %o2, 0x80, %o2
membar #Sync
ldda [%o3 + %o2] ASI_BLK_P, %f32 ldda [%o3 + %o2] ASI_BLK_P, %f32
ldda [%o4 + %o2] ASI_BLK_P, %f48 ldda [%o4 + %o2] ASI_BLK_P, %f48
1: membar #Sync 1: membar #Sync
ldx [%o1 + %o5], %fsr ldx [%o1 + %o5], %fsr
2: stb %l5, [%g6 + TI_FPDEPTH] 2: stb %l5, [%g6 + TI_FPDEPTH]
ba,pt %xcc, rt_continue ba,pt %xcc, rt_continue
nop nop
5: wr %g0, FPRS_FEF, %fprs 5: wr %g0, FPRS_FEF, %fprs
membar #StoreLoad | #LoadLoad
sll %o0, 8, %o2 sll %o0, 8, %o2
add %g6, TI_FPREGS+0x80, %o3 add %g6, TI_FPREGS+0x80, %o3
add %g6, TI_FPREGS+0xc0, %o4 add %g6, TI_FPREGS+0xc0, %o4
membar #Sync
ldda [%o3 + %o2] ASI_BLK_P, %f32 ldda [%o3 + %o2] ASI_BLK_P, %f32
ldda [%o4 + %o2] ASI_BLK_P, %f48 ldda [%o4 + %o2] ASI_BLK_P, %f48
membar #Sync membar #Sync

View File

@ -59,15 +59,17 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
be,pn %icc, 9b be,pn %icc, 9b
add %g6, TI_FPREGS, %g2 add %g6, TI_FPREGS, %g2
andcc %o5, FPRS_DL, %g0 andcc %o5, FPRS_DL, %g0
membar #StoreStore | #LoadStore
be,pn %icc, 4f be,pn %icc, 4f
add %g6, TI_FPREGS+0x40, %g3 add %g6, TI_FPREGS+0x40, %g3
membar #Sync
stda %f0, [%g2 + %g1] ASI_BLK_P stda %f0, [%g2 + %g1] ASI_BLK_P
stda %f16, [%g3 + %g1] ASI_BLK_P stda %f16, [%g3 + %g1] ASI_BLK_P
membar #Sync
andcc %o5, FPRS_DU, %g0 andcc %o5, FPRS_DU, %g0
be,pn %icc, 5f be,pn %icc, 5f
4: add %g1, 128, %g1 4: add %g1, 128, %g1
membar #Sync
stda %f32, [%g2 + %g1] ASI_BLK_P stda %f32, [%g2 + %g1] ASI_BLK_P
stda %f48, [%g3 + %g1] ASI_BLK_P stda %f48, [%g3 + %g1] ASI_BLK_P
@ -87,7 +89,7 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
sll %g1, 5, %g1 sll %g1, 5, %g1
add %g6, TI_FPREGS+0xc0, %g3 add %g6, TI_FPREGS+0xc0, %g3
wr %g0, FPRS_FEF, %fprs wr %g0, FPRS_FEF, %fprs
membar #StoreStore | #LoadStore membar #Sync
stda %f32, [%g2 + %g1] ASI_BLK_P stda %f32, [%g2 + %g1] ASI_BLK_P
stda %f48, [%g3 + %g1] ASI_BLK_P stda %f48, [%g3 + %g1] ASI_BLK_P
membar #Sync membar #Sync
@ -128,8 +130,8 @@ VISenterhalf:
be,pn %icc, 4f be,pn %icc, 4f
add %g6, TI_FPREGS, %g2 add %g6, TI_FPREGS, %g2
membar #StoreStore | #LoadStore
add %g6, TI_FPREGS+0x40, %g3 add %g6, TI_FPREGS+0x40, %g3
membar #Sync
stda %f0, [%g2 + %g1] ASI_BLK_P stda %f0, [%g2 + %g1] ASI_BLK_P
stda %f16, [%g3 + %g1] ASI_BLK_P stda %f16, [%g3 + %g1] ASI_BLK_P
membar #Sync membar #Sync

View File

@ -152,7 +152,7 @@ archclean:
$(SYMLINK_HEADERS): $(SYMLINK_HEADERS):
@echo ' SYMLINK $@' @echo ' SYMLINK $@'
ifneq ($(KBUILD_SRC),) ifneq ($(KBUILD_SRC),)
ln -fsn $(srctree)/include/asm-um/$(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $@ $(Q)ln -fsn $(srctree)/include/asm-um/$(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $@
else else
$(Q)cd $(TOPDIR)/$(dir $@) ; \ $(Q)cd $(TOPDIR)/$(dir $@) ; \
ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@) ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@)

View File

@ -3,16 +3,41 @@
#include <asm/types.h> #include <asm/types.h>
#if defined(__KERNEL__)
# include <asm/byteorder.h>
# if defined(__BIG_ENDIAN) # if defined(__BIG_ENDIAN)
# define ntohll(x) (x) # define ntohll(x) (x)
# define htonll(x) (x) # define htonll(x) (x)
# elif defined(__LITTLE_ENDIAN) # elif defined(__LITTLE_ENDIAN)
# define ntohll(x) be64_to_cpu(x)
# define htonll(x) cpu_to_be64(x)
# else
# error "Could not determine byte order"
# endif
#else
/* For the definition of ntohl, htonl and __BYTE_ORDER */
#include <endian.h>
#include <netinet/in.h>
#if defined(__BYTE_ORDER)
# if __BYTE_ORDER == __BIG_ENDIAN
# define ntohll(x) (x)
# define htonll(x) (x)
# elif __BYTE_ORDER == __LITTLE_ENDIAN
# define ntohll(x) bswap_64(x) # define ntohll(x) bswap_64(x)
# define htonll(x) bswap_64(x) # define htonll(x) bswap_64(x)
# else # else
#error "__BYTE_ORDER not defined" # error "Could not determine byte order: __BYTE_ORDER uncorrectly defined"
# endif # endif
#else /* ! defined(__BYTE_ORDER) */
# error "Could not determine byte order: __BYTE_ORDER not defined"
#endif
#endif /* ! defined(__KERNEL__) */
extern int init_cow_file(int fd, char *cow_file, char *backing_file, extern int init_cow_file(int fd, char *cow_file, char *backing_file,
int sectorsize, int alignment, int *bitmap_offset_out, int sectorsize, int alignment, int *bitmap_offset_out,
unsigned long *bitmap_len_out, int *data_offset_out); unsigned long *bitmap_len_out, int *data_offset_out);

View File

@ -9,7 +9,6 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/user.h> #include <sys/user.h>
#include <netinet/in.h>
#include "os.h" #include "os.h"

View File

@ -143,11 +143,22 @@ static int __init skas0_cmd_param(char *str, int* add)
return 0; return 0;
} }
/* The two __uml_setup would conflict, without this stupid alias. */
static int __init mode_skas0_cmd_param(char *str, int* add)
__attribute__((alias("skas0_cmd_param")));
__uml_setup("skas0", skas0_cmd_param, __uml_setup("skas0", skas0_cmd_param,
"skas0\n" "skas0\n"
" Disables SKAS3 usage, so that SKAS0 is used, unless \n" " Disables SKAS3 usage, so that SKAS0 is used, unless \n"
" you specify mode=tt.\n\n"); " you specify mode=tt.\n\n");
__uml_setup("mode=skas0", mode_skas0_cmd_param,
"mode=skas0\n"
" Disables SKAS3 usage, so that SKAS0 is used, unless you \n"
" specify mode=tt. Note that this was recently added - on \n"
" older kernels you must use simply \"skas0\".\n\n");
static int force_sysemu_disabled = 0; static int force_sysemu_disabled = 0;
static int __init nosysemu_cmd_param(char *str, int* add) static int __init nosysemu_cmd_param(char *str, int* add)

View File

@ -7,8 +7,8 @@ USER_SINGLE_OBJS := \
USER_OBJS += $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) USER_OBJS += $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS))
USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
$(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \ $(USER_OBJS) $(USER_OBJS:.o=.i) $(USER_OBJS:.o=.s) $(USER_OBJS:.o=.lst): \
$(CFLAGS_$(notdir $@)) c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(notdir $@))
$(USER_OBJS): cmd_checksrc = $(USER_OBJS): cmd_checksrc =
$(USER_OBJS): quiet_cmd_checksrc = $(USER_OBJS): quiet_cmd_checksrc =
$(USER_OBJS): cmd_force_checksrc = $(USER_OBJS): cmd_force_checksrc =

View File

@ -10,6 +10,22 @@
#include "uml-config.h" #include "uml-config.h"
#include "sysdep/sigcontext.h" #include "sysdep/sigcontext.h"
#include "sysdep/faultinfo.h" #include "sysdep/faultinfo.h"
#include <stddef.h>
/* Copied from sys-x86_64/signal.c - Can't find an equivalent definition
* in the libc headers anywhere.
*/
struct rt_sigframe
{
char *pretcode;
struct ucontext uc;
struct siginfo info;
};
/* Copied here from <linux/kernel.h> - we're userspace. */
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
void __attribute__ ((__section__ (".__syscall_stub"))) void __attribute__ ((__section__ (".__syscall_stub")))
stub_segv_handler(int sig) stub_segv_handler(int sig)
@ -22,11 +38,14 @@ stub_segv_handler(int sig)
__asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid)); __asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid));
__asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;" __asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;"
"syscall": : "g" (__NR_kill), "g" (SIGUSR1)); "syscall": : "g" (__NR_kill), "g" (SIGUSR1) :
/* Two popqs to restore the stack to the state just before entering "%rdi", "%rax", "%rsi");
* the handler, one pops the return address, the other pops the frame /* sys_sigreturn expects that the stack pointer will be 8 bytes into
* pointer. * the signal frame. So, we use the ucontext pointer, which we know
* already, to get the signal frame pointer, and add 8 to that.
*/ */
__asm__("popq %%rax ; popq %%rax ; movq %0, %%rax ; syscall" : : "g" __asm__("movq %0, %%rsp": :
(__NR_rt_sigreturn)); "g" ((unsigned long) container_of(uc, struct rt_sigframe,
uc) + 8));
__asm__("movq %0, %%rax ; syscall" : : "g" (__NR_rt_sigreturn));
} }

View File

@ -425,7 +425,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
rsp = (unsigned long) ka->sa.sa_restorer; rsp = (unsigned long) ka->sa.sa_restorer;
} }
return (void __user *)((rsp - frame_size) & -8UL); rsp -= frame_size;
/* Align the stack pointer according to the i386 ABI,
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
rsp = ((rsp + 4) & -16ul) - 4;
return (void __user *) rsp;
} }
int ia32_setup_frame(int sig, struct k_sigaction *ka, int ia32_setup_frame(int sig, struct k_sigaction *ka,

View File

@ -87,6 +87,10 @@ void __init setup_per_cpu_areas(void)
int i; int i;
unsigned long size; unsigned long size;
#ifdef CONFIG_HOTPLUG_CPU
prefill_possible_map();
#endif
/* Copy section for each CPU (we discard the original) */ /* Copy section for each CPU (we discard the original) */
size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES); size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES

View File

@ -892,7 +892,7 @@ static __init void disable_smp(void)
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range. * those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
* - Ashok Raj * - Ashok Raj
*/ */
static void prefill_possible_map(void) __init void prefill_possible_map(void)
{ {
int i; int i;
for (i = 0; i < NR_CPUS; i++) for (i = 0; i < NR_CPUS; i++)
@ -967,10 +967,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
current_cpu_data = boot_cpu_data; current_cpu_data = boot_cpu_data;
current_thread_info()->cpu = 0; /* needed? */ current_thread_info()->cpu = 0; /* needed? */
#ifdef CONFIG_HOTPLUG_CPU
prefill_possible_map();
#endif
if (smp_sanity_check(max_cpus) < 0) { if (smp_sanity_check(max_cpus) < 0) {
printk(KERN_INFO "SMP disabled\n"); printk(KERN_INFO "SMP disabled\n");
disable_smp(); disable_smp();

View File

@ -11,6 +11,8 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/page.h>
#include <asm/pgtable.h>
struct saved_context saved_context; struct saved_context saved_context;
@ -140,4 +142,129 @@ void fix_processor_context(void)
} }
#ifdef CONFIG_SOFTWARE_SUSPEND
/* Defined in arch/x86_64/kernel/suspend_asm.S */
extern int restore_image(void);
pgd_t *temp_level4_pgt;
static void **pages;
static inline void *__add_page(void)
{
void **c;
c = (void **)get_usable_page(GFP_ATOMIC);
if (c) {
*c = pages;
pages = c;
}
return c;
}
static inline void *__next_page(void)
{
void **c;
c = pages;
if (c) {
pages = *c;
*c = NULL;
}
return c;
}
/*
* Try to allocate as many usable pages as needed and daisy chain them.
* If one allocation fails, free the pages allocated so far
*/
static int alloc_usable_pages(unsigned long n)
{
void *p;
pages = NULL;
do
if (!__add_page())
break;
while (--n);
if (n) {
p = __next_page();
while (p) {
free_page((unsigned long)p);
p = __next_page();
}
return -ENOMEM;
}
return 0;
}
static void res_phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
{
long i, j;
i = pud_index(address);
pud = pud + i;
for (; i < PTRS_PER_PUD; pud++, i++) {
unsigned long paddr;
pmd_t *pmd;
paddr = address + i*PUD_SIZE;
if (paddr >= end)
break;
pmd = (pmd_t *)__next_page();
set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
for (j = 0; j < PTRS_PER_PMD; pmd++, j++, paddr += PMD_SIZE) {
unsigned long pe;
if (paddr >= end)
break;
pe = _PAGE_NX | _PAGE_PSE | _KERNPG_TABLE | paddr;
pe &= __supported_pte_mask;
set_pmd(pmd, __pmd(pe));
}
}
}
static void set_up_temporary_mappings(void)
{
unsigned long start, end, next;
temp_level4_pgt = (pgd_t *)__next_page();
/* It is safe to reuse the original kernel mapping */
set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map),
init_level4_pgt[pgd_index(__START_KERNEL_map)]);
/* Set up the direct mapping from scratch */
start = (unsigned long)pfn_to_kaddr(0);
end = (unsigned long)pfn_to_kaddr(end_pfn);
for (; start < end; start = next) {
pud_t *pud = (pud_t *)__next_page();
next = start + PGDIR_SIZE;
if (next > end)
next = end;
res_phys_pud_init(pud, __pa(start), __pa(next));
set_pgd(temp_level4_pgt + pgd_index(start),
mk_kernel_pgd(__pa(pud)));
}
}
int swsusp_arch_resume(void)
{
unsigned long n;
n = ((end_pfn << PAGE_SHIFT) + PUD_SIZE - 1) >> PUD_SHIFT;
n += (n + PTRS_PER_PUD - 1) / PTRS_PER_PUD + 1;
pr_debug("swsusp_arch_resume(): pages needed = %lu\n", n);
if (alloc_usable_pages(n)) {
free_eaten_memory();
return -ENOMEM;
}
/* We have got enough memory and from now on we cannot recover */
set_up_temporary_mappings();
restore_image();
return 0;
}
#endif /* CONFIG_SOFTWARE_SUSPEND */

View File

@ -39,12 +39,13 @@ ENTRY(swsusp_arch_suspend)
call swsusp_save call swsusp_save
ret ret
ENTRY(swsusp_arch_resume) ENTRY(restore_image)
/* set up cr3 */ /* switch to temporary page tables */
leaq init_level4_pgt(%rip),%rax movq $__PAGE_OFFSET, %rdx
subq $__START_KERNEL_map,%rax movq temp_level4_pgt(%rip), %rax
subq %rdx, %rax
movq %rax, %cr3 movq %rax, %cr3
/* Flush TLB */
movq mmu_cr4_features(%rip), %rax movq mmu_cr4_features(%rip), %rax
movq %rax, %rdx movq %rax, %rdx
andq $~(1<<7), %rdx # PGE andq $~(1<<7), %rdx # PGE
@ -69,6 +70,10 @@ loop:
movq pbe_next(%rdx), %rdx movq pbe_next(%rdx), %rdx
jmp loop jmp loop
done: done:
/* go back to the original page tables */
leaq init_level4_pgt(%rip), %rax
subq $__START_KERNEL_map, %rax
movq %rax, %cr3
/* Flush TLB, including "global" things (vmalloc) */ /* Flush TLB, including "global" things (vmalloc) */
movq mmu_cr4_features(%rip), %rax movq mmu_cr4_features(%rip), %rax
movq %rax, %rdx movq %rax, %rdx

View File

@ -220,8 +220,6 @@ void global_flush_tlb(void)
down_read(&init_mm.mmap_sem); down_read(&init_mm.mmap_sem);
df = xchg(&df_list, NULL); df = xchg(&df_list, NULL);
up_read(&init_mm.mmap_sem); up_read(&init_mm.mmap_sem);
if (!df)
return;
flush_map((df && !df->next) ? df->address : 0); flush_map((df && !df->next) ? df->address : 0);
for (; df; df = next_df) { for (; df; df = next_df) {
next_df = df->next; next_df = df->next;

View File

@ -795,7 +795,7 @@ static void drain_rx_pools (amb_dev * dev) {
} }
static inline void fill_rx_pool (amb_dev * dev, unsigned char pool, static inline void fill_rx_pool (amb_dev * dev, unsigned char pool,
unsigned int __nocast priority) gfp_t priority)
{ {
rx_in rx; rx_in rx;
amb_rxq * rxq; amb_rxq * rxq;

View File

@ -1374,8 +1374,7 @@ static void reset_chip (struct fs_dev *dev)
} }
} }
static void __devinit *aligned_kmalloc (int size, unsigned int __nocast flags, static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment)
int alignment)
{ {
void *t; void *t;
@ -1466,7 +1465,7 @@ static inline int nr_buffers_in_freepool (struct fs_dev *dev, struct freepool *f
working again after that... -- REW */ working again after that... -- REW */
static void top_off_fp (struct fs_dev *dev, struct freepool *fp, static void top_off_fp (struct fs_dev *dev, struct freepool *fp,
unsigned int __nocast gfp_flags) gfp_t gfp_flags)
{ {
struct FS_BPENTRY *qe, *ne; struct FS_BPENTRY *qe, *ne;
struct sk_buff *skb; struct sk_buff *skb;

View File

@ -178,7 +178,7 @@ fore200e_irq_itoa(int irq)
static void* static void*
fore200e_kmalloc(int size, unsigned int __nocast flags) fore200e_kmalloc(int size, gfp_t flags)
{ {
void *chunk = kzalloc(size, flags); void *chunk = kzalloc(size, flags);

View File

@ -156,7 +156,7 @@ dma_pool_create (const char *name, struct device *dev,
static struct dma_page * static struct dma_page *
pool_alloc_page (struct dma_pool *pool, unsigned int __nocast mem_flags) pool_alloc_page (struct dma_pool *pool, gfp_t mem_flags)
{ {
struct dma_page *page; struct dma_page *page;
int mapsize; int mapsize;
@ -262,8 +262,7 @@ dma_pool_destroy (struct dma_pool *pool)
* If such a memory block can't be allocated, null is returned. * If such a memory block can't be allocated, null is returned.
*/ */
void * void *
dma_pool_alloc (struct dma_pool *pool, unsigned int __nocast mem_flags, dma_pool_alloc (struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle)
dma_addr_t *handle)
{ {
unsigned long flags; unsigned long flags;
struct dma_page *page; struct dma_page *page;

View File

@ -229,7 +229,7 @@ static int pkt_grow_pktlist(struct pktcdvd_device *pd, int nr_packets)
return 1; return 1;
} }
static void *pkt_rb_alloc(unsigned int __nocast gfp_mask, void *data) static void *pkt_rb_alloc(gfp_t gfp_mask, void *data)
{ {
return kmalloc(sizeof(struct pkt_rb_node), gfp_mask); return kmalloc(sizeof(struct pkt_rb_node), gfp_mask);
} }
@ -2082,7 +2082,7 @@ static int pkt_close(struct inode *inode, struct file *file)
} }
static void *psd_pool_alloc(unsigned int __nocast gfp_mask, void *data) static void *psd_pool_alloc(gfp_t gfp_mask, void *data)
{ {
return kmalloc(sizeof(struct packet_stacked_data), gfp_mask); return kmalloc(sizeof(struct packet_stacked_data), gfp_mask);
} }

View File

@ -201,15 +201,15 @@ static int verify_command(struct file *file, unsigned char *cmd)
return 0; return 0;
} }
/* And root can do any command.. */
if (capable(CAP_SYS_RAWIO))
return 0;
if (!type) { if (!type) {
cmd_type[cmd[0]] = CMD_WARNED; cmd_type[cmd[0]] = CMD_WARNED;
printk(KERN_WARNING "scsi: unknown opcode 0x%02x\n", cmd[0]); printk(KERN_WARNING "scsi: unknown opcode 0x%02x\n", cmd[0]);
} }
/* And root can do any command.. */
if (capable(CAP_SYS_RAWIO))
return 0;
/* Otherwise fail it with an "Operation not permitted" */ /* Otherwise fail it with an "Operation not permitted" */
return -EPERM; return -EPERM;
} }

View File

@ -308,7 +308,7 @@ unlock:
} }
static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe, static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe,
size_t size, unsigned int __nocast flags, void *data) size_t size, gfp_t flags, void *data)
{ {
struct urb *urb; struct urb *urb;
struct usb_ctrlrequest *cr; struct usb_ctrlrequest *cr;

View File

@ -132,7 +132,7 @@ static struct usb_device_id blacklist_ids[] = {
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
static struct _urb *_urb_alloc(int isoc, unsigned int __nocast gfp) static struct _urb *_urb_alloc(int isoc, gfp_t gfp)
{ {
struct _urb *_urb = kmalloc(sizeof(struct _urb) + struct _urb *_urb = kmalloc(sizeof(struct _urb) +
sizeof(struct usb_iso_packet_descriptor) * isoc, gfp); sizeof(struct usb_iso_packet_descriptor) * isoc, gfp);

View File

@ -564,6 +564,7 @@ static int s3c2410_rtc_resume(struct device *dev, u32 level)
static struct device_driver s3c2410_rtcdrv = { static struct device_driver s3c2410_rtcdrv = {
.name = "s3c2410-rtc", .name = "s3c2410-rtc",
.owner = THIS_MODULE,
.bus = &platform_bus_type, .bus = &platform_bus_type,
.probe = s3c2410_rtc_probe, .probe = s3c2410_rtc_probe,
.remove = s3c2410_rtc_remove, .remove = s3c2410_rtc_remove,

View File

@ -50,8 +50,8 @@
#include <asm/io.h> /* For inb/outb/... */ #include <asm/io.h> /* For inb/outb/... */
/* Module and version information */ /* Module and version information */
#define WATCHDOG_VERSION "1.01" #define WATCHDOG_VERSION "1.02"
#define WATCHDOG_DATE "02 Sep 2005" #define WATCHDOG_DATE "03 Sep 2005"
#define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog" #define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog"
#define WATCHDOG_NAME "pcwd_pci" #define WATCHDOG_NAME "pcwd_pci"
#define PFX WATCHDOG_NAME ": " #define PFX WATCHDOG_NAME ": "
@ -70,9 +70,19 @@
* These are the defines that describe the control status bits for the * These are the defines that describe the control status bits for the
* PCI-PC Watchdog card. * PCI-PC Watchdog card.
*/ */
/* Port 1 : Control Status #1 */
#define WD_PCI_WTRP 0x01 /* Watchdog Trip status */ #define WD_PCI_WTRP 0x01 /* Watchdog Trip status */
#define WD_PCI_HRBT 0x02 /* Watchdog Heartbeat */ #define WD_PCI_HRBT 0x02 /* Watchdog Heartbeat */
#define WD_PCI_TTRP 0x04 /* Temperature Trip status */ #define WD_PCI_TTRP 0x04 /* Temperature Trip status */
#define WD_PCI_RL2A 0x08 /* Relay 2 Active */
#define WD_PCI_RL1A 0x10 /* Relay 1 Active */
#define WD_PCI_R2DS 0x40 /* Relay 2 Disable Temperature-trip/reset */
#define WD_PCI_RLY2 0x80 /* Activate Relay 2 on the board */
/* Port 2 : Control Status #2 */
#define WD_PCI_WDIS 0x10 /* Watchdog Disable */
#define WD_PCI_ENTP 0x20 /* Enable Temperature Trip Reset */
#define WD_PCI_WRSP 0x40 /* Watchdog wrote response */
#define WD_PCI_PCMD 0x80 /* PC has sent command */
/* according to documentation max. time to process a command for the pci /* according to documentation max. time to process a command for the pci
* watchdog card is 100 ms, so we give it 150 ms to do it's job */ * watchdog card is 100 ms, so we give it 150 ms to do it's job */
@ -83,6 +93,7 @@
#define CMD_GET_FIRMWARE_VERSION 0x08 #define CMD_GET_FIRMWARE_VERSION 0x08
#define CMD_READ_WATCHDOG_TIMEOUT 0x18 #define CMD_READ_WATCHDOG_TIMEOUT 0x18
#define CMD_WRITE_WATCHDOG_TIMEOUT 0x19 #define CMD_WRITE_WATCHDOG_TIMEOUT 0x19
#define CMD_GET_CLEAR_RESET_COUNT 0x84
/* We can only use 1 card due to the /dev/watchdog restriction */ /* We can only use 1 card due to the /dev/watchdog restriction */
static int cards_found; static int cards_found;
@ -91,15 +102,22 @@ static int cards_found;
static int temp_panic; static int temp_panic;
static unsigned long is_active; static unsigned long is_active;
static char expect_release; static char expect_release;
static struct { static struct { /* this is private data for each PCI-PC watchdog card */
int supports_temp; /* Wether or not the card has a temperature device */ int supports_temp; /* Wether or not the card has a temperature device */
int boot_status; /* The card's boot status */ int boot_status; /* The card's boot status */
unsigned long io_addr; /* The cards I/O address */ unsigned long io_addr; /* The cards I/O address */
spinlock_t io_lock; spinlock_t io_lock; /* the lock for io operations */
struct pci_dev *pdev; struct pci_dev *pdev; /* the PCI-device */
} pcipcwd_private; } pcipcwd_private;
/* module parameters */ /* module parameters */
#define QUIET 0 /* Default */
#define VERBOSE 1 /* Verbose */
#define DEBUG 2 /* print fancy stuff too */
static int debug = QUIET;
module_param(debug, int, 0);
MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)");
#define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ #define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */
static int heartbeat = WATCHDOG_HEARTBEAT; static int heartbeat = WATCHDOG_HEARTBEAT;
module_param(heartbeat, int, 0); module_param(heartbeat, int, 0);
@ -117,6 +135,10 @@ static int send_command(int cmd, int *msb, int *lsb)
{ {
int got_response, count; int got_response, count;
if (debug >= DEBUG)
printk(KERN_DEBUG PFX "sending following data cmd=0x%02x msb=0x%02x lsb=0x%02x\n",
cmd, *msb, *lsb);
spin_lock(&pcipcwd_private.io_lock); spin_lock(&pcipcwd_private.io_lock);
/* If a command requires data it should be written first. /* If a command requires data it should be written first.
* Data for commands with 8 bits of data should be written to port 4. * Data for commands with 8 bits of data should be written to port 4.
@ -131,10 +153,19 @@ static int send_command(int cmd, int *msb, int *lsb)
/* wait till the pci card processed the command, signaled by /* wait till the pci card processed the command, signaled by
* the WRSP bit in port 2 and give it a max. timeout of * the WRSP bit in port 2 and give it a max. timeout of
* PCI_COMMAND_TIMEOUT to process */ * PCI_COMMAND_TIMEOUT to process */
got_response = inb_p(pcipcwd_private.io_addr + 2) & 0x40; got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP;
for (count = 0; (count < PCI_COMMAND_TIMEOUT) && (!got_response); count++) { for (count = 0; (count < PCI_COMMAND_TIMEOUT) && (!got_response); count++) {
mdelay(1); mdelay(1);
got_response = inb_p(pcipcwd_private.io_addr + 2) & 0x40; got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP;
}
if (debug >= DEBUG) {
if (got_response) {
printk(KERN_DEBUG PFX "time to process command was: %d ms\n",
count);
} else {
printk(KERN_DEBUG PFX "card did not respond on command!\n");
}
} }
if (got_response) { if (got_response) {
@ -144,12 +175,66 @@ static int send_command(int cmd, int *msb, int *lsb)
/* clear WRSP bit */ /* clear WRSP bit */
inb_p(pcipcwd_private.io_addr + 6); inb_p(pcipcwd_private.io_addr + 6);
if (debug >= DEBUG)
printk(KERN_DEBUG PFX "received following data for cmd=0x%02x: msb=0x%02x lsb=0x%02x\n",
cmd, *msb, *lsb);
} }
spin_unlock(&pcipcwd_private.io_lock); spin_unlock(&pcipcwd_private.io_lock);
return got_response; return got_response;
} }
static inline void pcipcwd_check_temperature_support(void)
{
if (inb_p(pcipcwd_private.io_addr) != 0xF0)
pcipcwd_private.supports_temp = 1;
}
static int pcipcwd_get_option_switches(void)
{
int option_switches;
option_switches = inb_p(pcipcwd_private.io_addr + 3);
return option_switches;
}
static void pcipcwd_show_card_info(void)
{
int got_fw_rev, fw_rev_major, fw_rev_minor;
char fw_ver_str[20]; /* The cards firmware version */
int option_switches;
got_fw_rev = send_command(CMD_GET_FIRMWARE_VERSION, &fw_rev_major, &fw_rev_minor);
if (got_fw_rev) {
sprintf(fw_ver_str, "%u.%02u", fw_rev_major, fw_rev_minor);
} else {
sprintf(fw_ver_str, "<card no answer>");
}
/* Get switch settings */
option_switches = pcipcwd_get_option_switches();
printk(KERN_INFO PFX "Found card at port 0x%04x (Firmware: %s) %s temp option\n",
(int) pcipcwd_private.io_addr, fw_ver_str,
(pcipcwd_private.supports_temp ? "with" : "without"));
printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n",
option_switches,
((option_switches & 0x10) ? "ON" : "OFF"),
((option_switches & 0x08) ? "ON" : "OFF"));
if (pcipcwd_private.boot_status & WDIOF_CARDRESET)
printk(KERN_INFO PFX "Previous reset was caused by the Watchdog card\n");
if (pcipcwd_private.boot_status & WDIOF_OVERHEAT)
printk(KERN_INFO PFX "Card sensed a CPU Overheat\n");
if (pcipcwd_private.boot_status == 0)
printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n");
}
static int pcipcwd_start(void) static int pcipcwd_start(void)
{ {
int stat_reg; int stat_reg;
@ -161,11 +246,14 @@ static int pcipcwd_start(void)
stat_reg = inb_p(pcipcwd_private.io_addr + 2); stat_reg = inb_p(pcipcwd_private.io_addr + 2);
spin_unlock(&pcipcwd_private.io_lock); spin_unlock(&pcipcwd_private.io_lock);
if (stat_reg & 0x10) { if (stat_reg & WD_PCI_WDIS) {
printk(KERN_ERR PFX "Card timer not enabled\n"); printk(KERN_ERR PFX "Card timer not enabled\n");
return -1; return -1;
} }
if (debug >= VERBOSE)
printk(KERN_DEBUG PFX "Watchdog started\n");
return 0; return 0;
} }
@ -183,18 +271,25 @@ static int pcipcwd_stop(void)
stat_reg = inb_p(pcipcwd_private.io_addr + 2); stat_reg = inb_p(pcipcwd_private.io_addr + 2);
spin_unlock(&pcipcwd_private.io_lock); spin_unlock(&pcipcwd_private.io_lock);
if (!(stat_reg & 0x10)) { if (!(stat_reg & WD_PCI_WDIS)) {
printk(KERN_ERR PFX "Card did not acknowledge disable attempt\n"); printk(KERN_ERR PFX "Card did not acknowledge disable attempt\n");
return -1; return -1;
} }
if (debug >= VERBOSE)
printk(KERN_DEBUG PFX "Watchdog stopped\n");
return 0; return 0;
} }
static int pcipcwd_keepalive(void) static int pcipcwd_keepalive(void)
{ {
/* Re-trigger watchdog by writing to port 0 */ /* Re-trigger watchdog by writing to port 0 */
outb_p(0x42, pcipcwd_private.io_addr); outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */
if (debug >= DEBUG)
printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n");
return 0; return 0;
} }
@ -210,29 +305,64 @@ static int pcipcwd_set_heartbeat(int t)
send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb); send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb);
heartbeat = t; heartbeat = t;
if (debug >= VERBOSE)
printk(KERN_DEBUG PFX "New heartbeat: %d\n",
heartbeat);
return 0; return 0;
} }
static int pcipcwd_get_status(int *status) static int pcipcwd_get_status(int *status)
{ {
int new_status; int control_status;
*status=0; *status=0;
new_status = inb_p(pcipcwd_private.io_addr + 1); control_status = inb_p(pcipcwd_private.io_addr + 1);
if (new_status & WD_PCI_WTRP) if (control_status & WD_PCI_WTRP)
*status |= WDIOF_CARDRESET; *status |= WDIOF_CARDRESET;
if (new_status & WD_PCI_TTRP) { if (control_status & WD_PCI_TTRP) {
*status |= WDIOF_OVERHEAT; *status |= WDIOF_OVERHEAT;
if (temp_panic) if (temp_panic)
panic(PFX "Temperature overheat trip!\n"); panic(PFX "Temperature overheat trip!\n");
} }
if (debug >= DEBUG)
printk(KERN_DEBUG PFX "Control Status #1: 0x%02x\n",
control_status);
return 0; return 0;
} }
static int pcipcwd_clear_status(void) static int pcipcwd_clear_status(void)
{ {
outb_p(0x01, pcipcwd_private.io_addr + 1); int control_status;
int msb;
int reset_counter;
if (debug >= VERBOSE)
printk(KERN_INFO PFX "clearing watchdog trip status & LED\n");
control_status = inb_p(pcipcwd_private.io_addr + 1);
if (debug >= DEBUG) {
printk(KERN_DEBUG PFX "status was: 0x%02x\n", control_status);
printk(KERN_DEBUG PFX "sending: 0x%02x\n",
(control_status & WD_PCI_R2DS) | WD_PCI_WTRP);
}
/* clear trip status & LED and keep mode of relay 2 */
outb_p((control_status & WD_PCI_R2DS) | WD_PCI_WTRP, pcipcwd_private.io_addr + 1);
/* clear reset counter */
msb=0;
reset_counter=0xff;
send_command(CMD_GET_CLEAR_RESET_COUNT, &msb, &reset_counter);
if (debug >= DEBUG) {
printk(KERN_DEBUG PFX "reset count was: 0x%02x\n",
reset_counter);
}
return 0; return 0;
} }
@ -242,11 +372,18 @@ static int pcipcwd_get_temperature(int *temperature)
if (!pcipcwd_private.supports_temp) if (!pcipcwd_private.supports_temp)
return -ENODEV; return -ENODEV;
*temperature = inb_p(pcipcwd_private.io_addr);
/* /*
* Convert celsius to fahrenheit, since this was * Convert celsius to fahrenheit, since this was
* the decided 'standard' for this return value. * the decided 'standard' for this return value.
*/ */
*temperature = ((inb_p(pcipcwd_private.io_addr)) * 9 / 5) + 32; *temperature = (*temperature * 9 / 5) + 32;
if (debug >= DEBUG) {
printk(KERN_DEBUG PFX "temperature is: %d F\n",
*temperature);
}
return 0; return 0;
} }
@ -381,8 +518,11 @@ static int pcipcwd_ioctl(struct inode *inode, struct file *file,
static int pcipcwd_open(struct inode *inode, struct file *file) static int pcipcwd_open(struct inode *inode, struct file *file)
{ {
/* /dev/watchdog can only be opened once */ /* /dev/watchdog can only be opened once */
if (test_and_set_bit(0, &is_active)) if (test_and_set_bit(0, &is_active)) {
if (debug >= VERBOSE)
printk(KERN_ERR PFX "Attempt to open already opened device.\n");
return -EBUSY; return -EBUSY;
}
/* Activate */ /* Activate */
pcipcwd_start(); pcipcwd_start();
@ -492,19 +632,10 @@ static struct notifier_block pcipcwd_notifier = {
* Init & exit routines * Init & exit routines
*/ */
static inline void check_temperature_support(void)
{
if (inb_p(pcipcwd_private.io_addr) != 0xF0)
pcipcwd_private.supports_temp = 1;
}
static int __devinit pcipcwd_card_init(struct pci_dev *pdev, static int __devinit pcipcwd_card_init(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
int ret = -EIO; int ret = -EIO;
int got_fw_rev, fw_rev_major, fw_rev_minor;
char fw_ver_str[20];
char option_switches;
cards_found++; cards_found++;
if (cards_found == 1) if (cards_found == 1)
@ -546,36 +677,10 @@ static int __devinit pcipcwd_card_init(struct pci_dev *pdev,
pcipcwd_stop(); pcipcwd_stop();
/* Check whether or not the card supports the temperature device */ /* Check whether or not the card supports the temperature device */
check_temperature_support(); pcipcwd_check_temperature_support();
/* Get the Firmware Version */ /* Show info about the card itself */
got_fw_rev = send_command(CMD_GET_FIRMWARE_VERSION, &fw_rev_major, &fw_rev_minor); pcipcwd_show_card_info();
if (got_fw_rev) {
sprintf(fw_ver_str, "%u.%02u", fw_rev_major, fw_rev_minor);
} else {
sprintf(fw_ver_str, "<card no answer>");
}
/* Get switch settings */
option_switches = inb_p(pcipcwd_private.io_addr + 3);
printk(KERN_INFO PFX "Found card at port 0x%04x (Firmware: %s) %s temp option\n",
(int) pcipcwd_private.io_addr, fw_ver_str,
(pcipcwd_private.supports_temp ? "with" : "without"));
printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n",
option_switches,
((option_switches & 0x10) ? "ON" : "OFF"),
((option_switches & 0x08) ? "ON" : "OFF"));
if (pcipcwd_private.boot_status & WDIOF_CARDRESET)
printk(KERN_INFO PFX "Previous reset was caused by the Watchdog card\n");
if (pcipcwd_private.boot_status & WDIOF_OVERHEAT)
printk(KERN_INFO PFX "Card sensed a CPU Overheat\n");
if (pcipcwd_private.boot_status == 0)
printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n");
/* Check that the heartbeat value is within it's range ; if not reset to the default */ /* Check that the heartbeat value is within it's range ; if not reset to the default */
if (pcipcwd_set_heartbeat(heartbeat)) { if (pcipcwd_set_heartbeat(heartbeat)) {

View File

@ -69,8 +69,7 @@ int cn_already_initialized = 0;
* a new message. * a new message.
* *
*/ */
int cn_netlink_send(struct cn_msg *msg, u32 __group, int cn_netlink_send(struct cn_msg *msg, u32 __group, gfp_t gfp_mask)
unsigned int __nocast gfp_mask)
{ {
struct cn_callback_entry *__cbq; struct cn_callback_entry *__cbq;
unsigned int size; unsigned int size;

View File

@ -1101,6 +1101,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
ide_hwif_t *hwif; ide_hwif_t *hwif;
struct request *rq; struct request *rq;
ide_startstop_t startstop; ide_startstop_t startstop;
int loops = 0;
/* for atari only: POSSIBLY BROKEN HERE(?) */ /* for atari only: POSSIBLY BROKEN HERE(?) */
ide_get_lock(ide_intr, hwgroup); ide_get_lock(ide_intr, hwgroup);
@ -1153,6 +1154,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
/* no more work for this hwgroup (for now) */ /* no more work for this hwgroup (for now) */
return; return;
} }
again:
hwif = HWIF(drive); hwif = HWIF(drive);
if (hwgroup->hwif->sharing_irq && if (hwgroup->hwif->sharing_irq &&
hwif != hwgroup->hwif && hwif != hwgroup->hwif &&
@ -1192,8 +1194,14 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
* though. I hope that doesn't happen too much, hopefully not * though. I hope that doesn't happen too much, hopefully not
* unless the subdriver triggers such a thing in its own PM * unless the subdriver triggers such a thing in its own PM
* state machine. * state machine.
*
* We count how many times we loop here to make sure we service
* all drives in the hwgroup without looping for ever
*/ */
if (drive->blocked && !blk_pm_request(rq) && !(rq->flags & REQ_PREEMPT)) { if (drive->blocked && !blk_pm_request(rq) && !(rq->flags & REQ_PREEMPT)) {
drive = drive->next ? drive->next : hwgroup->drive;
if (loops++ < 4 && !blk_queue_plugged(drive->queue))
goto again;
/* We clear busy, there should be no pending ATA command at this point. */ /* We clear busy, there should be no pending ATA command at this point. */
hwgroup->busy = 0; hwgroup->busy = 0;
break; break;

View File

@ -98,7 +98,7 @@ static struct hpsb_address_ops arm_ops = {
static void queue_complete_cb(struct pending_request *req); static void queue_complete_cb(struct pending_request *req);
static struct pending_request *__alloc_pending_request(unsigned int __nocast flags) static struct pending_request *__alloc_pending_request(gfp_t flags)
{ {
struct pending_request *req; struct pending_request *req;

View File

@ -783,7 +783,7 @@ struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent,
u32 remote_qpn, u16 pkey_index, u32 remote_qpn, u16 pkey_index,
struct ib_ah *ah, int rmpp_active, struct ib_ah *ah, int rmpp_active,
int hdr_len, int data_len, int hdr_len, int data_len,
unsigned int __nocast gfp_mask) gfp_t gfp_mask)
{ {
struct ib_mad_agent_private *mad_agent_priv; struct ib_mad_agent_private *mad_agent_priv;
struct ib_mad_send_buf *send_buf; struct ib_mad_send_buf *send_buf;

View File

@ -574,7 +574,7 @@ static void ib_sa_path_rec_release(struct ib_sa_query *sa_query)
int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, int ib_sa_path_rec_get(struct ib_device *device, u8 port_num,
struct ib_sa_path_rec *rec, struct ib_sa_path_rec *rec,
ib_sa_comp_mask comp_mask, ib_sa_comp_mask comp_mask,
int timeout_ms, unsigned int __nocast gfp_mask, int timeout_ms, gfp_t gfp_mask,
void (*callback)(int status, void (*callback)(int status,
struct ib_sa_path_rec *resp, struct ib_sa_path_rec *resp,
void *context), void *context),
@ -676,7 +676,7 @@ static void ib_sa_service_rec_release(struct ib_sa_query *sa_query)
int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method, int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method,
struct ib_sa_service_rec *rec, struct ib_sa_service_rec *rec,
ib_sa_comp_mask comp_mask, ib_sa_comp_mask comp_mask,
int timeout_ms, unsigned int __nocast gfp_mask, int timeout_ms, gfp_t gfp_mask,
void (*callback)(int status, void (*callback)(int status,
struct ib_sa_service_rec *resp, struct ib_sa_service_rec *resp,
void *context), void *context),
@ -759,7 +759,7 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num,
u8 method, u8 method,
struct ib_sa_mcmember_rec *rec, struct ib_sa_mcmember_rec *rec,
ib_sa_comp_mask comp_mask, ib_sa_comp_mask comp_mask,
int timeout_ms, unsigned int __nocast gfp_mask, int timeout_ms, gfp_t gfp_mask,
void (*callback)(int status, void (*callback)(int status,
struct ib_sa_mcmember_rec *resp, struct ib_sa_mcmember_rec *resp,
void *context), void *context),

View File

@ -96,7 +96,7 @@ static kmem_cache_t *_crypt_io_pool;
/* /*
* Mempool alloc and free functions for the page * Mempool alloc and free functions for the page
*/ */
static void *mempool_alloc_page(unsigned int __nocast gfp_mask, void *data) static void *mempool_alloc_page(gfp_t gfp_mask, void *data)
{ {
return alloc_page(gfp_mask); return alloc_page(gfp_mask);
} }

View File

@ -32,7 +32,7 @@ struct io {
static unsigned _num_ios; static unsigned _num_ios;
static mempool_t *_io_pool; static mempool_t *_io_pool;
static void *alloc_io(unsigned int __nocast gfp_mask, void *pool_data) static void *alloc_io(gfp_t gfp_mask, void *pool_data)
{ {
return kmalloc(sizeof(struct io), gfp_mask); return kmalloc(sizeof(struct io), gfp_mask);
} }

View File

@ -122,7 +122,7 @@ static inline sector_t region_to_sector(struct region_hash *rh, region_t region)
/* FIXME move this */ /* FIXME move this */
static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw); static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw);
static void *region_alloc(unsigned int __nocast gfp_mask, void *pool_data) static void *region_alloc(gfp_t gfp_mask, void *pool_data)
{ {
return kmalloc(sizeof(struct region), gfp_mask); return kmalloc(sizeof(struct region), gfp_mask);
} }

View File

@ -38,7 +38,7 @@
static mdk_personality_t multipath_personality; static mdk_personality_t multipath_personality;
static void *mp_pool_alloc(unsigned int __nocast gfp_flags, void *data) static void *mp_pool_alloc(gfp_t gfp_flags, void *data)
{ {
struct multipath_bh *mpb; struct multipath_bh *mpb;
mpb = kmalloc(sizeof(*mpb), gfp_flags); mpb = kmalloc(sizeof(*mpb), gfp_flags);

View File

@ -52,7 +52,7 @@ static mdk_personality_t raid1_personality;
static void unplug_slaves(mddev_t *mddev); static void unplug_slaves(mddev_t *mddev);
static void * r1bio_pool_alloc(unsigned int __nocast gfp_flags, void *data) static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data)
{ {
struct pool_info *pi = data; struct pool_info *pi = data;
r1bio_t *r1_bio; r1bio_t *r1_bio;
@ -79,7 +79,7 @@ static void r1bio_pool_free(void *r1_bio, void *data)
#define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
#define RESYNC_WINDOW (2048*1024) #define RESYNC_WINDOW (2048*1024)
static void * r1buf_pool_alloc(unsigned int __nocast gfp_flags, void *data) static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
{ {
struct pool_info *pi = data; struct pool_info *pi = data;
struct page *page; struct page *page;

View File

@ -47,7 +47,7 @@
static void unplug_slaves(mddev_t *mddev); static void unplug_slaves(mddev_t *mddev);
static void * r10bio_pool_alloc(unsigned int __nocast gfp_flags, void *data) static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
{ {
conf_t *conf = data; conf_t *conf = data;
r10bio_t *r10_bio; r10bio_t *r10_bio;
@ -81,7 +81,7 @@ static void r10bio_pool_free(void *r10_bio, void *data)
* one for write (we recover only one drive per r10buf) * one for write (we recover only one drive per r10buf)
* *
*/ */
static void * r10buf_pool_alloc(unsigned int __nocast gfp_flags, void *data) static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
{ {
conf_t *conf = data; conf_t *conf = data;
struct page *page; struct page *page;

View File

@ -457,6 +457,17 @@ static int ucb1x00_detect_irq(struct ucb1x00 *ucb)
return probe_irq_off(mask); return probe_irq_off(mask);
} }
static void ucb1x00_release(struct class_device *dev)
{
struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
kfree(ucb);
}
static struct class ucb1x00_class = {
.name = "ucb1x00",
.release = ucb1x00_release,
};
static int ucb1x00_probe(struct mcp *mcp) static int ucb1x00_probe(struct mcp *mcp)
{ {
struct ucb1x00 *ucb; struct ucb1x00 *ucb;
@ -546,17 +557,6 @@ static void ucb1x00_remove(struct mcp *mcp)
class_device_unregister(&ucb->cdev); class_device_unregister(&ucb->cdev);
} }
static void ucb1x00_release(struct class_device *dev)
{
struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
kfree(ucb);
}
static struct class ucb1x00_class = {
.name = "ucb1x00",
.release = ucb1x00_release,
};
int ucb1x00_register_driver(struct ucb1x00_driver *drv) int ucb1x00_register_driver(struct ucb1x00_driver *drv)
{ {
struct ucb1x00 *ucb; struct ucb1x00 *ucb;

View File

@ -1290,7 +1290,7 @@ static void bond_mc_list_destroy(struct bonding *bond)
* Copy all the Multicast addresses from src to the bonding device dst * Copy all the Multicast addresses from src to the bonding device dst
*/ */
static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond, static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond,
unsigned int __nocast gfp_flag) gfp_t gfp_flag)
{ {
struct dev_mc_list *dmi, *new_dmi; struct dev_mc_list *dmi, *new_dmi;

View File

@ -584,7 +584,7 @@ static inline int ns83820_add_rx_skb(struct ns83820 *dev, struct sk_buff *skb)
return 0; return 0;
} }
static inline int rx_refill(struct net_device *ndev, unsigned int __nocast gfp) static inline int rx_refill(struct net_device *ndev, gfp_t gfp)
{ {
struct ns83820 *dev = PRIV(ndev); struct ns83820 *dev = PRIV(ndev);
unsigned i; unsigned i;

View File

@ -1036,7 +1036,7 @@ struct gem {
#define ALIGNED_RX_SKB_ADDR(addr) \ #define ALIGNED_RX_SKB_ADDR(addr) \
((((unsigned long)(addr) + (64UL - 1UL)) & ~(64UL - 1UL)) - (unsigned long)(addr)) ((((unsigned long)(addr) + (64UL - 1UL)) & ~(64UL - 1UL)) - (unsigned long)(addr))
static __inline__ struct sk_buff *gem_alloc_skb(int size, static __inline__ struct sk_buff *gem_alloc_skb(int size,
unsigned int __nocast gfp_flags) gfp_t gfp_flags)
{ {
struct sk_buff *skb = alloc_skb(size + 64, gfp_flags); struct sk_buff *skb = alloc_skb(size + 64, gfp_flags);

View File

@ -689,6 +689,9 @@ static int pccardd(void *__skt)
schedule(); schedule();
try_to_freeze(); try_to_freeze();
} }
/* make sure we are running before we exit */
set_current_state(TASK_RUNNING);
remove_wait_queue(&skt->thread_wait, &wait); remove_wait_queue(&skt->thread_wait, &wait);
/* remove from the device core */ /* remove from the device core */

View File

@ -873,6 +873,7 @@ static int ti1250_override(struct yenta_socket *socket)
* Some fixup code to make everybody happy (TM). * Some fixup code to make everybody happy (TM).
*/ */
#ifdef CONFIG_CARDBUS
/** /**
* set/clear various test bits: * set/clear various test bits:
* Defaults to clear the bit. * Defaults to clear the bit.
@ -927,7 +928,6 @@ static void ene_tune_bridge(struct pcmcia_socket *sock, struct pci_bus *bus)
config_writeb(socket, ENE_TEST_C9, test_c9); config_writeb(socket, ENE_TEST_C9, test_c9);
} }
static int ene_override(struct yenta_socket *socket) static int ene_override(struct yenta_socket *socket)
{ {
/* install tune_bridge() function */ /* install tune_bridge() function */
@ -935,6 +935,9 @@ static int ene_override(struct yenta_socket *socket)
return ti1250_override(socket); return ti1250_override(socket);
} }
#else
# define ene_override ti1250_override
#endif
#endif /* _LINUX_TI113X_H */ #endif /* _LINUX_TI113X_H */

View File

@ -833,7 +833,7 @@ zfcp_unit_dequeue(struct zfcp_unit *unit)
} }
static void * static void *
zfcp_mempool_alloc(unsigned int __nocast gfp_mask, void *size) zfcp_mempool_alloc(gfp_t gfp_mask, void *size)
{ {
return kmalloc((size_t) size, gfp_mask); return kmalloc((size_t) size, gfp_mask);
} }

View File

@ -383,11 +383,11 @@ static int imx_startup(struct uart_port *port)
*/ */
retval = request_irq(sport->rxirq, imx_rxint, 0, retval = request_irq(sport->rxirq, imx_rxint, 0,
DRIVER_NAME, sport); DRIVER_NAME, sport);
if (retval) goto error_out2; if (retval) goto error_out1;
retval = request_irq(sport->txirq, imx_txint, 0, retval = request_irq(sport->txirq, imx_txint, 0,
"imx-uart", sport); "imx-uart", sport);
if (retval) goto error_out1; if (retval) goto error_out2;
/* /*
* Finally, clear and enable interrupts * Finally, clear and enable interrupts
@ -406,10 +406,9 @@ static int imx_startup(struct uart_port *port)
return 0; return 0;
error_out1:
free_irq(sport->rxirq, sport);
error_out2: error_out2:
free_irq(sport->txirq, sport); free_irq(sport->rxirq, sport);
error_out1:
return retval; return retval;
} }

View File

@ -1235,6 +1235,7 @@ static int s3c2400_serial_probe(struct device *dev)
static struct device_driver s3c2400_serial_drv = { static struct device_driver s3c2400_serial_drv = {
.name = "s3c2400-uart", .name = "s3c2400-uart",
.owner = THIS_MODULE,
.bus = &platform_bus_type, .bus = &platform_bus_type,
.probe = s3c2400_serial_probe, .probe = s3c2400_serial_probe,
.remove = s3c24xx_serial_remove, .remove = s3c24xx_serial_remove,
@ -1338,6 +1339,7 @@ static int s3c2410_serial_probe(struct device *dev)
static struct device_driver s3c2410_serial_drv = { static struct device_driver s3c2410_serial_drv = {
.name = "s3c2410-uart", .name = "s3c2410-uart",
.owner = THIS_MODULE,
.bus = &platform_bus_type, .bus = &platform_bus_type,
.probe = s3c2410_serial_probe, .probe = s3c2410_serial_probe,
.remove = s3c24xx_serial_remove, .remove = s3c24xx_serial_remove,
@ -1499,6 +1501,7 @@ static int s3c2440_serial_probe(struct device *dev)
static struct device_driver s3c2440_serial_drv = { static struct device_driver s3c2440_serial_drv = {
.name = "s3c2440-uart", .name = "s3c2440-uart",
.owner = THIS_MODULE,
.bus = &platform_bus_type, .bus = &platform_bus_type,
.probe = s3c2440_serial_probe, .probe = s3c2440_serial_probe,
.remove = s3c24xx_serial_remove, .remove = s3c24xx_serial_remove,

View File

@ -30,6 +30,8 @@
* Revision history * Revision history
* 22.12.1999 0.1 Initial release (split from proc_usb.c) * 22.12.1999 0.1 Initial release (split from proc_usb.c)
* 04.01.2000 0.2 Turned into its own filesystem * 04.01.2000 0.2 Turned into its own filesystem
* 30.09.2005 0.3 Fix user-triggerable oops in async URB delivery
* (CAN-2005-3055)
*/ */
/*****************************************************************************/ /*****************************************************************************/
@ -58,7 +60,8 @@ static struct class *usb_device_class;
struct async { struct async {
struct list_head asynclist; struct list_head asynclist;
struct dev_state *ps; struct dev_state *ps;
struct task_struct *task; pid_t pid;
uid_t uid, euid;
unsigned int signr; unsigned int signr;
unsigned int ifnum; unsigned int ifnum;
void __user *userbuffer; void __user *userbuffer;
@ -290,7 +293,8 @@ static void async_completed(struct urb *urb, struct pt_regs *regs)
sinfo.si_errno = as->urb->status; sinfo.si_errno = as->urb->status;
sinfo.si_code = SI_ASYNCIO; sinfo.si_code = SI_ASYNCIO;
sinfo.si_addr = as->userurb; sinfo.si_addr = as->userurb;
send_sig_info(as->signr, &sinfo, as->task); kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid,
as->euid);
} }
wake_up(&ps->wait); wake_up(&ps->wait);
} }
@ -526,7 +530,9 @@ static int usbdev_open(struct inode *inode, struct file *file)
INIT_LIST_HEAD(&ps->async_completed); INIT_LIST_HEAD(&ps->async_completed);
init_waitqueue_head(&ps->wait); init_waitqueue_head(&ps->wait);
ps->discsignr = 0; ps->discsignr = 0;
ps->disctask = current; ps->disc_pid = current->pid;
ps->disc_uid = current->uid;
ps->disc_euid = current->euid;
ps->disccontext = NULL; ps->disccontext = NULL;
ps->ifclaimed = 0; ps->ifclaimed = 0;
wmb(); wmb();
@ -988,7 +994,9 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
as->userbuffer = NULL; as->userbuffer = NULL;
as->signr = uurb->signr; as->signr = uurb->signr;
as->ifnum = ifnum; as->ifnum = ifnum;
as->task = current; as->pid = current->pid;
as->uid = current->uid;
as->euid = current->euid;
if (!(uurb->endpoint & USB_DIR_IN)) { if (!(uurb->endpoint & USB_DIR_IN)) {
if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) { if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) {
free_async(as); free_async(as);

View File

@ -713,7 +713,7 @@ void usbfs_remove_device(struct usb_device *dev)
sinfo.si_errno = EPIPE; sinfo.si_errno = EPIPE;
sinfo.si_code = SI_ASYNCIO; sinfo.si_code = SI_ASYNCIO;
sinfo.si_addr = ds->disccontext; sinfo.si_addr = ds->disccontext;
send_sig_info(ds->discsignr, &sinfo, ds->disctask); kill_proc_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid);
} }
} }
usbfs_update_special(); usbfs_update_special();

View File

@ -52,7 +52,8 @@ struct dev_state {
struct list_head async_completed; struct list_head async_completed;
wait_queue_head_t wait; /* wake up if a request completed */ wait_queue_head_t wait; /* wake up if a request completed */
unsigned int discsignr; unsigned int discsignr;
struct task_struct *disctask; pid_t disc_pid;
uid_t disc_uid, disc_euid;
void __user *disccontext; void __user *disccontext;
unsigned long ifclaimed; unsigned long ifclaimed;
}; };

View File

@ -288,6 +288,9 @@ static void p9100_init_one(struct sbus_dev *sdev)
all->par.physbase = sdev->reg_addrs[2].phys_addr; all->par.physbase = sdev->reg_addrs[2].phys_addr;
sbusfb_fill_var(&all->info.var, sdev->prom_node, 8); sbusfb_fill_var(&all->info.var, sdev->prom_node, 8);
all->info.var.red.length = 8;
all->info.var.green.length = 8;
all->info.var.blue.length = 8;
linebytes = prom_getintdefault(sdev->prom_node, "linebytes", linebytes = prom_getintdefault(sdev->prom_node, "linebytes",
all->info.var.xres); all->info.var.xres);
@ -323,6 +326,7 @@ static void p9100_init_one(struct sbus_dev *sdev)
kfree(all); kfree(all);
return; return;
} }
fb_set_cmap(&all->info.cmap, &all->info);
list_add(&all->list, &p9100_list); list_add(&all->list, &p9100_list);

View File

@ -75,7 +75,7 @@ struct bio_set {
*/ */
static struct bio_set *fs_bio_set; static struct bio_set *fs_bio_set;
static inline struct bio_vec *bvec_alloc_bs(unsigned int __nocast gfp_mask, int nr, unsigned long *idx, struct bio_set *bs) static inline struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned long *idx, struct bio_set *bs)
{ {
struct bio_vec *bvl; struct bio_vec *bvl;
struct biovec_slab *bp; struct biovec_slab *bp;
@ -155,7 +155,7 @@ inline void bio_init(struct bio *bio)
* allocate bio and iovecs from the memory pools specified by the * allocate bio and iovecs from the memory pools specified by the
* bio_set structure. * bio_set structure.
**/ **/
struct bio *bio_alloc_bioset(unsigned int __nocast gfp_mask, int nr_iovecs, struct bio_set *bs) struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
{ {
struct bio *bio = mempool_alloc(bs->bio_pool, gfp_mask); struct bio *bio = mempool_alloc(bs->bio_pool, gfp_mask);
@ -181,7 +181,7 @@ out:
return bio; return bio;
} }
struct bio *bio_alloc(unsigned int __nocast gfp_mask, int nr_iovecs) struct bio *bio_alloc(gfp_t gfp_mask, int nr_iovecs)
{ {
struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set); struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
@ -277,7 +277,7 @@ inline void __bio_clone(struct bio *bio, struct bio *bio_src)
* *
* Like __bio_clone, only also allocates the returned bio * Like __bio_clone, only also allocates the returned bio
*/ */
struct bio *bio_clone(struct bio *bio, unsigned int __nocast gfp_mask) struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
{ {
struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set); struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
@ -1078,7 +1078,7 @@ struct bio_pair *bio_split(struct bio *bi, mempool_t *pool, int first_sectors)
return bp; return bp;
} }
static void *bio_pair_alloc(unsigned int __nocast gfp_flags, void *data) static void *bio_pair_alloc(gfp_t gfp_flags, void *data)
{ {
return kmalloc(sizeof(struct bio_pair), gfp_flags); return kmalloc(sizeof(struct bio_pair), gfp_flags);
} }

View File

@ -3045,7 +3045,7 @@ static void recalc_bh_state(void)
buffer_heads_over_limit = (tot > max_buffer_heads); buffer_heads_over_limit = (tot > max_buffer_heads);
} }
struct buffer_head *alloc_buffer_head(unsigned int __nocast gfp_flags) struct buffer_head *alloc_buffer_head(gfp_t gfp_flags)
{ {
struct buffer_head *ret = kmem_cache_alloc(bh_cachep, gfp_flags); struct buffer_head *ret = kmem_cache_alloc(bh_cachep, gfp_flags);
if (ret) { if (ret) {

View File

@ -102,7 +102,7 @@ static struct bio *mpage_bio_submit(int rw, struct bio *bio)
static struct bio * static struct bio *
mpage_alloc(struct block_device *bdev, mpage_alloc(struct block_device *bdev,
sector_t first_sector, int nr_vecs, sector_t first_sector, int nr_vecs,
unsigned int __nocast gfp_flags) gfp_t gfp_flags)
{ {
struct bio *bio; struct bio *bio;

View File

@ -40,7 +40,7 @@
* Depending on @gfp_mask the allocation may be guaranteed to succeed. * Depending on @gfp_mask the allocation may be guaranteed to succeed.
*/ */
static inline void *__ntfs_malloc(unsigned long size, static inline void *__ntfs_malloc(unsigned long size,
unsigned int __nocast gfp_mask) gfp_t gfp_mask)
{ {
if (likely(size <= PAGE_SIZE)) { if (likely(size <= PAGE_SIZE)) {
BUG_ON(!size); BUG_ON(!size);

View File

@ -35,7 +35,7 @@ EXPORT_SYMBOL(posix_acl_permission);
* Allocate a new ACL with the specified number of entries. * Allocate a new ACL with the specified number of entries.
*/ */
struct posix_acl * struct posix_acl *
posix_acl_alloc(int count, unsigned int __nocast flags) posix_acl_alloc(int count, gfp_t flags)
{ {
const size_t size = sizeof(struct posix_acl) + const size_t size = sizeof(struct posix_acl) +
count * sizeof(struct posix_acl_entry); count * sizeof(struct posix_acl_entry);
@ -51,7 +51,7 @@ posix_acl_alloc(int count, unsigned int __nocast flags)
* Clone an ACL. * Clone an ACL.
*/ */
struct posix_acl * struct posix_acl *
posix_acl_clone(const struct posix_acl *acl, unsigned int __nocast flags) posix_acl_clone(const struct posix_acl *acl, gfp_t flags)
{ {
struct posix_acl *clone = NULL; struct posix_acl *clone = NULL;
@ -185,7 +185,7 @@ posix_acl_equiv_mode(const struct posix_acl *acl, mode_t *mode_p)
* Create an ACL representing the file mode permission bits of an inode. * Create an ACL representing the file mode permission bits of an inode.
*/ */
struct posix_acl * struct posix_acl *
posix_acl_from_mode(mode_t mode, unsigned int __nocast flags) posix_acl_from_mode(mode_t mode, gfp_t flags)
{ {
struct posix_acl *acl = posix_acl_alloc(3, flags); struct posix_acl *acl = posix_acl_alloc(3, flags);
if (!acl) if (!acl)

View File

@ -109,7 +109,7 @@ static void *relay_alloc_buf(struct rchan_buf *buf, unsigned long size)
if (unlikely(!buf->page_array[i])) if (unlikely(!buf->page_array[i]))
goto depopulate; goto depopulate;
} }
mem = vmap(buf->page_array, n_pages, GFP_KERNEL, PAGE_KERNEL); mem = vmap(buf->page_array, n_pages, VM_MAP, PAGE_KERNEL);
if (!mem) if (!mem)
goto depopulate; goto depopulate;

View File

@ -45,7 +45,7 @@
void * void *
kmem_alloc(size_t size, unsigned int __nocast flags) kmem_alloc(size_t size, gfp_t flags)
{ {
int retries = 0; int retries = 0;
unsigned int lflags = kmem_flags_convert(flags); unsigned int lflags = kmem_flags_convert(flags);
@ -67,7 +67,7 @@ kmem_alloc(size_t size, unsigned int __nocast flags)
} }
void * void *
kmem_zalloc(size_t size, unsigned int __nocast flags) kmem_zalloc(size_t size, gfp_t flags)
{ {
void *ptr; void *ptr;
@ -90,7 +90,7 @@ kmem_free(void *ptr, size_t size)
void * void *
kmem_realloc(void *ptr, size_t newsize, size_t oldsize, kmem_realloc(void *ptr, size_t newsize, size_t oldsize,
unsigned int __nocast flags) gfp_t flags)
{ {
void *new; void *new;
@ -105,7 +105,7 @@ kmem_realloc(void *ptr, size_t newsize, size_t oldsize,
} }
void * void *
kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags) kmem_zone_alloc(kmem_zone_t *zone, gfp_t flags)
{ {
int retries = 0; int retries = 0;
unsigned int lflags = kmem_flags_convert(flags); unsigned int lflags = kmem_flags_convert(flags);
@ -124,7 +124,7 @@ kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags)
} }
void * void *
kmem_zone_zalloc(kmem_zone_t *zone, unsigned int __nocast flags) kmem_zone_zalloc(kmem_zone_t *zone, gfp_t flags)
{ {
void *ptr; void *ptr;

View File

@ -81,7 +81,7 @@ typedef unsigned long xfs_pflags_t;
*(NSTATEP) = *(OSTATEP); \ *(NSTATEP) = *(OSTATEP); \
} while (0) } while (0)
static __inline unsigned int kmem_flags_convert(unsigned int __nocast flags) static __inline unsigned int kmem_flags_convert(gfp_t flags)
{ {
unsigned int lflags = __GFP_NOWARN; /* we'll report problems, if need be */ unsigned int lflags = __GFP_NOWARN; /* we'll report problems, if need be */
@ -125,13 +125,12 @@ kmem_zone_destroy(kmem_zone_t *zone)
BUG(); BUG();
} }
extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); extern void *kmem_zone_zalloc(kmem_zone_t *, gfp_t);
extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); extern void *kmem_zone_alloc(kmem_zone_t *, gfp_t);
extern void *kmem_alloc(size_t, unsigned int __nocast); extern void *kmem_alloc(size_t, gfp_t);
extern void *kmem_realloc(void *, size_t, size_t, extern void *kmem_realloc(void *, size_t, size_t, gfp_t);
unsigned int __nocast); extern void *kmem_zalloc(size_t, gfp_t);
extern void *kmem_zalloc(size_t, unsigned int __nocast);
extern void kmem_free(void *, size_t); extern void kmem_free(void *, size_t);
typedef struct shrinker *kmem_shaker_t; typedef struct shrinker *kmem_shaker_t;

View File

@ -215,7 +215,7 @@
#define PC31_AOUT_UART3_RX ( GPIO_GIUS | GPIO_PORTC | GPIO_IN | 31) #define PC31_AOUT_UART3_RX ( GPIO_GIUS | GPIO_PORTC | GPIO_IN | 31)
#define PD6_PF_LSCLK ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 6 ) #define PD6_PF_LSCLK ( GPIO_PORTD | GPIO_OUT | GPIO_PF | 6 )
#define PD7_PF_REV ( GPIO_PORTD | GPIO_PF | 7 ) #define PD7_PF_REV ( GPIO_PORTD | GPIO_PF | 7 )
#define PD7_AF_UART2_DTR ( GPIO_PORTD | GPIO_IN | GPIO_AF | 7 ) #define PD7_AF_UART2_DTR ( GPIO_GIUS | GPIO_PORTD | GPIO_IN | GPIO_AF | 7 )
#define PD7_AIN_SPI2_SCLK ( GPIO_GIUS | GPIO_PORTD | GPIO_AIN | 7 ) #define PD7_AIN_SPI2_SCLK ( GPIO_GIUS | GPIO_PORTD | GPIO_AIN | 7 )
#define PD8_PF_CLS ( GPIO_PORTD | GPIO_PF | 8 ) #define PD8_PF_CLS ( GPIO_PORTD | GPIO_PF | 8 )
#define PD8_AF_UART2_DCD ( GPIO_PORTD | GPIO_OUT | GPIO_AF | 8 ) #define PD8_AF_UART2_DCD ( GPIO_PORTD | GPIO_OUT | GPIO_AF | 8 )

View File

@ -38,6 +38,8 @@
struct scoop_config { struct scoop_config {
unsigned short io_out; unsigned short io_out;
unsigned short io_dir; unsigned short io_dir;
unsigned short suspend_clr;
unsigned short suspend_set;
}; };
/* Structure for linking scoop devices to PCMCIA sockets */ /* Structure for linking scoop devices to PCMCIA sockets */

View File

@ -35,7 +35,7 @@ dma_set_mask(struct device *dev, u64 dma_mask)
static inline void * static inline void *
dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
unsigned int __nocast flag) gfp_t flag)
{ {
BUG_ON(dev->bus != &pci_bus_type); BUG_ON(dev->bus != &pci_bus_type);
@ -168,7 +168,7 @@ dma_set_mask(struct device *dev, u64 dma_mask)
static inline void * static inline void *
dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
unsigned int __nocast flag) gfp_t flag)
{ {
BUG(); BUG();
return NULL; return NULL;

View File

@ -11,7 +11,7 @@
#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)
void *dma_alloc_coherent(struct device *dev, size_t size, void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag); dma_addr_t *dma_handle, gfp_t flag);
void dma_free_coherent(struct device *dev, size_t size, void dma_free_coherent(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_handle); void *vaddr, dma_addr_t dma_handle);

View File

@ -61,7 +61,7 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask)
static inline void *dma_alloc_coherent(struct device *dev, size_t size, static inline void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t * dma_handle, dma_addr_t * dma_handle,
unsigned int __nocast gfp) gfp_t gfp)
{ {
#ifdef CONFIG_NOT_COHERENT_CACHE #ifdef CONFIG_NOT_COHERENT_CACHE
return __dma_alloc_coherent(size, dma_handle, gfp); return __dma_alloc_coherent(size, dma_handle, gfp);

View File

@ -19,7 +19,7 @@
extern int dma_supported(struct device *dev, u64 mask); extern int dma_supported(struct device *dev, u64 mask);
extern int dma_set_mask(struct device *dev, u64 dma_mask); extern int dma_set_mask(struct device *dev, u64 dma_mask);
extern void *dma_alloc_coherent(struct device *dev, size_t size, extern void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag); dma_addr_t *dma_handle, gfp_t flag);
extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
dma_addr_t dma_handle); dma_addr_t dma_handle);
extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
@ -118,7 +118,7 @@ dma_cache_sync(void *vaddr, size_t size,
*/ */
struct dma_mapping_ops { struct dma_mapping_ops {
void * (*alloc_coherent)(struct device *dev, size_t size, void * (*alloc_coherent)(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag); dma_addr_t *dma_handle, gfp_t flag);
void (*free_coherent)(struct device *dev, size_t size, void (*free_coherent)(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_handle); void *vaddr, dma_addr_t dma_handle);
dma_addr_t (*map_single)(struct device *dev, void *ptr, dma_addr_t (*map_single)(struct device *dev, void *ptr,

View File

@ -122,7 +122,7 @@ extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
int nelems, enum dma_data_direction direction); int nelems, enum dma_data_direction direction);
extern void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, extern void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast flag); dma_addr_t *dma_handle, gfp_t flag);
extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, extern void iommu_free_coherent(struct iommu_table *tbl, size_t size,
void *vaddr, dma_addr_t dma_handle); void *vaddr, dma_addr_t dma_handle);
extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,

View File

@ -81,6 +81,7 @@ static inline int hard_smp_processor_id(void)
extern int safe_smp_processor_id(void); extern int safe_smp_processor_id(void);
extern int __cpu_disable(void); extern int __cpu_disable(void);
extern void __cpu_die(unsigned int cpu); extern void __cpu_die(unsigned int cpu);
extern void prefill_possible_map(void);
#endif /* !ASSEMBLY */ #endif /* !ASSEMBLY */

View File

@ -76,6 +76,13 @@ struct atm_dev_stats {
/* set interface ESI */ /* set interface ESI */
#define ATM_SETESIF _IOW('a',ATMIOC_ITF+13,struct atmif_sioc) #define ATM_SETESIF _IOW('a',ATMIOC_ITF+13,struct atmif_sioc)
/* force interface ESI */ /* force interface ESI */
#define ATM_ADDLECSADDR _IOW('a', ATMIOC_ITF+14, struct atmif_sioc)
/* register a LECS address */
#define ATM_DELLECSADDR _IOW('a', ATMIOC_ITF+15, struct atmif_sioc)
/* unregister a LECS address */
#define ATM_GETLECSADDR _IOW('a', ATMIOC_ITF+16, struct atmif_sioc)
/* retrieve LECS address(es) */
#define ATM_GETSTAT _IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc) #define ATM_GETSTAT _IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc)
/* get AAL layer statistics */ /* get AAL layer statistics */
#define ATM_GETSTATZ _IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc) #define ATM_GETSTATZ _IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc)
@ -328,6 +335,8 @@ struct atm_dev_addr {
struct list_head entry; /* next address */ struct list_head entry; /* next address */
}; };
enum atm_addr_type_t { ATM_ADDR_LOCAL, ATM_ADDR_LECS };
struct atm_dev { struct atm_dev {
const struct atmdev_ops *ops; /* device operations; NULL if unused */ const struct atmdev_ops *ops; /* device operations; NULL if unused */
const struct atmphy_ops *phy; /* PHY operations, may be undefined */ const struct atmphy_ops *phy; /* PHY operations, may be undefined */
@ -338,6 +347,7 @@ struct atm_dev {
void *phy_data; /* private PHY date */ void *phy_data; /* private PHY date */
unsigned long flags; /* device flags (ATM_DF_*) */ unsigned long flags; /* device flags (ATM_DF_*) */
struct list_head local; /* local ATM addresses */ struct list_head local; /* local ATM addresses */
struct list_head lecs; /* LECS ATM addresses learned via ILMI */
unsigned char esi[ESI_LEN]; /* ESI ("MAC" addr) */ unsigned char esi[ESI_LEN]; /* ESI ("MAC" addr) */
struct atm_cirange ci_range; /* VPI/VCI range */ struct atm_cirange ci_range; /* VPI/VCI range */
struct k_atm_dev_stats stats; /* statistics */ struct k_atm_dev_stats stats; /* statistics */
@ -457,7 +467,7 @@ static inline void atm_dev_put(struct atm_dev *dev)
int atm_charge(struct atm_vcc *vcc,int truesize); int atm_charge(struct atm_vcc *vcc,int truesize);
struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size, struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
unsigned int __nocast gfp_flags); gfp_t gfp_flags);
int atm_pcr_goal(struct atm_trafprm *tp); int atm_pcr_goal(struct atm_trafprm *tp);
void vcc_release_async(struct atm_vcc *vcc, int reply); void vcc_release_async(struct atm_vcc *vcc, int reply);

View File

@ -276,8 +276,8 @@ extern void bio_pair_release(struct bio_pair *dbio);
extern struct bio_set *bioset_create(int, int, int); extern struct bio_set *bioset_create(int, int, int);
extern void bioset_free(struct bio_set *); extern void bioset_free(struct bio_set *);
extern struct bio *bio_alloc(unsigned int __nocast, int); extern struct bio *bio_alloc(gfp_t, int);
extern struct bio *bio_alloc_bioset(unsigned int __nocast, int, struct bio_set *); extern struct bio *bio_alloc_bioset(gfp_t, int, struct bio_set *);
extern void bio_put(struct bio *); extern void bio_put(struct bio *);
extern void bio_free(struct bio *, struct bio_set *); extern void bio_free(struct bio *, struct bio_set *);
@ -287,7 +287,7 @@ extern int bio_phys_segments(struct request_queue *, struct bio *);
extern int bio_hw_segments(struct request_queue *, struct bio *); extern int bio_hw_segments(struct request_queue *, struct bio *);
extern void __bio_clone(struct bio *, struct bio *); extern void __bio_clone(struct bio *, struct bio *);
extern struct bio *bio_clone(struct bio *, unsigned int __nocast); extern struct bio *bio_clone(struct bio *, gfp_t);
extern void bio_init(struct bio *); extern void bio_init(struct bio *);

View File

@ -172,7 +172,7 @@ void __brelse(struct buffer_head *);
void __bforget(struct buffer_head *); void __bforget(struct buffer_head *);
void __breadahead(struct block_device *, sector_t block, int size); void __breadahead(struct block_device *, sector_t block, int size);
struct buffer_head *__bread(struct block_device *, sector_t block, int size); struct buffer_head *__bread(struct block_device *, sector_t block, int size);
struct buffer_head *alloc_buffer_head(unsigned int __nocast gfp_flags); struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
void free_buffer_head(struct buffer_head * bh); void free_buffer_head(struct buffer_head * bh);
void FASTCALL(unlock_buffer(struct buffer_head *bh)); void FASTCALL(unlock_buffer(struct buffer_head *bh));
void FASTCALL(__lock_buffer(struct buffer_head *bh)); void FASTCALL(__lock_buffer(struct buffer_head *bh));

View File

@ -149,7 +149,7 @@ struct cn_dev {
int cn_add_callback(struct cb_id *, char *, void (*callback) (void *)); int cn_add_callback(struct cb_id *, char *, void (*callback) (void *));
void cn_del_callback(struct cb_id *); void cn_del_callback(struct cb_id *);
int cn_netlink_send(struct cn_msg *, u32, unsigned int __nocast); int cn_netlink_send(struct cn_msg *, u32, gfp_t);
int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)); int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *));
void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);

View File

@ -23,7 +23,7 @@ void cpuset_init_current_mems_allowed(void);
void cpuset_update_current_mems_allowed(void); void cpuset_update_current_mems_allowed(void);
void cpuset_restrict_to_mems_allowed(unsigned long *nodes); void cpuset_restrict_to_mems_allowed(unsigned long *nodes);
int cpuset_zonelist_valid_mems_allowed(struct zonelist *zl); int cpuset_zonelist_valid_mems_allowed(struct zonelist *zl);
extern int cpuset_zone_allowed(struct zone *z, unsigned int __nocast gfp_mask); extern int cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask);
extern int cpuset_excl_nodes_overlap(const struct task_struct *p); extern int cpuset_excl_nodes_overlap(const struct task_struct *p);
extern struct file_operations proc_cpuset_operations; extern struct file_operations proc_cpuset_operations;
extern char *cpuset_task_status_allowed(struct task_struct *task, char *buffer); extern char *cpuset_task_status_allowed(struct task_struct *task, char *buffer);
@ -49,8 +49,7 @@ static inline int cpuset_zonelist_valid_mems_allowed(struct zonelist *zl)
return 1; return 1;
} }
static inline int cpuset_zone_allowed(struct zone *z, static inline int cpuset_zone_allowed(struct zone *z, gfp_t gfp_mask)
unsigned int __nocast gfp_mask)
{ {
return 1; return 1;
} }

View File

@ -19,7 +19,7 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev,
void dma_pool_destroy(struct dma_pool *pool); void dma_pool_destroy(struct dma_pool *pool);
void *dma_pool_alloc(struct dma_pool *pool, unsigned int __nocast mem_flags, void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
dma_addr_t *handle); dma_addr_t *handle);
void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr); void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);

View File

@ -85,9 +85,9 @@ static inline void arch_free_page(struct page *page, int order) { }
#endif #endif
extern struct page * extern struct page *
FASTCALL(__alloc_pages(unsigned int, unsigned int, struct zonelist *)); FASTCALL(__alloc_pages(gfp_t, unsigned int, struct zonelist *));
static inline struct page *alloc_pages_node(int nid, unsigned int __nocast gfp_mask, static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
unsigned int order) unsigned int order)
{ {
if (unlikely(order >= MAX_ORDER)) if (unlikely(order >= MAX_ORDER))
@ -98,17 +98,17 @@ static inline struct page *alloc_pages_node(int nid, unsigned int __nocast gfp_m
} }
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
extern struct page *alloc_pages_current(unsigned int __nocast gfp_mask, unsigned order); extern struct page *alloc_pages_current(gfp_t gfp_mask, unsigned order);
static inline struct page * static inline struct page *
alloc_pages(unsigned int __nocast gfp_mask, unsigned int order) alloc_pages(gfp_t gfp_mask, unsigned int order)
{ {
if (unlikely(order >= MAX_ORDER)) if (unlikely(order >= MAX_ORDER))
return NULL; return NULL;
return alloc_pages_current(gfp_mask, order); return alloc_pages_current(gfp_mask, order);
} }
extern struct page *alloc_page_vma(unsigned __nocast gfp_mask, extern struct page *alloc_page_vma(gfp_t gfp_mask,
struct vm_area_struct *vma, unsigned long addr); struct vm_area_struct *vma, unsigned long addr);
#else #else
#define alloc_pages(gfp_mask, order) \ #define alloc_pages(gfp_mask, order) \
@ -117,8 +117,8 @@ extern struct page *alloc_page_vma(unsigned __nocast gfp_mask,
#endif #endif
#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
extern unsigned long FASTCALL(__get_free_pages(unsigned int __nocast gfp_mask, unsigned int order)); extern unsigned long FASTCALL(__get_free_pages(gfp_t gfp_mask, unsigned int order));
extern unsigned long FASTCALL(get_zeroed_page(unsigned int __nocast gfp_mask)); extern unsigned long FASTCALL(get_zeroed_page(gfp_t gfp_mask));
#define __get_free_page(gfp_mask) \ #define __get_free_page(gfp_mask) \
__get_free_pages((gfp_mask),0) __get_free_pages((gfp_mask),0)

View File

@ -935,7 +935,7 @@ void journal_put_journal_head(struct journal_head *jh);
*/ */
extern kmem_cache_t *jbd_handle_cache; extern kmem_cache_t *jbd_handle_cache;
static inline handle_t *jbd_alloc_handle(unsigned int __nocast gfp_flags) static inline handle_t *jbd_alloc_handle(gfp_t gfp_flags)
{ {
return kmem_cache_alloc(jbd_handle_cache, gfp_flags); return kmem_cache_alloc(jbd_handle_cache, gfp_flags);
} }

View File

@ -38,97 +38,16 @@ struct keyring_list {
struct key *keys[0]; struct key *keys[0];
}; };
/* /*
* check to see whether permission is granted to use a key in the desired way * check to see whether permission is granted to use a key in the desired way
*/ */
extern int key_task_permission(const key_ref_t key_ref,
struct task_struct *context,
key_perm_t perm);
static inline int key_permission(const key_ref_t key_ref, key_perm_t perm) static inline int key_permission(const key_ref_t key_ref, key_perm_t perm)
{ {
struct key *key = key_ref_to_ptr(key_ref); return key_task_permission(key_ref, current, perm);
key_perm_t kperm;
if (is_key_possessed(key_ref))
kperm = key->perm >> 24;
else if (key->uid == current->fsuid)
kperm = key->perm >> 16;
else if (key->gid != -1 &&
key->perm & KEY_GRP_ALL &&
in_group_p(key->gid)
)
kperm = key->perm >> 8;
else
kperm = key->perm;
kperm = kperm & perm & KEY_ALL;
return kperm == perm;
}
/*
* check to see whether permission is granted to use a key in at least one of
* the desired ways
*/
static inline int key_any_permission(const key_ref_t key_ref, key_perm_t perm)
{
struct key *key = key_ref_to_ptr(key_ref);
key_perm_t kperm;
if (is_key_possessed(key_ref))
kperm = key->perm >> 24;
else if (key->uid == current->fsuid)
kperm = key->perm >> 16;
else if (key->gid != -1 &&
key->perm & KEY_GRP_ALL &&
in_group_p(key->gid)
)
kperm = key->perm >> 8;
else
kperm = key->perm;
kperm = kperm & perm & KEY_ALL;
return kperm != 0;
}
static inline int key_task_groups_search(struct task_struct *tsk, gid_t gid)
{
int ret;
task_lock(tsk);
ret = groups_search(tsk->group_info, gid);
task_unlock(tsk);
return ret;
}
static inline int key_task_permission(const key_ref_t key_ref,
struct task_struct *context,
key_perm_t perm)
{
struct key *key = key_ref_to_ptr(key_ref);
key_perm_t kperm;
if (is_key_possessed(key_ref)) {
kperm = key->perm >> 24;
}
else if (key->uid == context->fsuid) {
kperm = key->perm >> 16;
}
else if (key->gid != -1 &&
key->perm & KEY_GRP_ALL && (
key->gid == context->fsgid ||
key_task_groups_search(context, key->gid)
)
) {
kperm = key->perm >> 8;
}
else {
kperm = key->perm;
}
kperm = kperm & perm & KEY_ALL;
return kperm == perm;
} }
extern key_ref_t lookup_user_key(struct task_struct *context, extern key_ref_t lookup_user_key(struct task_struct *context,

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