forked from Minki/linux
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
1f8d31d189
@ -675,7 +675,7 @@ sub-domain of the parent domain.
|
||||
|
||||
Support for power domains is provided through the :c:member:`pm_domain` field of
|
||||
|struct device|. This field is a pointer to an object of type
|
||||
|struct dev_pm_domain|, defined in :file:`include/linux/pm.h``, providing a set
|
||||
|struct dev_pm_domain|, defined in :file:`include/linux/pm.h`, providing a set
|
||||
of power management callbacks analogous to the subsystem-level and device driver
|
||||
callbacks that are executed for the given device during all power transitions,
|
||||
instead of the respective subsystem-level callbacks. Specifically, if a
|
||||
|
@ -41,6 +41,11 @@ Igor Mammedov (DFS support)
|
||||
Jeff Layton (many, many fixes, as well as great work on the cifs Kerberos code)
|
||||
Scott Lovenberg
|
||||
Pavel Shilovsky (for great work adding SMB2 support, and various SMB3 features)
|
||||
Aurelien Aptel (for DFS SMB3 work and some key bug fixes)
|
||||
Ronnie Sahlberg (for SMB3 xattr work and bug fixes)
|
||||
Shirish Pargaonkar (for many ACL patches over the years)
|
||||
Sachin Prabhu (many bug fixes, including for reconnect, copy offload and security)
|
||||
|
||||
|
||||
Test case and Bug Report contributors
|
||||
-------------------------------------
|
||||
|
@ -1,10 +1,14 @@
|
||||
The CIFS VFS support for Linux supports many advanced network filesystem
|
||||
features such as hierarchical dfs like namespace, hardlinks, locking and more.
|
||||
This module supports the SMB3 family of advanced network protocols (as well
|
||||
as older dialects, originally called "CIFS" or SMB1).
|
||||
|
||||
The CIFS VFS module for Linux supports many advanced network filesystem
|
||||
features such as hierarchical DFS like namespace, hardlinks, locking and more.
|
||||
It was designed to comply with the SNIA CIFS Technical Reference (which
|
||||
supersedes the 1992 X/Open SMB Standard) as well as to perform best practice
|
||||
practical interoperability with Windows 2000, Windows XP, Samba and equivalent
|
||||
servers. This code was developed in participation with the Protocol Freedom
|
||||
Information Foundation.
|
||||
Information Foundation. CIFS and now SMB3 has now become a defacto
|
||||
standard for interoperating between Macs and Windows and major NAS appliances.
|
||||
|
||||
Please see
|
||||
http://protocolfreedom.org/ and
|
||||
@ -15,30 +19,11 @@ for more details.
|
||||
For questions or bug reports please contact:
|
||||
sfrench@samba.org (sfrench@us.ibm.com)
|
||||
|
||||
See the project page at: https://wiki.samba.org/index.php/LinuxCIFS_utils
|
||||
|
||||
Build instructions:
|
||||
==================
|
||||
For Linux 2.4:
|
||||
1) Get the kernel source (e.g.from http://www.kernel.org)
|
||||
and download the cifs vfs source (see the project page
|
||||
at http://us1.samba.org/samba/Linux_CIFS_client.html)
|
||||
and change directory into the top of the kernel directory
|
||||
then patch the kernel (e.g. "patch -p1 < cifs_24.patch")
|
||||
to add the cifs vfs to your kernel configure options if
|
||||
it has not already been added (e.g. current SuSE and UL
|
||||
users do not need to apply the cifs_24.patch since the cifs vfs is
|
||||
already in the kernel configure menu) and then
|
||||
mkdir linux/fs/cifs and then copy the current cifs vfs files from
|
||||
the cifs download to your kernel build directory e.g.
|
||||
|
||||
cp <cifs_download_dir>/fs/cifs/* to <kernel_download_dir>/fs/cifs
|
||||
|
||||
2) make menuconfig (or make xconfig)
|
||||
3) select cifs from within the network filesystem choices
|
||||
4) save and exit
|
||||
5) make dep
|
||||
6) make modules (or "make" if CIFS VFS not to be built as a module)
|
||||
|
||||
For Linux 2.6:
|
||||
For Linux:
|
||||
1) Download the kernel (e.g. from http://www.kernel.org)
|
||||
and change directory into the top of the kernel directory tree
|
||||
(e.g. /usr/src/linux-2.5.73)
|
||||
@ -61,16 +46,13 @@ would simply type "make install").
|
||||
If you do not have the utility mount.cifs (in the Samba 3.0 source tree and on
|
||||
the CIFS VFS web site) copy it to the same directory in which mount.smbfs and
|
||||
similar files reside (usually /sbin). Although the helper software is not
|
||||
required, mount.cifs is recommended. Eventually the Samba 3.0 utility program
|
||||
"net" may also be helpful since it may someday provide easier mount syntax for
|
||||
users who are used to Windows e.g.
|
||||
net use <mount point> <UNC name or cifs URL>
|
||||
required, mount.cifs is recommended. Most distros include a "cifs-utils"
|
||||
package that includes this utility so it is recommended to install this.
|
||||
|
||||
Note that running the Winbind pam/nss module (logon service) on all of your
|
||||
Linux clients is useful in mapping Uids and Gids consistently across the
|
||||
domain to the proper network user. The mount.cifs mount helper can be
|
||||
trivially built from Samba 3.0 or later source e.g. by executing:
|
||||
|
||||
gcc samba/source/client/mount.cifs.c -o mount.cifs
|
||||
found at cifs-utils.git on git.samba.org
|
||||
|
||||
If cifs is built as a module, then the size and number of network buffers
|
||||
and maximum number of simultaneous requests to one server can be configured.
|
||||
@ -79,6 +61,18 @@ Changing these from their defaults is not recommended. By executing modinfo
|
||||
on kernel/fs/cifs/cifs.ko the list of configuration changes that can be made
|
||||
at module initialization time (by running insmod cifs.ko) can be seen.
|
||||
|
||||
Recommendations
|
||||
===============
|
||||
To improve security the SMB2.1 dialect or later (usually will get SMB3) is now
|
||||
the new default. To use old dialects (e.g. to mount Windows XP) use "vers=1.0"
|
||||
on mount (or vers=2.0 for Windows Vista). Note that the CIFS (vers=1.0) is
|
||||
much older and less secure than the default dialect SMB3 which includes
|
||||
many advanced security features such as downgrade attack detection
|
||||
and encrypted shares and stronger signing and authentication algorithms.
|
||||
There are additional mount options that may be helpful for SMB3 to get
|
||||
improved POSIX behavior (NB: can use vers=3.0 to force only SMB3, never 2.1):
|
||||
"mfsymlinks" and "cifsacl" and "idsfromsid"
|
||||
|
||||
Allowing User Mounts
|
||||
====================
|
||||
To permit users to mount and unmount over directories they own is possible
|
||||
@ -98,9 +92,7 @@ and execution of suid programs on the remote target would be enabled
|
||||
by default. This can be changed, as with nfs and other filesystems,
|
||||
by simply specifying "nosuid" among the mount options. For user mounts
|
||||
though to be able to pass the suid flag to mount requires rebuilding
|
||||
mount.cifs with the following flag:
|
||||
|
||||
gcc samba/source/client/mount.cifs.c -DCIFS_ALLOW_USR_SUID -o mount.cifs
|
||||
mount.cifs with the following flag: CIFS_ALLOW_USR_SUID
|
||||
|
||||
There is a corresponding manual page for cifs mounting in the Samba 3.0 and
|
||||
later source tree in docs/manpages/mount.cifs.8
|
||||
@ -189,18 +181,18 @@ applications running on the same server as Samba.
|
||||
Use instructions:
|
||||
================
|
||||
Once the CIFS VFS support is built into the kernel or installed as a module
|
||||
(cifs.o), you can use mount syntax like the following to access Samba or Windows
|
||||
servers:
|
||||
(cifs.ko), you can use mount syntax like the following to access Samba or
|
||||
Mac or Windows servers:
|
||||
|
||||
mount -t cifs //9.53.216.11/e$ /mnt -o user=myname,pass=mypassword
|
||||
mount -t cifs //9.53.216.11/e$ /mnt -o username=myname,password=mypassword
|
||||
|
||||
Before -o the option -v may be specified to make the mount.cifs
|
||||
mount helper display the mount steps more verbosely.
|
||||
After -o the following commonly used cifs vfs specific options
|
||||
are supported:
|
||||
|
||||
user=<username>
|
||||
pass=<password>
|
||||
username=<username>
|
||||
password=<password>
|
||||
domain=<domain name>
|
||||
|
||||
Other cifs mount options are described below. Use of TCP names (in addition to
|
||||
@ -246,13 +238,16 @@ the Server's registry. Samba starting with version 3.10 will allow such
|
||||
filenames (ie those which contain valid Linux characters, which normally
|
||||
would be forbidden for Windows/CIFS semantics) as long as the server is
|
||||
configured for Unix Extensions (and the client has not disabled
|
||||
/proc/fs/cifs/LinuxExtensionsEnabled).
|
||||
|
||||
/proc/fs/cifs/LinuxExtensionsEnabled). In addition the mount option
|
||||
"mapposix" can be used on CIFS (vers=1.0) to force the mapping of
|
||||
illegal Windows/NTFS/SMB characters to a remap range (this mount parm
|
||||
is the default for SMB3). This remap ("mapposix") range is also
|
||||
compatible with Mac (and "Services for Mac" on some older Windows).
|
||||
|
||||
CIFS VFS Mount Options
|
||||
======================
|
||||
A partial list of the supported mount options follows:
|
||||
user The user name to use when trying to establish
|
||||
username The user name to use when trying to establish
|
||||
the CIFS session.
|
||||
password The user password. If the mount helper is
|
||||
installed, the user will be prompted for password
|
||||
|
@ -1,4 +1,4 @@
|
||||
Version 2.03 August 1, 2014
|
||||
Version 2.04 September 13, 2017
|
||||
|
||||
A Partial List of Missing Features
|
||||
==================================
|
||||
@ -8,73 +8,69 @@ for visible, important contributions to this module. Here
|
||||
is a partial list of the known problems and missing features:
|
||||
|
||||
a) SMB3 (and SMB3.02) missing optional features:
|
||||
- RDMA
|
||||
- RDMA (started)
|
||||
- multichannel (started)
|
||||
- directory leases (improved metadata caching)
|
||||
- T10 copy offload (copy chunk is only mechanism supported)
|
||||
- encrypted shares
|
||||
|
||||
b) improved sparse file support
|
||||
|
||||
c) Directory entry caching relies on a 1 second timer, rather than
|
||||
using FindNotify or equivalent. - (started)
|
||||
using Directory Leases
|
||||
|
||||
d) quota support (needs minor kernel change since quota calls
|
||||
to make it to network filesystems or deviceless filesystems)
|
||||
|
||||
e) improve support for very old servers (OS/2 and Win9x for example)
|
||||
Including support for changing the time remotely (utimes command).
|
||||
e) Better optimize open to reduce redundant opens (using reference
|
||||
counts more) and to improve use of compounding in SMB3 to reduce
|
||||
number of roundtrips.
|
||||
|
||||
f) hook lower into the sockets api (as NFS/SunRPC does) to avoid the
|
||||
extra copy in/out of the socket buffers in some cases.
|
||||
|
||||
g) Better optimize open (and pathbased setfilesize) to reduce the
|
||||
oplock breaks coming from windows srv. Piggyback identical file
|
||||
opens on top of each other by incrementing reference count rather
|
||||
than resending (helps reduce server resource utilization and avoid
|
||||
spurious oplock breaks).
|
||||
|
||||
h) Add support for storing symlink info to Windows servers
|
||||
in the Extended Attribute format their SFU clients would recognize.
|
||||
|
||||
i) Finish inotify support so kde and gnome file list windows
|
||||
f) Finish inotify support so kde and gnome file list windows
|
||||
will autorefresh (partially complete by Asser). Needs minor kernel
|
||||
vfs change to support removing D_NOTIFY on a file.
|
||||
|
||||
j) Add GUI tool to configure /proc/fs/cifs settings and for display of
|
||||
g) Add GUI tool to configure /proc/fs/cifs settings and for display of
|
||||
the CIFS statistics (started)
|
||||
|
||||
k) implement support for security and trusted categories of xattrs
|
||||
h) implement support for security and trusted categories of xattrs
|
||||
(requires minor protocol extension) to enable better support for SELINUX
|
||||
|
||||
l) Implement O_DIRECT flag on open (already supported on mount)
|
||||
i) Implement O_DIRECT flag on open (already supported on mount)
|
||||
|
||||
m) Create UID mapping facility so server UIDs can be mapped on a per
|
||||
j) Create UID mapping facility so server UIDs can be mapped on a per
|
||||
mount or a per server basis to client UIDs or nobody if no mapping
|
||||
exists. This is helpful when Unix extensions are negotiated to
|
||||
allow better permission checking when UIDs differ on the server
|
||||
and client. Add new protocol request to the CIFS protocol
|
||||
standard for asking the server for the corresponding name of a
|
||||
particular uid.
|
||||
exists. Also better integration with winbind for resolving SID owners
|
||||
|
||||
n) DOS attrs - returned as pseudo-xattr in Samba format (check VFAT and NTFS for this too)
|
||||
k) Add tools to take advantage of more smb3 specific ioctls and features
|
||||
|
||||
o) mount check for unmatched uids
|
||||
l) encrypted file support
|
||||
|
||||
p) Add support for new vfs entry point for fallocate
|
||||
m) improved stats gathering, tools (perhaps integration with nfsometer?)
|
||||
|
||||
q) Add tools to take advantage of cifs/smb3 specific ioctls and features
|
||||
such as "CopyChunk" (fast server side file copy)
|
||||
n) allow setting more NTFS/SMB3 file attributes remotely (currently limited to compressed
|
||||
file attribute via chflags) and improve user space tools for managing and
|
||||
viewing them.
|
||||
|
||||
r) encrypted file support
|
||||
o) mount helper GUI (to simplify the various configuration options on mount)
|
||||
|
||||
s) improved stats gathering, tools (perhaps integration with nfsometer?)
|
||||
p) autonegotiation of dialects (offering more than one dialect ie SMB3.02,
|
||||
SMB3, SMB2.1 not just SMB3).
|
||||
|
||||
t) allow setting more NTFS/SMB3 file attributes remotely (currently limited to compressed
|
||||
file attribute via chflags)
|
||||
q) Allow mount.cifs to be more verbose in reporting errors with dialect
|
||||
or unsupported feature errors.
|
||||
|
||||
u) mount helper GUI (to simplify the various configuration options on mount)
|
||||
r) updating cifs documentation, and user guid.
|
||||
|
||||
s) Addressing bugs found by running a broader set of xfstests in standard
|
||||
file system xfstest suite.
|
||||
|
||||
t) split cifs and smb3 support into separate modules so legacy (and less
|
||||
secure) CIFS dialect can be disabled in environments that don't need it
|
||||
and simplify the code.
|
||||
|
||||
u) Finish up SMB3.1.1 dialect support
|
||||
|
||||
v) POSIX Extensions for SMB3.1.1
|
||||
|
||||
KNOWN BUGS
|
||||
====================================
|
||||
|
@ -1,24 +1,28 @@
|
||||
This is the client VFS module for the Common Internet File System
|
||||
(CIFS) protocol which is the successor to the Server Message Block
|
||||
This is the client VFS module for the SMB3 NAS protocol as well
|
||||
older dialects such as the Common Internet File System (CIFS)
|
||||
protocol which was the successor to the Server Message Block
|
||||
(SMB) protocol, the native file sharing mechanism for most early
|
||||
PC operating systems. New and improved versions of CIFS are now
|
||||
called SMB2 and SMB3. These dialects are also supported by the
|
||||
CIFS VFS module. CIFS is fully supported by network
|
||||
file servers such as Windows 2000, 2003, 2008 and 2012
|
||||
file servers such as Windows 2000, 2003, 2008, 2012 and 2016
|
||||
as well by Samba (which provides excellent CIFS
|
||||
server support for Linux and many other operating systems), so
|
||||
server support for Linux and many other operating systems), Apple
|
||||
systems, as well as most Network Attached Storage vendors, so
|
||||
this network filesystem client can mount to a wide variety of
|
||||
servers.
|
||||
|
||||
The intent of this module is to provide the most advanced network
|
||||
file system function for CIFS compliant servers, including better
|
||||
POSIX compliance, secure per-user session establishment, high
|
||||
performance safe distributed caching (oplock), optional packet
|
||||
file system function for SMB3 compliant servers, including advanced
|
||||
security features, excellent parallelized high performance i/o, better
|
||||
POSIX compliance, secure per-user session establishment, encryption,
|
||||
high performance safe distributed caching (leases/oplocks), optional packet
|
||||
signing, large files, Unicode support and other internationalization
|
||||
improvements. Since both Samba server and this filesystem client support
|
||||
the CIFS Unix extensions, the combination can provide a reasonable
|
||||
alternative to NFSv4 for fileserving in some Linux to Linux environments,
|
||||
not just in Linux to Windows environments.
|
||||
the CIFS Unix extensions (and in the future SMB3 POSIX extensions),
|
||||
the combination can provide a reasonable alternative to other network and
|
||||
cluster file systems for fileserving in some Linux to Linux environments,
|
||||
not just in Linux to Windows (or Linux to Mac) environments.
|
||||
|
||||
This filesystem has an mount utility (mount.cifs) that can be obtained from
|
||||
|
||||
|
@ -337,7 +337,7 @@ Examples for low-level BPF:
|
||||
jeq #14, good /* __NR_rt_sigprocmask */
|
||||
jeq #13, good /* __NR_rt_sigaction */
|
||||
jeq #35, good /* __NR_nanosleep */
|
||||
bad: ret #0 /* SECCOMP_RET_KILL */
|
||||
bad: ret #0 /* SECCOMP_RET_KILL_THREAD */
|
||||
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
|
||||
|
||||
The above example code can be placed into a file (here called "foo"), and
|
||||
|
@ -1680,6 +1680,9 @@ accept_dad - INTEGER
|
||||
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
|
||||
link-local address has been found.
|
||||
|
||||
DAD operation and mode on a given interface will be selected according
|
||||
to the maximum value of conf/{all,interface}/accept_dad.
|
||||
|
||||
force_tllao - BOOLEAN
|
||||
Enable sending the target link-layer address option even when
|
||||
responding to a unicast neighbor solicitation.
|
||||
@ -1727,16 +1730,23 @@ suppress_frag_ndisc - INTEGER
|
||||
|
||||
optimistic_dad - BOOLEAN
|
||||
Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
|
||||
0: disabled (default)
|
||||
1: enabled
|
||||
0: disabled (default)
|
||||
1: enabled
|
||||
|
||||
Optimistic Duplicate Address Detection for the interface will be enabled
|
||||
if at least one of conf/{all,interface}/optimistic_dad is set to 1,
|
||||
it will be disabled otherwise.
|
||||
|
||||
use_optimistic - BOOLEAN
|
||||
If enabled, do not classify optimistic addresses as deprecated during
|
||||
source address selection. Preferred addresses will still be chosen
|
||||
before optimistic addresses, subject to other ranking in the source
|
||||
address selection algorithm.
|
||||
0: disabled (default)
|
||||
1: enabled
|
||||
0: disabled (default)
|
||||
1: enabled
|
||||
|
||||
This will be enabled if at least one of
|
||||
conf/{all,interface}/use_optimistic is set to 1, disabled otherwise.
|
||||
|
||||
stable_secret - IPv6 address
|
||||
This IPv6 address will be used as a secret to generate IPv6
|
||||
|
@ -13,42 +13,42 @@ an example setup using a data-center-class switch ASIC chip. Other setups
|
||||
with SR-IOV or soft switches, such as OVS, are possible.
|
||||
|
||||
|
||||
User-space tools
|
||||
User-space tools
|
||||
|
||||
user space |
|
||||
+-------------------------------------------------------------------+
|
||||
kernel | Netlink
|
||||
|
|
||||
+--------------+-------------------------------+
|
||||
| Network stack |
|
||||
| (Linux) |
|
||||
| |
|
||||
+----------------------------------------------+
|
||||
user space |
|
||||
+-------------------------------------------------------------------+
|
||||
kernel | Netlink
|
||||
|
|
||||
+--------------+-------------------------------+
|
||||
| Network stack |
|
||||
| (Linux) |
|
||||
| |
|
||||
+----------------------------------------------+
|
||||
|
||||
sw1p2 sw1p4 sw1p6
|
||||
sw1p1 + sw1p3 + sw1p5 + eth1
|
||||
+ | + | + | +
|
||||
| | | | | | |
|
||||
+--+----+----+----+-+--+----+---+ +-----+-----+
|
||||
| Switch driver | | mgmt |
|
||||
| (this document) | | driver |
|
||||
| | | |
|
||||
+--------------+----------------+ +-----------+
|
||||
|
|
||||
kernel | HW bus (eg PCI)
|
||||
+-------------------------------------------------------------------+
|
||||
hardware |
|
||||
+--------------+---+------------+
|
||||
| Switch device (sw1) |
|
||||
| +----+ +--------+
|
||||
| | v offloaded data path | mgmt port
|
||||
| | | |
|
||||
+--|----|----+----+----+----+---+
|
||||
| | | | | |
|
||||
+ + + + + +
|
||||
p1 p2 p3 p4 p5 p6
|
||||
sw1p1 + sw1p3 + sw1p5 + eth1
|
||||
+ | + | + | +
|
||||
| | | | | | |
|
||||
+--+----+----+----+----+----+---+ +-----+-----+
|
||||
| Switch driver | | mgmt |
|
||||
| (this document) | | driver |
|
||||
| | | |
|
||||
+--------------+----------------+ +-----------+
|
||||
|
|
||||
kernel | HW bus (eg PCI)
|
||||
+-------------------------------------------------------------------+
|
||||
hardware |
|
||||
+--------------+----------------+
|
||||
| Switch device (sw1) |
|
||||
| +----+ +--------+
|
||||
| | v offloaded data path | mgmt port
|
||||
| | | |
|
||||
+--|----|----+----+----+----+---+
|
||||
| | | | | |
|
||||
+ + + + + +
|
||||
p1 p2 p3 p4 p5 p6
|
||||
|
||||
front-panel ports
|
||||
front-panel ports
|
||||
|
||||
|
||||
Fig 1.
|
||||
|
@ -75,6 +75,7 @@ show up in /proc/sys/kernel:
|
||||
- reboot-cmd [ SPARC only ]
|
||||
- rtsig-max
|
||||
- rtsig-nr
|
||||
- seccomp/ ==> Documentation/userspace-api/seccomp_filter.rst
|
||||
- sem
|
||||
- sem_next_id [ sysv ipc ]
|
||||
- sg-big-buff [ generic SCSI device (sg) ]
|
||||
|
@ -87,11 +87,16 @@ Return values
|
||||
A seccomp filter may return any of the following values. If multiple
|
||||
filters exist, the return value for the evaluation of a given system
|
||||
call will always use the highest precedent value. (For example,
|
||||
``SECCOMP_RET_KILL`` will always take precedence.)
|
||||
``SECCOMP_RET_KILL_PROCESS`` will always take precedence.)
|
||||
|
||||
In precedence order, they are:
|
||||
|
||||
``SECCOMP_RET_KILL``:
|
||||
``SECCOMP_RET_KILL_PROCESS``:
|
||||
Results in the entire process exiting immediately without executing
|
||||
the system call. The exit status of the task (``status & 0x7f``)
|
||||
will be ``SIGSYS``, not ``SIGKILL``.
|
||||
|
||||
``SECCOMP_RET_KILL_THREAD``:
|
||||
Results in the task exiting immediately without executing the
|
||||
system call. The exit status of the task (``status & 0x7f``) will
|
||||
be ``SIGSYS``, not ``SIGKILL``.
|
||||
@ -141,6 +146,15 @@ In precedence order, they are:
|
||||
allow use of ptrace, even of other sandboxed processes, without
|
||||
extreme care; ptracers can use this mechanism to escape.)
|
||||
|
||||
``SECCOMP_RET_LOG``:
|
||||
Results in the system call being executed after it is logged. This
|
||||
should be used by application developers to learn which syscalls their
|
||||
application needs without having to iterate through multiple test and
|
||||
development cycles to build the list.
|
||||
|
||||
This action will only be logged if "log" is present in the
|
||||
actions_logged sysctl string.
|
||||
|
||||
``SECCOMP_RET_ALLOW``:
|
||||
Results in the system call being executed.
|
||||
|
||||
@ -169,7 +183,41 @@ The ``samples/seccomp/`` directory contains both an x86-specific example
|
||||
and a more generic example of a higher level macro interface for BPF
|
||||
program generation.
|
||||
|
||||
Sysctls
|
||||
=======
|
||||
|
||||
Seccomp's sysctl files can be found in the ``/proc/sys/kernel/seccomp/``
|
||||
directory. Here's a description of each file in that directory:
|
||||
|
||||
``actions_avail``:
|
||||
A read-only ordered list of seccomp return values (refer to the
|
||||
``SECCOMP_RET_*`` macros above) in string form. The ordering, from
|
||||
left-to-right, is the least permissive return value to the most
|
||||
permissive return value.
|
||||
|
||||
The list represents the set of seccomp return values supported
|
||||
by the kernel. A userspace program may use this list to
|
||||
determine if the actions found in the ``seccomp.h``, when the
|
||||
program was built, differs from the set of actions actually
|
||||
supported in the current running kernel.
|
||||
|
||||
``actions_logged``:
|
||||
A read-write ordered list of seccomp return values (refer to the
|
||||
``SECCOMP_RET_*`` macros above) that are allowed to be logged. Writes
|
||||
to the file do not need to be in ordered form but reads from the file
|
||||
will be ordered in the same way as the actions_avail sysctl.
|
||||
|
||||
It is important to note that the value of ``actions_logged`` does not
|
||||
prevent certain actions from being logged when the audit subsystem is
|
||||
configured to audit a task. If the action is not found in
|
||||
``actions_logged`` list, the final decision on whether to audit the
|
||||
action for that task is ultimately left up to the audit subsystem to
|
||||
decide for all seccomp return values other than ``SECCOMP_RET_ALLOW``.
|
||||
|
||||
The ``allow`` string is not accepted in the ``actions_logged`` sysctl
|
||||
as it is not possible to log ``SECCOMP_RET_ALLOW`` actions. Attempting
|
||||
to write ``allow`` to the sysctl will result in an EINVAL being
|
||||
returned.
|
||||
|
||||
Adding architecture support
|
||||
===========================
|
||||
|
18
MAINTAINERS
18
MAINTAINERS
@ -352,6 +352,18 @@ L: linux-acpi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/acpi/arm64
|
||||
|
||||
ACPI PMIC DRIVERS
|
||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
M: Len Brown <lenb@kernel.org>
|
||||
R: Andy Shevchenko <andy@infradead.org>
|
||||
R: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/acpi/pmic/
|
||||
|
||||
ACPI THERMAL DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
@ -2853,7 +2865,6 @@ S: Supported
|
||||
F: drivers/scsi/bnx2i/
|
||||
|
||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||
M: Ariel Elior <ariel.elior@cavium.com>
|
||||
M: everest-linux-l2@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
@ -6643,8 +6654,8 @@ M: Alexander Aring <alex.aring@gmail.com>
|
||||
M: Stefan Schmidt <stefan@osg.samsung.com>
|
||||
L: linux-wpan@vger.kernel.org
|
||||
W: http://wpan.cakelab.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan-next.git
|
||||
S: Maintained
|
||||
F: net/ieee802154/
|
||||
F: net/mac802154/
|
||||
@ -11047,7 +11058,6 @@ S: Supported
|
||||
F: drivers/scsi/qedi/
|
||||
|
||||
QLOGIC QL4xxx ETHERNET DRIVER
|
||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
||||
M: everest-linux-l2@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -78,9 +78,6 @@ struct task_struct;
|
||||
|
||||
#endif
|
||||
|
||||
#define copy_segments(tsk, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
|
||||
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
|
||||
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)
|
||||
|
||||
|
@ -50,17 +50,22 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
|
||||
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
|
||||
KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
||||
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
||||
|
||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
||||
KBUILD_CPPFLAGS += -mbig-endian
|
||||
CHECKFLAGS += -D__AARCH64EB__
|
||||
AS += -EB
|
||||
LD += -EB
|
||||
LDFLAGS += -maarch64linuxb
|
||||
UTS_MACHINE := aarch64_be
|
||||
else
|
||||
KBUILD_CPPFLAGS += -mlittle-endian
|
||||
CHECKFLAGS += -D__AARCH64EL__
|
||||
AS += -EL
|
||||
LD += -EL
|
||||
LDFLAGS += -maarch64linux
|
||||
UTS_MACHINE := aarch64
|
||||
endif
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifndef __ASM_LINKAGE_H
|
||||
#define __ASM_LINKAGE_H
|
||||
|
||||
#define __ALIGN .align 4
|
||||
#define __ALIGN_STR ".align 4"
|
||||
#define __ALIGN .align 2
|
||||
#define __ALIGN_STR ".align 2"
|
||||
|
||||
#endif
|
||||
|
@ -321,6 +321,8 @@ void kernel_neon_end(void)
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_neon_end);
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
|
||||
static DEFINE_PER_CPU(struct fpsimd_state, efi_fpsimd_state);
|
||||
static DEFINE_PER_CPU(bool, efi_fpsimd_state_used);
|
||||
|
||||
@ -370,6 +372,8 @@ void __efi_fpsimd_end(void)
|
||||
kernel_neon_end();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_EFI */
|
||||
|
||||
#endif /* CONFIG_KERNEL_MODE_NEON */
|
||||
|
||||
#ifdef CONFIG_CPU_PM
|
||||
|
@ -92,9 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||
{
|
||||
}
|
||||
|
||||
#define copy_segments(tsk, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
|
||||
/*
|
||||
* saved kernel SP and DP of a blocked thread.
|
||||
*/
|
||||
|
@ -92,10 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||
extern asmlinkage void save_user_regs(struct user_context *target);
|
||||
extern asmlinkage void *restore_user_regs(const struct user_context *target, ...);
|
||||
|
||||
#define copy_segments(tsk, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
#define forget_segments() do { } while (0)
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
|
||||
|
@ -118,14 +118,6 @@ struct mm_struct;
|
||||
/* Free all resources held by a thread. */
|
||||
extern void release_thread(struct task_struct *);
|
||||
|
||||
/* Copy and release all segment info associated with a VM */
|
||||
extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
|
||||
extern void release_segments(struct mm_struct * mm);
|
||||
|
||||
/* Copy and release all segment info associated with a VM */
|
||||
#define copy_segments(p, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
#define KSTK_EIP(tsk) ((tsk)->thread.lr)
|
||||
#define KSTK_ESP(tsk) ((tsk)->thread.sp)
|
||||
|
@ -131,9 +131,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||
{
|
||||
}
|
||||
|
||||
#define copy_segments(tsk, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
|
||||
/*
|
||||
* Return saved PC of a blocked thread.
|
||||
*/
|
||||
|
@ -22,10 +22,10 @@
|
||||
#include "pci.h"
|
||||
|
||||
static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
|
||||
static const struct ath79_pci_irq *ath79_pci_irq_map __initdata;
|
||||
static unsigned ath79_pci_nr_irqs __initdata;
|
||||
static const struct ath79_pci_irq *ath79_pci_irq_map;
|
||||
static unsigned ath79_pci_nr_irqs;
|
||||
|
||||
static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
|
||||
static const struct ath79_pci_irq ar71xx_pci_irq_map[] = {
|
||||
{
|
||||
.slot = 17,
|
||||
.pin = 1,
|
||||
@ -41,7 +41,7 @@ static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
|
||||
}
|
||||
};
|
||||
|
||||
static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
|
||||
static const struct ath79_pci_irq ar724x_pci_irq_map[] = {
|
||||
{
|
||||
.slot = 0,
|
||||
.pin = 1,
|
||||
@ -49,7 +49,7 @@ static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
|
||||
}
|
||||
};
|
||||
|
||||
static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
|
||||
static const struct ath79_pci_irq qca955x_pci_irq_map[] = {
|
||||
{
|
||||
.bus = 0,
|
||||
.slot = 0,
|
||||
@ -64,7 +64,7 @@ static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
|
||||
},
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
||||
{
|
||||
int irq = -1;
|
||||
int i;
|
||||
|
@ -1377,29 +1377,32 @@ do { \
|
||||
|
||||
#define __write_64bit_c0_split(source, sel, val) \
|
||||
do { \
|
||||
unsigned long long __tmp; \
|
||||
unsigned long __flags; \
|
||||
\
|
||||
local_irq_save(__flags); \
|
||||
if (sel == 0) \
|
||||
__asm__ __volatile__( \
|
||||
".set\tmips64\n\t" \
|
||||
"dsll\t%L0, %L0, 32\n\t" \
|
||||
"dsll\t%L0, %L1, 32\n\t" \
|
||||
"dsrl\t%L0, %L0, 32\n\t" \
|
||||
"dsll\t%M0, %M0, 32\n\t" \
|
||||
"dsll\t%M0, %M1, 32\n\t" \
|
||||
"or\t%L0, %L0, %M0\n\t" \
|
||||
"dmtc0\t%L0, " #source "\n\t" \
|
||||
".set\tmips0" \
|
||||
: : "r" (val)); \
|
||||
: "=&r,r" (__tmp) \
|
||||
: "r,0" (val)); \
|
||||
else \
|
||||
__asm__ __volatile__( \
|
||||
".set\tmips64\n\t" \
|
||||
"dsll\t%L0, %L0, 32\n\t" \
|
||||
"dsll\t%L0, %L1, 32\n\t" \
|
||||
"dsrl\t%L0, %L0, 32\n\t" \
|
||||
"dsll\t%M0, %M0, 32\n\t" \
|
||||
"dsll\t%M0, %M1, 32\n\t" \
|
||||
"or\t%L0, %L0, %M0\n\t" \
|
||||
"dmtc0\t%L0, " #source ", " #sel "\n\t" \
|
||||
".set\tmips0" \
|
||||
: : "r" (val)); \
|
||||
: "=&r,r" (__tmp) \
|
||||
: "r,0" (val)); \
|
||||
local_irq_restore(__flags); \
|
||||
} while (0)
|
||||
|
||||
|
@ -618,8 +618,7 @@ static int mipspmu_event_init(struct perf_event *event)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if ((unsigned int)event->cpu >= nr_cpumask_bits ||
|
||||
(event->cpu >= 0 && !cpu_online(event->cpu)))
|
||||
if (event->cpu >= 0 && !cpu_online(event->cpu))
|
||||
return -ENODEV;
|
||||
|
||||
if (!atomic_inc_not_zero(&active_events)) {
|
||||
|
@ -32,13 +32,13 @@
|
||||
#define INTC PC104PLUS_INTC_IRQ
|
||||
#define INTD PC104PLUS_INTD_IRQ
|
||||
|
||||
static char irq_tab_capcella[][5] __initdata = {
|
||||
static char irq_tab_capcella[][5] = {
|
||||
[11] = { -1, INT1, INT1, INT1, INT1 },
|
||||
[12] = { -1, INT2, INT2, INT2, INT2 },
|
||||
[14] = { -1, INTA, INTB, INTC, INTD }
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return irq_tab_capcella[slot][pin];
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ static void qube_raq_via_board_id_fixup(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0,
|
||||
qube_raq_via_board_id_fixup);
|
||||
|
||||
static char irq_tab_qube1[] __initdata = {
|
||||
static char irq_tab_qube1[] = {
|
||||
[COBALT_PCICONF_CPU] = 0,
|
||||
[COBALT_PCICONF_ETH0] = QUBE1_ETH0_IRQ,
|
||||
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
||||
@ -156,7 +156,7 @@ static char irq_tab_qube1[] __initdata = {
|
||||
[COBALT_PCICONF_ETH1] = 0
|
||||
};
|
||||
|
||||
static char irq_tab_cobalt[] __initdata = {
|
||||
static char irq_tab_cobalt[] = {
|
||||
[COBALT_PCICONF_CPU] = 0,
|
||||
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
||||
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
||||
@ -165,7 +165,7 @@ static char irq_tab_cobalt[] __initdata = {
|
||||
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
||||
};
|
||||
|
||||
static char irq_tab_raq2[] __initdata = {
|
||||
static char irq_tab_raq2[] = {
|
||||
[COBALT_PCICONF_CPU] = 0,
|
||||
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
||||
[COBALT_PCICONF_RAQSCSI] = RAQ2_SCSI_IRQ,
|
||||
@ -174,7 +174,7 @@ static char irq_tab_raq2[] __initdata = {
|
||||
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
|
||||
return irq_tab_qube1[slot];
|
||||
|
@ -43,7 +43,7 @@
|
||||
*/
|
||||
|
||||
#define MAX_SLOT_NUM 10
|
||||
static unsigned char irq_map[][5] __initdata = {
|
||||
static unsigned char irq_map[][5] = {
|
||||
[3] = {0, MARKEINS_PCI_IRQ_INTB, MARKEINS_PCI_IRQ_INTC,
|
||||
MARKEINS_PCI_IRQ_INTD, 0,},
|
||||
[4] = {0, MARKEINS_PCI_IRQ_INTA, 0, 0, 0,},
|
||||
@ -85,7 +85,7 @@ static void emma2rh_pci_host_fixup(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_EMMA2RH,
|
||||
emma2rh_pci_host_fixup);
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return irq_map[slot][pin];
|
||||
}
|
||||
|
@ -19,7 +19,7 @@
|
||||
/* South bridge slot number is set by the pci probe process */
|
||||
static u8 sb_slot = 5;
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq = 0;
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
#define INTB MACEPCI_SHARED0_IRQ
|
||||
#define INTC MACEPCI_SHARED1_IRQ
|
||||
#define INTD MACEPCI_SHARED2_IRQ
|
||||
static char irq_tab_mace[][5] __initdata = {
|
||||
static char irq_tab_mace[][5] = {
|
||||
/* Dummy INT#A INT#B INT#C INT#D */
|
||||
{0, 0, 0, 0, 0}, /* This is placeholder row - never used */
|
||||
{0, SCSI0, SCSI0, SCSI0, SCSI0},
|
||||
@ -39,7 +39,7 @@ static char irq_tab_mace[][5] __initdata = {
|
||||
* irqs. I suppose a device without a pin A will thank us for doing it
|
||||
* right if there exists such a broken piece of crap.
|
||||
*/
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return irq_tab_mace[slot][pin];
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include <asm/txx9/pci.h>
|
||||
#include <asm/txx9/jmr3927.h>
|
||||
|
||||
int __init jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
unsigned char irq = pin;
|
||||
|
||||
|
@ -23,7 +23,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return of_irq_parse_and_map_pci(dev, slot, pin);
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
#define PCID 7
|
||||
|
||||
/* all the pci device has the PCIA pin, check the datasheet. */
|
||||
static char irq_tab[][5] __initdata = {
|
||||
static char irq_tab[][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{0, 0, 0, 0, 0}, /* 11: Unused */
|
||||
{0, 0, 0, 0, 0}, /* 12: Unused */
|
||||
@ -51,7 +51,7 @@ static char irq_tab[][5] __initdata = {
|
||||
{0, 0, 0, 0, 0}, /* 27: Unused */
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int virq;
|
||||
|
||||
|
@ -32,7 +32,7 @@ static void print_fixup_info(const struct pci_dev *pdev)
|
||||
pdev->vendor, pdev->device, pdev->irq);
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
print_fixup_info(dev);
|
||||
return dev->irq;
|
||||
|
@ -12,7 +12,7 @@
|
||||
static char pci_irq[5] = {
|
||||
};
|
||||
|
||||
static char irq_tab[][5] __initdata = {
|
||||
static char irq_tab[][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{0, 0, 0, 0, 0 }, /* 0: GT64120 PCI bridge */
|
||||
{0, 0, 0, 0, 0 }, /* 1: Unused */
|
||||
@ -38,7 +38,7 @@ static char irq_tab[][5] __initdata = {
|
||||
{0, PCID, PCIA, PCIB, PCIC } /* 21: PCI Slot 4 */
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int virq;
|
||||
virq = irq_tab[slot][pin];
|
||||
|
@ -22,19 +22,19 @@
|
||||
|
||||
#include <asm/vr41xx/mpc30x.h>
|
||||
|
||||
static const int internal_func_irqs[] __initconst = {
|
||||
static const int internal_func_irqs[] = {
|
||||
VRC4173_CASCADE_IRQ,
|
||||
VRC4173_AC97_IRQ,
|
||||
VRC4173_USB_IRQ,
|
||||
};
|
||||
|
||||
static const int irq_tab_mpc30x[] __initconst = {
|
||||
static const int irq_tab_mpc30x[] = {
|
||||
[12] = VRC4173_PCMCIA1_IRQ,
|
||||
[13] = VRC4173_PCMCIA2_IRQ,
|
||||
[29] = MQ200_IRQ,
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (slot == 30)
|
||||
return internal_func_irqs[PCI_FUNC(dev->devfn)];
|
||||
|
@ -47,7 +47,7 @@
|
||||
|
||||
#if defined(CONFIG_PMC_MSP7120_GW)
|
||||
/* Garibaldi Board IRQ wiring to PCI slots */
|
||||
static char irq_tab[][5] __initdata = {
|
||||
static char irq_tab[][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||
@ -86,7 +86,7 @@ static char irq_tab[][5] __initdata = {
|
||||
#elif defined(CONFIG_PMC_MSP7120_EVAL)
|
||||
|
||||
/* MSP7120 Eval Board IRQ wiring to PCI slots */
|
||||
static char irq_tab[][5] __initdata = {
|
||||
static char irq_tab[][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||
@ -125,7 +125,7 @@ static char irq_tab[][5] __initdata = {
|
||||
#else
|
||||
|
||||
/* Unknown board -- don't assign any IRQs */
|
||||
static char irq_tab[][5] __initdata = {
|
||||
static char irq_tab[][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||
@ -202,7 +202,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
* RETURNS: IRQ number
|
||||
*
|
||||
****************************************************************************/
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
#if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)
|
||||
printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n");
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include <asm/txx9/pci.h>
|
||||
#include <asm/txx9/rbtx4927.h>
|
||||
|
||||
int __init rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
unsigned char irq = pin;
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <asm/txx9/pci.h>
|
||||
#include <asm/txx9/rbtx4938.h>
|
||||
|
||||
int __init rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq = tx4938_pcic1_map_irq(dev, slot);
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
* seem to be a documentation error. At least on my RM200C the Cirrus
|
||||
* Logic CL-GD5434 VGA is device 3.
|
||||
*/
|
||||
static char irq_tab_rm200[8][5] __initdata = {
|
||||
static char irq_tab_rm200[8][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||
@ -57,7 +57,7 @@ static char irq_tab_rm200[8][5] __initdata = {
|
||||
*
|
||||
* The VGA card is optional for RM300 systems.
|
||||
*/
|
||||
static char irq_tab_rm300d[8][5] __initdata = {
|
||||
static char irq_tab_rm300d[8][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||
@ -69,7 +69,7 @@ static char irq_tab_rm300d[8][5] __initdata = {
|
||||
{ 0, INTD, INTA, INTB, INTC }, /* Slot 4 */
|
||||
};
|
||||
|
||||
static char irq_tab_rm300e[5][5] __initdata = {
|
||||
static char irq_tab_rm300e[5][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||
@ -96,7 +96,7 @@ static char irq_tab_rm300e[5][5] __initdata = {
|
||||
#define INTC PCIT_IRQ_INTC
|
||||
#define INTD PCIT_IRQ_INTD
|
||||
|
||||
static char irq_tab_pcit[13][5] __initdata = {
|
||||
static char irq_tab_pcit[13][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||
{ SCSI0, SCSI0, SCSI0, SCSI0, SCSI0 }, /* SCSI */
|
||||
@ -113,7 +113,7 @@ static char irq_tab_pcit[13][5] __initdata = {
|
||||
{ 0, INTA, INTB, INTC, INTD }, /* Slot 5 */
|
||||
};
|
||||
|
||||
static char irq_tab_pcit_cplus[13][5] __initdata = {
|
||||
static char irq_tab_pcit_cplus[13][5] = {
|
||||
/* INTA INTB INTC INTD */
|
||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||
{ 0, INTB, INTC, INTD, INTA }, /* PCI Slot 9 */
|
||||
@ -130,7 +130,7 @@ static inline int is_rm300_revd(void)
|
||||
return (csmsr & 0xa0) == 0x20;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
switch (sni_brd_type) {
|
||||
case SNI_BRD_PCI_TOWER_CPLUS:
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
#include <asm/vr41xx/tb0219.h>
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq = -1;
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <asm/vr41xx/giu.h>
|
||||
#include <asm/vr41xx/tb0226.h>
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq = -1;
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#include <asm/vr41xx/tb0287.h>
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
unsigned char bus;
|
||||
int irq = -1;
|
||||
|
@ -522,7 +522,7 @@ static int __init alchemy_pci_init(void)
|
||||
arch_initcall(alchemy_pci_init);
|
||||
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
struct alchemy_pci_context *ctx = dev->sysdata;
|
||||
if (ctx && ctx->board_map_irq)
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <bcm47xx.h>
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ arch_initcall(lasat_pci_setup);
|
||||
#define LASAT_IRQ_PCIC (LASAT_IRQ_BASE + 7)
|
||||
#define LASAT_IRQ_PCID (LASAT_IRQ_BASE + 8)
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
switch (slot) {
|
||||
case 1:
|
||||
|
@ -361,7 +361,7 @@ static int mt7620_pci_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
u16 cmd;
|
||||
u32 val;
|
||||
|
@ -59,8 +59,7 @@ union octeon_pci_address {
|
||||
} s;
|
||||
};
|
||||
|
||||
int __initconst (*octeon_pcibios_map_irq)(const struct pci_dev *dev,
|
||||
u8 slot, u8 pin);
|
||||
int (*octeon_pcibios_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
|
||||
|
||||
/**
|
||||
@ -74,7 +73,7 @@ enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
|
||||
* as it goes through each bridge.
|
||||
* Returns Interrupt number for the device
|
||||
*/
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
if (octeon_pcibios_map_irq)
|
||||
return octeon_pcibios_map_irq(dev, slot, pin);
|
||||
|
@ -181,7 +181,7 @@ static inline void rt2880_pci_write_u32(unsigned long reg, u32 val)
|
||||
spin_unlock_irqrestore(&rt2880_pci_lock, flags);
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
u16 cmd;
|
||||
int irq = -1;
|
||||
|
@ -564,7 +564,7 @@ err_put_intc_node:
|
||||
return err;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return of_irq_parse_and_map_pci(dev, slot, pin);
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ int __init tx4938_pciclk66_setup(void)
|
||||
return pciclk;
|
||||
}
|
||||
|
||||
int __init tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||
int tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||
{
|
||||
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4938_pcic1ptr) {
|
||||
switch (slot) {
|
||||
|
@ -48,7 +48,7 @@ void __init tx4939_report_pci1clk(void)
|
||||
((pciclk + 50000) / 100000) % 10);
|
||||
}
|
||||
|
||||
int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||
int tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||
{
|
||||
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4939_pcic1ptr) {
|
||||
switch (slot) {
|
||||
@ -68,7 +68,7 @@ int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int __init tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq = tx4939_pcic1_map_irq(dev, slot);
|
||||
|
||||
|
@ -205,7 +205,7 @@ int xlp_socdev_to_node(const struct pci_dev *lnkdev)
|
||||
return PCI_SLOT(lnkdev->devfn) / 8;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
struct pci_dev *lnkdev;
|
||||
int lnkfunc, node;
|
||||
|
@ -315,7 +315,7 @@ static void xls_pcie_ack_b(struct irq_data *d)
|
||||
}
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return get_irq_vector(dev);
|
||||
}
|
||||
|
@ -1464,8 +1464,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
|
||||
* as it goes through each bridge.
|
||||
* Returns Interrupt number for the device
|
||||
*/
|
||||
int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev,
|
||||
u8 slot, u8 pin)
|
||||
int octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
/*
|
||||
* The EBH5600 board with the PCI to PCIe bridge mistakenly
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include <linux/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_MT_SMP
|
||||
#define MIPS_CPU_IPI_RESCHED_IRQ 0 /* SW int 0 for resched */
|
||||
#define MIPS_CPU_IPI_CALL_IRQ 1 /* SW int 1 for call */
|
||||
|
@ -386,9 +386,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
static int (*txx9_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
return txx9_board_vec->pci_map_irq(dev, slot, pin);
|
||||
return txx9_pci_map_irq(dev, slot, pin);
|
||||
}
|
||||
|
||||
char * (*txx9_board_pcibios_setup)(char *str) __initdata;
|
||||
@ -424,5 +425,8 @@ char *__init txx9_pcibios_setup(char *str)
|
||||
txx9_pci_err_action = TXX9_PCI_ERR_IGNORE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
txx9_pci_map_irq = txx9_board_vec->pci_map_irq;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
@ -59,10 +59,6 @@ void arch_cpu_idle(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void release_segments(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
|
||||
void machine_restart(char *cmd)
|
||||
{
|
||||
#ifdef CONFIG_KERNEL_DEBUGGER
|
||||
@ -112,14 +108,6 @@ void release_thread(struct task_struct *dead_task)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* we do not have to muck with descriptors here, that is
|
||||
* done in switch_mm() as needed.
|
||||
*/
|
||||
void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* this gets called so that we can store lazy state into memory and copy the
|
||||
* current task into the new thread.
|
||||
|
@ -257,6 +257,18 @@ config PARISC_PAGE_SIZE_64KB
|
||||
|
||||
endchoice
|
||||
|
||||
config PARISC_SELF_EXTRACT
|
||||
bool "Build kernel as self-extracting executable"
|
||||
default y
|
||||
help
|
||||
Say Y if you want to build the parisc kernel as a kind of
|
||||
self-extracting executable.
|
||||
|
||||
If you say N here, the kernel will be compressed with gzip
|
||||
which can be loaded by the palo bootloader directly too.
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
|
@ -129,8 +129,13 @@ Image: vmlinux
|
||||
bzImage: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
ifdef CONFIG_PARISC_SELF_EXTRACT
|
||||
vmlinuz: bzImage
|
||||
$(OBJCOPY) $(boot)/bzImage $@
|
||||
else
|
||||
vmlinuz: vmlinux
|
||||
@gzip -cf -9 $< > $@
|
||||
endif
|
||||
|
||||
install:
|
||||
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \
|
||||
|
@ -15,7 +15,7 @@ targets += misc.o piggy.o sizes.h head.o real2.o firmware.o
|
||||
KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
|
||||
KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs
|
||||
KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs -Os
|
||||
ifndef CONFIG_64BIT
|
||||
KBUILD_CFLAGS += -mfast-indirect-calls
|
||||
endif
|
||||
|
@ -24,7 +24,8 @@
|
||||
/* Symbols defined by linker scripts */
|
||||
extern char input_data[];
|
||||
extern int input_len;
|
||||
extern __le32 output_len; /* at unaligned address, little-endian */
|
||||
/* output_len is inserted by the linker possibly at an unaligned address */
|
||||
extern __le32 output_len __aligned(1);
|
||||
extern char _text, _end;
|
||||
extern char _bss, _ebss;
|
||||
extern char _startcode_end;
|
||||
|
@ -280,6 +280,7 @@ void setup_pdc(void); /* in inventory.c */
|
||||
/* wrapper-functions from pdc.c */
|
||||
|
||||
int pdc_add_valid(unsigned long address);
|
||||
int pdc_instr(unsigned int *instr);
|
||||
int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len);
|
||||
int pdc_chassis_disp(unsigned long disp);
|
||||
int pdc_chassis_warn(unsigned long *warn);
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef __ASM_SMP_H
|
||||
#define __ASM_SMP_H
|
||||
|
||||
extern int init_per_cpu(int cpuid);
|
||||
|
||||
#if defined(CONFIG_SMP)
|
||||
|
||||
|
@ -232,6 +232,26 @@ int pdc_add_valid(unsigned long address)
|
||||
}
|
||||
EXPORT_SYMBOL(pdc_add_valid);
|
||||
|
||||
/**
|
||||
* pdc_instr - Get instruction that invokes PDCE_CHECK in HPMC handler.
|
||||
* @instr: Pointer to variable which will get instruction opcode.
|
||||
*
|
||||
* The return value is PDC_OK (0) in case call succeeded.
|
||||
*/
|
||||
int __init pdc_instr(unsigned int *instr)
|
||||
{
|
||||
int retval;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pdc_lock, flags);
|
||||
retval = mem_pdc_call(PDC_INSTR, 0UL, __pa(pdc_result));
|
||||
convert_to_wide(pdc_result);
|
||||
*instr = pdc_result[0];
|
||||
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_chassis_info - Return chassis information.
|
||||
* @result: The return buffer.
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/initrd.h>
|
||||
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/pdcpat.h>
|
||||
@ -216,8 +217,16 @@ void __init pdc_pdt_init(void)
|
||||
}
|
||||
|
||||
for (i = 0; i < pdt_status.pdt_entries; i++) {
|
||||
unsigned long addr;
|
||||
|
||||
report_mem_err(pdt_entry[i]);
|
||||
|
||||
addr = pdt_entry[i] & PDT_ADDR_PHYS_MASK;
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) &&
|
||||
addr >= initrd_start && addr < initrd_end)
|
||||
pr_crit("CRITICAL: initrd possibly broken "
|
||||
"due to bad memory!\n");
|
||||
|
||||
/* mark memory page bad */
|
||||
memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);
|
||||
}
|
||||
|
@ -317,7 +317,7 @@ void __init collect_boot_cpu_data(void)
|
||||
*
|
||||
* o Enable CPU profiling hooks.
|
||||
*/
|
||||
int init_per_cpu(int cpunum)
|
||||
int __init init_per_cpu(int cpunum)
|
||||
{
|
||||
int ret;
|
||||
struct pdc_coproc_cfg coproc_cfg;
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/clock.h>
|
||||
#include <linux/start_kernel.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sections.h>
|
||||
@ -48,6 +49,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||
|
||||
@ -115,7 +117,6 @@ void __init dma_ops_init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int init_per_cpu(int cpuid);
|
||||
extern void collect_boot_cpu_data(void);
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
@ -398,9 +399,8 @@ static int __init parisc_init(void)
|
||||
}
|
||||
arch_initcall(parisc_init);
|
||||
|
||||
void start_parisc(void)
|
||||
void __init start_parisc(void)
|
||||
{
|
||||
extern void start_kernel(void);
|
||||
extern void early_trap_init(void);
|
||||
|
||||
int ret, cpunum;
|
||||
|
@ -255,12 +255,11 @@ void arch_send_call_function_single_ipi(int cpu)
|
||||
static void __init
|
||||
smp_cpu_init(int cpunum)
|
||||
{
|
||||
extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */
|
||||
extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
|
||||
extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */
|
||||
|
||||
/* Set modes and Enable floating point coprocessor */
|
||||
(void) init_per_cpu(cpunum);
|
||||
init_per_cpu(cpunum);
|
||||
|
||||
disable_sr_hashing();
|
||||
|
||||
|
@ -817,7 +817,7 @@ void __init initialize_ivt(const void *iva)
|
||||
u32 check = 0;
|
||||
u32 *ivap;
|
||||
u32 *hpmcp;
|
||||
u32 length;
|
||||
u32 length, instr;
|
||||
|
||||
if (strcmp((const char *)iva, "cows can fly"))
|
||||
panic("IVT invalid");
|
||||
@ -827,6 +827,14 @@ void __init initialize_ivt(const void *iva)
|
||||
for (i = 0; i < 8; i++)
|
||||
*ivap++ = 0;
|
||||
|
||||
/*
|
||||
* Use PDC_INSTR firmware function to get instruction that invokes
|
||||
* PDCE_CHECK in HPMC handler. See programming note at page 1-31 of
|
||||
* the PA 1.1 Firmware Architecture document.
|
||||
*/
|
||||
if (pdc_instr(&instr) == PDC_OK)
|
||||
ivap[0] = instr;
|
||||
|
||||
/* Compute Checksum for HPMC handler */
|
||||
length = os_hpmc_size;
|
||||
ivap[7] = length;
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/sort.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/assembly.h>
|
||||
@ -279,6 +280,17 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
|
||||
|
||||
info->prev_sp = sp - 64;
|
||||
info->prev_ip = 0;
|
||||
|
||||
/* The stack is at the end inside the thread_union
|
||||
* struct. If we reach data, we have reached the
|
||||
* beginning of the stack and should stop unwinding. */
|
||||
if (info->prev_sp >= (unsigned long) task_thread_info(info->t) &&
|
||||
info->prev_sp < ((unsigned long) task_thread_info(info->t)
|
||||
+ THREAD_SZ_ALGN)) {
|
||||
info->prev_sp = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(tmp, (unsigned long *)(info->prev_sp - RP_OFFSET)))
|
||||
break;
|
||||
info->prev_ip = tmp;
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/hugetlb.h>
|
||||
|
||||
#include <asm/traps.h>
|
||||
|
||||
@ -261,7 +262,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||
struct task_struct *tsk;
|
||||
struct mm_struct *mm;
|
||||
unsigned long acc_type;
|
||||
int fault;
|
||||
int fault = 0;
|
||||
unsigned int flags;
|
||||
|
||||
if (faulthandler_disabled())
|
||||
@ -315,7 +316,8 @@ good_area:
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
else if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
|
||||
VM_FAULT_HWPOISON_LARGE))
|
||||
goto bad_area;
|
||||
BUG();
|
||||
}
|
||||
@ -352,8 +354,7 @@ bad_area:
|
||||
|
||||
if (user_mode(regs)) {
|
||||
struct siginfo si;
|
||||
|
||||
show_signal_msg(regs, code, address, tsk, vma);
|
||||
unsigned int lsb = 0;
|
||||
|
||||
switch (code) {
|
||||
case 15: /* Data TLB miss fault/Data page fault */
|
||||
@ -386,6 +387,30 @@ bad_area:
|
||||
si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) {
|
||||
printk(KERN_ERR
|
||||
"MCE: Killing %s:%d due to hardware memory corruption fault at %08lx\n",
|
||||
tsk->comm, tsk->pid, address);
|
||||
si.si_signo = SIGBUS;
|
||||
si.si_code = BUS_MCEERR_AR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Either small page or large page may be poisoned.
|
||||
* In other words, VM_FAULT_HWPOISON_LARGE and
|
||||
* VM_FAULT_HWPOISON are mutually exclusive.
|
||||
*/
|
||||
if (fault & VM_FAULT_HWPOISON_LARGE)
|
||||
lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
|
||||
else if (fault & VM_FAULT_HWPOISON)
|
||||
lsb = PAGE_SHIFT;
|
||||
else
|
||||
show_signal_msg(regs, code, address, tsk, vma);
|
||||
si.si_addr_lsb = lsb;
|
||||
|
||||
si.si_errno = 0;
|
||||
si.si_addr = (void __user *) address;
|
||||
force_sig_info(si.si_signo, &si, current);
|
||||
|
@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||
|
@ -64,11 +64,12 @@ CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_GENERIC=y
|
||||
|
@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_USB_AUDIO=y
|
||||
CONFIG_SND_USB_USX2Y=y
|
||||
|
@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_DUMMY=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
|
@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||
|
@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_HID_DRAGONRISE=y
|
||||
CONFIG_HID_GYRATION=y
|
||||
CONFIG_HID_TWINHAN=y
|
||||
|
@ -789,17 +789,18 @@ CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_DYNAMIC_MINORS=y
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
CONFIG_SND_VERBOSE_PRINTK=y
|
||||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_DEBUG_VERBOSE=y
|
||||
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_DUMMY=m
|
||||
CONFIG_SND_VIRMIDI=m
|
||||
CONFIG_SND_MTPAV=m
|
||||
|
@ -79,11 +79,12 @@ CONFIG_FB=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_HID_APPLE=m
|
||||
CONFIG_HID_WACOM=m
|
||||
CONFIG_MMC=y
|
||||
|
@ -1019,6 +1019,10 @@ int eeh_init(void)
|
||||
} else if ((ret = eeh_ops->init()))
|
||||
return ret;
|
||||
|
||||
/* Initialize PHB PEs */
|
||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||
eeh_dev_phb_init_dynamic(hose);
|
||||
|
||||
/* Initialize EEH event */
|
||||
ret = eeh_event_init();
|
||||
if (ret)
|
||||
|
@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
|
||||
/* EEH PE for PHB */
|
||||
eeh_phb_pe_create(phb);
|
||||
}
|
||||
|
||||
/**
|
||||
* eeh_dev_phb_init - Create EEH devices for devices included in existing PHBs
|
||||
*
|
||||
* Scan all the existing PHBs and create EEH devices for their OF
|
||||
* nodes and their children OF nodes
|
||||
*/
|
||||
static int __init eeh_dev_phb_init(void)
|
||||
{
|
||||
struct pci_controller *phb, *tmp;
|
||||
|
||||
list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
|
||||
eeh_dev_phb_init_dynamic(phb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(eeh_dev_phb_init);
|
||||
|
@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p)
|
||||
* and that can be emulated.
|
||||
*/
|
||||
if (!is_conditional_branch(*p->ainsn.insn) &&
|
||||
analyse_instr(&op, ®s, *p->ainsn.insn))
|
||||
analyse_instr(&op, ®s, *p->ainsn.insn) == 1) {
|
||||
emulate_update_regs(®s, &op);
|
||||
nip = regs.nip;
|
||||
}
|
||||
|
||||
return nip;
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
|
||||
* in the appropriate thread structures from live.
|
||||
*/
|
||||
|
||||
if (tsk != current)
|
||||
if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
|
||||
return;
|
||||
|
||||
if (MSR_TM_SUSPENDED(mfmsr())) {
|
||||
|
@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
|
||||
int machine_check_e500mc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long mcsr = mfspr(SPRN_MCSR);
|
||||
unsigned long pvr = mfspr(SPRN_PVR);
|
||||
unsigned long reason = mcsr;
|
||||
int recoverable = 1;
|
||||
|
||||
@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
|
||||
* may still get logged and cause a machine check. We should
|
||||
* only treat the non-write shadow case as non-recoverable.
|
||||
*/
|
||||
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
||||
recoverable = 0;
|
||||
/* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
|
||||
* is not implemented but L1 data cache always runs in write
|
||||
* shadow mode. Hence on data cache parity errors HW will
|
||||
* automatically invalidate the L1 Data Cache.
|
||||
*/
|
||||
if (PVR_VER(pvr) != PVR_VER_E6500) {
|
||||
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
||||
recoverable = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (reason & MCSR_L2MMU_MHIT) {
|
||||
|
@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);
|
||||
: "r" (addr), "i" (-EFAULT), "0" (err))
|
||||
|
||||
static nokprobe_inline void set_cr0(const struct pt_regs *regs,
|
||||
struct instruction_op *op, int rd)
|
||||
struct instruction_op *op)
|
||||
{
|
||||
long val = regs->gpr[rd];
|
||||
long val = op->val;
|
||||
|
||||
op->type |= SETCC;
|
||||
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
|
||||
@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
case 13: /* addic. */
|
||||
imm = (short) instr;
|
||||
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
|
||||
set_cr0(regs, op, rd);
|
||||
set_cr0(regs, op);
|
||||
return 1;
|
||||
|
||||
case 14: /* addi */
|
||||
@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
|
||||
case 28: /* andi. */
|
||||
op->val = regs->gpr[rd] & (unsigned short) instr;
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
goto logical_done_nocc;
|
||||
|
||||
case 29: /* andis. */
|
||||
imm = (unsigned short) instr;
|
||||
op->val = regs->gpr[rd] & (imm << 16);
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
goto logical_done_nocc;
|
||||
|
||||
#ifdef __powerpc64__
|
||||
@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
op->type = COMPUTE + SETCC;
|
||||
imm = 0xf0000000UL;
|
||||
val = regs->gpr[rd];
|
||||
op->val = regs->ccr;
|
||||
op->ccval = regs->ccr;
|
||||
for (sh = 0; sh < 8; ++sh) {
|
||||
if (instr & (0x80000 >> sh))
|
||||
op->val = (op->val & ~imm) |
|
||||
op->ccval = (op->ccval & ~imm) |
|
||||
(val & imm);
|
||||
imm >>= 4;
|
||||
}
|
||||
@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
goto arith_done;
|
||||
|
||||
case 235: /* mullw */
|
||||
op->val = (unsigned int) regs->gpr[ra] *
|
||||
(unsigned int) regs->gpr[rb];
|
||||
op->val = (long)(int) regs->gpr[ra] *
|
||||
(int) regs->gpr[rb];
|
||||
|
||||
goto arith_done;
|
||||
|
||||
case 266: /* add */
|
||||
@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
|
||||
logical_done:
|
||||
if (instr & 1)
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
logical_done_nocc:
|
||||
op->reg = ra;
|
||||
op->type |= SETREG;
|
||||
@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||
|
||||
arith_done:
|
||||
if (instr & 1)
|
||||
set_cr0(regs, op, rd);
|
||||
set_cr0(regs, op);
|
||||
compute_done:
|
||||
op->reg = rd;
|
||||
op->type |= SETREG;
|
||||
|
@ -793,6 +793,11 @@ void perf_event_print_debug(void)
|
||||
u32 pmcs[MAX_HWEVENTS];
|
||||
int i;
|
||||
|
||||
if (!ppmu) {
|
||||
pr_info("Performance monitor hardware not registered.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ppmu->n_counter)
|
||||
return;
|
||||
|
||||
|
@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
|
||||
u64 pir = get_hard_smp_processor_id(cpu);
|
||||
|
||||
mtspr(SPRN_LPCR, lpcr_val);
|
||||
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
||||
|
||||
/*
|
||||
* Program the LPCR via stop-api only if the deepest stop state
|
||||
* can lose hypervisor context.
|
||||
*/
|
||||
if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
|
||||
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent)
|
||||
return rc;
|
||||
}
|
||||
|
||||
of_node_put(dn->parent);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
|
||||
}
|
||||
|
||||
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
|
||||
of_node_put(parent);
|
||||
if (!dn) {
|
||||
pr_warn("Failed call to configure-connector, drc index: %x\n",
|
||||
drc_index);
|
||||
dlpar_release_drc(drc_index);
|
||||
of_node_put(parent);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = dlpar_attach_node(dn, parent);
|
||||
|
||||
/* Regardless we are done with parent now */
|
||||
of_node_put(parent);
|
||||
|
||||
if (rc) {
|
||||
saved_rc = rc;
|
||||
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
|
||||
|
@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
|
||||
return -ENOENT;
|
||||
|
||||
dn = dlpar_configure_connector(drc_index, parent_dn);
|
||||
if (!dn)
|
||||
if (!dn) {
|
||||
of_node_put(parent_dn);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
rc = dlpar_attach_node(dn, parent_dn);
|
||||
if (rc)
|
||||
|
@ -1507,7 +1507,9 @@ static inline pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma,
|
||||
static inline void pmdp_invalidate(struct vm_area_struct *vma,
|
||||
unsigned long addr, pmd_t *pmdp)
|
||||
{
|
||||
pmdp_xchg_direct(vma->vm_mm, addr, pmdp, __pmd(_SEGMENT_ENTRY_EMPTY));
|
||||
pmd_t pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
|
||||
|
||||
pmdp_xchg_direct(vma->vm_mm, addr, pmdp, pmd);
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
||||
|
@ -404,18 +404,6 @@ static inline void save_vector_registers(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __init topology_setup(char *str)
|
||||
{
|
||||
bool enabled;
|
||||
int rc;
|
||||
|
||||
rc = kstrtobool(str, &enabled);
|
||||
if (!rc && !enabled)
|
||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_TOPOLOGY;
|
||||
return rc;
|
||||
}
|
||||
early_param("topology", topology_setup);
|
||||
|
||||
static int __init disable_vector_extension(char *str)
|
||||
{
|
||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
|
||||
|
@ -823,9 +823,12 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
|
||||
}
|
||||
|
||||
/* Check online status of the CPU to which the event is pinned */
|
||||
if ((unsigned int)event->cpu >= nr_cpumask_bits ||
|
||||
(event->cpu >= 0 && !cpu_online(event->cpu)))
|
||||
return -ENODEV;
|
||||
if (event->cpu >= 0) {
|
||||
if ((unsigned int)event->cpu >= nr_cpumask_bits)
|
||||
return -ENODEV;
|
||||
if (!cpu_online(event->cpu))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Force reset of idle/hv excludes regardless of what the
|
||||
* user requested.
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/cpuset.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/export.h>
|
||||
@ -29,12 +31,20 @@
|
||||
#define PTF_VERTICAL (1UL)
|
||||
#define PTF_CHECK (2UL)
|
||||
|
||||
enum {
|
||||
TOPOLOGY_MODE_HW,
|
||||
TOPOLOGY_MODE_SINGLE,
|
||||
TOPOLOGY_MODE_PACKAGE,
|
||||
TOPOLOGY_MODE_UNINITIALIZED
|
||||
};
|
||||
|
||||
struct mask_info {
|
||||
struct mask_info *next;
|
||||
unsigned char id;
|
||||
cpumask_t mask;
|
||||
};
|
||||
|
||||
static int topology_mode = TOPOLOGY_MODE_UNINITIALIZED;
|
||||
static void set_topology_timer(void);
|
||||
static void topology_work_fn(struct work_struct *work);
|
||||
static struct sysinfo_15_1_x *tl_info;
|
||||
@ -59,11 +69,26 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
|
||||
cpumask_t mask;
|
||||
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
return mask;
|
||||
for (; info; info = info->next) {
|
||||
if (cpumask_test_cpu(cpu, &info->mask))
|
||||
return info->mask;
|
||||
switch (topology_mode) {
|
||||
case TOPOLOGY_MODE_HW:
|
||||
while (info) {
|
||||
if (cpumask_test_cpu(cpu, &info->mask)) {
|
||||
mask = info->mask;
|
||||
break;
|
||||
}
|
||||
info = info->next;
|
||||
}
|
||||
if (cpumask_empty(&mask))
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
break;
|
||||
case TOPOLOGY_MODE_PACKAGE:
|
||||
cpumask_copy(&mask, cpu_present_mask);
|
||||
break;
|
||||
default:
|
||||
/* fallthrough */
|
||||
case TOPOLOGY_MODE_SINGLE:
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
break;
|
||||
}
|
||||
return mask;
|
||||
}
|
||||
@ -74,7 +99,7 @@ static cpumask_t cpu_thread_map(unsigned int cpu)
|
||||
int i;
|
||||
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
if (topology_mode != TOPOLOGY_MODE_HW)
|
||||
return mask;
|
||||
cpu -= cpu % (smp_cpu_mtid + 1);
|
||||
for (i = 0; i <= smp_cpu_mtid; i++)
|
||||
@ -184,10 +209,8 @@ static void topology_update_polarization_simple(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
for_each_possible_cpu(cpu)
|
||||
smp_cpu_set_polarization(cpu, POLARIZATION_HRZ);
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
}
|
||||
|
||||
static int ptf(unsigned long fc)
|
||||
@ -223,7 +246,7 @@ int topology_set_cpu_management(int fc)
|
||||
static void update_cpu_masks(void)
|
||||
{
|
||||
struct cpu_topology_s390 *topo;
|
||||
int cpu;
|
||||
int cpu, id;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
topo = &cpu_topology[cpu];
|
||||
@ -231,12 +254,13 @@ static void update_cpu_masks(void)
|
||||
topo->core_mask = cpu_group_map(&socket_info, cpu);
|
||||
topo->book_mask = cpu_group_map(&book_info, cpu);
|
||||
topo->drawer_mask = cpu_group_map(&drawer_info, cpu);
|
||||
if (!MACHINE_HAS_TOPOLOGY) {
|
||||
if (topology_mode != TOPOLOGY_MODE_HW) {
|
||||
id = topology_mode == TOPOLOGY_MODE_PACKAGE ? 0 : cpu;
|
||||
topo->thread_id = cpu;
|
||||
topo->core_id = cpu;
|
||||
topo->socket_id = cpu;
|
||||
topo->book_id = cpu;
|
||||
topo->drawer_id = cpu;
|
||||
topo->socket_id = id;
|
||||
topo->book_id = id;
|
||||
topo->drawer_id = id;
|
||||
if (cpu_present(cpu))
|
||||
cpumask_set_cpu(cpu, &cpus_with_topology);
|
||||
}
|
||||
@ -254,6 +278,7 @@ static int __arch_update_cpu_topology(void)
|
||||
struct sysinfo_15_1_x *info = tl_info;
|
||||
int rc = 0;
|
||||
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
cpumask_clear(&cpus_with_topology);
|
||||
if (MACHINE_HAS_TOPOLOGY) {
|
||||
rc = 1;
|
||||
@ -263,6 +288,7 @@ static int __arch_update_cpu_topology(void)
|
||||
update_cpu_masks();
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
topology_update_polarization_simple();
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -289,6 +315,11 @@ void topology_schedule_update(void)
|
||||
schedule_work(&topology_work);
|
||||
}
|
||||
|
||||
static void topology_flush_work(void)
|
||||
{
|
||||
flush_work(&topology_work);
|
||||
}
|
||||
|
||||
static void topology_timer_fn(unsigned long ignored)
|
||||
{
|
||||
if (ptf(PTF_CHECK))
|
||||
@ -459,6 +490,12 @@ void __init topology_init_early(void)
|
||||
struct sysinfo_15_1_x *info;
|
||||
|
||||
set_sched_topology(s390_topology);
|
||||
if (topology_mode == TOPOLOGY_MODE_UNINITIALIZED) {
|
||||
if (MACHINE_HAS_TOPOLOGY)
|
||||
topology_mode = TOPOLOGY_MODE_HW;
|
||||
else
|
||||
topology_mode = TOPOLOGY_MODE_SINGLE;
|
||||
}
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
goto out;
|
||||
tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
@ -474,12 +511,97 @@ out:
|
||||
__arch_update_cpu_topology();
|
||||
}
|
||||
|
||||
static inline int topology_get_mode(int enabled)
|
||||
{
|
||||
if (!enabled)
|
||||
return TOPOLOGY_MODE_SINGLE;
|
||||
return MACHINE_HAS_TOPOLOGY ? TOPOLOGY_MODE_HW : TOPOLOGY_MODE_PACKAGE;
|
||||
}
|
||||
|
||||
static inline int topology_is_enabled(void)
|
||||
{
|
||||
return topology_mode != TOPOLOGY_MODE_SINGLE;
|
||||
}
|
||||
|
||||
static int __init topology_setup(char *str)
|
||||
{
|
||||
bool enabled;
|
||||
int rc;
|
||||
|
||||
rc = kstrtobool(str, &enabled);
|
||||
if (rc)
|
||||
return rc;
|
||||
topology_mode = topology_get_mode(enabled);
|
||||
return 0;
|
||||
}
|
||||
early_param("topology", topology_setup);
|
||||
|
||||
static int topology_ctl_handler(struct ctl_table *ctl, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
unsigned int len;
|
||||
int new_mode;
|
||||
char buf[2];
|
||||
|
||||
if (!*lenp || *ppos) {
|
||||
*lenp = 0;
|
||||
return 0;
|
||||
}
|
||||
if (!write) {
|
||||
strncpy(buf, topology_is_enabled() ? "1\n" : "0\n",
|
||||
ARRAY_SIZE(buf));
|
||||
len = strnlen(buf, ARRAY_SIZE(buf));
|
||||
if (len > *lenp)
|
||||
len = *lenp;
|
||||
if (copy_to_user(buffer, buf, len))
|
||||
return -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
len = *lenp;
|
||||
if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len))
|
||||
return -EFAULT;
|
||||
if (buf[0] != '0' && buf[0] != '1')
|
||||
return -EINVAL;
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
new_mode = topology_get_mode(buf[0] == '1');
|
||||
if (topology_mode != new_mode) {
|
||||
topology_mode = new_mode;
|
||||
topology_schedule_update();
|
||||
}
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
topology_flush_work();
|
||||
out:
|
||||
*lenp = len;
|
||||
*ppos += len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ctl_table topology_ctl_table[] = {
|
||||
{
|
||||
.procname = "topology",
|
||||
.mode = 0644,
|
||||
.proc_handler = topology_ctl_handler,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct ctl_table topology_dir_table[] = {
|
||||
{
|
||||
.procname = "s390",
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = topology_ctl_table,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
if (MACHINE_HAS_TOPOLOGY)
|
||||
set_topology_timer();
|
||||
else
|
||||
topology_update_polarization_simple();
|
||||
register_sysctl_table(topology_dir_table);
|
||||
return device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching);
|
||||
}
|
||||
device_initcall(topology_init);
|
||||
|
@ -56,13 +56,12 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||
static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||
unsigned long end, int write, struct page **pages, int *nr)
|
||||
{
|
||||
unsigned long mask, result;
|
||||
struct page *head, *page;
|
||||
unsigned long mask;
|
||||
int refs;
|
||||
|
||||
result = write ? 0 : _SEGMENT_ENTRY_PROTECT;
|
||||
mask = result | _SEGMENT_ENTRY_INVALID;
|
||||
if ((pmd_val(pmd) & mask) != result)
|
||||
mask = (write ? _SEGMENT_ENTRY_PROTECT : 0) | _SEGMENT_ENTRY_INVALID;
|
||||
if ((pmd_val(pmd) & mask) != 0)
|
||||
return 0;
|
||||
VM_BUG_ON(!pfn_valid(pmd_val(pmd) >> PAGE_SHIFT));
|
||||
|
||||
|
@ -136,10 +136,6 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_pc, unsigned lo
|
||||
/* Free all resources held by a thread. */
|
||||
extern void release_thread(struct task_struct *);
|
||||
|
||||
/* Copy and release all segment info associated with a VM */
|
||||
#define copy_segments(p, mm) do { } while(0)
|
||||
#define release_segments(mm) do { } while(0)
|
||||
|
||||
/*
|
||||
* FPU lazy state save handling.
|
||||
*/
|
||||
|
@ -170,10 +170,6 @@ struct mm_struct;
|
||||
/* Free all resources held by a thread. */
|
||||
extern void release_thread(struct task_struct *);
|
||||
|
||||
/* Copy and release all segment info associated with a VM */
|
||||
#define copy_segments(p, mm) do { } while (0)
|
||||
#define release_segments(mm) do { } while (0)
|
||||
#define forget_segments() do { } while (0)
|
||||
/*
|
||||
* FPU lazy state save handling.
|
||||
*/
|
||||
|
@ -409,5 +409,4 @@ CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ZLIB=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
|
@ -189,7 +189,6 @@ CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_FILTER=y
|
||||
CONFIG_IP_NF_TARGET_REJECT=y
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_ECN=m
|
||||
CONFIG_IP_NF_TARGET_TTL=m
|
||||
@ -521,7 +520,6 @@ CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ZLIB=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRC_CCITT=m
|
||||
CONFIG_CRC7=m
|
||||
|
@ -140,7 +140,7 @@ static int __init setup_maxnodemem(char *str)
|
||||
{
|
||||
char *endp;
|
||||
unsigned long long maxnodemem;
|
||||
long node;
|
||||
unsigned long node;
|
||||
|
||||
node = str ? simple_strtoul(str, &endp, 0) : INT_MAX;
|
||||
if (node >= MAX_NUMNODES || *endp != ':')
|
||||
|
@ -58,11 +58,6 @@ static inline void release_thread(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mm_copy_segments(struct mm_struct *from_mm,
|
||||
struct mm_struct *new_mm)
|
||||
{
|
||||
}
|
||||
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
/*
|
||||
|
@ -33,7 +33,7 @@
|
||||
#define s3 ((16 + 2 + (3 * 256)) * 4)
|
||||
|
||||
/* register macros */
|
||||
#define CTX %rdi
|
||||
#define CTX %r12
|
||||
#define RIO %rsi
|
||||
|
||||
#define RX0 %rax
|
||||
@ -56,12 +56,12 @@
|
||||
#define RX2bh %ch
|
||||
#define RX3bh %dh
|
||||
|
||||
#define RT0 %rbp
|
||||
#define RT0 %rdi
|
||||
#define RT1 %rsi
|
||||
#define RT2 %r8
|
||||
#define RT3 %r9
|
||||
|
||||
#define RT0d %ebp
|
||||
#define RT0d %edi
|
||||
#define RT1d %esi
|
||||
#define RT2d %r8d
|
||||
#define RT3d %r9d
|
||||
@ -120,13 +120,14 @@
|
||||
|
||||
ENTRY(__blowfish_enc_blk)
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rdi: ctx
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
* %rcx: bool, if true: xor output
|
||||
*/
|
||||
movq %rbp, %r11;
|
||||
movq %r12, %r11;
|
||||
|
||||
movq %rdi, CTX;
|
||||
movq %rsi, %r10;
|
||||
movq %rdx, RIO;
|
||||
|
||||
@ -142,7 +143,7 @@ ENTRY(__blowfish_enc_blk)
|
||||
round_enc(14);
|
||||
add_roundkey_enc(16);
|
||||
|
||||
movq %r11, %rbp;
|
||||
movq %r11, %r12;
|
||||
|
||||
movq %r10, RIO;
|
||||
test %cl, %cl;
|
||||
@ -157,12 +158,13 @@ ENDPROC(__blowfish_enc_blk)
|
||||
|
||||
ENTRY(blowfish_dec_blk)
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rdi: ctx
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
movq %rbp, %r11;
|
||||
movq %r12, %r11;
|
||||
|
||||
movq %rdi, CTX;
|
||||
movq %rsi, %r10;
|
||||
movq %rdx, RIO;
|
||||
|
||||
@ -181,7 +183,7 @@ ENTRY(blowfish_dec_blk)
|
||||
movq %r10, RIO;
|
||||
write_block();
|
||||
|
||||
movq %r11, %rbp;
|
||||
movq %r11, %r12;
|
||||
|
||||
ret;
|
||||
ENDPROC(blowfish_dec_blk)
|
||||
@ -298,20 +300,21 @@ ENDPROC(blowfish_dec_blk)
|
||||
|
||||
ENTRY(__blowfish_enc_blk_4way)
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rdi: ctx
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
* %rcx: bool, if true: xor output
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %r12;
|
||||
pushq %rbx;
|
||||
pushq %rcx;
|
||||
|
||||
preload_roundkey_enc(0);
|
||||
|
||||
movq %rdi, CTX
|
||||
movq %rsi, %r11;
|
||||
movq %rdx, RIO;
|
||||
|
||||
preload_roundkey_enc(0);
|
||||
|
||||
read_block4();
|
||||
|
||||
round_enc4(0);
|
||||
@ -324,39 +327,40 @@ ENTRY(__blowfish_enc_blk_4way)
|
||||
round_enc4(14);
|
||||
add_preloaded_roundkey4();
|
||||
|
||||
popq %rbp;
|
||||
popq %r12;
|
||||
movq %r11, RIO;
|
||||
|
||||
test %bpl, %bpl;
|
||||
test %r12b, %r12b;
|
||||
jnz .L__enc_xor4;
|
||||
|
||||
write_block4();
|
||||
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
popq %r12;
|
||||
ret;
|
||||
|
||||
.L__enc_xor4:
|
||||
xor_block4();
|
||||
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
popq %r12;
|
||||
ret;
|
||||
ENDPROC(__blowfish_enc_blk_4way)
|
||||
|
||||
ENTRY(blowfish_dec_blk_4way)
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rdi: ctx
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %r12;
|
||||
pushq %rbx;
|
||||
preload_roundkey_dec(17);
|
||||
|
||||
movq %rsi, %r11;
|
||||
movq %rdi, CTX;
|
||||
movq %rsi, %r11
|
||||
movq %rdx, RIO;
|
||||
|
||||
preload_roundkey_dec(17);
|
||||
read_block4();
|
||||
|
||||
round_dec4(17);
|
||||
@ -373,7 +377,7 @@ ENTRY(blowfish_dec_blk_4way)
|
||||
write_block4();
|
||||
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
popq %r12;
|
||||
|
||||
ret;
|
||||
ENDPROC(blowfish_dec_blk_4way)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user