Merge branches 'x86/cleanups', 'x86/mpparse', 'x86/numa' and 'x86/uv' into x86/urgent
This commit is contained in:
commit
0936912274
865 changed files with 41789 additions and 16637 deletions
8
CREDITS
8
CREDITS
|
@ -369,10 +369,10 @@ P: 1024/8462A731 4C 55 86 34 44 59 A7 99 2B 97 88 4A 88 9A 0D 97
|
||||||
D: sun4 port, Sparc hacker
|
D: sun4 port, Sparc hacker
|
||||||
|
|
||||||
N: Hugh Blemings
|
N: Hugh Blemings
|
||||||
E: hugh@misc.nu
|
E: hugh@blemings.org
|
||||||
W: http://misc.nu/hugh/
|
W: http://blemings.org/hugh
|
||||||
D: Author and maintainer of the Keyspan USB to Serial drivers
|
D: Original author of the Keyspan USB to serial drivers, random PowerPC hacker
|
||||||
S: Po Box 234
|
S: PO Box 234
|
||||||
S: Belconnen ACT 2616
|
S: Belconnen ACT 2616
|
||||||
S: Australia
|
S: Australia
|
||||||
|
|
||||||
|
|
|
@ -31,3 +31,51 @@ not defined by include/asm-XXX/topology.h:
|
||||||
2) core_id: 0
|
2) core_id: 0
|
||||||
3) thread_siblings: just the given CPU
|
3) thread_siblings: just the given CPU
|
||||||
4) core_siblings: just the given CPU
|
4) core_siblings: just the given CPU
|
||||||
|
|
||||||
|
Additionally, cpu topology information is provided under
|
||||||
|
/sys/devices/system/cpu and includes these files. The internal
|
||||||
|
source for the output is in brackets ("[]").
|
||||||
|
|
||||||
|
kernel_max: the maximum cpu index allowed by the kernel configuration.
|
||||||
|
[NR_CPUS-1]
|
||||||
|
|
||||||
|
offline: cpus that are not online because they have been
|
||||||
|
HOTPLUGGED off (see cpu-hotplug.txt) or exceed the limit
|
||||||
|
of cpus allowed by the kernel configuration (kernel_max
|
||||||
|
above). [~cpu_online_mask + cpus >= NR_CPUS]
|
||||||
|
|
||||||
|
online: cpus that are online and being scheduled [cpu_online_mask]
|
||||||
|
|
||||||
|
possible: cpus that have been allocated resources and can be
|
||||||
|
brought online if they are present. [cpu_possible_mask]
|
||||||
|
|
||||||
|
present: cpus that have been identified as being present in the
|
||||||
|
system. [cpu_present_mask]
|
||||||
|
|
||||||
|
The format for the above output is compatible with cpulist_parse()
|
||||||
|
[see <linux/cpumask.h>]. Some examples follow.
|
||||||
|
|
||||||
|
In this example, there are 64 cpus in the system but cpus 32-63 exceed
|
||||||
|
the kernel max which is limited to 0..31 by the NR_CPUS config option
|
||||||
|
being 32. Note also that cpus 2 and 4-31 are not online but could be
|
||||||
|
brought online as they are both present and possible.
|
||||||
|
|
||||||
|
kernel_max: 31
|
||||||
|
offline: 2,4-31,32-63
|
||||||
|
online: 0-1,3
|
||||||
|
possible: 0-31
|
||||||
|
present: 0-31
|
||||||
|
|
||||||
|
In this example, the NR_CPUS config option is 128, but the kernel was
|
||||||
|
started with possible_cpus=144. There are 4 cpus in the system and cpu2
|
||||||
|
was manually taken offline (and is the only cpu that can be brought
|
||||||
|
online.)
|
||||||
|
|
||||||
|
kernel_max: 127
|
||||||
|
offline: 2,4-127,128-143
|
||||||
|
online: 0-1,3
|
||||||
|
possible: 0-127
|
||||||
|
present: 0-3
|
||||||
|
|
||||||
|
See cpu-hotplug.txt for the possible_cpus=NUM kernel start parameter
|
||||||
|
as well as more information on the various cpumask's.
|
||||||
|
|
|
@ -31,7 +31,6 @@ Features which OCFS2 does not support yet:
|
||||||
- quotas
|
- quotas
|
||||||
- Directory change notification (F_NOTIFY)
|
- Directory change notification (F_NOTIFY)
|
||||||
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
|
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
|
||||||
- POSIX ACLs
|
|
||||||
|
|
||||||
Mount options
|
Mount options
|
||||||
=============
|
=============
|
||||||
|
@ -79,3 +78,5 @@ inode64 Indicates that Ocfs2 is allowed to create inodes at
|
||||||
bits of significance.
|
bits of significance.
|
||||||
user_xattr (*) Enables Extended User Attributes.
|
user_xattr (*) Enables Extended User Attributes.
|
||||||
nouser_xattr Disables Extended User Attributes.
|
nouser_xattr Disables Extended User Attributes.
|
||||||
|
acl Enables POSIX Access Control Lists support.
|
||||||
|
noacl (*) Disables POSIX Access Control Lists support.
|
||||||
|
|
|
@ -95,6 +95,9 @@ no_chk_data_crc skip checking of CRCs on data nodes in order to
|
||||||
of this option is that corruption of the contents
|
of this option is that corruption of the contents
|
||||||
of a file can go unnoticed.
|
of a file can go unnoticed.
|
||||||
chk_data_crc (*) do not skip checking CRCs on data nodes
|
chk_data_crc (*) do not skip checking CRCs on data nodes
|
||||||
|
compr=none override default compressor and set it to "none"
|
||||||
|
compr=lzo override default compressor and set it to "lzo"
|
||||||
|
compr=zlib override default compressor and set it to "zlib"
|
||||||
|
|
||||||
|
|
||||||
Quick usage instructions
|
Quick usage instructions
|
||||||
|
|
|
@ -97,6 +97,7 @@ Code Seq# Include File Comments
|
||||||
<http://linux01.gwdg.de/~alatham/ppdd.html>
|
<http://linux01.gwdg.de/~alatham/ppdd.html>
|
||||||
'M' all linux/soundcard.h
|
'M' all linux/soundcard.h
|
||||||
'N' 00-1F drivers/usb/scanner.h
|
'N' 00-1F drivers/usb/scanner.h
|
||||||
|
'O' 00-02 include/mtd/ubi-user.h UBI
|
||||||
'P' all linux/soundcard.h
|
'P' all linux/soundcard.h
|
||||||
'Q' all linux/soundcard.h
|
'Q' all linux/soundcard.h
|
||||||
'R' 00-1F linux/random.h
|
'R' 00-1F linux/random.h
|
||||||
|
@ -142,6 +143,9 @@ Code Seq# Include File Comments
|
||||||
'n' 00-7F linux/ncp_fs.h
|
'n' 00-7F linux/ncp_fs.h
|
||||||
'n' E0-FF video/matrox.h matroxfb
|
'n' E0-FF video/matrox.h matroxfb
|
||||||
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
|
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
|
||||||
|
'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
|
||||||
|
'o' 40-41 include/mtd/ubi-user.h UBI
|
||||||
|
'o' 01-A1 include/linux/dvb/*.h DVB
|
||||||
'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this)
|
'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this)
|
||||||
'p' 00-3F linux/mc146818rtc.h conflict!
|
'p' 00-3F linux/mc146818rtc.h conflict!
|
||||||
'p' 40-7F linux/nvram.h
|
'p' 40-7F linux/nvram.h
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
00-INDEX
|
00-INDEX
|
||||||
- this file: info on the kernel build process
|
- this file: info on the kernel build process
|
||||||
|
kbuild.txt
|
||||||
|
- developer information on kbuild
|
||||||
|
kconfig.txt
|
||||||
|
- usage help for make *config
|
||||||
kconfig-language.txt
|
kconfig-language.txt
|
||||||
- specification of Config Language, the language in Kconfig files
|
- specification of Config Language, the language in Kconfig files
|
||||||
makefiles.txt
|
makefiles.txt
|
||||||
|
|
126
Documentation/kbuild/kbuild.txt
Normal file
126
Documentation/kbuild/kbuild.txt
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
Environment variables
|
||||||
|
|
||||||
|
KCPPFLAGS
|
||||||
|
--------------------------------------------------
|
||||||
|
Additional options to pass when preprocessing. The preprocessing options
|
||||||
|
will be used in all cases where kbuild do preprocessing including
|
||||||
|
building C files and assembler files.
|
||||||
|
|
||||||
|
KAFLAGS
|
||||||
|
--------------------------------------------------
|
||||||
|
Additional options to the assembler.
|
||||||
|
|
||||||
|
KCFLAGS
|
||||||
|
--------------------------------------------------
|
||||||
|
Additional options to the C compiler.
|
||||||
|
|
||||||
|
KBUILD_VERBOSE
|
||||||
|
--------------------------------------------------
|
||||||
|
Set the kbuild verbosity. Can be assinged same values as "V=...".
|
||||||
|
See make help for the full list.
|
||||||
|
Setting "V=..." takes precedence over KBUILD_VERBOSE.
|
||||||
|
|
||||||
|
KBUILD_EXTMOD
|
||||||
|
--------------------------------------------------
|
||||||
|
Set the directory to look for the kernel source when building external
|
||||||
|
modules.
|
||||||
|
The directory can be specified in several ways:
|
||||||
|
1) Use "M=..." on the command line
|
||||||
|
2) Environmnet variable KBUILD_EXTMOD
|
||||||
|
3) Environmnet variable SUBDIRS
|
||||||
|
The possibilities are listed in the order they take precedence.
|
||||||
|
Using "M=..." will always override the others.
|
||||||
|
|
||||||
|
KBUILD_OUTPUT
|
||||||
|
--------------------------------------------------
|
||||||
|
Specify the output directory when building the kernel.
|
||||||
|
The output directory can also be specificed using "O=...".
|
||||||
|
Setting "O=..." takes precedence over KBUILD_OUTPUT
|
||||||
|
|
||||||
|
ARCH
|
||||||
|
--------------------------------------------------
|
||||||
|
Set ARCH to the architecture to be built.
|
||||||
|
In most cases the name of the architecture is the same as the
|
||||||
|
directory name found in the arch/ directory.
|
||||||
|
But some architectures suach as x86 and sparc has aliases.
|
||||||
|
x86: i386 for 32 bit, x86_64 for 64 bit
|
||||||
|
sparc: sparc for 32 bit, sparc64 for 64 bit
|
||||||
|
|
||||||
|
CROSS_COMPILE
|
||||||
|
--------------------------------------------------
|
||||||
|
Specify an optional fixed part of the binutils filename.
|
||||||
|
CROSS_COMPILE can be a part of the filename or the full path.
|
||||||
|
|
||||||
|
CROSS_COMPILE is also used for ccache is some setups.
|
||||||
|
|
||||||
|
CF
|
||||||
|
--------------------------------------------------
|
||||||
|
Additional options for sparse.
|
||||||
|
CF is often used on the command-line like this:
|
||||||
|
|
||||||
|
make CF=-Wbitwise C=2
|
||||||
|
|
||||||
|
INSTALL_PATH
|
||||||
|
--------------------------------------------------
|
||||||
|
INSTALL_PATH specifies where to place the updated kernel and system map
|
||||||
|
images. Default is /boot, but you can set it to other values
|
||||||
|
|
||||||
|
|
||||||
|
MODLIB
|
||||||
|
--------------------------------------------------
|
||||||
|
Specify where to install modules.
|
||||||
|
The default value is:
|
||||||
|
|
||||||
|
$(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
|
||||||
|
|
||||||
|
The value can be overridden in which case the default value is ignored.
|
||||||
|
|
||||||
|
INSTALL_MOD_PATH
|
||||||
|
--------------------------------------------------
|
||||||
|
INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
|
||||||
|
relocations required by build roots. This is not defined in the
|
||||||
|
makefile but the argument can be passed to make if needed.
|
||||||
|
|
||||||
|
INSTALL_MOD_STRIP
|
||||||
|
--------------------------------------------------
|
||||||
|
INSTALL_MOD_STRIP, if defined, will cause modules to be
|
||||||
|
stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
|
||||||
|
the default option --strip-debug will be used. Otherwise,
|
||||||
|
INSTALL_MOD_STRIP will used as the options to the strip command.
|
||||||
|
|
||||||
|
INSTALL_FW_PATH
|
||||||
|
--------------------------------------------------
|
||||||
|
INSTALL_FW_PATH specify where to install the firmware blobs.
|
||||||
|
The default value is:
|
||||||
|
|
||||||
|
$(INSTALL_MOD_PATH)/lib/firmware
|
||||||
|
|
||||||
|
The value can be overridden in which case the default value is ignored.
|
||||||
|
|
||||||
|
INSTALL_HDR_PATH
|
||||||
|
--------------------------------------------------
|
||||||
|
INSTALL_HDR_PATH specify where to install user space headers when
|
||||||
|
executing "make headers_*".
|
||||||
|
The default value is:
|
||||||
|
|
||||||
|
$(objtree)/usr
|
||||||
|
|
||||||
|
$(objtree) is the directory where output files are saved.
|
||||||
|
The output directory is often set using "O=..." on the commandline.
|
||||||
|
|
||||||
|
The value can be overridden in which case the default value is ignored.
|
||||||
|
|
||||||
|
KBUILD_MODPOST_WARN
|
||||||
|
--------------------------------------------------
|
||||||
|
KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
|
||||||
|
symbols in the final module linking stage.
|
||||||
|
|
||||||
|
KBUILD_MODPOST_FINAL
|
||||||
|
--------------------------------------------------
|
||||||
|
KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
|
||||||
|
This is solely usefull to speed up test compiles.
|
||||||
|
|
||||||
|
KBUILD_EXTRA_SYMBOLS
|
||||||
|
--------------------------------------------------
|
||||||
|
For modules use symbols from another modules.
|
||||||
|
See more details in modules.txt.
|
188
Documentation/kbuild/kconfig.txt
Normal file
188
Documentation/kbuild/kconfig.txt
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
This file contains some assistance for using "make *config".
|
||||||
|
|
||||||
|
Use "make help" to list all of the possible configuration targets.
|
||||||
|
|
||||||
|
The xconfig ('qconf') and menuconfig ('mconf') programs also
|
||||||
|
have embedded help text. Be sure to check it for navigation,
|
||||||
|
search, and other general help text.
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
General
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
New kernel releases often introduce new config symbols. Often more
|
||||||
|
important, new kernel releases may rename config symbols. When
|
||||||
|
this happens, using a previously working .config file and running
|
||||||
|
"make oldconfig" won't necessarily produce a working new kernel
|
||||||
|
for you, so you may find that you need to see what NEW kernel
|
||||||
|
symbols have been introduced.
|
||||||
|
|
||||||
|
To see a list of new config symbols when using "make oldconfig", use
|
||||||
|
|
||||||
|
cp user/some/old.config .config
|
||||||
|
yes "" | make oldconfig >conf.new
|
||||||
|
|
||||||
|
and the config program will list as (NEW) any new symbols that have
|
||||||
|
unknown values. Of course, the .config file is also updated with
|
||||||
|
new (default) values, so you can use:
|
||||||
|
|
||||||
|
grep "(NEW)" conf.new
|
||||||
|
|
||||||
|
to see the new config symbols or you can 'diff' the previous and
|
||||||
|
new .config files to see the differences:
|
||||||
|
|
||||||
|
diff .config.old .config | less
|
||||||
|
|
||||||
|
(Yes, we need something better here.)
|
||||||
|
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
menuconfig
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
SEARCHING for CONFIG symbols
|
||||||
|
|
||||||
|
Searching in menuconfig:
|
||||||
|
|
||||||
|
The Search function searches for kernel configuration symbol
|
||||||
|
names, so you have to know something close to what you are
|
||||||
|
looking for.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
/hotplug
|
||||||
|
This lists all config symbols that contain "hotplug",
|
||||||
|
e.g., HOTPLUG, HOTPLUG_CPU, MEMORY_HOTPLUG.
|
||||||
|
|
||||||
|
For search help, enter / followed TAB-TAB-TAB (to highlight
|
||||||
|
<Help>) and Enter. This will tell you that you can also use
|
||||||
|
regular expressions (regexes) in the search string, so if you
|
||||||
|
are not interested in MEMORY_HOTPLUG, you could try
|
||||||
|
|
||||||
|
/^hotplug
|
||||||
|
|
||||||
|
|
||||||
|
______________________________________________________________________
|
||||||
|
Color Themes for 'menuconfig'
|
||||||
|
|
||||||
|
It is possible to select different color themes using the variable
|
||||||
|
MENUCONFIG_COLOR. To select a theme use:
|
||||||
|
|
||||||
|
make MENUCONFIG_COLOR=<theme> menuconfig
|
||||||
|
|
||||||
|
Available themes are:
|
||||||
|
mono => selects colors suitable for monochrome displays
|
||||||
|
blackbg => selects a color scheme with black background
|
||||||
|
classic => theme with blue background. The classic look
|
||||||
|
bluetitle => a LCD friendly version of classic. (default)
|
||||||
|
|
||||||
|
______________________________________________________________________
|
||||||
|
Environment variables in 'menuconfig'
|
||||||
|
|
||||||
|
KCONFIG_ALLCONFIG
|
||||||
|
--------------------------------------------------
|
||||||
|
(partially based on lkml email from/by Rob Landley, re: miniconfig)
|
||||||
|
--------------------------------------------------
|
||||||
|
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can
|
||||||
|
also use the environment variable KCONFIG_ALLCONFIG as a flag or a
|
||||||
|
filename that contains config symbols that the user requires to be
|
||||||
|
set to a specific value. If KCONFIG_ALLCONFIG is used without a
|
||||||
|
filename, "make *config" checks for a file named
|
||||||
|
"all{yes/mod/no/random}.config" (corresponding to the *config command
|
||||||
|
that was used) for symbol values that are to be forced. If this file
|
||||||
|
is not found, it checks for a file named "all.config" to contain forced
|
||||||
|
values.
|
||||||
|
|
||||||
|
This enables you to create "miniature" config (miniconfig) or custom
|
||||||
|
config files containing just the config symbols that you are interested
|
||||||
|
in. Then the kernel config system generates the full .config file,
|
||||||
|
including dependencies of your miniconfig file, based on the miniconfig
|
||||||
|
file.
|
||||||
|
|
||||||
|
This 'KCONFIG_ALLCONFIG' file is a config file which contains
|
||||||
|
(usually a subset of all) preset config symbols. These variable
|
||||||
|
settings are still subject to normal dependency checks.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
|
||||||
|
or
|
||||||
|
KCONFIG_ALLCONFIG=mini.config make allnoconfig
|
||||||
|
or
|
||||||
|
make KCONFIG_ALLCONFIG=mini.config allnoconfig
|
||||||
|
|
||||||
|
These examples will disable most options (allnoconfig) but enable or
|
||||||
|
disable the options that are explicitly listed in the specified
|
||||||
|
mini-config files.
|
||||||
|
|
||||||
|
KCONFIG_NOSILENTUPDATE
|
||||||
|
--------------------------------------------------
|
||||||
|
If this variable has a non-blank value, it prevents silent kernel
|
||||||
|
config udpates (requires explicit updates).
|
||||||
|
|
||||||
|
KCONFIG_CONFIG
|
||||||
|
--------------------------------------------------
|
||||||
|
This environment variable can be used to specify a default kernel config
|
||||||
|
file name to override the default name of ".config".
|
||||||
|
|
||||||
|
KCONFIG_OVERWRITECONFIG
|
||||||
|
--------------------------------------------------
|
||||||
|
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
||||||
|
break symlinks when .config is a symlink to somewhere else.
|
||||||
|
|
||||||
|
KCONFIG_NOTIMESTAMP
|
||||||
|
--------------------------------------------------
|
||||||
|
If this environment variable exists and is non-null, the timestamp line
|
||||||
|
in generated .config files is omitted.
|
||||||
|
|
||||||
|
KCONFIG_AUTOCONFIG
|
||||||
|
--------------------------------------------------
|
||||||
|
This environment variable can be set to specify the path & name of the
|
||||||
|
"auto.conf" file. Its default value is "include/config/auto.conf".
|
||||||
|
|
||||||
|
KCONFIG_AUTOHEADER
|
||||||
|
--------------------------------------------------
|
||||||
|
This environment variable can be set to specify the path & name of the
|
||||||
|
"autoconf.h" (header) file. Its default value is "include/linux/autoconf.h".
|
||||||
|
|
||||||
|
______________________________________________________________________
|
||||||
|
menuconfig User Interface Options
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
MENUCONFIG_MODE
|
||||||
|
--------------------------------------------------
|
||||||
|
This mode shows all sub-menus in one large tree.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
MENUCONFIG_MODE=single_menu make menuconfig
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
xconfig
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Searching in xconfig:
|
||||||
|
|
||||||
|
The Search function searches for kernel configuration symbol
|
||||||
|
names, so you have to know something close to what you are
|
||||||
|
looking for.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
Ctrl-F hotplug
|
||||||
|
or
|
||||||
|
Menu: File, Search, hotplug
|
||||||
|
|
||||||
|
lists all config symbol entries that contain "hotplug" in
|
||||||
|
the symbol name. In this Search dialog, you may change the
|
||||||
|
config setting for any of the entries that are not grayed out.
|
||||||
|
You can also enter a different search string without having
|
||||||
|
to return to the main menu.
|
||||||
|
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
gconfig
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Searching in gconfig:
|
||||||
|
|
||||||
|
None (gconfig isn't maintained as well as xconfig or menuconfig);
|
||||||
|
however, gconfig does have a few more viewing choices than
|
||||||
|
xconfig does.
|
||||||
|
|
||||||
|
###
|
|
@ -152,3 +152,4 @@
|
||||||
151 -> ADS Tech Instant HDTV [1421:0380]
|
151 -> ADS Tech Instant HDTV [1421:0380]
|
||||||
152 -> Asus Tiger Rev:1.00 [1043:4857]
|
152 -> Asus Tiger Rev:1.00 [1043:4857]
|
||||||
153 -> Kworld Plus TV Analog Lite PCI [17de:7128]
|
153 -> Kworld Plus TV Analog Lite PCI [17de:7128]
|
||||||
|
154 -> Avermedia AVerTV GO 007 FM Plus [1461:f31d]
|
||||||
|
|
|
@ -41,6 +41,7 @@ chips are known to work:
|
||||||
- 10c4:818a: Silicon Labs USB FM Radio Reference Design
|
- 10c4:818a: Silicon Labs USB FM Radio Reference Design
|
||||||
- 06e1:a155: ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF)
|
- 06e1:a155: ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF)
|
||||||
- 1b80:d700: KWorld USB FM Radio SnapMusic Mobile 700 (FM700)
|
- 1b80:d700: KWorld USB FM Radio SnapMusic Mobile 700 (FM700)
|
||||||
|
- 10c5:819a: DealExtreme USB Radio
|
||||||
|
|
||||||
|
|
||||||
Software
|
Software
|
||||||
|
|
|
@ -184,7 +184,7 @@ may be NULL if the subdev driver does not support anything from that category.
|
||||||
It looks like this:
|
It looks like this:
|
||||||
|
|
||||||
struct v4l2_subdev_core_ops {
|
struct v4l2_subdev_core_ops {
|
||||||
int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_chip_ident *chip);
|
int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
|
||||||
int (*log_status)(struct v4l2_subdev *sd);
|
int (*log_status)(struct v4l2_subdev *sd);
|
||||||
int (*init)(struct v4l2_subdev *sd, u32 val);
|
int (*init)(struct v4l2_subdev *sd, u32 val);
|
||||||
...
|
...
|
||||||
|
@ -390,16 +390,18 @@ allocated memory.
|
||||||
|
|
||||||
You should also set these fields:
|
You should also set these fields:
|
||||||
|
|
||||||
- parent: set to the parent device (same device as was used to register
|
- v4l2_dev: set to the v4l2_device parent device.
|
||||||
v4l2_device).
|
|
||||||
- name: set to something descriptive and unique.
|
- name: set to something descriptive and unique.
|
||||||
- fops: set to the file_operations struct.
|
- fops: set to the v4l2_file_operations struct.
|
||||||
- ioctl_ops: if you use the v4l2_ioctl_ops to simplify ioctl maintenance
|
- ioctl_ops: if you use the v4l2_ioctl_ops to simplify ioctl maintenance
|
||||||
(highly recommended to use this and it might become compulsory in the
|
(highly recommended to use this and it might become compulsory in the
|
||||||
future!), then set this to your v4l2_ioctl_ops struct.
|
future!), then set this to your v4l2_ioctl_ops struct.
|
||||||
|
|
||||||
If you use v4l2_ioctl_ops, then you should set .unlocked_ioctl to
|
If you use v4l2_ioctl_ops, then you should set either .unlocked_ioctl or
|
||||||
__video_ioctl2 or .ioctl to video_ioctl2 in your file_operations struct.
|
.ioctl to video_ioctl2 in your v4l2_file_operations struct.
|
||||||
|
|
||||||
|
The v4l2_file_operations struct is a subset of file_operations. The main
|
||||||
|
difference is that the inode argument is omitted since it is never used.
|
||||||
|
|
||||||
|
|
||||||
video_device registration
|
video_device registration
|
||||||
|
@ -410,7 +412,7 @@ for you.
|
||||||
|
|
||||||
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||||
if (err) {
|
if (err) {
|
||||||
video_device_release(vdev); // or kfree(my_vdev);
|
video_device_release(vdev); /* or kfree(my_vdev); */
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -516,5 +518,4 @@ void *video_drvdata(struct file *file);
|
||||||
|
|
||||||
You can go from a video_device struct to the v4l2_device struct using:
|
You can go from a video_device struct to the v4l2_device struct using:
|
||||||
|
|
||||||
struct v4l2_device *v4l2_dev = dev_get_drvdata(vdev->parent);
|
struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ Protocol 2.07: (Kernel 2.6.24) Added paravirtualised boot protocol.
|
||||||
and KEEP_SEGMENTS flag in load_flags.
|
and KEEP_SEGMENTS flag in load_flags.
|
||||||
|
|
||||||
Protocol 2.08: (Kernel 2.6.26) Added crc32 checksum and ELF format
|
Protocol 2.08: (Kernel 2.6.26) Added crc32 checksum and ELF format
|
||||||
payload. Introduced payload_offset and payload length
|
payload. Introduced payload_offset and payload_length
|
||||||
fields to aid in locating the payload.
|
fields to aid in locating the payload.
|
||||||
|
|
||||||
Protocol 2.09: (Kernel 2.6.26) Added a field of 64-bit physical
|
Protocol 2.09: (Kernel 2.6.26) Added a field of 64-bit physical
|
||||||
|
|
15
MAINTAINERS
15
MAINTAINERS
|
@ -4015,10 +4015,12 @@ L: alsa-devel@alsa-project.org (subscribers-only)
|
||||||
W: http://alsa-project.org/main/index.php/ASoC
|
W: http://alsa-project.org/main/index.php/ASoC
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
SPARC (sparc32)
|
SPARC + UltraSPARC (sparc/sparc64)
|
||||||
P: William L. Irwin
|
P: David S. Miller
|
||||||
M: wli@holomorphy.com
|
M: davem@davemloft.net
|
||||||
L: sparclinux@vger.kernel.org
|
L: sparclinux@vger.kernel.org
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
||||||
|
@ -4302,13 +4304,6 @@ M: dushistov@mail.ru
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
UltraSPARC (sparc64)
|
|
||||||
P: David S. Miller
|
|
||||||
M: davem@davemloft.net
|
|
||||||
L: sparclinux@vger.kernel.org
|
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
ULTRA-WIDEBAND (UWB) SUBSYSTEM:
|
ULTRA-WIDEBAND (UWB) SUBSYSTEM:
|
||||||
P: David Vrabel
|
P: David Vrabel
|
||||||
M: david.vrabel@csr.com
|
M: david.vrabel@csr.com
|
||||||
|
|
3
Makefile
3
Makefile
|
@ -321,7 +321,8 @@ KALLSYMS = scripts/kallsyms
|
||||||
PERL = perl
|
PERL = perl
|
||||||
CHECK = sparse
|
CHECK = sparse
|
||||||
|
|
||||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(CF)
|
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
||||||
|
-Wbitwise -Wno-return-void $(CF)
|
||||||
MODFLAGS = -DMODULE
|
MODFLAGS = -DMODULE
|
||||||
CFLAGS_MODULE = $(MODFLAGS)
|
CFLAGS_MODULE = $(MODFLAGS)
|
||||||
AFLAGS_MODULE = $(MODFLAGS)
|
AFLAGS_MODULE = $(MODFLAGS)
|
||||||
|
|
32
README
32
README
|
@ -52,11 +52,11 @@ DOCUMENTATION:
|
||||||
|
|
||||||
- The Documentation/DocBook/ subdirectory contains several guides for
|
- The Documentation/DocBook/ subdirectory contains several guides for
|
||||||
kernel developers and users. These guides can be rendered in a
|
kernel developers and users. These guides can be rendered in a
|
||||||
number of formats: PostScript (.ps), PDF, and HTML, among others.
|
number of formats: PostScript (.ps), PDF, HTML, & man-pages, among others.
|
||||||
After installation, "make psdocs", "make pdfdocs", or "make htmldocs"
|
After installation, "make psdocs", "make pdfdocs", "make htmldocs",
|
||||||
will render the documentation in the requested format.
|
or "make mandocs" will render the documentation in the requested format.
|
||||||
|
|
||||||
INSTALLING the kernel:
|
INSTALLING the kernel source:
|
||||||
|
|
||||||
- If you install the full sources, put the kernel tarball in a
|
- If you install the full sources, put the kernel tarball in a
|
||||||
directory where you have permissions (eg. your home directory) and
|
directory where you have permissions (eg. your home directory) and
|
||||||
|
@ -187,14 +187,9 @@ CONFIGURING the kernel:
|
||||||
"make randconfig" Create a ./.config file by setting symbol
|
"make randconfig" Create a ./.config file by setting symbol
|
||||||
values to random values.
|
values to random values.
|
||||||
|
|
||||||
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can
|
You can find more information on using the Linux kernel config tools
|
||||||
also use the environment variable KCONFIG_ALLCONFIG to specify a
|
in Documentation/kbuild/make-configs.txt.
|
||||||
filename that contains config options that the user requires to be
|
|
||||||
set to a specific value. If KCONFIG_ALLCONFIG=filename is not used,
|
|
||||||
"make *config" checks for a file named "all{yes/mod/no/random}.config"
|
|
||||||
for symbol values that are to be forced. If this file is not found,
|
|
||||||
it checks for a file named "all.config" to contain forced values.
|
|
||||||
|
|
||||||
NOTES on "make config":
|
NOTES on "make config":
|
||||||
- having unnecessary drivers will make the kernel bigger, and can
|
- having unnecessary drivers will make the kernel bigger, and can
|
||||||
under some circumstances lead to problems: probing for a
|
under some circumstances lead to problems: probing for a
|
||||||
|
@ -231,6 +226,19 @@ COMPILING the kernel:
|
||||||
- If you configured any of the parts of the kernel as `modules', you
|
- If you configured any of the parts of the kernel as `modules', you
|
||||||
will also have to do "make modules_install".
|
will also have to do "make modules_install".
|
||||||
|
|
||||||
|
- Verbose kernel compile/build output:
|
||||||
|
|
||||||
|
Normally the kernel build system runs in a fairly quiet mode (but not
|
||||||
|
totally silent). However, sometimes you or other kernel developers need
|
||||||
|
to see compile, link, or other commands exactly as they are executed.
|
||||||
|
For this, use "verbose" build mode. This is done by inserting
|
||||||
|
"V=1" in the "make" command. E.g.:
|
||||||
|
|
||||||
|
make V=1 all
|
||||||
|
|
||||||
|
To have the build system also tell the reason for the rebuild of each
|
||||||
|
target, use "V=2". The default is "V=0".
|
||||||
|
|
||||||
- Keep a backup kernel handy in case something goes wrong. This is
|
- Keep a backup kernel handy in case something goes wrong. This is
|
||||||
especially true for the development releases, since each new release
|
especially true for the development releases, since each new release
|
||||||
contains new code which has not been debugged. Make sure you keep a
|
contains new code which has not been debugged. Make sure you keep a
|
||||||
|
|
|
@ -39,7 +39,24 @@ static inline cpumask_t node_to_cpumask(int node)
|
||||||
return node_cpu_mask;
|
return node_cpu_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern struct cpumask node_to_cpumask_map[];
|
||||||
|
/* FIXME: This is dumb, recalculating every time. But simple. */
|
||||||
|
static const struct cpumask *cpumask_of_node(int node)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
cpumask_clear(&node_to_cpumask_map[node]);
|
||||||
|
|
||||||
|
for_each_online_cpu(cpu) {
|
||||||
|
if (cpu_to_node(cpu) == node)
|
||||||
|
cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &node_to_cpumask_map[node];
|
||||||
|
}
|
||||||
|
|
||||||
#define pcibus_to_cpumask(bus) (cpu_online_map)
|
#define pcibus_to_cpumask(bus) (cpu_online_map)
|
||||||
|
#define cpumask_of_pcibus(bus) (cpu_online_mask)
|
||||||
|
|
||||||
#endif /* !CONFIG_NUMA */
|
#endif /* !CONFIG_NUMA */
|
||||||
# include <asm-generic/topology.h>
|
# include <asm-generic/topology.h>
|
||||||
|
|
|
@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror -Wno-sign-compare
|
||||||
|
|
||||||
obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
|
obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
|
||||||
irq_alpha.o signal.o setup.o ptrace.o time.o \
|
irq_alpha.o signal.o setup.o ptrace.o time.o \
|
||||||
alpha_ksyms.o systbls.o err_common.o io.o
|
alpha_ksyms.o systbls.o err_common.o io.o binfmt_loader.o
|
||||||
|
|
||||||
obj-$(CONFIG_VGA_HOSE) += console.o
|
obj-$(CONFIG_VGA_HOSE) += console.o
|
||||||
obj-$(CONFIG_SMP) += smp.o
|
obj-$(CONFIG_SMP) += smp.o
|
||||||
|
|
51
arch/alpha/kernel/binfmt_loader.c
Normal file
51
arch/alpha/kernel/binfmt_loader.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/file.h>
|
||||||
|
#include <linux/mm_types.h>
|
||||||
|
#include <linux/binfmts.h>
|
||||||
|
#include <linux/a.out.h>
|
||||||
|
|
||||||
|
static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
struct exec *eh = (struct exec *)bprm->buf;
|
||||||
|
unsigned long loader;
|
||||||
|
struct file *file;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
if (eh->fh.f_magic != 0x183 || (eh->fh.f_flags & 0x3000) != 0x3000)
|
||||||
|
return -ENOEXEC;
|
||||||
|
|
||||||
|
if (bprm->loader)
|
||||||
|
return -ENOEXEC;
|
||||||
|
|
||||||
|
allow_write_access(bprm->file);
|
||||||
|
fput(bprm->file);
|
||||||
|
bprm->file = NULL;
|
||||||
|
|
||||||
|
loader = bprm->vma->vm_end - sizeof(void *);
|
||||||
|
|
||||||
|
file = open_exec("/sbin/loader");
|
||||||
|
retval = PTR_ERR(file);
|
||||||
|
if (IS_ERR(file))
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Remember if the application is TASO. */
|
||||||
|
bprm->taso = eh->ah.entry < 0x100000000UL;
|
||||||
|
|
||||||
|
bprm->file = file;
|
||||||
|
bprm->loader = loader;
|
||||||
|
retval = prepare_binprm(bprm);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
return search_binary_handler(bprm,regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct linux_binfmt loader_format = {
|
||||||
|
.load_binary = load_binary,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init init_loader_binfmt(void)
|
||||||
|
{
|
||||||
|
return register_binfmt(&loader_format);
|
||||||
|
}
|
||||||
|
arch_initcall(init_loader_binfmt);
|
|
@ -50,7 +50,8 @@ int irq_select_affinity(unsigned int irq)
|
||||||
if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq])
|
if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq])
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
while (!cpu_possible(cpu) || !cpu_isset(cpu, irq_default_affinity))
|
while (!cpu_possible(cpu) ||
|
||||||
|
!cpumask_test_cpu(cpu, irq_default_affinity))
|
||||||
cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
|
cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
|
||||||
last_cpu = cpu;
|
last_cpu = cpu;
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,11 @@ int alpha_l3_cacheshape;
|
||||||
unsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON;
|
unsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NUMA
|
||||||
|
struct cpumask node_to_cpumask_map[MAX_NUMNODES] __read_mostly;
|
||||||
|
EXPORT_SYMBOL(node_to_cpumask_map);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Which processor we booted from. */
|
/* Which processor we booted from. */
|
||||||
int boot_cpuid;
|
int boot_cpuid;
|
||||||
|
|
||||||
|
|
|
@ -2321,7 +2321,7 @@ static struct clk i2c2_fck = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2chs2_fck = {
|
static struct clk i2chs2_fck = {
|
||||||
.name = "i2chs_fck",
|
.name = "i2c_fck",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.parent = &func_96m_ck,
|
.parent = &func_96m_ck,
|
||||||
.flags = CLOCK_IN_OMAP243X,
|
.flags = CLOCK_IN_OMAP243X,
|
||||||
|
@ -2354,7 +2354,7 @@ static struct clk i2c1_fck = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2chs1_fck = {
|
static struct clk i2chs1_fck = {
|
||||||
.name = "i2chs_fck",
|
.name = "i2c_fck",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.parent = &func_96m_ck,
|
.parent = &func_96m_ck,
|
||||||
.flags = CLOCK_IN_OMAP243X,
|
.flags = CLOCK_IN_OMAP243X,
|
||||||
|
|
|
@ -263,6 +263,11 @@ static inline int fls(unsigned long word)
|
||||||
return 32 - result;
|
return 32 - result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int __fls(unsigned long word)
|
||||||
|
{
|
||||||
|
return fls(word) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long find_first_zero_bit(const unsigned long *addr,
|
unsigned long find_first_zero_bit(const unsigned long *addr,
|
||||||
unsigned long size);
|
unsigned long size);
|
||||||
unsigned long find_next_zero_bit(const unsigned long *addr,
|
unsigned long find_next_zero_bit(const unsigned long *addr,
|
||||||
|
|
|
@ -213,6 +213,7 @@ static __inline__ int __test_bit(int nr, const void *addr)
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#include <asm-generic/bitops/fls.h>
|
#include <asm-generic/bitops/fls.h>
|
||||||
|
#include <asm-generic/bitops/__fls.h>
|
||||||
#include <asm-generic/bitops/fls64.h>
|
#include <asm-generic/bitops/fls64.h>
|
||||||
|
|
||||||
#endif /* _BLACKFIN_BITOPS_H */
|
#endif /* _BLACKFIN_BITOPS_H */
|
||||||
|
|
|
@ -148,6 +148,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
|
||||||
#define ffs kernel_ffs
|
#define ffs kernel_ffs
|
||||||
|
|
||||||
#include <asm-generic/bitops/fls.h>
|
#include <asm-generic/bitops/fls.h>
|
||||||
|
#include <asm-generic/bitops/__fls.h>
|
||||||
#include <asm-generic/bitops/fls64.h>
|
#include <asm-generic/bitops/fls64.h>
|
||||||
#include <asm-generic/bitops/hweight.h>
|
#include <asm-generic/bitops/hweight.h>
|
||||||
#include <asm-generic/bitops/find.h>
|
#include <asm-generic/bitops/find.h>
|
||||||
|
|
|
@ -207,6 +207,7 @@ static __inline__ unsigned long __ffs(unsigned long word)
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#include <asm-generic/bitops/fls.h>
|
#include <asm-generic/bitops/fls.h>
|
||||||
|
#include <asm-generic/bitops/__fls.h>
|
||||||
#include <asm-generic/bitops/fls64.h>
|
#include <asm-generic/bitops/fls64.h>
|
||||||
|
|
||||||
#endif /* _H8300_BITOPS_H */
|
#endif /* _H8300_BITOPS_H */
|
||||||
|
|
|
@ -687,3 +687,6 @@ config IRQ_PER_CPU
|
||||||
|
|
||||||
config IOMMU_HELPER
|
config IOMMU_HELPER
|
||||||
def_bool (IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB || IA64_GENERIC || SWIOTLB)
|
def_bool (IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB || IA64_GENERIC || SWIOTLB)
|
||||||
|
|
||||||
|
config IOMMU_API
|
||||||
|
def_bool (DMAR)
|
||||||
|
|
|
@ -27,7 +27,7 @@ irq_canonicalize (int irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
|
extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
|
||||||
bool is_affinity_mask_valid(cpumask_t cpumask);
|
bool is_affinity_mask_valid(cpumask_var_t cpumask);
|
||||||
|
|
||||||
#define is_affinity_mask_valid is_affinity_mask_valid
|
#define is_affinity_mask_valid is_affinity_mask_valid
|
||||||
|
|
||||||
|
|
|
@ -467,7 +467,7 @@ struct kvm_arch {
|
||||||
struct kvm_sal_data rdv_sal_data;
|
struct kvm_sal_data rdv_sal_data;
|
||||||
|
|
||||||
struct list_head assigned_dev_head;
|
struct list_head assigned_dev_head;
|
||||||
struct dmar_domain *intel_iommu_domain;
|
struct iommu_domain *iommu_domain;
|
||||||
struct hlist_head irq_ack_notifier_list;
|
struct hlist_head irq_ack_notifier_list;
|
||||||
|
|
||||||
unsigned long irq_sources_bitmap;
|
unsigned long irq_sources_bitmap;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
* Returns a bitmask of CPUs on Node 'node'.
|
* Returns a bitmask of CPUs on Node 'node'.
|
||||||
*/
|
*/
|
||||||
#define node_to_cpumask(node) (node_to_cpu_mask[node])
|
#define node_to_cpumask(node) (node_to_cpu_mask[node])
|
||||||
|
#define cpumask_of_node(node) (&node_to_cpu_mask[node])
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the number of the node containing Node 'nid'.
|
* Returns the number of the node containing Node 'nid'.
|
||||||
|
@ -45,7 +46,7 @@
|
||||||
/*
|
/*
|
||||||
* Returns the number of the first CPU on Node 'node'.
|
* Returns the number of the first CPU on Node 'node'.
|
||||||
*/
|
*/
|
||||||
#define node_to_first_cpu(node) (first_cpu(node_to_cpumask(node)))
|
#define node_to_first_cpu(node) (cpumask_first(cpumask_of_node(node)))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determines the node for a given pci bus
|
* Determines the node for a given pci bus
|
||||||
|
@ -109,6 +110,8 @@ void build_cpu_to_node_map(void);
|
||||||
#define topology_core_id(cpu) (cpu_data(cpu)->core_id)
|
#define topology_core_id(cpu) (cpu_data(cpu)->core_id)
|
||||||
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
||||||
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
|
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
|
||||||
|
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
|
||||||
|
#define topology_thread_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu))
|
||||||
#define smt_capable() (smp_num_siblings > 1)
|
#define smt_capable() (smp_num_siblings > 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -119,6 +122,10 @@ extern void arch_fix_phys_package_id(int num, u32 slot);
|
||||||
node_to_cpumask(pcibus_to_node(bus)) \
|
node_to_cpumask(pcibus_to_node(bus)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \
|
||||||
|
cpu_all_mask : \
|
||||||
|
cpumask_from_node(pcibus_to_node(bus)))
|
||||||
|
|
||||||
#include <asm-generic/topology.h>
|
#include <asm-generic/topology.h>
|
||||||
|
|
||||||
#endif /* _ASM_IA64_TOPOLOGY_H */
|
#endif /* _ASM_IA64_TOPOLOGY_H */
|
||||||
|
|
|
@ -202,7 +202,6 @@ char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size)
|
||||||
Boot-time Table Parsing
|
Boot-time Table Parsing
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int total_cpus __initdata;
|
|
||||||
static int available_cpus __initdata;
|
static int available_cpus __initdata;
|
||||||
struct acpi_table_madt *acpi_madt __initdata;
|
struct acpi_table_madt *acpi_madt __initdata;
|
||||||
static u8 has_8259;
|
static u8 has_8259;
|
||||||
|
@ -1001,7 +1000,7 @@ acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||||
node = pxm_to_node(pxm);
|
node = pxm_to_node(pxm);
|
||||||
|
|
||||||
if (node >= MAX_NUMNODES || !node_online(node) ||
|
if (node >= MAX_NUMNODES || !node_online(node) ||
|
||||||
cpus_empty(node_to_cpumask(node)))
|
cpumask_empty(cpumask_of_node(node)))
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
|
|
||||||
/* We know a gsi to node mapping! */
|
/* We know a gsi to node mapping! */
|
||||||
|
|
|
@ -695,32 +695,31 @@ get_target_cpu (unsigned int gsi, int irq)
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
{
|
{
|
||||||
int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
|
int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
|
||||||
cpumask_t cpu_mask;
|
const struct cpumask *cpu_mask;
|
||||||
|
|
||||||
iosapic_index = find_iosapic(gsi);
|
iosapic_index = find_iosapic(gsi);
|
||||||
if (iosapic_index < 0 ||
|
if (iosapic_index < 0 ||
|
||||||
iosapic_lists[iosapic_index].node == MAX_NUMNODES)
|
iosapic_lists[iosapic_index].node == MAX_NUMNODES)
|
||||||
goto skip_numa_setup;
|
goto skip_numa_setup;
|
||||||
|
|
||||||
cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node);
|
cpu_mask = cpumask_of_node(iosapic_lists[iosapic_index].node);
|
||||||
cpus_and(cpu_mask, cpu_mask, domain);
|
num_cpus = 0;
|
||||||
for_each_cpu_mask(numa_cpu, cpu_mask) {
|
for_each_cpu_and(numa_cpu, cpu_mask, &domain) {
|
||||||
if (!cpu_online(numa_cpu))
|
if (cpu_online(numa_cpu))
|
||||||
cpu_clear(numa_cpu, cpu_mask);
|
num_cpus++;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_cpus = cpus_weight(cpu_mask);
|
|
||||||
|
|
||||||
if (!num_cpus)
|
if (!num_cpus)
|
||||||
goto skip_numa_setup;
|
goto skip_numa_setup;
|
||||||
|
|
||||||
/* Use irq assignment to distribute across cpus in node */
|
/* Use irq assignment to distribute across cpus in node */
|
||||||
cpu_index = irq % num_cpus;
|
cpu_index = irq % num_cpus;
|
||||||
|
|
||||||
for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++)
|
for_each_cpu_and(numa_cpu, cpu_mask, &domain)
|
||||||
numa_cpu = next_cpu(numa_cpu, cpu_mask);
|
if (cpu_online(numa_cpu) && i++ >= cpu_index)
|
||||||
|
break;
|
||||||
|
|
||||||
if (numa_cpu != NR_CPUS)
|
if (numa_cpu < nr_cpu_ids)
|
||||||
return cpu_physical_id(numa_cpu);
|
return cpu_physical_id(numa_cpu);
|
||||||
}
|
}
|
||||||
skip_numa_setup:
|
skip_numa_setup:
|
||||||
|
@ -731,7 +730,7 @@ skip_numa_setup:
|
||||||
* case of NUMA.)
|
* case of NUMA.)
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
if (++cpu >= NR_CPUS)
|
if (++cpu >= nr_cpu_ids)
|
||||||
cpu = 0;
|
cpu = 0;
|
||||||
} while (!cpu_online(cpu) || !cpu_isset(cpu, domain));
|
} while (!cpu_online(cpu) || !cpu_isset(cpu, domain));
|
||||||
|
|
||||||
|
|
|
@ -112,11 +112,11 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_affinity_mask_valid(cpumask_t cpumask)
|
bool is_affinity_mask_valid(cpumask_var_t cpumask)
|
||||||
{
|
{
|
||||||
if (ia64_platform_is("sn2")) {
|
if (ia64_platform_is("sn2")) {
|
||||||
/* Only allow one CPU to be specified in the smp_affinity mask */
|
/* Only allow one CPU to be specified in the smp_affinity mask */
|
||||||
if (cpus_weight(cpumask) != 1)
|
if (cpumask_weight(cpumask) != 1)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -93,13 +93,14 @@ void ia64_account_on_switch(struct task_struct *prev, struct task_struct *next)
|
||||||
now = ia64_get_itc();
|
now = ia64_get_itc();
|
||||||
|
|
||||||
delta_stime = cycle_to_cputime(pi->ac_stime + (now - pi->ac_stamp));
|
delta_stime = cycle_to_cputime(pi->ac_stime + (now - pi->ac_stamp));
|
||||||
account_system_time(prev, 0, delta_stime);
|
if (idle_task(smp_processor_id()) != prev)
|
||||||
account_system_time_scaled(prev, delta_stime);
|
account_system_time(prev, 0, delta_stime, delta_stime);
|
||||||
|
else
|
||||||
|
account_idle_time(delta_stime);
|
||||||
|
|
||||||
if (pi->ac_utime) {
|
if (pi->ac_utime) {
|
||||||
delta_utime = cycle_to_cputime(pi->ac_utime);
|
delta_utime = cycle_to_cputime(pi->ac_utime);
|
||||||
account_user_time(prev, delta_utime);
|
account_user_time(prev, delta_utime, delta_utime);
|
||||||
account_user_time_scaled(prev, delta_utime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pi->ac_stamp = ni->ac_stamp = now;
|
pi->ac_stamp = ni->ac_stamp = now;
|
||||||
|
@ -122,8 +123,10 @@ void account_system_vtime(struct task_struct *tsk)
|
||||||
now = ia64_get_itc();
|
now = ia64_get_itc();
|
||||||
|
|
||||||
delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp));
|
delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp));
|
||||||
account_system_time(tsk, 0, delta_stime);
|
if (irq_count() || idle_task(smp_processor_id()) != tsk)
|
||||||
account_system_time_scaled(tsk, delta_stime);
|
account_system_time(tsk, 0, delta_stime, delta_stime);
|
||||||
|
else
|
||||||
|
account_idle_time(delta_stime);
|
||||||
ti->ac_stime = 0;
|
ti->ac_stime = 0;
|
||||||
|
|
||||||
ti->ac_stamp = now;
|
ti->ac_stamp = now;
|
||||||
|
@ -143,8 +146,7 @@ void account_process_tick(struct task_struct *p, int user_tick)
|
||||||
|
|
||||||
if (ti->ac_utime) {
|
if (ti->ac_utime) {
|
||||||
delta_utime = cycle_to_cputime(ti->ac_utime);
|
delta_utime = cycle_to_cputime(ti->ac_utime);
|
||||||
account_user_time(p, delta_utime);
|
account_user_time(p, delta_utime, delta_utime);
|
||||||
account_user_time_scaled(p, delta_utime);
|
|
||||||
ti->ac_utime = 0;
|
ti->ac_utime = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,8 +51,8 @@ EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
||||||
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
|
||||||
coalesced_mmio.o irq_comm.o)
|
coalesced_mmio.o irq_comm.o)
|
||||||
|
|
||||||
ifeq ($(CONFIG_DMAR),y)
|
ifeq ($(CONFIG_IOMMU_API),y)
|
||||||
common-objs += $(addprefix ../../../virt/kvm/, vtd.o)
|
common-objs += $(addprefix ../../../virt/kvm/, iommu.o)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/hrtimer.h>
|
#include <linux/hrtimer.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/iommu.h>
|
||||||
#include <linux/intel-iommu.h>
|
#include <linux/intel-iommu.h>
|
||||||
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -188,7 +189,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||||
r = KVM_COALESCED_MMIO_PAGE_OFFSET;
|
r = KVM_COALESCED_MMIO_PAGE_OFFSET;
|
||||||
break;
|
break;
|
||||||
case KVM_CAP_IOMMU:
|
case KVM_CAP_IOMMU:
|
||||||
r = intel_iommu_found();
|
r = iommu_found();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
|
@ -385,7 +385,6 @@ static int sn_topology_show(struct seq_file *s, void *d)
|
||||||
int j;
|
int j;
|
||||||
const char *slabname;
|
const char *slabname;
|
||||||
int ordinal;
|
int ordinal;
|
||||||
cpumask_t cpumask;
|
|
||||||
char slice;
|
char slice;
|
||||||
struct cpuinfo_ia64 *c;
|
struct cpuinfo_ia64 *c;
|
||||||
struct sn_hwperf_port_info *ptdata;
|
struct sn_hwperf_port_info *ptdata;
|
||||||
|
@ -473,23 +472,21 @@ static int sn_topology_show(struct seq_file *s, void *d)
|
||||||
* CPUs on this node, if any
|
* CPUs on this node, if any
|
||||||
*/
|
*/
|
||||||
if (!SN_HWPERF_IS_IONODE(obj)) {
|
if (!SN_HWPERF_IS_IONODE(obj)) {
|
||||||
cpumask = node_to_cpumask(ordinal);
|
for_each_cpu_and(i, cpu_online_mask,
|
||||||
for_each_online_cpu(i) {
|
cpumask_of_node(ordinal)) {
|
||||||
if (cpu_isset(i, cpumask)) {
|
slice = 'a' + cpuid_to_slice(i);
|
||||||
slice = 'a' + cpuid_to_slice(i);
|
c = cpu_data(i);
|
||||||
c = cpu_data(i);
|
seq_printf(s, "cpu %d %s%c local"
|
||||||
seq_printf(s, "cpu %d %s%c local"
|
" freq %luMHz, arch ia64",
|
||||||
" freq %luMHz, arch ia64",
|
i, obj->location, slice,
|
||||||
i, obj->location, slice,
|
c->proc_freq / 1000000);
|
||||||
c->proc_freq / 1000000);
|
for_each_online_cpu(j) {
|
||||||
for_each_online_cpu(j) {
|
seq_printf(s, j ? ":%d" : ", dist %d",
|
||||||
seq_printf(s, j ? ":%d" : ", dist %d",
|
node_distance(
|
||||||
node_distance(
|
|
||||||
cpu_to_node(i),
|
cpu_to_node(i),
|
||||||
cpu_to_node(j)));
|
cpu_to_node(j)));
|
||||||
}
|
|
||||||
seq_putc(s, '\n');
|
|
||||||
}
|
}
|
||||||
|
seq_putc(s, '\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -592,7 +592,7 @@ int setup_profiling_timer(unsigned int multiplier)
|
||||||
* accounting. At that time they also adjust their APIC timers
|
* accounting. At that time they also adjust their APIC timers
|
||||||
* accordingly.
|
* accordingly.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < NR_CPUS; ++i)
|
for_each_possible_cpu(i)
|
||||||
per_cpu(prof_multiplier, i) = multiplier;
|
per_cpu(prof_multiplier, i) = multiplier;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -280,7 +280,6 @@ config M68060
|
||||||
|
|
||||||
config MMU_MOTOROLA
|
config MMU_MOTOROLA
|
||||||
bool
|
bool
|
||||||
depends on MMU && !MMU_SUN3
|
|
||||||
|
|
||||||
config MMU_SUN3
|
config MMU_SUN3
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -331,6 +331,7 @@ found_middle:
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#include <asm-generic/bitops/fls.h>
|
#include <asm-generic/bitops/fls.h>
|
||||||
|
#include <asm-generic/bitops/__fls.h>
|
||||||
#include <asm-generic/bitops/fls64.h>
|
#include <asm-generic/bitops/fls64.h>
|
||||||
|
|
||||||
#endif /* _M68KNOMMU_BITOPS_H */
|
#endif /* _M68KNOMMU_BITOPS_H */
|
||||||
|
|
|
@ -25,11 +25,13 @@ extern struct cpuinfo_ip27 sn_cpu_info[NR_CPUS];
|
||||||
#define cpu_to_node(cpu) (sn_cpu_info[(cpu)].p_nodeid)
|
#define cpu_to_node(cpu) (sn_cpu_info[(cpu)].p_nodeid)
|
||||||
#define parent_node(node) (node)
|
#define parent_node(node) (node)
|
||||||
#define node_to_cpumask(node) (hub_data(node)->h_cpus)
|
#define node_to_cpumask(node) (hub_data(node)->h_cpus)
|
||||||
#define node_to_first_cpu(node) (first_cpu(node_to_cpumask(node)))
|
#define cpumask_of_node(node) (&hub_data(node)->h_cpus)
|
||||||
|
#define node_to_first_cpu(node) (cpumask_first(cpumask_of_node(node)))
|
||||||
struct pci_bus;
|
struct pci_bus;
|
||||||
extern int pcibus_to_node(struct pci_bus *);
|
extern int pcibus_to_node(struct pci_bus *);
|
||||||
|
|
||||||
#define pcibus_to_cpumask(bus) (cpu_online_map)
|
#define pcibus_to_cpumask(bus) (cpu_online_map)
|
||||||
|
#define cpumask_of_pcibus(bus) (cpu_online_mask)
|
||||||
|
|
||||||
extern unsigned char __node_distances[MAX_COMPACT_NODES][MAX_COMPACT_NODES];
|
extern unsigned char __node_distances[MAX_COMPACT_NODES][MAX_COMPACT_NODES];
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,10 @@ struct mod_arch_specific
|
||||||
{
|
{
|
||||||
unsigned long got_offset, got_count, got_max;
|
unsigned long got_offset, got_count, got_max;
|
||||||
unsigned long fdesc_offset, fdesc_count, fdesc_max;
|
unsigned long fdesc_offset, fdesc_count, fdesc_max;
|
||||||
unsigned long stub_offset, stub_count, stub_max;
|
struct {
|
||||||
unsigned long init_stub_offset, init_stub_count, init_stub_max;
|
unsigned long stub_offset;
|
||||||
|
unsigned int stub_entries;
|
||||||
|
} *section;
|
||||||
int unwind_section;
|
int unwind_section;
|
||||||
struct unwind_table *unwind;
|
struct unwind_table *unwind;
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
typedef unsigned long address_t;
|
typedef unsigned long address_t;
|
||||||
|
|
||||||
extern cpumask_t cpu_online_map;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Private routines/data
|
* Private routines/data
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*
|
*
|
||||||
* Linux/PA-RISC Project (http://www.parisc-linux.org/)
|
* Linux/PA-RISC Project (http://www.parisc-linux.org/)
|
||||||
* Copyright (C) 2003 Randolph Chung <tausq at debian . org>
|
* Copyright (C) 2003 Randolph Chung <tausq at debian . org>
|
||||||
|
* Copyright (C) 2008 Helge Deller <deller@gmx.de>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -24,6 +25,19 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Notes:
|
* Notes:
|
||||||
|
* - PLT stub handling
|
||||||
|
* On 32bit (and sometimes 64bit) and with big kernel modules like xfs or
|
||||||
|
* ipv6 the relocation types R_PARISC_PCREL17F and R_PARISC_PCREL22F may
|
||||||
|
* fail to reach their PLT stub if we only create one big stub array for
|
||||||
|
* all sections at the beginning of the core or init section.
|
||||||
|
* Instead we now insert individual PLT stub entries directly in front of
|
||||||
|
* of the code sections where the stubs are actually called.
|
||||||
|
* This reduces the distance between the PCREL location and the stub entry
|
||||||
|
* so that the relocations can be fulfilled.
|
||||||
|
* While calculating the final layout of the kernel module in memory, the
|
||||||
|
* kernel module loader calls arch_mod_section_prepend() to request the
|
||||||
|
* to be reserved amount of memory in front of each individual section.
|
||||||
|
*
|
||||||
* - SEGREL32 handling
|
* - SEGREL32 handling
|
||||||
* We are not doing SEGREL32 handling correctly. According to the ABI, we
|
* We are not doing SEGREL32 handling correctly. According to the ABI, we
|
||||||
* should do a value offset, like this:
|
* should do a value offset, like this:
|
||||||
|
@ -58,9 +72,13 @@
|
||||||
#define DEBUGP(fmt...)
|
#define DEBUGP(fmt...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define RELOC_REACHABLE(val, bits) \
|
||||||
|
(( ( !((val) & (1<<((bits)-1))) && ((val)>>(bits)) != 0 ) || \
|
||||||
|
( ((val) & (1<<((bits)-1))) && ((val)>>(bits)) != (((__typeof__(val))(~0))>>((bits)+2)))) ? \
|
||||||
|
0 : 1)
|
||||||
|
|
||||||
#define CHECK_RELOC(val, bits) \
|
#define CHECK_RELOC(val, bits) \
|
||||||
if ( ( !((val) & (1<<((bits)-1))) && ((val)>>(bits)) != 0 ) || \
|
if (!RELOC_REACHABLE(val, bits)) { \
|
||||||
( ((val) & (1<<((bits)-1))) && ((val)>>(bits)) != (((__typeof__(val))(~0))>>((bits)+2)))) { \
|
|
||||||
printk(KERN_ERR "module %s relocation of symbol %s is out of range (0x%lx in %d bits)\n", \
|
printk(KERN_ERR "module %s relocation of symbol %s is out of range (0x%lx in %d bits)\n", \
|
||||||
me->name, strtab + sym->st_name, (unsigned long)val, bits); \
|
me->name, strtab + sym->st_name, (unsigned long)val, bits); \
|
||||||
return -ENOEXEC; \
|
return -ENOEXEC; \
|
||||||
|
@ -92,13 +110,6 @@ static inline int in_local(struct module *me, void *loc)
|
||||||
return in_init(me, loc) || in_core(me, loc);
|
return in_init(me, loc) || in_core(me, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int in_local_section(struct module *me, void *loc, void *dot)
|
|
||||||
{
|
|
||||||
return (in_init(me, loc) && in_init(me, dot)) ||
|
|
||||||
(in_core(me, loc) && in_core(me, dot));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
struct got_entry {
|
struct got_entry {
|
||||||
Elf32_Addr addr;
|
Elf32_Addr addr;
|
||||||
|
@ -258,23 +269,42 @@ static inline unsigned long count_stubs(const Elf_Rela *rela, unsigned long n)
|
||||||
/* Free memory returned from module_alloc */
|
/* Free memory returned from module_alloc */
|
||||||
void module_free(struct module *mod, void *module_region)
|
void module_free(struct module *mod, void *module_region)
|
||||||
{
|
{
|
||||||
|
kfree(mod->arch.section);
|
||||||
|
mod->arch.section = NULL;
|
||||||
|
|
||||||
vfree(module_region);
|
vfree(module_region);
|
||||||
/* FIXME: If module_region == mod->init_region, trim exception
|
/* FIXME: If module_region == mod->init_region, trim exception
|
||||||
table entries. */
|
table entries. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Additional bytes needed in front of individual sections */
|
||||||
|
unsigned int arch_mod_section_prepend(struct module *mod,
|
||||||
|
unsigned int section)
|
||||||
|
{
|
||||||
|
/* size needed for all stubs of this section (including
|
||||||
|
* one additional for correct alignment of the stubs) */
|
||||||
|
return (mod->arch.section[section].stub_entries + 1)
|
||||||
|
* sizeof(struct stub_entry);
|
||||||
|
}
|
||||||
|
|
||||||
#define CONST
|
#define CONST
|
||||||
int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||||
CONST Elf_Shdr *sechdrs,
|
CONST Elf_Shdr *sechdrs,
|
||||||
CONST char *secstrings,
|
CONST char *secstrings,
|
||||||
struct module *me)
|
struct module *me)
|
||||||
{
|
{
|
||||||
unsigned long gots = 0, fdescs = 0, stubs = 0, init_stubs = 0;
|
unsigned long gots = 0, fdescs = 0, len;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
len = hdr->e_shnum * sizeof(me->arch.section[0]);
|
||||||
|
me->arch.section = kzalloc(len, GFP_KERNEL);
|
||||||
|
if (!me->arch.section)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 1; i < hdr->e_shnum; i++) {
|
for (i = 1; i < hdr->e_shnum; i++) {
|
||||||
const Elf_Rela *rels = (void *)hdr + sechdrs[i].sh_offset;
|
const Elf_Rela *rels = (void *)sechdrs[i].sh_addr;
|
||||||
unsigned long nrels = sechdrs[i].sh_size / sizeof(*rels);
|
unsigned long nrels = sechdrs[i].sh_size / sizeof(*rels);
|
||||||
|
unsigned int count, s;
|
||||||
|
|
||||||
if (strncmp(secstrings + sechdrs[i].sh_name,
|
if (strncmp(secstrings + sechdrs[i].sh_name,
|
||||||
".PARISC.unwind", 14) == 0)
|
".PARISC.unwind", 14) == 0)
|
||||||
|
@ -290,11 +320,23 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||||
*/
|
*/
|
||||||
gots += count_gots(rels, nrels);
|
gots += count_gots(rels, nrels);
|
||||||
fdescs += count_fdescs(rels, nrels);
|
fdescs += count_fdescs(rels, nrels);
|
||||||
if(strncmp(secstrings + sechdrs[i].sh_name,
|
|
||||||
".rela.init", 10) == 0)
|
/* XXX: By sorting the relocs and finding duplicate entries
|
||||||
init_stubs += count_stubs(rels, nrels);
|
* we could reduce the number of necessary stubs and save
|
||||||
else
|
* some memory. */
|
||||||
stubs += count_stubs(rels, nrels);
|
count = count_stubs(rels, nrels);
|
||||||
|
if (!count)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* so we need relocation stubs. reserve necessary memory. */
|
||||||
|
/* sh_info gives the section for which we need to add stubs. */
|
||||||
|
s = sechdrs[i].sh_info;
|
||||||
|
|
||||||
|
/* each code section should only have one relocation section */
|
||||||
|
WARN_ON(me->arch.section[s].stub_entries);
|
||||||
|
|
||||||
|
/* store number of stubs we need for this section */
|
||||||
|
me->arch.section[s].stub_entries += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* align things a bit */
|
/* align things a bit */
|
||||||
|
@ -306,18 +348,8 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||||
me->arch.fdesc_offset = me->core_size;
|
me->arch.fdesc_offset = me->core_size;
|
||||||
me->core_size += fdescs * sizeof(Elf_Fdesc);
|
me->core_size += fdescs * sizeof(Elf_Fdesc);
|
||||||
|
|
||||||
me->core_size = ALIGN(me->core_size, 16);
|
|
||||||
me->arch.stub_offset = me->core_size;
|
|
||||||
me->core_size += stubs * sizeof(struct stub_entry);
|
|
||||||
|
|
||||||
me->init_size = ALIGN(me->init_size, 16);
|
|
||||||
me->arch.init_stub_offset = me->init_size;
|
|
||||||
me->init_size += init_stubs * sizeof(struct stub_entry);
|
|
||||||
|
|
||||||
me->arch.got_max = gots;
|
me->arch.got_max = gots;
|
||||||
me->arch.fdesc_max = fdescs;
|
me->arch.fdesc_max = fdescs;
|
||||||
me->arch.stub_max = stubs;
|
|
||||||
me->arch.init_stub_max = init_stubs;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -380,23 +412,27 @@ enum elf_stub_type {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
|
static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
|
||||||
enum elf_stub_type stub_type, int init_section)
|
enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
|
||||||
struct stub_entry *stub;
|
struct stub_entry *stub;
|
||||||
|
|
||||||
if(init_section) {
|
/* initialize stub_offset to point in front of the section */
|
||||||
i = me->arch.init_stub_count++;
|
if (!me->arch.section[targetsec].stub_offset) {
|
||||||
BUG_ON(me->arch.init_stub_count > me->arch.init_stub_max);
|
loc0 -= (me->arch.section[targetsec].stub_entries + 1) *
|
||||||
stub = me->module_init + me->arch.init_stub_offset +
|
sizeof(struct stub_entry);
|
||||||
i * sizeof(struct stub_entry);
|
/* get correct alignment for the stubs */
|
||||||
} else {
|
loc0 = ALIGN(loc0, sizeof(struct stub_entry));
|
||||||
i = me->arch.stub_count++;
|
me->arch.section[targetsec].stub_offset = loc0;
|
||||||
BUG_ON(me->arch.stub_count > me->arch.stub_max);
|
|
||||||
stub = me->module_core + me->arch.stub_offset +
|
|
||||||
i * sizeof(struct stub_entry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get address of stub entry */
|
||||||
|
stub = (void *) me->arch.section[targetsec].stub_offset;
|
||||||
|
me->arch.section[targetsec].stub_offset += sizeof(struct stub_entry);
|
||||||
|
|
||||||
|
/* do not write outside available stub area */
|
||||||
|
BUG_ON(0 == me->arch.section[targetsec].stub_entries--);
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
/* for 32-bit the stub looks like this:
|
/* for 32-bit the stub looks like this:
|
||||||
* ldil L'XXX,%r1
|
* ldil L'XXX,%r1
|
||||||
|
@ -489,15 +525,19 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
Elf32_Addr val;
|
Elf32_Addr val;
|
||||||
Elf32_Sword addend;
|
Elf32_Sword addend;
|
||||||
Elf32_Addr dot;
|
Elf32_Addr dot;
|
||||||
|
Elf_Addr loc0;
|
||||||
|
unsigned int targetsec = sechdrs[relsec].sh_info;
|
||||||
//unsigned long dp = (unsigned long)$global$;
|
//unsigned long dp = (unsigned long)$global$;
|
||||||
register unsigned long dp asm ("r27");
|
register unsigned long dp asm ("r27");
|
||||||
|
|
||||||
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
||||||
sechdrs[relsec].sh_info);
|
targetsec);
|
||||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||||
/* This is where to make the change */
|
/* This is where to make the change */
|
||||||
loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
|
loc = (void *)sechdrs[targetsec].sh_addr
|
||||||
+ rel[i].r_offset;
|
+ rel[i].r_offset;
|
||||||
|
/* This is the start of the target section */
|
||||||
|
loc0 = sechdrs[targetsec].sh_addr;
|
||||||
/* This is the symbol it is referring to */
|
/* This is the symbol it is referring to */
|
||||||
sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
|
sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
|
||||||
+ ELF32_R_SYM(rel[i].r_info);
|
+ ELF32_R_SYM(rel[i].r_info);
|
||||||
|
@ -569,19 +609,32 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
break;
|
break;
|
||||||
case R_PARISC_PCREL17F:
|
case R_PARISC_PCREL17F:
|
||||||
/* 17-bit PC relative address */
|
/* 17-bit PC relative address */
|
||||||
val = get_stub(me, val, addend, ELF_STUB_GOT, in_init(me, loc));
|
/* calculate direct call offset */
|
||||||
|
val += addend;
|
||||||
val = (val - dot - 8)/4;
|
val = (val - dot - 8)/4;
|
||||||
CHECK_RELOC(val, 17)
|
if (!RELOC_REACHABLE(val, 17)) {
|
||||||
|
/* direct distance too far, create
|
||||||
|
* stub entry instead */
|
||||||
|
val = get_stub(me, sym->st_value, addend,
|
||||||
|
ELF_STUB_DIRECT, loc0, targetsec);
|
||||||
|
val = (val - dot - 8)/4;
|
||||||
|
CHECK_RELOC(val, 17);
|
||||||
|
}
|
||||||
*loc = (*loc & ~0x1f1ffd) | reassemble_17(val);
|
*loc = (*loc & ~0x1f1ffd) | reassemble_17(val);
|
||||||
break;
|
break;
|
||||||
case R_PARISC_PCREL22F:
|
case R_PARISC_PCREL22F:
|
||||||
/* 22-bit PC relative address; only defined for pa20 */
|
/* 22-bit PC relative address; only defined for pa20 */
|
||||||
val = get_stub(me, val, addend, ELF_STUB_GOT, in_init(me, loc));
|
/* calculate direct call offset */
|
||||||
DEBUGP("STUB FOR %s loc %lx+%lx at %lx\n",
|
val += addend;
|
||||||
strtab + sym->st_name, (unsigned long)loc, addend,
|
|
||||||
val)
|
|
||||||
val = (val - dot - 8)/4;
|
val = (val - dot - 8)/4;
|
||||||
CHECK_RELOC(val, 22);
|
if (!RELOC_REACHABLE(val, 22)) {
|
||||||
|
/* direct distance too far, create
|
||||||
|
* stub entry instead */
|
||||||
|
val = get_stub(me, sym->st_value, addend,
|
||||||
|
ELF_STUB_DIRECT, loc0, targetsec);
|
||||||
|
val = (val - dot - 8)/4;
|
||||||
|
CHECK_RELOC(val, 22);
|
||||||
|
}
|
||||||
*loc = (*loc & ~0x3ff1ffd) | reassemble_22(val);
|
*loc = (*loc & ~0x3ff1ffd) | reassemble_22(val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -610,13 +663,17 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
Elf64_Addr val;
|
Elf64_Addr val;
|
||||||
Elf64_Sxword addend;
|
Elf64_Sxword addend;
|
||||||
Elf64_Addr dot;
|
Elf64_Addr dot;
|
||||||
|
Elf_Addr loc0;
|
||||||
|
unsigned int targetsec = sechdrs[relsec].sh_info;
|
||||||
|
|
||||||
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
||||||
sechdrs[relsec].sh_info);
|
targetsec);
|
||||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||||
/* This is where to make the change */
|
/* This is where to make the change */
|
||||||
loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
|
loc = (void *)sechdrs[targetsec].sh_addr
|
||||||
+ rel[i].r_offset;
|
+ rel[i].r_offset;
|
||||||
|
/* This is the start of the target section */
|
||||||
|
loc0 = sechdrs[targetsec].sh_addr;
|
||||||
/* This is the symbol it is referring to */
|
/* This is the symbol it is referring to */
|
||||||
sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
|
sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
|
||||||
+ ELF64_R_SYM(rel[i].r_info);
|
+ ELF64_R_SYM(rel[i].r_info);
|
||||||
|
@ -672,42 +729,40 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
DEBUGP("PCREL22F Symbol %s loc %p val %lx\n",
|
DEBUGP("PCREL22F Symbol %s loc %p val %lx\n",
|
||||||
strtab + sym->st_name,
|
strtab + sym->st_name,
|
||||||
loc, val);
|
loc, val);
|
||||||
|
val += addend;
|
||||||
/* can we reach it locally? */
|
/* can we reach it locally? */
|
||||||
if(!in_local_section(me, (void *)val, (void *)dot)) {
|
if (in_local(me, (void *)val)) {
|
||||||
|
/* this is the case where the symbol is local
|
||||||
if (in_local(me, (void *)val))
|
* to the module, but in a different section,
|
||||||
/* this is the case where the
|
* so stub the jump in case it's more than 22
|
||||||
* symbol is local to the
|
* bits away */
|
||||||
* module, but in a different
|
val = (val - dot - 8)/4;
|
||||||
* section, so stub the jump
|
if (!RELOC_REACHABLE(val, 22)) {
|
||||||
* in case it's more than 22
|
/* direct distance too far, create
|
||||||
* bits away */
|
* stub entry instead */
|
||||||
val = get_stub(me, val, addend, ELF_STUB_DIRECT,
|
val = get_stub(me, sym->st_value,
|
||||||
in_init(me, loc));
|
addend, ELF_STUB_DIRECT,
|
||||||
else if (strncmp(strtab + sym->st_name, "$$", 2)
|
loc0, targetsec);
|
||||||
|
} else {
|
||||||
|
/* Ok, we can reach it directly. */
|
||||||
|
val = sym->st_value;
|
||||||
|
val += addend;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val = sym->st_value;
|
||||||
|
if (strncmp(strtab + sym->st_name, "$$", 2)
|
||||||
== 0)
|
== 0)
|
||||||
val = get_stub(me, val, addend, ELF_STUB_MILLI,
|
val = get_stub(me, val, addend, ELF_STUB_MILLI,
|
||||||
in_init(me, loc));
|
loc0, targetsec);
|
||||||
else
|
else
|
||||||
val = get_stub(me, val, addend, ELF_STUB_GOT,
|
val = get_stub(me, val, addend, ELF_STUB_GOT,
|
||||||
in_init(me, loc));
|
loc0, targetsec);
|
||||||
}
|
}
|
||||||
DEBUGP("STUB FOR %s loc %lx, val %lx+%lx at %lx\n",
|
DEBUGP("STUB FOR %s loc %lx, val %lx+%lx at %lx\n",
|
||||||
strtab + sym->st_name, loc, sym->st_value,
|
strtab + sym->st_name, loc, sym->st_value,
|
||||||
addend, val);
|
addend, val);
|
||||||
/* FIXME: local symbols work as long as the
|
|
||||||
* core and init pieces aren't separated too
|
|
||||||
* far. If this is ever broken, you will trip
|
|
||||||
* the check below. The way to fix it would
|
|
||||||
* be to generate local stubs to go between init
|
|
||||||
* and core */
|
|
||||||
if((Elf64_Sxword)(val - dot - 8) > 0x800000 -1 ||
|
|
||||||
(Elf64_Sxword)(val - dot - 8) < -0x800000) {
|
|
||||||
printk(KERN_ERR "Module %s, symbol %s is out of range for PCREL22F relocation\n",
|
|
||||||
me->name, strtab + sym->st_name);
|
|
||||||
return -ENOEXEC;
|
|
||||||
}
|
|
||||||
val = (val - dot - 8)/4;
|
val = (val - dot - 8)/4;
|
||||||
|
CHECK_RELOC(val, 22);
|
||||||
*loc = (*loc & ~0x3ff1ffd) | reassemble_22(val);
|
*loc = (*loc & ~0x3ff1ffd) | reassemble_22(val);
|
||||||
break;
|
break;
|
||||||
case R_PARISC_DIR64:
|
case R_PARISC_DIR64:
|
||||||
|
@ -794,12 +849,8 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
addr = (u32 *)entry->addr;
|
addr = (u32 *)entry->addr;
|
||||||
printk("INSNS: %x %x %x %x\n",
|
printk("INSNS: %x %x %x %x\n",
|
||||||
addr[0], addr[1], addr[2], addr[3]);
|
addr[0], addr[1], addr[2], addr[3]);
|
||||||
printk("stubs used %ld, stubs max %ld\n"
|
printk("got entries used %ld, gots max %ld\n"
|
||||||
"init_stubs used %ld, init stubs max %ld\n"
|
|
||||||
"got entries used %ld, gots max %ld\n"
|
|
||||||
"fdescs used %ld, fdescs max %ld\n",
|
"fdescs used %ld, fdescs max %ld\n",
|
||||||
me->arch.stub_count, me->arch.stub_max,
|
|
||||||
me->arch.init_stub_count, me->arch.init_stub_max,
|
|
||||||
me->arch.got_count, me->arch.got_max,
|
me->arch.got_count, me->arch.got_max,
|
||||||
me->arch.fdesc_count, me->arch.fdesc_max);
|
me->arch.fdesc_count, me->arch.fdesc_max);
|
||||||
#endif
|
#endif
|
||||||
|
@ -829,7 +880,10 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
me->name, me->arch.got_count, MAX_GOTS);
|
me->name, me->arch.got_count, MAX_GOTS);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kfree(me->arch.section);
|
||||||
|
me->arch.section = NULL;
|
||||||
|
|
||||||
/* no symbol table */
|
/* no symbol table */
|
||||||
if(symhdr == NULL)
|
if(symhdr == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -22,11 +22,11 @@ static inline cpumask_t node_to_cpumask(int node)
|
||||||
return numa_cpumask_lookup_table[node];
|
return numa_cpumask_lookup_table[node];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define cpumask_of_node(node) (&numa_cpumask_lookup_table[node])
|
||||||
|
|
||||||
static inline int node_to_first_cpu(int node)
|
static inline int node_to_first_cpu(int node)
|
||||||
{
|
{
|
||||||
cpumask_t tmp;
|
return cpumask_first(cpumask_of_node(node));
|
||||||
tmp = node_to_cpumask(node);
|
|
||||||
return first_cpu(tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int of_node_to_nid(struct device_node *device);
|
int of_node_to_nid(struct device_node *device);
|
||||||
|
@ -46,6 +46,10 @@ static inline int pcibus_to_node(struct pci_bus *bus)
|
||||||
node_to_cpumask(pcibus_to_node(bus)) \
|
node_to_cpumask(pcibus_to_node(bus)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \
|
||||||
|
cpu_all_mask : \
|
||||||
|
cpumask_of_node(pcibus_to_node(bus)))
|
||||||
|
|
||||||
/* sched_domains SD_NODE_INIT for PPC64 machines */
|
/* sched_domains SD_NODE_INIT for PPC64 machines */
|
||||||
#define SD_NODE_INIT (struct sched_domain) { \
|
#define SD_NODE_INIT (struct sched_domain) { \
|
||||||
.parent = NULL, \
|
.parent = NULL, \
|
||||||
|
@ -108,6 +112,8 @@ static inline void sysfs_remove_device_from_node(struct sys_device *dev,
|
||||||
|
|
||||||
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
|
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
|
||||||
#define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu))
|
#define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu))
|
||||||
|
#define topology_thread_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu))
|
||||||
|
#define topology_core_cpumask(cpu) (&per_cpu(cpu_core_map, cpu))
|
||||||
#define topology_core_id(cpu) (cpu_to_core_id(cpu))
|
#define topology_core_id(cpu) (cpu_to_core_id(cpu))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <linux/mqueue.h>
|
#include <linux/mqueue.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
|
#include <linux/kernel_stat.h>
|
||||||
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
|
@ -256,8 +256,10 @@ void account_system_vtime(struct task_struct *tsk)
|
||||||
delta += sys_time;
|
delta += sys_time;
|
||||||
get_paca()->system_time = 0;
|
get_paca()->system_time = 0;
|
||||||
}
|
}
|
||||||
account_system_time(tsk, 0, delta);
|
if (in_irq() || idle_task(smp_processor_id()) != tsk)
|
||||||
account_system_time_scaled(tsk, deltascaled);
|
account_system_time(tsk, 0, delta, deltascaled);
|
||||||
|
else
|
||||||
|
account_idle_time(delta);
|
||||||
per_cpu(cputime_last_delta, smp_processor_id()) = delta;
|
per_cpu(cputime_last_delta, smp_processor_id()) = delta;
|
||||||
per_cpu(cputime_scaled_last_delta, smp_processor_id()) = deltascaled;
|
per_cpu(cputime_scaled_last_delta, smp_processor_id()) = deltascaled;
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
@ -275,10 +277,8 @@ void account_process_tick(struct task_struct *tsk, int user_tick)
|
||||||
|
|
||||||
utime = get_paca()->user_time;
|
utime = get_paca()->user_time;
|
||||||
get_paca()->user_time = 0;
|
get_paca()->user_time = 0;
|
||||||
account_user_time(tsk, utime);
|
|
||||||
|
|
||||||
utimescaled = cputime_to_scaled(utime);
|
utimescaled = cputime_to_scaled(utime);
|
||||||
account_user_time_scaled(tsk, utimescaled);
|
account_user_time(tsk, utime, utimescaled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -338,8 +338,12 @@ void calculate_steal_time(void)
|
||||||
tb = mftb();
|
tb = mftb();
|
||||||
purr = mfspr(SPRN_PURR);
|
purr = mfspr(SPRN_PURR);
|
||||||
stolen = (tb - pme->tb) - (purr - pme->purr);
|
stolen = (tb - pme->tb) - (purr - pme->purr);
|
||||||
if (stolen > 0)
|
if (stolen > 0) {
|
||||||
account_steal_time(current, stolen);
|
if (idle_task(smp_processor_id()) != current)
|
||||||
|
account_steal_time(stolen);
|
||||||
|
else
|
||||||
|
account_idle_time(stolen);
|
||||||
|
}
|
||||||
pme->tb = tb;
|
pme->tb = tb;
|
||||||
pme->purr = purr;
|
pme->purr = purr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,10 +80,10 @@ static void cpu_affinity_set(struct spu *spu, int cpu)
|
||||||
u64 route;
|
u64 route;
|
||||||
|
|
||||||
if (nr_cpus_node(spu->node)) {
|
if (nr_cpus_node(spu->node)) {
|
||||||
cpumask_t spumask = node_to_cpumask(spu->node);
|
const struct cpumask *spumask = cpumask_of_node(spu->node),
|
||||||
cpumask_t cpumask = node_to_cpumask(cpu_to_node(cpu));
|
*cpumask = cpumask_of_node(cpu_to_node(cpu));
|
||||||
|
|
||||||
if (!cpus_intersects(spumask, cpumask))
|
if (!cpumask_intersects(spumask, cpumask))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,6 @@ spufs_new_inode(struct super_block *sb, int mode)
|
||||||
inode->i_mode = mode;
|
inode->i_mode = mode;
|
||||||
inode->i_uid = current_fsuid();
|
inode->i_uid = current_fsuid();
|
||||||
inode->i_gid = current_fsgid();
|
inode->i_gid = current_fsgid();
|
||||||
inode->i_blocks = 0;
|
|
||||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||||
out:
|
out:
|
||||||
return inode;
|
return inode;
|
||||||
|
|
|
@ -166,9 +166,9 @@ void spu_update_sched_info(struct spu_context *ctx)
|
||||||
static int __node_allowed(struct spu_context *ctx, int node)
|
static int __node_allowed(struct spu_context *ctx, int node)
|
||||||
{
|
{
|
||||||
if (nr_cpus_node(node)) {
|
if (nr_cpus_node(node)) {
|
||||||
cpumask_t mask = node_to_cpumask(node);
|
const struct cpumask *mask = cpumask_of_node(node);
|
||||||
|
|
||||||
if (cpus_intersects(mask, ctx->cpus_allowed))
|
if (cpumask_intersects(mask, &ctx->cpus_allowed))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,6 @@ static struct inode *hypfs_make_inode(struct super_block *sb, int mode)
|
||||||
ret->i_mode = mode;
|
ret->i_mode = mode;
|
||||||
ret->i_uid = hypfs_info->uid;
|
ret->i_uid = hypfs_info->uid;
|
||||||
ret->i_gid = hypfs_info->gid;
|
ret->i_gid = hypfs_info->gid;
|
||||||
ret->i_blocks = 0;
|
|
||||||
ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
|
ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
|
||||||
if (mode & S_IFDIR)
|
if (mode & S_IFDIR)
|
||||||
ret->i_nlink = 2;
|
ret->i_nlink = 2;
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
struct s390_idle_data {
|
struct s390_idle_data {
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
unsigned int in_idle;
|
|
||||||
unsigned long long idle_count;
|
unsigned long long idle_count;
|
||||||
unsigned long long idle_enter;
|
unsigned long long idle_enter;
|
||||||
unsigned long long idle_time;
|
unsigned long long idle_time;
|
||||||
|
@ -22,12 +21,12 @@ struct s390_idle_data {
|
||||||
|
|
||||||
DECLARE_PER_CPU(struct s390_idle_data, s390_idle);
|
DECLARE_PER_CPU(struct s390_idle_data, s390_idle);
|
||||||
|
|
||||||
void s390_idle_leave(void);
|
void vtime_start_cpu(void);
|
||||||
|
|
||||||
static inline void s390_idle_check(void)
|
static inline void s390_idle_check(void)
|
||||||
{
|
{
|
||||||
if ((&__get_cpu_var(s390_idle))->in_idle)
|
if ((&__get_cpu_var(s390_idle))->idle_enter != 0ULL)
|
||||||
s390_idle_leave();
|
vtime_start_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _ASM_S390_CPU_H_ */
|
#endif /* _ASM_S390_CPU_H_ */
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include <asm/div64.h>
|
#include <asm/div64.h>
|
||||||
|
|
||||||
/* We want to use micro-second resolution. */
|
/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */
|
||||||
|
|
||||||
typedef unsigned long long cputime_t;
|
typedef unsigned long long cputime_t;
|
||||||
typedef unsigned long long cputime64_t;
|
typedef unsigned long long cputime64_t;
|
||||||
|
@ -53,9 +53,9 @@ __div(unsigned long long n, unsigned int base)
|
||||||
#define cputime_ge(__a, __b) ((__a) >= (__b))
|
#define cputime_ge(__a, __b) ((__a) >= (__b))
|
||||||
#define cputime_lt(__a, __b) ((__a) < (__b))
|
#define cputime_lt(__a, __b) ((__a) < (__b))
|
||||||
#define cputime_le(__a, __b) ((__a) <= (__b))
|
#define cputime_le(__a, __b) ((__a) <= (__b))
|
||||||
#define cputime_to_jiffies(__ct) (__div((__ct), 1000000 / HZ))
|
#define cputime_to_jiffies(__ct) (__div((__ct), 4096000000ULL / HZ))
|
||||||
#define cputime_to_scaled(__ct) (__ct)
|
#define cputime_to_scaled(__ct) (__ct)
|
||||||
#define jiffies_to_cputime(__hz) ((cputime_t)(__hz) * (1000000 / HZ))
|
#define jiffies_to_cputime(__hz) ((cputime_t)(__hz) * (4096000000ULL / HZ))
|
||||||
|
|
||||||
#define cputime64_zero (0ULL)
|
#define cputime64_zero (0ULL)
|
||||||
#define cputime64_add(__a, __b) ((__a) + (__b))
|
#define cputime64_add(__a, __b) ((__a) + (__b))
|
||||||
|
@ -64,7 +64,7 @@ __div(unsigned long long n, unsigned int base)
|
||||||
static inline u64
|
static inline u64
|
||||||
cputime64_to_jiffies64(cputime64_t cputime)
|
cputime64_to_jiffies64(cputime64_t cputime)
|
||||||
{
|
{
|
||||||
do_div(cputime, 1000000 / HZ);
|
do_div(cputime, 4096000000ULL / HZ);
|
||||||
return cputime;
|
return cputime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,13 +74,13 @@ cputime64_to_jiffies64(cputime64_t cputime)
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
cputime_to_msecs(const cputime_t cputime)
|
cputime_to_msecs(const cputime_t cputime)
|
||||||
{
|
{
|
||||||
return __div(cputime, 1000);
|
return __div(cputime, 4096000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cputime_t
|
static inline cputime_t
|
||||||
msecs_to_cputime(const unsigned int m)
|
msecs_to_cputime(const unsigned int m)
|
||||||
{
|
{
|
||||||
return (cputime_t) m * 1000;
|
return (cputime_t) m * 4096000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -89,13 +89,13 @@ msecs_to_cputime(const unsigned int m)
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
cputime_to_secs(const cputime_t cputime)
|
cputime_to_secs(const cputime_t cputime)
|
||||||
{
|
{
|
||||||
return __div(cputime, 1000000);
|
return __div(cputime, 2048000000) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cputime_t
|
static inline cputime_t
|
||||||
secs_to_cputime(const unsigned int s)
|
secs_to_cputime(const unsigned int s)
|
||||||
{
|
{
|
||||||
return (cputime_t) s * 1000000;
|
return (cputime_t) s * 4096000000ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -104,7 +104,7 @@ secs_to_cputime(const unsigned int s)
|
||||||
static inline cputime_t
|
static inline cputime_t
|
||||||
timespec_to_cputime(const struct timespec *value)
|
timespec_to_cputime(const struct timespec *value)
|
||||||
{
|
{
|
||||||
return value->tv_nsec / 1000 + (u64) value->tv_sec * 1000000;
|
return value->tv_nsec * 4096 / 1000 + (u64) value->tv_sec * 4096000000ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -114,12 +114,12 @@ cputime_to_timespec(const cputime_t cputime, struct timespec *value)
|
||||||
register_pair rp;
|
register_pair rp;
|
||||||
|
|
||||||
rp.pair = cputime >> 1;
|
rp.pair = cputime >> 1;
|
||||||
asm ("dr %0,%1" : "+d" (rp) : "d" (1000000 >> 1));
|
asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
|
||||||
value->tv_nsec = rp.subreg.even * 1000;
|
value->tv_nsec = rp.subreg.even * 1000 / 4096;
|
||||||
value->tv_sec = rp.subreg.odd;
|
value->tv_sec = rp.subreg.odd;
|
||||||
#else
|
#else
|
||||||
value->tv_nsec = (cputime % 1000000) * 1000;
|
value->tv_nsec = (cputime % 4096000000ULL) * 1000 / 4096;
|
||||||
value->tv_sec = cputime / 1000000;
|
value->tv_sec = cputime / 4096000000ULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ cputime_to_timespec(const cputime_t cputime, struct timespec *value)
|
||||||
static inline cputime_t
|
static inline cputime_t
|
||||||
timeval_to_cputime(const struct timeval *value)
|
timeval_to_cputime(const struct timeval *value)
|
||||||
{
|
{
|
||||||
return value->tv_usec + (u64) value->tv_sec * 1000000;
|
return value->tv_usec * 4096 + (u64) value->tv_sec * 4096000000ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -141,12 +141,12 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
|
||||||
register_pair rp;
|
register_pair rp;
|
||||||
|
|
||||||
rp.pair = cputime >> 1;
|
rp.pair = cputime >> 1;
|
||||||
asm ("dr %0,%1" : "+d" (rp) : "d" (1000000 >> 1));
|
asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
|
||||||
value->tv_usec = rp.subreg.even;
|
value->tv_usec = rp.subreg.even / 4096;
|
||||||
value->tv_sec = rp.subreg.odd;
|
value->tv_sec = rp.subreg.odd;
|
||||||
#else
|
#else
|
||||||
value->tv_usec = cputime % 1000000;
|
value->tv_usec = cputime % 4096000000ULL;
|
||||||
value->tv_sec = cputime / 1000000;
|
value->tv_sec = cputime / 4096000000ULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,13 +156,13 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
|
||||||
static inline clock_t
|
static inline clock_t
|
||||||
cputime_to_clock_t(cputime_t cputime)
|
cputime_to_clock_t(cputime_t cputime)
|
||||||
{
|
{
|
||||||
return __div(cputime, 1000000 / USER_HZ);
|
return __div(cputime, 4096000000ULL / USER_HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cputime_t
|
static inline cputime_t
|
||||||
clock_t_to_cputime(unsigned long x)
|
clock_t_to_cputime(unsigned long x)
|
||||||
{
|
{
|
||||||
return (cputime_t) x * (1000000 / USER_HZ);
|
return (cputime_t) x * (4096000000ULL / USER_HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -171,7 +171,7 @@ clock_t_to_cputime(unsigned long x)
|
||||||
static inline clock_t
|
static inline clock_t
|
||||||
cputime64_to_clock_t(cputime64_t cputime)
|
cputime64_to_clock_t(cputime64_t cputime)
|
||||||
{
|
{
|
||||||
return __div(cputime, 1000000 / USER_HZ);
|
return __div(cputime, 4096000000ULL / USER_HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _S390_CPUTIME_H */
|
#endif /* _S390_CPUTIME_H */
|
||||||
|
|
|
@ -67,11 +67,11 @@
|
||||||
#define __LC_SYNC_ENTER_TIMER 0x248
|
#define __LC_SYNC_ENTER_TIMER 0x248
|
||||||
#define __LC_ASYNC_ENTER_TIMER 0x250
|
#define __LC_ASYNC_ENTER_TIMER 0x250
|
||||||
#define __LC_EXIT_TIMER 0x258
|
#define __LC_EXIT_TIMER 0x258
|
||||||
#define __LC_LAST_UPDATE_TIMER 0x260
|
#define __LC_USER_TIMER 0x260
|
||||||
#define __LC_USER_TIMER 0x268
|
#define __LC_SYSTEM_TIMER 0x268
|
||||||
#define __LC_SYSTEM_TIMER 0x270
|
#define __LC_STEAL_TIMER 0x270
|
||||||
#define __LC_LAST_UPDATE_CLOCK 0x278
|
#define __LC_LAST_UPDATE_TIMER 0x278
|
||||||
#define __LC_STEAL_CLOCK 0x280
|
#define __LC_LAST_UPDATE_CLOCK 0x280
|
||||||
#define __LC_RETURN_MCCK_PSW 0x288
|
#define __LC_RETURN_MCCK_PSW 0x288
|
||||||
#define __LC_KERNEL_STACK 0xC40
|
#define __LC_KERNEL_STACK 0xC40
|
||||||
#define __LC_THREAD_INFO 0xC44
|
#define __LC_THREAD_INFO 0xC44
|
||||||
|
@ -89,11 +89,11 @@
|
||||||
#define __LC_SYNC_ENTER_TIMER 0x250
|
#define __LC_SYNC_ENTER_TIMER 0x250
|
||||||
#define __LC_ASYNC_ENTER_TIMER 0x258
|
#define __LC_ASYNC_ENTER_TIMER 0x258
|
||||||
#define __LC_EXIT_TIMER 0x260
|
#define __LC_EXIT_TIMER 0x260
|
||||||
#define __LC_LAST_UPDATE_TIMER 0x268
|
#define __LC_USER_TIMER 0x268
|
||||||
#define __LC_USER_TIMER 0x270
|
#define __LC_SYSTEM_TIMER 0x270
|
||||||
#define __LC_SYSTEM_TIMER 0x278
|
#define __LC_STEAL_TIMER 0x278
|
||||||
#define __LC_LAST_UPDATE_CLOCK 0x280
|
#define __LC_LAST_UPDATE_TIMER 0x280
|
||||||
#define __LC_STEAL_CLOCK 0x288
|
#define __LC_LAST_UPDATE_CLOCK 0x288
|
||||||
#define __LC_RETURN_MCCK_PSW 0x290
|
#define __LC_RETURN_MCCK_PSW 0x290
|
||||||
#define __LC_KERNEL_STACK 0xD40
|
#define __LC_KERNEL_STACK 0xD40
|
||||||
#define __LC_THREAD_INFO 0xD48
|
#define __LC_THREAD_INFO 0xD48
|
||||||
|
@ -106,8 +106,10 @@
|
||||||
#define __LC_IPLDEV 0xDB8
|
#define __LC_IPLDEV 0xDB8
|
||||||
#define __LC_CURRENT 0xDD8
|
#define __LC_CURRENT 0xDD8
|
||||||
#define __LC_INT_CLOCK 0xDE8
|
#define __LC_INT_CLOCK 0xDE8
|
||||||
|
#define __LC_VDSO_PER_CPU 0xE38
|
||||||
#endif /* __s390x__ */
|
#endif /* __s390x__ */
|
||||||
|
|
||||||
|
#define __LC_PASTE 0xE40
|
||||||
|
|
||||||
#define __LC_PANIC_MAGIC 0xE00
|
#define __LC_PANIC_MAGIC 0xE00
|
||||||
#ifndef __s390x__
|
#ifndef __s390x__
|
||||||
|
@ -252,11 +254,11 @@ struct _lowcore
|
||||||
__u64 sync_enter_timer; /* 0x248 */
|
__u64 sync_enter_timer; /* 0x248 */
|
||||||
__u64 async_enter_timer; /* 0x250 */
|
__u64 async_enter_timer; /* 0x250 */
|
||||||
__u64 exit_timer; /* 0x258 */
|
__u64 exit_timer; /* 0x258 */
|
||||||
__u64 last_update_timer; /* 0x260 */
|
__u64 user_timer; /* 0x260 */
|
||||||
__u64 user_timer; /* 0x268 */
|
__u64 system_timer; /* 0x268 */
|
||||||
__u64 system_timer; /* 0x270 */
|
__u64 steal_timer; /* 0x270 */
|
||||||
__u64 last_update_clock; /* 0x278 */
|
__u64 last_update_timer; /* 0x278 */
|
||||||
__u64 steal_clock; /* 0x280 */
|
__u64 last_update_clock; /* 0x280 */
|
||||||
psw_t return_mcck_psw; /* 0x288 */
|
psw_t return_mcck_psw; /* 0x288 */
|
||||||
__u8 pad8[0xc00-0x290]; /* 0x290 */
|
__u8 pad8[0xc00-0x290]; /* 0x290 */
|
||||||
|
|
||||||
|
@ -343,11 +345,11 @@ struct _lowcore
|
||||||
__u64 sync_enter_timer; /* 0x250 */
|
__u64 sync_enter_timer; /* 0x250 */
|
||||||
__u64 async_enter_timer; /* 0x258 */
|
__u64 async_enter_timer; /* 0x258 */
|
||||||
__u64 exit_timer; /* 0x260 */
|
__u64 exit_timer; /* 0x260 */
|
||||||
__u64 last_update_timer; /* 0x268 */
|
__u64 user_timer; /* 0x268 */
|
||||||
__u64 user_timer; /* 0x270 */
|
__u64 system_timer; /* 0x270 */
|
||||||
__u64 system_timer; /* 0x278 */
|
__u64 steal_timer; /* 0x278 */
|
||||||
__u64 last_update_clock; /* 0x280 */
|
__u64 last_update_timer; /* 0x280 */
|
||||||
__u64 steal_clock; /* 0x288 */
|
__u64 last_update_clock; /* 0x288 */
|
||||||
psw_t return_mcck_psw; /* 0x290 */
|
psw_t return_mcck_psw; /* 0x290 */
|
||||||
__u8 pad8[0xc00-0x2a0]; /* 0x2a0 */
|
__u8 pad8[0xc00-0x2a0]; /* 0x2a0 */
|
||||||
/* System info area */
|
/* System info area */
|
||||||
|
@ -381,7 +383,12 @@ struct _lowcore
|
||||||
/* whether the kernel died with panic() or not */
|
/* whether the kernel died with panic() or not */
|
||||||
__u32 panic_magic; /* 0xe00 */
|
__u32 panic_magic; /* 0xe00 */
|
||||||
|
|
||||||
__u8 pad13[0x11b8-0xe04]; /* 0xe04 */
|
/* Per cpu primary space access list */
|
||||||
|
__u8 pad_0xe04[0xe3c-0xe04]; /* 0xe04 */
|
||||||
|
__u32 vdso_per_cpu_data; /* 0xe3c */
|
||||||
|
__u32 paste[16]; /* 0xe40 */
|
||||||
|
|
||||||
|
__u8 pad13[0x11b8-0xe80]; /* 0xe80 */
|
||||||
|
|
||||||
/* 64 bit extparam used for pfault, diag 250 etc */
|
/* 64 bit extparam used for pfault, diag 250 etc */
|
||||||
__u64 ext_params2; /* 0x11B8 */
|
__u64 ext_params2; /* 0x11B8 */
|
||||||
|
|
|
@ -99,7 +99,7 @@ static inline void restore_access_regs(unsigned int *acrs)
|
||||||
prev = __switch_to(prev,next); \
|
prev = __switch_to(prev,next); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
extern void account_vtime(struct task_struct *);
|
extern void account_vtime(struct task_struct *, struct task_struct *);
|
||||||
extern void account_tick_vtime(struct task_struct *);
|
extern void account_tick_vtime(struct task_struct *);
|
||||||
extern void account_system_vtime(struct task_struct *);
|
extern void account_system_vtime(struct task_struct *);
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ static inline void cmma_init(void) { }
|
||||||
|
|
||||||
#define finish_arch_switch(prev) do { \
|
#define finish_arch_switch(prev) do { \
|
||||||
set_fs(current->thread.mm_segment); \
|
set_fs(current->thread.mm_segment); \
|
||||||
account_vtime(prev); \
|
account_vtime(prev, current); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define nop() asm volatile("nop")
|
#define nop() asm volatile("nop")
|
||||||
|
|
|
@ -47,6 +47,8 @@ struct thread_info {
|
||||||
unsigned int cpu; /* current CPU */
|
unsigned int cpu; /* current CPU */
|
||||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||||
struct restart_block restart_block;
|
struct restart_block restart_block;
|
||||||
|
__u64 user_timer;
|
||||||
|
__u64 system_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -23,20 +23,18 @@ struct vtimer_list {
|
||||||
__u64 expires;
|
__u64 expires;
|
||||||
__u64 interval;
|
__u64 interval;
|
||||||
|
|
||||||
spinlock_t lock;
|
|
||||||
unsigned long magic;
|
|
||||||
|
|
||||||
void (*function)(unsigned long);
|
void (*function)(unsigned long);
|
||||||
unsigned long data;
|
unsigned long data;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* the offset value will wrap after ca. 71 years */
|
/* the vtimer value will wrap after ca. 71 years */
|
||||||
struct vtimer_queue {
|
struct vtimer_queue {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
__u64 to_expire; /* current event expire time */
|
__u64 timer; /* last programmed timer */
|
||||||
__u64 offset; /* list offset to zero */
|
__u64 elapsed; /* elapsed time of timer expire values */
|
||||||
__u64 idle; /* temp var for idle */
|
__u64 idle; /* temp var for idle */
|
||||||
|
int do_spt; /* =1: reprogram cpu timer in idle */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void init_virt_timer(struct vtimer_list *timer);
|
extern void init_virt_timer(struct vtimer_list *timer);
|
||||||
|
@ -48,8 +46,8 @@ extern int del_virt_timer(struct vtimer_list *timer);
|
||||||
extern void init_cpu_vtimer(void);
|
extern void init_cpu_vtimer(void);
|
||||||
extern void vtime_init(void);
|
extern void vtime_init(void);
|
||||||
|
|
||||||
extern void vtime_start_cpu_timer(void);
|
extern void vtime_stop_cpu(void);
|
||||||
extern void vtime_stop_cpu_timer(void);
|
extern void vtime_start_leave(void);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,12 @@
|
||||||
#define mc_capable() (1)
|
#define mc_capable() (1)
|
||||||
|
|
||||||
cpumask_t cpu_coregroup_map(unsigned int cpu);
|
cpumask_t cpu_coregroup_map(unsigned int cpu);
|
||||||
|
const struct cpumask *cpu_coregroup_mask(unsigned int cpu);
|
||||||
|
|
||||||
extern cpumask_t cpu_core_map[NR_CPUS];
|
extern cpumask_t cpu_core_map[NR_CPUS];
|
||||||
|
|
||||||
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
||||||
|
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
|
||||||
|
|
||||||
int topology_set_cpu_management(int fc);
|
int topology_set_cpu_management(int fc);
|
||||||
void topology_schedule_update(void);
|
void topology_schedule_update(void);
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note about this structure:
|
* Note about the vdso_data and vdso_per_cpu_data structures:
|
||||||
*
|
*
|
||||||
* NEVER USE THIS IN USERSPACE CODE DIRECTLY. The layout of this
|
* NEVER USE THEM IN USERSPACE CODE DIRECTLY. The layout of the
|
||||||
* structure is supposed to be known only to the function in the vdso
|
* structure is supposed to be known only to the function in the vdso
|
||||||
* itself and may change without notice.
|
* itself and may change without notice.
|
||||||
*/
|
*/
|
||||||
|
@ -28,10 +28,21 @@ struct vdso_data {
|
||||||
__u64 wtom_clock_nsec; /* 0x28 */
|
__u64 wtom_clock_nsec; /* 0x28 */
|
||||||
__u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */
|
__u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */
|
||||||
__u32 tz_dsttime; /* Type of dst correction 0x34 */
|
__u32 tz_dsttime; /* Type of dst correction 0x34 */
|
||||||
|
__u32 ectg_available;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct vdso_per_cpu_data {
|
||||||
|
__u64 ectg_timer_base;
|
||||||
|
__u64 ectg_user_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct vdso_data *vdso_data;
|
extern struct vdso_data *vdso_data;
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
int vdso_alloc_per_cpu(int cpu, struct _lowcore *lowcore);
|
||||||
|
void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -48,6 +48,11 @@ int main(void)
|
||||||
DEFINE(__VDSO_WTOM_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
DEFINE(__VDSO_WTOM_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
||||||
DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
||||||
DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest));
|
DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest));
|
||||||
|
DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available));
|
||||||
|
DEFINE(__VDSO_ECTG_BASE,
|
||||||
|
offsetof(struct vdso_per_cpu_data, ectg_timer_base));
|
||||||
|
DEFINE(__VDSO_ECTG_USER,
|
||||||
|
offsetof(struct vdso_per_cpu_data, ectg_user_time));
|
||||||
/* constants used by the vdso */
|
/* constants used by the vdso */
|
||||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||||
|
|
|
@ -583,8 +583,8 @@ kernel_per:
|
||||||
|
|
||||||
.globl io_int_handler
|
.globl io_int_handler
|
||||||
io_int_handler:
|
io_int_handler:
|
||||||
stpt __LC_ASYNC_ENTER_TIMER
|
|
||||||
stck __LC_INT_CLOCK
|
stck __LC_INT_CLOCK
|
||||||
|
stpt __LC_ASYNC_ENTER_TIMER
|
||||||
SAVE_ALL_BASE __LC_SAVE_AREA+16
|
SAVE_ALL_BASE __LC_SAVE_AREA+16
|
||||||
SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+16
|
SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+16
|
||||||
CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+16
|
CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+16
|
||||||
|
@ -723,8 +723,8 @@ io_notify_resume:
|
||||||
|
|
||||||
.globl ext_int_handler
|
.globl ext_int_handler
|
||||||
ext_int_handler:
|
ext_int_handler:
|
||||||
stpt __LC_ASYNC_ENTER_TIMER
|
|
||||||
stck __LC_INT_CLOCK
|
stck __LC_INT_CLOCK
|
||||||
|
stpt __LC_ASYNC_ENTER_TIMER
|
||||||
SAVE_ALL_BASE __LC_SAVE_AREA+16
|
SAVE_ALL_BASE __LC_SAVE_AREA+16
|
||||||
SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16
|
SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16
|
||||||
CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16
|
CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16
|
||||||
|
@ -750,6 +750,7 @@ __critical_end:
|
||||||
|
|
||||||
.globl mcck_int_handler
|
.globl mcck_int_handler
|
||||||
mcck_int_handler:
|
mcck_int_handler:
|
||||||
|
stck __LC_INT_CLOCK
|
||||||
spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer
|
spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer
|
||||||
lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs
|
lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs
|
||||||
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
||||||
|
|
|
@ -177,8 +177,11 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
||||||
.if !\sync
|
.if !\sync
|
||||||
ni \psworg+1,0xfd # clear wait state bit
|
ni \psworg+1,0xfd # clear wait state bit
|
||||||
.endif
|
.endif
|
||||||
lmg %r0,%r15,SP_R0(%r15) # load gprs 0-15 of user
|
lg %r14,__LC_VDSO_PER_CPU
|
||||||
|
lmg %r0,%r13,SP_R0(%r15) # load gprs 0-13 of user
|
||||||
stpt __LC_EXIT_TIMER
|
stpt __LC_EXIT_TIMER
|
||||||
|
mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER
|
||||||
|
lmg %r14,%r15,SP_R14(%r15) # load grps 14-15 of user
|
||||||
lpswe \psworg # back to caller
|
lpswe \psworg # back to caller
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ -559,8 +562,8 @@ kernel_per:
|
||||||
*/
|
*/
|
||||||
.globl io_int_handler
|
.globl io_int_handler
|
||||||
io_int_handler:
|
io_int_handler:
|
||||||
stpt __LC_ASYNC_ENTER_TIMER
|
|
||||||
stck __LC_INT_CLOCK
|
stck __LC_INT_CLOCK
|
||||||
|
stpt __LC_ASYNC_ENTER_TIMER
|
||||||
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
||||||
SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+32
|
SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+32
|
||||||
CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+32
|
CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+32
|
||||||
|
@ -721,8 +724,8 @@ io_notify_resume:
|
||||||
*/
|
*/
|
||||||
.globl ext_int_handler
|
.globl ext_int_handler
|
||||||
ext_int_handler:
|
ext_int_handler:
|
||||||
stpt __LC_ASYNC_ENTER_TIMER
|
|
||||||
stck __LC_INT_CLOCK
|
stck __LC_INT_CLOCK
|
||||||
|
stpt __LC_ASYNC_ENTER_TIMER
|
||||||
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
||||||
SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32
|
SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32
|
||||||
CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32
|
CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32
|
||||||
|
@ -746,6 +749,7 @@ __critical_end:
|
||||||
*/
|
*/
|
||||||
.globl mcck_int_handler
|
.globl mcck_int_handler
|
||||||
mcck_int_handler:
|
mcck_int_handler:
|
||||||
|
stck __LC_INT_CLOCK
|
||||||
la %r1,4095 # revalidate r1
|
la %r1,4095 # revalidate r1
|
||||||
spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer
|
spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer
|
||||||
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
|
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
|
||||||
|
@ -979,23 +983,23 @@ cleanup_sysc_return:
|
||||||
|
|
||||||
cleanup_sysc_leave:
|
cleanup_sysc_leave:
|
||||||
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn)
|
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn)
|
||||||
je 2f
|
je 3f
|
||||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
|
||||||
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn+8)
|
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn+8)
|
||||||
je 2f
|
jhe 0f
|
||||||
mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||||
|
0: mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||||
cghi %r12,__LC_MCK_OLD_PSW
|
cghi %r12,__LC_MCK_OLD_PSW
|
||||||
jne 0f
|
jne 1f
|
||||||
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
||||||
j 1f
|
j 2f
|
||||||
0: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
1: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||||
1: lmg %r0,%r11,SP_R0(%r15)
|
2: lmg %r0,%r11,SP_R0(%r15)
|
||||||
lg %r15,SP_R15(%r15)
|
lg %r15,SP_R15(%r15)
|
||||||
2: la %r12,__LC_RETURN_PSW
|
3: la %r12,__LC_RETURN_PSW
|
||||||
br %r14
|
br %r14
|
||||||
cleanup_sysc_leave_insn:
|
cleanup_sysc_leave_insn:
|
||||||
.quad sysc_done - 4
|
.quad sysc_done - 4
|
||||||
.quad sysc_done - 8
|
.quad sysc_done - 16
|
||||||
|
|
||||||
cleanup_io_return:
|
cleanup_io_return:
|
||||||
mvc __LC_RETURN_PSW(8),0(%r12)
|
mvc __LC_RETURN_PSW(8),0(%r12)
|
||||||
|
@ -1005,23 +1009,23 @@ cleanup_io_return:
|
||||||
|
|
||||||
cleanup_io_leave:
|
cleanup_io_leave:
|
||||||
clc 8(8,%r12),BASED(cleanup_io_leave_insn)
|
clc 8(8,%r12),BASED(cleanup_io_leave_insn)
|
||||||
je 2f
|
je 3f
|
||||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
|
||||||
clc 8(8,%r12),BASED(cleanup_io_leave_insn+8)
|
clc 8(8,%r12),BASED(cleanup_io_leave_insn+8)
|
||||||
je 2f
|
jhe 0f
|
||||||
mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||||
|
0: mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||||
cghi %r12,__LC_MCK_OLD_PSW
|
cghi %r12,__LC_MCK_OLD_PSW
|
||||||
jne 0f
|
jne 1f
|
||||||
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
||||||
j 1f
|
j 2f
|
||||||
0: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
1: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||||
1: lmg %r0,%r11,SP_R0(%r15)
|
2: lmg %r0,%r11,SP_R0(%r15)
|
||||||
lg %r15,SP_R15(%r15)
|
lg %r15,SP_R15(%r15)
|
||||||
2: la %r12,__LC_RETURN_PSW
|
3: la %r12,__LC_RETURN_PSW
|
||||||
br %r14
|
br %r14
|
||||||
cleanup_io_leave_insn:
|
cleanup_io_leave_insn:
|
||||||
.quad io_done - 4
|
.quad io_done - 4
|
||||||
.quad io_done - 8
|
.quad io_done - 16
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Integer constants
|
* Integer constants
|
||||||
|
|
|
@ -87,6 +87,8 @@ startup_continue:
|
||||||
lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
|
lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
|
||||||
# move IPL device to lowcore
|
# move IPL device to lowcore
|
||||||
mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
|
mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
|
||||||
|
lghi %r0,__LC_PASTE
|
||||||
|
stg %r0,__LC_VDSO_PER_CPU
|
||||||
#
|
#
|
||||||
# Setup stack
|
# Setup stack
|
||||||
#
|
#
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
#include <linux/tick.h>
|
#include <linux/tick.h>
|
||||||
#include <linux/elfcore.h>
|
#include <linux/elfcore.h>
|
||||||
|
#include <linux/kernel_stat.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@ -45,7 +46,6 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/timer.h>
|
#include <asm/timer.h>
|
||||||
#include <asm/cpu.h>
|
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
|
||||||
asmlinkage void ret_from_fork(void) asm ("ret_from_fork");
|
asmlinkage void ret_from_fork(void) asm ("ret_from_fork");
|
||||||
|
@ -75,36 +75,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
|
||||||
return sf->gprs[8];
|
return sf->gprs[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = {
|
|
||||||
.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock)
|
|
||||||
};
|
|
||||||
|
|
||||||
static int s390_idle_enter(void)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle;
|
|
||||||
|
|
||||||
idle = &__get_cpu_var(s390_idle);
|
|
||||||
spin_lock(&idle->lock);
|
|
||||||
idle->idle_count++;
|
|
||||||
idle->in_idle = 1;
|
|
||||||
idle->idle_enter = get_clock();
|
|
||||||
spin_unlock(&idle->lock);
|
|
||||||
vtime_stop_cpu_timer();
|
|
||||||
return NOTIFY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void s390_idle_leave(void)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle;
|
|
||||||
|
|
||||||
vtime_start_cpu_timer();
|
|
||||||
idle = &__get_cpu_var(s390_idle);
|
|
||||||
spin_lock(&idle->lock);
|
|
||||||
idle->idle_time += get_clock() - idle->idle_enter;
|
|
||||||
idle->in_idle = 0;
|
|
||||||
spin_unlock(&idle->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void s390_handle_mcck(void);
|
extern void s390_handle_mcck(void);
|
||||||
/*
|
/*
|
||||||
* The idle loop on a S390...
|
* The idle loop on a S390...
|
||||||
|
@ -117,10 +87,6 @@ static void default_idle(void)
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (s390_idle_enter() == NOTIFY_BAD) {
|
|
||||||
local_irq_enable();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
if (cpu_is_offline(smp_processor_id())) {
|
if (cpu_is_offline(smp_processor_id())) {
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
|
@ -130,7 +96,6 @@ static void default_idle(void)
|
||||||
local_mcck_disable();
|
local_mcck_disable();
|
||||||
if (test_thread_flag(TIF_MCCK_PENDING)) {
|
if (test_thread_flag(TIF_MCCK_PENDING)) {
|
||||||
local_mcck_enable();
|
local_mcck_enable();
|
||||||
s390_idle_leave();
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
s390_handle_mcck();
|
s390_handle_mcck();
|
||||||
return;
|
return;
|
||||||
|
@ -138,9 +103,9 @@ static void default_idle(void)
|
||||||
trace_hardirqs_on();
|
trace_hardirqs_on();
|
||||||
/* Don't trace preempt off for idle. */
|
/* Don't trace preempt off for idle. */
|
||||||
stop_critical_timings();
|
stop_critical_timings();
|
||||||
/* Wait for external, I/O or machine check interrupt. */
|
/* Stop virtual timer and halt the cpu. */
|
||||||
__load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
|
vtime_stop_cpu();
|
||||||
PSW_MASK_IO | PSW_MASK_EXT);
|
/* Reenable preemption tracer. */
|
||||||
start_critical_timings();
|
start_critical_timings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,8 +119,8 @@ void do_extint(struct pt_regs *regs, unsigned short code)
|
||||||
struct pt_regs *old_regs;
|
struct pt_regs *old_regs;
|
||||||
|
|
||||||
old_regs = set_irq_regs(regs);
|
old_regs = set_irq_regs(regs);
|
||||||
irq_enter();
|
|
||||||
s390_idle_check();
|
s390_idle_check();
|
||||||
|
irq_enter();
|
||||||
if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator)
|
if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator)
|
||||||
/* Serve timer interrupts first. */
|
/* Serve timer interrupts first. */
|
||||||
clock_comparator_work();
|
clock_comparator_work();
|
||||||
|
|
|
@ -427,6 +427,8 @@ setup_lowcore(void)
|
||||||
/* enable extended save area */
|
/* enable extended save area */
|
||||||
__ctl_set_bit(14, 29);
|
__ctl_set_bit(14, 29);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0];
|
||||||
#endif
|
#endif
|
||||||
set_prefix((u32)(unsigned long) lc);
|
set_prefix((u32)(unsigned long) lc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include <asm/lowcore.h>
|
#include <asm/lowcore.h>
|
||||||
#include <asm/sclp.h>
|
#include <asm/sclp.h>
|
||||||
#include <asm/cpu.h>
|
#include <asm/cpu.h>
|
||||||
|
#include <asm/vdso.h>
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -500,6 +501,9 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
|
||||||
goto out;
|
goto out;
|
||||||
lowcore->extended_save_area_addr = (u32) save_area;
|
lowcore->extended_save_area_addr = (u32) save_area;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (vdso_alloc_per_cpu(cpu, lowcore))
|
||||||
|
goto out;
|
||||||
#endif
|
#endif
|
||||||
lowcore_ptr[cpu] = lowcore;
|
lowcore_ptr[cpu] = lowcore;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -522,6 +526,8 @@ static void smp_free_lowcore(int cpu)
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
if (MACHINE_HAS_IEEE)
|
if (MACHINE_HAS_IEEE)
|
||||||
free_page((unsigned long) lowcore->extended_save_area_addr);
|
free_page((unsigned long) lowcore->extended_save_area_addr);
|
||||||
|
#else
|
||||||
|
vdso_free_per_cpu(cpu, lowcore);
|
||||||
#endif
|
#endif
|
||||||
free_page(lowcore->panic_stack - PAGE_SIZE);
|
free_page(lowcore->panic_stack - PAGE_SIZE);
|
||||||
free_pages(lowcore->async_stack - ASYNC_SIZE, ASYNC_ORDER);
|
free_pages(lowcore->async_stack - ASYNC_SIZE, ASYNC_ORDER);
|
||||||
|
@ -664,6 +670,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, lc_order);
|
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, lc_order);
|
||||||
panic_stack = __get_free_page(GFP_KERNEL);
|
panic_stack = __get_free_page(GFP_KERNEL);
|
||||||
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
|
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
|
||||||
|
BUG_ON(!lowcore || !panic_stack || !async_stack);
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
if (MACHINE_HAS_IEEE)
|
if (MACHINE_HAS_IEEE)
|
||||||
save_area = get_zeroed_page(GFP_KERNEL);
|
save_area = get_zeroed_page(GFP_KERNEL);
|
||||||
|
@ -677,6 +684,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
if (MACHINE_HAS_IEEE)
|
if (MACHINE_HAS_IEEE)
|
||||||
lowcore->extended_save_area_addr = (u32) save_area;
|
lowcore->extended_save_area_addr = (u32) save_area;
|
||||||
|
#else
|
||||||
|
BUG_ON(vdso_alloc_per_cpu(smp_processor_id(), lowcore));
|
||||||
#endif
|
#endif
|
||||||
set_prefix((u32)(unsigned long) lowcore);
|
set_prefix((u32)(unsigned long) lowcore);
|
||||||
local_mcck_enable();
|
local_mcck_enable();
|
||||||
|
@ -845,9 +854,11 @@ static ssize_t show_idle_count(struct sys_device *dev,
|
||||||
unsigned long long idle_count;
|
unsigned long long idle_count;
|
||||||
|
|
||||||
idle = &per_cpu(s390_idle, dev->id);
|
idle = &per_cpu(s390_idle, dev->id);
|
||||||
spin_lock_irq(&idle->lock);
|
spin_lock(&idle->lock);
|
||||||
idle_count = idle->idle_count;
|
idle_count = idle->idle_count;
|
||||||
spin_unlock_irq(&idle->lock);
|
if (idle->idle_enter)
|
||||||
|
idle_count++;
|
||||||
|
spin_unlock(&idle->lock);
|
||||||
return sprintf(buf, "%llu\n", idle_count);
|
return sprintf(buf, "%llu\n", idle_count);
|
||||||
}
|
}
|
||||||
static SYSDEV_ATTR(idle_count, 0444, show_idle_count, NULL);
|
static SYSDEV_ATTR(idle_count, 0444, show_idle_count, NULL);
|
||||||
|
@ -856,18 +867,17 @@ static ssize_t show_idle_time(struct sys_device *dev,
|
||||||
struct sysdev_attribute *attr, char *buf)
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
struct s390_idle_data *idle;
|
struct s390_idle_data *idle;
|
||||||
unsigned long long new_time;
|
unsigned long long now, idle_time, idle_enter;
|
||||||
|
|
||||||
idle = &per_cpu(s390_idle, dev->id);
|
idle = &per_cpu(s390_idle, dev->id);
|
||||||
spin_lock_irq(&idle->lock);
|
spin_lock(&idle->lock);
|
||||||
if (idle->in_idle) {
|
now = get_clock();
|
||||||
new_time = get_clock();
|
idle_time = idle->idle_time;
|
||||||
idle->idle_time += new_time - idle->idle_enter;
|
idle_enter = idle->idle_enter;
|
||||||
idle->idle_enter = new_time;
|
if (idle_enter != 0ULL && idle_enter < now)
|
||||||
}
|
idle_time += now - idle_enter;
|
||||||
new_time = idle->idle_time;
|
spin_unlock(&idle->lock);
|
||||||
spin_unlock_irq(&idle->lock);
|
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||||
return sprintf(buf, "%llu\n", new_time >> 12);
|
|
||||||
}
|
}
|
||||||
static SYSDEV_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
static SYSDEV_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,11 @@ cpumask_t cpu_coregroup_map(unsigned int cpu)
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct cpumask *cpu_coregroup_mask(unsigned int cpu)
|
||||||
|
{
|
||||||
|
return &cpu_core_map[cpu];
|
||||||
|
}
|
||||||
|
|
||||||
static void add_cpus_to_core(struct tl_cpu *tl_cpu, struct core_info *core)
|
static void add_cpus_to_core(struct tl_cpu *tl_cpu, struct core_info *core)
|
||||||
{
|
{
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
|
@ -31,9 +31,6 @@
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/vdso.h>
|
#include <asm/vdso.h>
|
||||||
|
|
||||||
/* Max supported size for symbol names */
|
|
||||||
#define MAX_SYMNAME 64
|
|
||||||
|
|
||||||
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
||||||
extern char vdso32_start, vdso32_end;
|
extern char vdso32_start, vdso32_end;
|
||||||
static void *vdso32_kbase = &vdso32_start;
|
static void *vdso32_kbase = &vdso32_start;
|
||||||
|
@ -70,6 +67,119 @@ static union {
|
||||||
} vdso_data_store __attribute__((__section__(".data.page_aligned")));
|
} vdso_data_store __attribute__((__section__(".data.page_aligned")));
|
||||||
struct vdso_data *vdso_data = &vdso_data_store.data;
|
struct vdso_data *vdso_data = &vdso_data_store.data;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup vdso data page.
|
||||||
|
*/
|
||||||
|
static void vdso_init_data(struct vdso_data *vd)
|
||||||
|
{
|
||||||
|
unsigned int facility_list;
|
||||||
|
|
||||||
|
facility_list = stfl();
|
||||||
|
vd->ectg_available = switch_amode && (facility_list & 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
/*
|
||||||
|
* Setup per cpu vdso data page.
|
||||||
|
*/
|
||||||
|
static void vdso_init_per_cpu_data(int cpu, struct vdso_per_cpu_data *vpcd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate/free per cpu vdso data.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
#define SEGMENT_ORDER 2
|
||||||
|
#else
|
||||||
|
#define SEGMENT_ORDER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int vdso_alloc_per_cpu(int cpu, struct _lowcore *lowcore)
|
||||||
|
{
|
||||||
|
unsigned long segment_table, page_table, page_frame;
|
||||||
|
u32 *psal, *aste;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
lowcore->vdso_per_cpu_data = __LC_PASTE;
|
||||||
|
|
||||||
|
if (!switch_amode || !vdso_enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
segment_table = __get_free_pages(GFP_KERNEL, SEGMENT_ORDER);
|
||||||
|
page_table = get_zeroed_page(GFP_KERNEL | GFP_DMA);
|
||||||
|
page_frame = get_zeroed_page(GFP_KERNEL);
|
||||||
|
if (!segment_table || !page_table || !page_frame)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
clear_table((unsigned long *) segment_table, _SEGMENT_ENTRY_EMPTY,
|
||||||
|
PAGE_SIZE << SEGMENT_ORDER);
|
||||||
|
clear_table((unsigned long *) page_table, _PAGE_TYPE_EMPTY,
|
||||||
|
256*sizeof(unsigned long));
|
||||||
|
|
||||||
|
*(unsigned long *) segment_table = _SEGMENT_ENTRY + page_table;
|
||||||
|
*(unsigned long *) page_table = _PAGE_RO + page_frame;
|
||||||
|
|
||||||
|
psal = (u32 *) (page_table + 256*sizeof(unsigned long));
|
||||||
|
aste = psal + 32;
|
||||||
|
|
||||||
|
for (i = 4; i < 32; i += 4)
|
||||||
|
psal[i] = 0x80000000;
|
||||||
|
|
||||||
|
lowcore->paste[4] = (u32)(addr_t) psal;
|
||||||
|
psal[0] = 0x20000000;
|
||||||
|
psal[2] = (u32)(addr_t) aste;
|
||||||
|
*(unsigned long *) (aste + 2) = segment_table +
|
||||||
|
_ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT;
|
||||||
|
aste[4] = (u32)(addr_t) psal;
|
||||||
|
lowcore->vdso_per_cpu_data = page_frame;
|
||||||
|
|
||||||
|
vdso_init_per_cpu_data(cpu, (struct vdso_per_cpu_data *) page_frame);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
free_page(page_frame);
|
||||||
|
free_page(page_table);
|
||||||
|
free_pages(segment_table, SEGMENT_ORDER);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore)
|
||||||
|
{
|
||||||
|
unsigned long segment_table, page_table, page_frame;
|
||||||
|
u32 *psal, *aste;
|
||||||
|
|
||||||
|
if (!switch_amode || !vdso_enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
psal = (u32 *)(addr_t) lowcore->paste[4];
|
||||||
|
aste = (u32 *)(addr_t) psal[2];
|
||||||
|
segment_table = *(unsigned long *)(aste + 2) & PAGE_MASK;
|
||||||
|
page_table = *(unsigned long *) segment_table;
|
||||||
|
page_frame = *(unsigned long *) page_table;
|
||||||
|
|
||||||
|
free_page(page_frame);
|
||||||
|
free_page(page_table);
|
||||||
|
free_pages(segment_table, SEGMENT_ORDER);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HOTPLUG_CPU */
|
||||||
|
|
||||||
|
static void __vdso_init_cr5(void *dummy)
|
||||||
|
{
|
||||||
|
unsigned long cr5;
|
||||||
|
|
||||||
|
cr5 = offsetof(struct _lowcore, paste);
|
||||||
|
__ctl_load(cr5, 5, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vdso_init_cr5(void)
|
||||||
|
{
|
||||||
|
if (switch_amode && vdso_enabled)
|
||||||
|
on_each_cpu(__vdso_init_cr5, NULL, 1);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_64BIT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is called from binfmt_elf, we create the special vma for the
|
* This is called from binfmt_elf, we create the special vma for the
|
||||||
* vDSO and insert it into the mm struct tree
|
* vDSO and insert it into the mm struct tree
|
||||||
|
@ -172,6 +282,9 @@ static int __init vdso_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!vdso_enabled)
|
||||||
|
return 0;
|
||||||
|
vdso_init_data(vdso_data);
|
||||||
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
||||||
/* Calculate the size of the 32 bit vDSO */
|
/* Calculate the size of the 32 bit vDSO */
|
||||||
vdso32_pages = ((&vdso32_end - &vdso32_start
|
vdso32_pages = ((&vdso32_end - &vdso32_start
|
||||||
|
@ -208,6 +321,10 @@ static int __init vdso_init(void)
|
||||||
}
|
}
|
||||||
vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data);
|
vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data);
|
||||||
vdso64_pagelist[vdso64_pages] = NULL;
|
vdso64_pagelist[vdso64_pages] = NULL;
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
BUG_ON(vdso_alloc_per_cpu(0, S390_lowcore));
|
||||||
|
#endif
|
||||||
|
vdso_init_cr5();
|
||||||
#endif /* CONFIG_64BIT */
|
#endif /* CONFIG_64BIT */
|
||||||
|
|
||||||
get_page(virt_to_page(vdso_data));
|
get_page(virt_to_page(vdso_data));
|
||||||
|
|
|
@ -22,7 +22,12 @@ __kernel_clock_getres:
|
||||||
cghi %r2,CLOCK_REALTIME
|
cghi %r2,CLOCK_REALTIME
|
||||||
je 0f
|
je 0f
|
||||||
cghi %r2,CLOCK_MONOTONIC
|
cghi %r2,CLOCK_MONOTONIC
|
||||||
|
je 0f
|
||||||
|
cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */
|
||||||
jne 2f
|
jne 2f
|
||||||
|
larl %r5,_vdso_data
|
||||||
|
icm %r0,15,__LC_ECTG_OK(%r5)
|
||||||
|
jz 2f
|
||||||
0: ltgr %r3,%r3
|
0: ltgr %r3,%r3
|
||||||
jz 1f /* res == NULL */
|
jz 1f /* res == NULL */
|
||||||
larl %r1,3f
|
larl %r1,3f
|
||||||
|
|
|
@ -22,8 +22,10 @@ __kernel_clock_gettime:
|
||||||
larl %r5,_vdso_data
|
larl %r5,_vdso_data
|
||||||
cghi %r2,CLOCK_REALTIME
|
cghi %r2,CLOCK_REALTIME
|
||||||
je 4f
|
je 4f
|
||||||
|
cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */
|
||||||
|
je 9f
|
||||||
cghi %r2,CLOCK_MONOTONIC
|
cghi %r2,CLOCK_MONOTONIC
|
||||||
jne 9f
|
jne 12f
|
||||||
|
|
||||||
/* CLOCK_MONOTONIC */
|
/* CLOCK_MONOTONIC */
|
||||||
ltgr %r3,%r3
|
ltgr %r3,%r3
|
||||||
|
@ -42,7 +44,7 @@ __kernel_clock_gettime:
|
||||||
alg %r0,__VDSO_WTOM_SEC(%r5)
|
alg %r0,__VDSO_WTOM_SEC(%r5)
|
||||||
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
||||||
jne 0b
|
jne 0b
|
||||||
larl %r5,10f
|
larl %r5,13f
|
||||||
1: clg %r1,0(%r5)
|
1: clg %r1,0(%r5)
|
||||||
jl 2f
|
jl 2f
|
||||||
slg %r1,0(%r5)
|
slg %r1,0(%r5)
|
||||||
|
@ -68,7 +70,7 @@ __kernel_clock_gettime:
|
||||||
lg %r0,__VDSO_XTIME_SEC(%r5)
|
lg %r0,__VDSO_XTIME_SEC(%r5)
|
||||||
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
||||||
jne 5b
|
jne 5b
|
||||||
larl %r5,10f
|
larl %r5,13f
|
||||||
6: clg %r1,0(%r5)
|
6: clg %r1,0(%r5)
|
||||||
jl 7f
|
jl 7f
|
||||||
slg %r1,0(%r5)
|
slg %r1,0(%r5)
|
||||||
|
@ -79,11 +81,38 @@ __kernel_clock_gettime:
|
||||||
8: lghi %r2,0
|
8: lghi %r2,0
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
|
/* CLOCK_THREAD_CPUTIME_ID for this thread */
|
||||||
|
9: icm %r0,15,__VDSO_ECTG_OK(%r5)
|
||||||
|
jz 12f
|
||||||
|
ear %r2,%a4
|
||||||
|
llilh %r4,0x0100
|
||||||
|
sar %a4,%r4
|
||||||
|
lghi %r4,0
|
||||||
|
sacf 512 /* Magic ectg instruction */
|
||||||
|
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
||||||
|
sacf 0
|
||||||
|
sar %a4,%r2
|
||||||
|
algr %r1,%r0 /* r1 = cputime as TOD value */
|
||||||
|
mghi %r1,1000 /* convert to nanoseconds */
|
||||||
|
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
||||||
|
lgr %r4,%r1
|
||||||
|
larl %r5,13f
|
||||||
|
srlg %r1,%r1,9 /* divide by 1000000000 */
|
||||||
|
mlg %r0,8(%r5)
|
||||||
|
srlg %r0,%r0,11 /* r0 = tv_sec */
|
||||||
|
stg %r0,0(%r3)
|
||||||
|
msg %r0,0(%r5) /* calculate tv_nsec */
|
||||||
|
slgr %r4,%r0 /* r4 = tv_nsec */
|
||||||
|
stg %r4,8(%r3)
|
||||||
|
lghi %r2,0
|
||||||
|
br %r14
|
||||||
|
|
||||||
/* Fallback to system call */
|
/* Fallback to system call */
|
||||||
9: lghi %r1,__NR_clock_gettime
|
12: lghi %r1,__NR_clock_gettime
|
||||||
svc 0
|
svc 0
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
10: .quad 1000000000
|
13: .quad 1000000000
|
||||||
|
14: .quad 19342813113834067
|
||||||
.cfi_endproc
|
.cfi_endproc
|
||||||
.size __kernel_clock_gettime,.-__kernel_clock_gettime
|
.size __kernel_clock_gettime,.-__kernel_clock_gettime
|
||||||
|
|
|
@ -23,94 +23,24 @@
|
||||||
#include <asm/s390_ext.h>
|
#include <asm/s390_ext.h>
|
||||||
#include <asm/timer.h>
|
#include <asm/timer.h>
|
||||||
#include <asm/irq_regs.h>
|
#include <asm/irq_regs.h>
|
||||||
|
#include <asm/cpu.h>
|
||||||
|
|
||||||
static ext_int_info_t ext_int_info_timer;
|
static ext_int_info_t ext_int_info_timer;
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);
|
static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);
|
||||||
|
|
||||||
/*
|
DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = {
|
||||||
* Update process times based on virtual cpu times stored by entry.S
|
.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock)
|
||||||
* to the lowcore fields user_timer, system_timer & steal_clock.
|
};
|
||||||
*/
|
|
||||||
void account_process_tick(struct task_struct *tsk, int user_tick)
|
static inline __u64 get_vtimer(void)
|
||||||
{
|
{
|
||||||
cputime_t cputime;
|
|
||||||
__u64 timer, clock;
|
|
||||||
int rcu_user_flag;
|
|
||||||
|
|
||||||
timer = S390_lowcore.last_update_timer;
|
|
||||||
clock = S390_lowcore.last_update_clock;
|
|
||||||
asm volatile (" STPT %0\n" /* Store current cpu timer value */
|
|
||||||
" STCK %1" /* Store current tod clock value */
|
|
||||||
: "=m" (S390_lowcore.last_update_timer),
|
|
||||||
"=m" (S390_lowcore.last_update_clock) );
|
|
||||||
S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer;
|
|
||||||
S390_lowcore.steal_clock += S390_lowcore.last_update_clock - clock;
|
|
||||||
|
|
||||||
cputime = S390_lowcore.user_timer >> 12;
|
|
||||||
rcu_user_flag = cputime != 0;
|
|
||||||
S390_lowcore.user_timer -= cputime << 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_user_time(tsk, cputime);
|
|
||||||
|
|
||||||
cputime = S390_lowcore.system_timer >> 12;
|
|
||||||
S390_lowcore.system_timer -= cputime << 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_system_time(tsk, HARDIRQ_OFFSET, cputime);
|
|
||||||
|
|
||||||
cputime = S390_lowcore.steal_clock;
|
|
||||||
if ((__s64) cputime > 0) {
|
|
||||||
cputime >>= 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_steal_time(tsk, cputime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update process times based on virtual cpu times stored by entry.S
|
|
||||||
* to the lowcore fields user_timer, system_timer & steal_clock.
|
|
||||||
*/
|
|
||||||
void account_vtime(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
cputime_t cputime;
|
|
||||||
__u64 timer;
|
__u64 timer;
|
||||||
|
|
||||||
timer = S390_lowcore.last_update_timer;
|
asm volatile("STPT %0" : "=m" (timer));
|
||||||
asm volatile (" STPT %0" /* Store current cpu timer value */
|
return timer;
|
||||||
: "=m" (S390_lowcore.last_update_timer) );
|
|
||||||
S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer;
|
|
||||||
|
|
||||||
cputime = S390_lowcore.user_timer >> 12;
|
|
||||||
S390_lowcore.user_timer -= cputime << 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_user_time(tsk, cputime);
|
|
||||||
|
|
||||||
cputime = S390_lowcore.system_timer >> 12;
|
|
||||||
S390_lowcore.system_timer -= cputime << 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_system_time(tsk, 0, cputime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Update process times based on virtual cpu times stored by entry.S
|
|
||||||
* to the lowcore fields user_timer, system_timer & steal_clock.
|
|
||||||
*/
|
|
||||||
void account_system_vtime(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
cputime_t cputime;
|
|
||||||
__u64 timer;
|
|
||||||
|
|
||||||
timer = S390_lowcore.last_update_timer;
|
|
||||||
asm volatile (" STPT %0" /* Store current cpu timer value */
|
|
||||||
: "=m" (S390_lowcore.last_update_timer) );
|
|
||||||
S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer;
|
|
||||||
|
|
||||||
cputime = S390_lowcore.system_timer >> 12;
|
|
||||||
S390_lowcore.system_timer -= cputime << 12;
|
|
||||||
S390_lowcore.steal_clock -= cputime << 12;
|
|
||||||
account_system_time(tsk, 0, cputime);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(account_system_vtime);
|
|
||||||
|
|
||||||
static inline void set_vtimer(__u64 expires)
|
static inline void set_vtimer(__u64 expires)
|
||||||
{
|
{
|
||||||
__u64 timer;
|
__u64 timer;
|
||||||
|
@ -120,56 +50,192 @@ static inline void set_vtimer(__u64 expires)
|
||||||
: "=m" (timer) : "m" (expires) );
|
: "=m" (timer) : "m" (expires) );
|
||||||
S390_lowcore.system_timer += S390_lowcore.last_update_timer - timer;
|
S390_lowcore.system_timer += S390_lowcore.last_update_timer - timer;
|
||||||
S390_lowcore.last_update_timer = expires;
|
S390_lowcore.last_update_timer = expires;
|
||||||
|
|
||||||
/* store expire time for this CPU timer */
|
|
||||||
__get_cpu_var(virt_cpu_timer).to_expire = expires;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vtime_start_cpu_timer(void)
|
/*
|
||||||
|
* Update process times based on virtual cpu times stored by entry.S
|
||||||
|
* to the lowcore fields user_timer, system_timer & steal_clock.
|
||||||
|
*/
|
||||||
|
static void do_account_vtime(struct task_struct *tsk, int hardirq_offset)
|
||||||
{
|
{
|
||||||
struct vtimer_queue *vt_list;
|
struct thread_info *ti = task_thread_info(tsk);
|
||||||
|
__u64 timer, clock, user, system, steal;
|
||||||
|
|
||||||
vt_list = &__get_cpu_var(virt_cpu_timer);
|
timer = S390_lowcore.last_update_timer;
|
||||||
|
clock = S390_lowcore.last_update_clock;
|
||||||
|
asm volatile (" STPT %0\n" /* Store current cpu timer value */
|
||||||
|
" STCK %1" /* Store current tod clock value */
|
||||||
|
: "=m" (S390_lowcore.last_update_timer),
|
||||||
|
"=m" (S390_lowcore.last_update_clock) );
|
||||||
|
S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer;
|
||||||
|
S390_lowcore.steal_timer += S390_lowcore.last_update_clock - clock;
|
||||||
|
|
||||||
/* CPU timer interrupt is pending, don't reprogramm it */
|
user = S390_lowcore.user_timer - ti->user_timer;
|
||||||
if (vt_list->idle & 1LL<<63)
|
S390_lowcore.steal_timer -= user;
|
||||||
return;
|
ti->user_timer = S390_lowcore.user_timer;
|
||||||
|
account_user_time(tsk, user, user);
|
||||||
|
|
||||||
if (!list_empty(&vt_list->list))
|
system = S390_lowcore.system_timer - ti->system_timer;
|
||||||
set_vtimer(vt_list->idle);
|
S390_lowcore.steal_timer -= system;
|
||||||
|
ti->system_timer = S390_lowcore.system_timer;
|
||||||
|
account_system_time(tsk, hardirq_offset, system, system);
|
||||||
|
|
||||||
|
steal = S390_lowcore.steal_timer;
|
||||||
|
if ((s64) steal > 0) {
|
||||||
|
S390_lowcore.steal_timer = 0;
|
||||||
|
account_steal_time(steal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vtime_stop_cpu_timer(void)
|
void account_vtime(struct task_struct *prev, struct task_struct *next)
|
||||||
{
|
{
|
||||||
struct vtimer_queue *vt_list;
|
struct thread_info *ti;
|
||||||
|
|
||||||
vt_list = &__get_cpu_var(virt_cpu_timer);
|
do_account_vtime(prev, 0);
|
||||||
|
ti = task_thread_info(prev);
|
||||||
|
ti->user_timer = S390_lowcore.user_timer;
|
||||||
|
ti->system_timer = S390_lowcore.system_timer;
|
||||||
|
ti = task_thread_info(next);
|
||||||
|
S390_lowcore.user_timer = ti->user_timer;
|
||||||
|
S390_lowcore.system_timer = ti->system_timer;
|
||||||
|
}
|
||||||
|
|
||||||
/* nothing to do */
|
void account_process_tick(struct task_struct *tsk, int user_tick)
|
||||||
if (list_empty(&vt_list->list)) {
|
{
|
||||||
vt_list->idle = VTIMER_MAX_SLICE;
|
do_account_vtime(tsk, HARDIRQ_OFFSET);
|
||||||
goto fire;
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update process times based on virtual cpu times stored by entry.S
|
||||||
|
* to the lowcore fields user_timer, system_timer & steal_clock.
|
||||||
|
*/
|
||||||
|
void account_system_vtime(struct task_struct *tsk)
|
||||||
|
{
|
||||||
|
struct thread_info *ti = task_thread_info(tsk);
|
||||||
|
__u64 timer, system;
|
||||||
|
|
||||||
|
timer = S390_lowcore.last_update_timer;
|
||||||
|
S390_lowcore.last_update_timer = get_vtimer();
|
||||||
|
S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer;
|
||||||
|
|
||||||
|
system = S390_lowcore.system_timer - ti->system_timer;
|
||||||
|
S390_lowcore.steal_timer -= system;
|
||||||
|
ti->system_timer = S390_lowcore.system_timer;
|
||||||
|
account_system_time(tsk, 0, system, system);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(account_system_vtime);
|
||||||
|
|
||||||
|
void vtime_start_cpu(void)
|
||||||
|
{
|
||||||
|
struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
|
||||||
|
struct vtimer_queue *vq = &__get_cpu_var(virt_cpu_timer);
|
||||||
|
__u64 idle_time, expires;
|
||||||
|
|
||||||
|
/* Account time spent with enabled wait psw loaded as idle time. */
|
||||||
|
idle_time = S390_lowcore.int_clock - idle->idle_enter;
|
||||||
|
account_idle_time(idle_time);
|
||||||
|
S390_lowcore.last_update_clock = S390_lowcore.int_clock;
|
||||||
|
|
||||||
|
/* Account system time spent going idle. */
|
||||||
|
S390_lowcore.system_timer += S390_lowcore.last_update_timer - vq->idle;
|
||||||
|
S390_lowcore.last_update_timer = S390_lowcore.async_enter_timer;
|
||||||
|
|
||||||
|
/* Restart vtime CPU timer */
|
||||||
|
if (vq->do_spt) {
|
||||||
|
/* Program old expire value but first save progress. */
|
||||||
|
expires = vq->idle - S390_lowcore.async_enter_timer;
|
||||||
|
expires += get_vtimer();
|
||||||
|
set_vtimer(expires);
|
||||||
|
} else {
|
||||||
|
/* Don't account the CPU timer delta while the cpu was idle. */
|
||||||
|
vq->elapsed -= vq->idle - S390_lowcore.async_enter_timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store the actual expire value */
|
spin_lock(&idle->lock);
|
||||||
asm volatile ("STPT %0" : "=m" (vt_list->idle));
|
idle->idle_time += idle_time;
|
||||||
|
idle->idle_enter = 0ULL;
|
||||||
|
idle->idle_count++;
|
||||||
|
spin_unlock(&idle->lock);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
void vtime_stop_cpu(void)
|
||||||
* If the CPU timer is negative we don't reprogramm
|
{
|
||||||
* it because we will get instantly an interrupt.
|
struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
|
||||||
*/
|
struct vtimer_queue *vq = &__get_cpu_var(virt_cpu_timer);
|
||||||
if (vt_list->idle & 1LL<<63)
|
psw_t psw;
|
||||||
return;
|
|
||||||
|
|
||||||
vt_list->offset += vt_list->to_expire - vt_list->idle;
|
/* Wait for external, I/O or machine check interrupt. */
|
||||||
|
psw.mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_IO | PSW_MASK_EXT;
|
||||||
|
|
||||||
/*
|
/* Check if the CPU timer needs to be reprogrammed. */
|
||||||
* We cannot halt the CPU timer, we just write a value that
|
if (vq->do_spt) {
|
||||||
* nearly never expires (only after 71 years) and re-write
|
__u64 vmax = VTIMER_MAX_SLICE;
|
||||||
* the stored expire value if we continue the timer
|
/*
|
||||||
*/
|
* The inline assembly is equivalent to
|
||||||
fire:
|
* vq->idle = get_cpu_timer();
|
||||||
set_vtimer(VTIMER_MAX_SLICE);
|
* set_cpu_timer(VTIMER_MAX_SLICE);
|
||||||
|
* idle->idle_enter = get_clock();
|
||||||
|
* __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
|
||||||
|
* PSW_MASK_IO | PSW_MASK_EXT);
|
||||||
|
* The difference is that the inline assembly makes sure that
|
||||||
|
* the last three instruction are stpt, stck and lpsw in that
|
||||||
|
* order. This is done to increase the precision.
|
||||||
|
*/
|
||||||
|
asm volatile(
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
" basr 1,0\n"
|
||||||
|
"0: ahi 1,1f-0b\n"
|
||||||
|
" st 1,4(%2)\n"
|
||||||
|
#else /* CONFIG_64BIT */
|
||||||
|
" larl 1,1f\n"
|
||||||
|
" stg 1,8(%2)\n"
|
||||||
|
#endif /* CONFIG_64BIT */
|
||||||
|
" stpt 0(%4)\n"
|
||||||
|
" spt 0(%5)\n"
|
||||||
|
" stck 0(%3)\n"
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
" lpsw 0(%2)\n"
|
||||||
|
#else /* CONFIG_64BIT */
|
||||||
|
" lpswe 0(%2)\n"
|
||||||
|
#endif /* CONFIG_64BIT */
|
||||||
|
"1:"
|
||||||
|
: "=m" (idle->idle_enter), "=m" (vq->idle)
|
||||||
|
: "a" (&psw), "a" (&idle->idle_enter),
|
||||||
|
"a" (&vq->idle), "a" (&vmax), "m" (vmax), "m" (psw)
|
||||||
|
: "memory", "cc", "1");
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The inline assembly is equivalent to
|
||||||
|
* vq->idle = get_cpu_timer();
|
||||||
|
* idle->idle_enter = get_clock();
|
||||||
|
* __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
|
||||||
|
* PSW_MASK_IO | PSW_MASK_EXT);
|
||||||
|
* The difference is that the inline assembly makes sure that
|
||||||
|
* the last three instruction are stpt, stck and lpsw in that
|
||||||
|
* order. This is done to increase the precision.
|
||||||
|
*/
|
||||||
|
asm volatile(
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
" basr 1,0\n"
|
||||||
|
"0: ahi 1,1f-0b\n"
|
||||||
|
" st 1,4(%2)\n"
|
||||||
|
#else /* CONFIG_64BIT */
|
||||||
|
" larl 1,1f\n"
|
||||||
|
" stg 1,8(%2)\n"
|
||||||
|
#endif /* CONFIG_64BIT */
|
||||||
|
" stpt 0(%4)\n"
|
||||||
|
" stck 0(%3)\n"
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
" lpsw 0(%2)\n"
|
||||||
|
#else /* CONFIG_64BIT */
|
||||||
|
" lpswe 0(%2)\n"
|
||||||
|
#endif /* CONFIG_64BIT */
|
||||||
|
"1:"
|
||||||
|
: "=m" (idle->idle_enter), "=m" (vq->idle)
|
||||||
|
: "a" (&psw), "a" (&idle->idle_enter),
|
||||||
|
"a" (&vq->idle), "m" (psw)
|
||||||
|
: "memory", "cc", "1");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -195,30 +261,23 @@ static void list_add_sorted(struct vtimer_list *timer, struct list_head *head)
|
||||||
*/
|
*/
|
||||||
static void do_callbacks(struct list_head *cb_list)
|
static void do_callbacks(struct list_head *cb_list)
|
||||||
{
|
{
|
||||||
struct vtimer_queue *vt_list;
|
struct vtimer_queue *vq;
|
||||||
struct vtimer_list *event, *tmp;
|
struct vtimer_list *event, *tmp;
|
||||||
void (*fn)(unsigned long);
|
|
||||||
unsigned long data;
|
|
||||||
|
|
||||||
if (list_empty(cb_list))
|
if (list_empty(cb_list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vt_list = &__get_cpu_var(virt_cpu_timer);
|
vq = &__get_cpu_var(virt_cpu_timer);
|
||||||
|
|
||||||
list_for_each_entry_safe(event, tmp, cb_list, entry) {
|
list_for_each_entry_safe(event, tmp, cb_list, entry) {
|
||||||
fn = event->function;
|
list_del_init(&event->entry);
|
||||||
data = event->data;
|
(event->function)(event->data);
|
||||||
fn(data);
|
if (event->interval) {
|
||||||
|
/* Recharge interval timer */
|
||||||
if (!event->interval)
|
event->expires = event->interval + vq->elapsed;
|
||||||
/* delete one shot timer */
|
spin_lock(&vq->lock);
|
||||||
list_del_init(&event->entry);
|
list_add_sorted(event, &vq->list);
|
||||||
else {
|
spin_unlock(&vq->lock);
|
||||||
/* move interval timer back to list */
|
|
||||||
spin_lock(&vt_list->lock);
|
|
||||||
list_del_init(&event->entry);
|
|
||||||
list_add_sorted(event, &vt_list->list);
|
|
||||||
spin_unlock(&vt_list->lock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,64 +287,57 @@ static void do_callbacks(struct list_head *cb_list)
|
||||||
*/
|
*/
|
||||||
static void do_cpu_timer_interrupt(__u16 error_code)
|
static void do_cpu_timer_interrupt(__u16 error_code)
|
||||||
{
|
{
|
||||||
__u64 next, delta;
|
struct vtimer_queue *vq;
|
||||||
struct vtimer_queue *vt_list;
|
|
||||||
struct vtimer_list *event, *tmp;
|
struct vtimer_list *event, *tmp;
|
||||||
struct list_head *ptr;
|
struct list_head cb_list; /* the callback queue */
|
||||||
/* the callback queue */
|
__u64 elapsed, next;
|
||||||
struct list_head cb_list;
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&cb_list);
|
INIT_LIST_HEAD(&cb_list);
|
||||||
vt_list = &__get_cpu_var(virt_cpu_timer);
|
vq = &__get_cpu_var(virt_cpu_timer);
|
||||||
|
|
||||||
/* walk timer list, fire all expired events */
|
/* walk timer list, fire all expired events */
|
||||||
spin_lock(&vt_list->lock);
|
spin_lock(&vq->lock);
|
||||||
|
|
||||||
if (vt_list->to_expire < VTIMER_MAX_SLICE)
|
elapsed = vq->elapsed + (vq->timer - S390_lowcore.async_enter_timer);
|
||||||
vt_list->offset += vt_list->to_expire;
|
BUG_ON((s64) elapsed < 0);
|
||||||
|
vq->elapsed = 0;
|
||||||
list_for_each_entry_safe(event, tmp, &vt_list->list, entry) {
|
list_for_each_entry_safe(event, tmp, &vq->list, entry) {
|
||||||
if (event->expires > vt_list->offset)
|
if (event->expires < elapsed)
|
||||||
/* found first unexpired event, leave */
|
/* move expired timer to the callback queue */
|
||||||
break;
|
list_move_tail(&event->entry, &cb_list);
|
||||||
|
else
|
||||||
/* re-charge interval timer, we have to add the offset */
|
event->expires -= elapsed;
|
||||||
if (event->interval)
|
|
||||||
event->expires = event->interval + vt_list->offset;
|
|
||||||
|
|
||||||
/* move expired timer to the callback queue */
|
|
||||||
list_move_tail(&event->entry, &cb_list);
|
|
||||||
}
|
}
|
||||||
spin_unlock(&vt_list->lock);
|
spin_unlock(&vq->lock);
|
||||||
|
|
||||||
|
vq->do_spt = list_empty(&cb_list);
|
||||||
do_callbacks(&cb_list);
|
do_callbacks(&cb_list);
|
||||||
|
|
||||||
/* next event is first in list */
|
/* next event is first in list */
|
||||||
spin_lock(&vt_list->lock);
|
next = VTIMER_MAX_SLICE;
|
||||||
if (!list_empty(&vt_list->list)) {
|
spin_lock(&vq->lock);
|
||||||
ptr = vt_list->list.next;
|
if (!list_empty(&vq->list)) {
|
||||||
event = list_entry(ptr, struct vtimer_list, entry);
|
event = list_first_entry(&vq->list, struct vtimer_list, entry);
|
||||||
next = event->expires - vt_list->offset;
|
next = event->expires;
|
||||||
|
} else
|
||||||
/* add the expired time from this interrupt handler
|
vq->do_spt = 0;
|
||||||
* and the callback functions
|
spin_unlock(&vq->lock);
|
||||||
*/
|
/*
|
||||||
asm volatile ("STPT %0" : "=m" (delta));
|
* To improve precision add the time spent by the
|
||||||
delta = 0xffffffffffffffffLL - delta + 1;
|
* interrupt handler to the elapsed time.
|
||||||
vt_list->offset += delta;
|
* Note: CPU timer counts down and we got an interrupt,
|
||||||
next -= delta;
|
* the current content is negative
|
||||||
} else {
|
*/
|
||||||
vt_list->offset = 0;
|
elapsed = S390_lowcore.async_enter_timer - get_vtimer();
|
||||||
next = VTIMER_MAX_SLICE;
|
set_vtimer(next - elapsed);
|
||||||
}
|
vq->timer = next - elapsed;
|
||||||
spin_unlock(&vt_list->lock);
|
vq->elapsed = elapsed;
|
||||||
set_vtimer(next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_virt_timer(struct vtimer_list *timer)
|
void init_virt_timer(struct vtimer_list *timer)
|
||||||
{
|
{
|
||||||
timer->function = NULL;
|
timer->function = NULL;
|
||||||
INIT_LIST_HEAD(&timer->entry);
|
INIT_LIST_HEAD(&timer->entry);
|
||||||
spin_lock_init(&timer->lock);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(init_virt_timer);
|
EXPORT_SYMBOL(init_virt_timer);
|
||||||
|
|
||||||
|
@ -299,44 +351,40 @@ static inline int vtimer_pending(struct vtimer_list *timer)
|
||||||
*/
|
*/
|
||||||
static void internal_add_vtimer(struct vtimer_list *timer)
|
static void internal_add_vtimer(struct vtimer_list *timer)
|
||||||
{
|
{
|
||||||
|
struct vtimer_queue *vq;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
__u64 done;
|
__u64 left, expires;
|
||||||
struct vtimer_list *event;
|
|
||||||
struct vtimer_queue *vt_list;
|
|
||||||
|
|
||||||
vt_list = &per_cpu(virt_cpu_timer, timer->cpu);
|
vq = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||||
spin_lock_irqsave(&vt_list->lock, flags);
|
spin_lock_irqsave(&vq->lock, flags);
|
||||||
|
|
||||||
BUG_ON(timer->cpu != smp_processor_id());
|
BUG_ON(timer->cpu != smp_processor_id());
|
||||||
|
|
||||||
/* if list is empty we only have to set the timer */
|
if (list_empty(&vq->list)) {
|
||||||
if (list_empty(&vt_list->list)) {
|
/* First timer on this cpu, just program it. */
|
||||||
/* reset the offset, this may happen if the last timer was
|
list_add(&timer->entry, &vq->list);
|
||||||
* just deleted by mod_virt_timer and the interrupt
|
set_vtimer(timer->expires);
|
||||||
* didn't happen until here
|
vq->timer = timer->expires;
|
||||||
*/
|
vq->elapsed = 0;
|
||||||
vt_list->offset = 0;
|
} else {
|
||||||
goto fire;
|
/* Check progress of old timers. */
|
||||||
|
expires = timer->expires;
|
||||||
|
left = get_vtimer();
|
||||||
|
if (likely((s64) expires < (s64) left)) {
|
||||||
|
/* The new timer expires before the current timer. */
|
||||||
|
set_vtimer(expires);
|
||||||
|
vq->elapsed += vq->timer - left;
|
||||||
|
vq->timer = expires;
|
||||||
|
} else {
|
||||||
|
vq->elapsed += vq->timer - left;
|
||||||
|
vq->timer = left;
|
||||||
|
}
|
||||||
|
/* Insert new timer into per cpu list. */
|
||||||
|
timer->expires += vq->elapsed;
|
||||||
|
list_add_sorted(timer, &vq->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save progress */
|
spin_unlock_irqrestore(&vq->lock, flags);
|
||||||
asm volatile ("STPT %0" : "=m" (done));
|
|
||||||
|
|
||||||
/* calculate completed work */
|
|
||||||
done = vt_list->to_expire - done + vt_list->offset;
|
|
||||||
vt_list->offset = 0;
|
|
||||||
|
|
||||||
list_for_each_entry(event, &vt_list->list, entry)
|
|
||||||
event->expires -= done;
|
|
||||||
|
|
||||||
fire:
|
|
||||||
list_add_sorted(timer, &vt_list->list);
|
|
||||||
|
|
||||||
/* get first element, which is the next vtimer slice */
|
|
||||||
event = list_entry(vt_list->list.next, struct vtimer_list, entry);
|
|
||||||
|
|
||||||
set_vtimer(event->expires);
|
|
||||||
spin_unlock_irqrestore(&vt_list->lock, flags);
|
|
||||||
/* release CPU acquired in prepare_vtimer or mod_virt_timer() */
|
/* release CPU acquired in prepare_vtimer or mod_virt_timer() */
|
||||||
put_cpu();
|
put_cpu();
|
||||||
}
|
}
|
||||||
|
@ -381,14 +429,15 @@ EXPORT_SYMBOL(add_virt_timer_periodic);
|
||||||
* If we change a pending timer the function must be called on the CPU
|
* If we change a pending timer the function must be called on the CPU
|
||||||
* where the timer is running on, e.g. by smp_call_function_single()
|
* where the timer is running on, e.g. by smp_call_function_single()
|
||||||
*
|
*
|
||||||
* The original mod_timer adds the timer if it is not pending. For compatibility
|
* The original mod_timer adds the timer if it is not pending. For
|
||||||
* we do the same. The timer will be added on the current CPU as a oneshot timer.
|
* compatibility we do the same. The timer will be added on the current
|
||||||
|
* CPU as a oneshot timer.
|
||||||
*
|
*
|
||||||
* returns whether it has modified a pending timer (1) or not (0)
|
* returns whether it has modified a pending timer (1) or not (0)
|
||||||
*/
|
*/
|
||||||
int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
||||||
{
|
{
|
||||||
struct vtimer_queue *vt_list;
|
struct vtimer_queue *vq;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
|
@ -404,17 +453,17 @@ int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
cpu = get_cpu();
|
cpu = get_cpu();
|
||||||
vt_list = &per_cpu(virt_cpu_timer, cpu);
|
vq = &per_cpu(virt_cpu_timer, cpu);
|
||||||
|
|
||||||
/* check if we run on the right CPU */
|
/* check if we run on the right CPU */
|
||||||
BUG_ON(timer->cpu != cpu);
|
BUG_ON(timer->cpu != cpu);
|
||||||
|
|
||||||
/* disable interrupts before test if timer is pending */
|
/* disable interrupts before test if timer is pending */
|
||||||
spin_lock_irqsave(&vt_list->lock, flags);
|
spin_lock_irqsave(&vq->lock, flags);
|
||||||
|
|
||||||
/* if timer isn't pending add it on the current CPU */
|
/* if timer isn't pending add it on the current CPU */
|
||||||
if (!vtimer_pending(timer)) {
|
if (!vtimer_pending(timer)) {
|
||||||
spin_unlock_irqrestore(&vt_list->lock, flags);
|
spin_unlock_irqrestore(&vq->lock, flags);
|
||||||
/* we do not activate an interval timer with mod_virt_timer */
|
/* we do not activate an interval timer with mod_virt_timer */
|
||||||
timer->interval = 0;
|
timer->interval = 0;
|
||||||
timer->expires = expires;
|
timer->expires = expires;
|
||||||
|
@ -431,7 +480,7 @@ int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
||||||
timer->interval = expires;
|
timer->interval = expires;
|
||||||
|
|
||||||
/* the timer can't expire anymore so we can release the lock */
|
/* the timer can't expire anymore so we can release the lock */
|
||||||
spin_unlock_irqrestore(&vt_list->lock, flags);
|
spin_unlock_irqrestore(&vq->lock, flags);
|
||||||
internal_add_vtimer(timer);
|
internal_add_vtimer(timer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -445,25 +494,19 @@ EXPORT_SYMBOL(mod_virt_timer);
|
||||||
int del_virt_timer(struct vtimer_list *timer)
|
int del_virt_timer(struct vtimer_list *timer)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct vtimer_queue *vt_list;
|
struct vtimer_queue *vq;
|
||||||
|
|
||||||
/* check if timer is pending */
|
/* check if timer is pending */
|
||||||
if (!vtimer_pending(timer))
|
if (!vtimer_pending(timer))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
vt_list = &per_cpu(virt_cpu_timer, timer->cpu);
|
vq = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||||
spin_lock_irqsave(&vt_list->lock, flags);
|
spin_lock_irqsave(&vq->lock, flags);
|
||||||
|
|
||||||
/* we don't interrupt a running timer, just let it expire! */
|
/* we don't interrupt a running timer, just let it expire! */
|
||||||
list_del_init(&timer->entry);
|
list_del_init(&timer->entry);
|
||||||
|
|
||||||
/* last timer removed */
|
spin_unlock_irqrestore(&vq->lock, flags);
|
||||||
if (list_empty(&vt_list->list)) {
|
|
||||||
vt_list->to_expire = 0;
|
|
||||||
vt_list->offset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&vt_list->lock, flags);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(del_virt_timer);
|
EXPORT_SYMBOL(del_virt_timer);
|
||||||
|
@ -473,24 +516,19 @@ EXPORT_SYMBOL(del_virt_timer);
|
||||||
*/
|
*/
|
||||||
void init_cpu_vtimer(void)
|
void init_cpu_vtimer(void)
|
||||||
{
|
{
|
||||||
struct vtimer_queue *vt_list;
|
struct vtimer_queue *vq;
|
||||||
|
|
||||||
/* kick the virtual timer */
|
/* kick the virtual timer */
|
||||||
S390_lowcore.exit_timer = VTIMER_MAX_SLICE;
|
|
||||||
S390_lowcore.last_update_timer = VTIMER_MAX_SLICE;
|
|
||||||
asm volatile ("SPT %0" : : "m" (S390_lowcore.last_update_timer));
|
|
||||||
asm volatile ("STCK %0" : "=m" (S390_lowcore.last_update_clock));
|
asm volatile ("STCK %0" : "=m" (S390_lowcore.last_update_clock));
|
||||||
|
asm volatile ("STPT %0" : "=m" (S390_lowcore.last_update_timer));
|
||||||
|
|
||||||
|
/* initialize per cpu vtimer structure */
|
||||||
|
vq = &__get_cpu_var(virt_cpu_timer);
|
||||||
|
INIT_LIST_HEAD(&vq->list);
|
||||||
|
spin_lock_init(&vq->lock);
|
||||||
|
|
||||||
/* enable cpu timer interrupts */
|
/* enable cpu timer interrupts */
|
||||||
__ctl_set_bit(0,10);
|
__ctl_set_bit(0,10);
|
||||||
|
|
||||||
vt_list = &__get_cpu_var(virt_cpu_timer);
|
|
||||||
INIT_LIST_HEAD(&vt_list->list);
|
|
||||||
spin_lock_init(&vt_list->lock);
|
|
||||||
vt_list->to_expire = 0;
|
|
||||||
vt_list->offset = 0;
|
|
||||||
vt_list->idle = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init vtime_init(void)
|
void __init vtime_init(void)
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#define parent_node(node) ((void)(node),0)
|
#define parent_node(node) ((void)(node),0)
|
||||||
|
|
||||||
#define node_to_cpumask(node) ((void)node, cpu_online_map)
|
#define node_to_cpumask(node) ((void)node, cpu_online_map)
|
||||||
|
#define cpumask_of_node(node) ((void)node, cpu_online_mask)
|
||||||
#define node_to_first_cpu(node) ((void)(node),0)
|
#define node_to_first_cpu(node) ((void)(node),0)
|
||||||
|
|
||||||
#define pcibus_to_node(bus) ((void)(bus), -1)
|
#define pcibus_to_node(bus) ((void)(bus), -1)
|
||||||
|
|
|
@ -4,6 +4,17 @@
|
||||||
|
|
||||||
mainmenu "Linux/SPARC Kernel Configuration"
|
mainmenu "Linux/SPARC Kernel Configuration"
|
||||||
|
|
||||||
|
config 64BIT
|
||||||
|
bool "64-bit kernel" if ARCH = "sparc"
|
||||||
|
default ARCH = "sparc64"
|
||||||
|
help
|
||||||
|
SPARC is a family of RISC microprocessors designed and marketed by
|
||||||
|
Sun Microsystems, incorporated. They are very widely found in Sun
|
||||||
|
workstations and clones.
|
||||||
|
|
||||||
|
Say yes to build a 64-bit kernel - formerly known as sparc64
|
||||||
|
Say no to build a 32-bit kernel - formerly known as sparc
|
||||||
|
|
||||||
config SPARC
|
config SPARC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
@ -15,22 +26,11 @@ config SPARC
|
||||||
select RTC_CLASS
|
select RTC_CLASS
|
||||||
select RTC_DRV_M48T59
|
select RTC_DRV_M48T59
|
||||||
|
|
||||||
# Identify this as a Sparc32 build
|
|
||||||
config SPARC32
|
config SPARC32
|
||||||
bool
|
def_bool !64BIT
|
||||||
default y if ARCH = "sparc"
|
|
||||||
help
|
|
||||||
SPARC is a family of RISC microprocessors designed and marketed by
|
|
||||||
Sun Microsystems, incorporated. They are very widely found in Sun
|
|
||||||
workstations and clones. This port covers the original 32-bit SPARC;
|
|
||||||
it is old and stable and usually considered one of the "big three"
|
|
||||||
along with the Intel and Alpha ports. The UltraLinux project
|
|
||||||
maintains both the SPARC32 and SPARC64 ports; its web page is
|
|
||||||
available at <http://www.ultralinux.org/>.
|
|
||||||
|
|
||||||
config SPARC64
|
config SPARC64
|
||||||
bool
|
def_bool 64BIT
|
||||||
default y if ARCH = "sparc64"
|
|
||||||
select ARCH_SUPPORTS_MSI
|
select ARCH_SUPPORTS_MSI
|
||||||
select HAVE_FUNCTION_TRACER
|
select HAVE_FUNCTION_TRACER
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
|
@ -53,9 +53,6 @@ config BITS
|
||||||
default 32 if SPARC32
|
default 32 if SPARC32
|
||||||
default 64 if SPARC64
|
default 64 if SPARC64
|
||||||
|
|
||||||
config 64BIT
|
|
||||||
def_bool y if SPARC64
|
|
||||||
|
|
||||||
config GENERIC_TIME
|
config GENERIC_TIME
|
||||||
bool
|
bool
|
||||||
default y if SPARC64
|
default y if SPARC64
|
||||||
|
@ -188,14 +185,6 @@ config ARCH_MAY_HAVE_PC_FDC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config ARCH_HAS_ILOG2_U32
|
|
||||||
bool
|
|
||||||
default n
|
|
||||||
|
|
||||||
config ARCH_HAS_ILOG2_U64
|
|
||||||
bool
|
|
||||||
default n
|
|
||||||
|
|
||||||
config EMULATED_CMPXCHG
|
config EMULATED_CMPXCHG
|
||||||
bool
|
bool
|
||||||
default y if SPARC32
|
default y if SPARC32
|
||||||
|
@ -442,26 +431,6 @@ config SERIAL_CONSOLE
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Bus options (PCI etc.)"
|
menu "Bus options (PCI etc.)"
|
||||||
config ISA
|
|
||||||
bool
|
|
||||||
help
|
|
||||||
ISA is found on Espresso only and is not supported currently.
|
|
||||||
|
|
||||||
config ISAPNP
|
|
||||||
bool
|
|
||||||
help
|
|
||||||
ISAPNP is not supported
|
|
||||||
|
|
||||||
config EISA
|
|
||||||
bool
|
|
||||||
help
|
|
||||||
EISA is not supported.
|
|
||||||
|
|
||||||
config MCA
|
|
||||||
bool
|
|
||||||
help
|
|
||||||
MCA is not supported.
|
|
||||||
|
|
||||||
config SBUS
|
config SBUS
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.28-rc4
|
# Linux kernel version: 2.6.28
|
||||||
# Mon Nov 10 12:35:09 2008
|
# Fri Jan 2 18:14:26 2009
|
||||||
#
|
#
|
||||||
CONFIG_SPARC=y
|
CONFIG_SPARC=y
|
||||||
CONFIG_SPARC64=y
|
CONFIG_SPARC64=y
|
||||||
|
CONFIG_ARCH_DEFCONFIG="arch/sparc/configs/sparc64_defconfig"
|
||||||
|
CONFIG_BITS=64
|
||||||
|
CONFIG_64BIT=y
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
CONFIG_64BIT=y
|
|
||||||
CONFIG_MMU=y
|
|
||||||
CONFIG_IOMMU_HELPER=y
|
CONFIG_IOMMU_HELPER=y
|
||||||
CONFIG_QUICKLIST=y
|
CONFIG_QUICKLIST=y
|
||||||
CONFIG_STACKTRACE_SUPPORT=y
|
CONFIG_STACKTRACE_SUPPORT=y
|
||||||
CONFIG_LOCKDEP_SUPPORT=y
|
CONFIG_LOCKDEP_SUPPORT=y
|
||||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
|
||||||
CONFIG_AUDIT_ARCH=y
|
CONFIG_AUDIT_ARCH=y
|
||||||
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
|
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
|
||||||
|
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||||
|
CONFIG_MMU=y
|
||||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||||
CONFIG_OF=y
|
CONFIG_OF=y
|
||||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -86,6 +86,7 @@ CONFIG_SLUB_DEBUG=y
|
||||||
CONFIG_SLUB=y
|
CONFIG_SLUB=y
|
||||||
# CONFIG_SLOB is not set
|
# CONFIG_SLOB is not set
|
||||||
CONFIG_PROFILING=y
|
CONFIG_PROFILING=y
|
||||||
|
CONFIG_TRACEPOINTS=y
|
||||||
# CONFIG_MARKERS is not set
|
# CONFIG_MARKERS is not set
|
||||||
CONFIG_OPROFILE=m
|
CONFIG_OPROFILE=m
|
||||||
CONFIG_HAVE_OPROFILE=y
|
CONFIG_HAVE_OPROFILE=y
|
||||||
|
@ -127,34 +128,40 @@ CONFIG_DEFAULT_AS=y
|
||||||
# CONFIG_DEFAULT_NOOP is not set
|
# CONFIG_DEFAULT_NOOP is not set
|
||||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||||
CONFIG_CLASSIC_RCU=y
|
CONFIG_CLASSIC_RCU=y
|
||||||
|
# CONFIG_TREE_RCU is not set
|
||||||
|
# CONFIG_PREEMPT_RCU is not set
|
||||||
|
# CONFIG_TREE_RCU_TRACE is not set
|
||||||
|
# CONFIG_PREEMPT_RCU_TRACE is not set
|
||||||
# CONFIG_FREEZER is not set
|
# CONFIG_FREEZER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor type and features
|
# Processor type and features
|
||||||
#
|
#
|
||||||
CONFIG_SPARC64_PAGE_SIZE_8KB=y
|
CONFIG_SMP=y
|
||||||
# CONFIG_SPARC64_PAGE_SIZE_64KB is not set
|
CONFIG_NR_CPUS=64
|
||||||
CONFIG_SECCOMP=y
|
|
||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
# CONFIG_HZ_250 is not set
|
# CONFIG_HZ_250 is not set
|
||||||
# CONFIG_HZ_300 is not set
|
# CONFIG_HZ_300 is not set
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=100
|
||||||
CONFIG_SCHED_HRTICK=y
|
CONFIG_SCHED_HRTICK=y
|
||||||
|
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||||
|
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||||
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
|
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||||
|
CONFIG_SPARC64_SMP=y
|
||||||
|
CONFIG_SPARC64_PAGE_SIZE_8KB=y
|
||||||
|
# CONFIG_SPARC64_PAGE_SIZE_64KB is not set
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_HOTPLUG_CPU=y
|
CONFIG_HOTPLUG_CPU=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_TICK_ONESHOT=y
|
CONFIG_TICK_ONESHOT=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||||
CONFIG_SMP=y
|
|
||||||
CONFIG_NR_CPUS=64
|
|
||||||
# CONFIG_CPU_FREQ is not set
|
# CONFIG_CPU_FREQ is not set
|
||||||
CONFIG_US3_MC=y
|
CONFIG_US3_MC=y
|
||||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
|
||||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|
||||||
CONFIG_HUGETLB_PAGE_SIZE_4MB=y
|
CONFIG_HUGETLB_PAGE_SIZE_4MB=y
|
||||||
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
|
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
|
||||||
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
||||||
|
@ -183,10 +190,18 @@ CONFIG_PHYS_ADDR_T_64BIT=y
|
||||||
CONFIG_ZONE_DMA_FLAG=0
|
CONFIG_ZONE_DMA_FLAG=0
|
||||||
CONFIG_NR_QUICK=1
|
CONFIG_NR_QUICK=1
|
||||||
CONFIG_UNEVICTABLE_LRU=y
|
CONFIG_UNEVICTABLE_LRU=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
# CONFIG_PREEMPT_NONE is not set
|
||||||
|
CONFIG_PREEMPT_VOLUNTARY=y
|
||||||
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bus options (PCI etc.)
|
||||||
|
#
|
||||||
CONFIG_SBUS=y
|
CONFIG_SBUS=y
|
||||||
CONFIG_SBUSCHAR=y
|
CONFIG_SBUSCHAR=y
|
||||||
CONFIG_SUN_AUXIO=y
|
|
||||||
CONFIG_SUN_IO=y
|
|
||||||
CONFIG_SUN_LDOMS=y
|
CONFIG_SUN_LDOMS=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_DOMAINS=y
|
CONFIG_PCI_DOMAINS=y
|
||||||
|
@ -195,7 +210,9 @@ CONFIG_ARCH_SUPPORTS_MSI=y
|
||||||
CONFIG_PCI_MSI=y
|
CONFIG_PCI_MSI=y
|
||||||
# CONFIG_PCI_LEGACY is not set
|
# CONFIG_PCI_LEGACY is not set
|
||||||
# CONFIG_PCI_DEBUG is not set
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
# CONFIG_PCCARD is not set
|
||||||
CONFIG_SUN_OPENPROMFS=m
|
CONFIG_SUN_OPENPROMFS=m
|
||||||
|
CONFIG_SPARC64_PCI=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Executable file formats
|
# Executable file formats
|
||||||
|
@ -207,17 +224,13 @@ CONFIG_COMPAT_BINFMT_ELF=y
|
||||||
CONFIG_BINFMT_MISC=m
|
CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_COMPAT=y
|
CONFIG_COMPAT=y
|
||||||
CONFIG_SYSVIPC_COMPAT=y
|
CONFIG_SYSVIPC_COMPAT=y
|
||||||
CONFIG_SCHED_SMT=y
|
|
||||||
CONFIG_SCHED_MC=y
|
|
||||||
# CONFIG_PREEMPT_NONE is not set
|
|
||||||
CONFIG_PREEMPT_VOLUNTARY=y
|
|
||||||
# CONFIG_PREEMPT is not set
|
|
||||||
# CONFIG_CMDLINE_BOOL is not set
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Networking options
|
# Networking options
|
||||||
#
|
#
|
||||||
|
# CONFIG_NET_NS is not set
|
||||||
|
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
|
@ -314,6 +327,7 @@ CONFIG_VLAN_8021Q=m
|
||||||
# CONFIG_ECONET is not set
|
# CONFIG_ECONET is not set
|
||||||
# CONFIG_WAN_ROUTER is not set
|
# CONFIG_WAN_ROUTER is not set
|
||||||
# CONFIG_NET_SCHED is not set
|
# CONFIG_NET_SCHED is not set
|
||||||
|
# CONFIG_DCB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Network testing
|
# Network testing
|
||||||
|
@ -330,8 +344,8 @@ CONFIG_WIRELESS=y
|
||||||
# CONFIG_CFG80211 is not set
|
# CONFIG_CFG80211 is not set
|
||||||
CONFIG_WIRELESS_OLD_REGULATORY=y
|
CONFIG_WIRELESS_OLD_REGULATORY=y
|
||||||
# CONFIG_WIRELESS_EXT is not set
|
# CONFIG_WIRELESS_EXT is not set
|
||||||
|
# CONFIG_LIB80211 is not set
|
||||||
# CONFIG_MAC80211 is not set
|
# CONFIG_MAC80211 is not set
|
||||||
# CONFIG_IEEE80211 is not set
|
|
||||||
# CONFIG_RFKILL is not set
|
# CONFIG_RFKILL is not set
|
||||||
# CONFIG_NET_9P is not set
|
# CONFIG_NET_9P is not set
|
||||||
|
|
||||||
|
@ -378,8 +392,10 @@ CONFIG_MISC_DEVICES=y
|
||||||
# CONFIG_EEPROM_93CX6 is not set
|
# CONFIG_EEPROM_93CX6 is not set
|
||||||
# CONFIG_SGI_IOC4 is not set
|
# CONFIG_SGI_IOC4 is not set
|
||||||
# CONFIG_TIFM_CORE is not set
|
# CONFIG_TIFM_CORE is not set
|
||||||
|
# CONFIG_ICS932S401 is not set
|
||||||
# CONFIG_ENCLOSURE_SERVICES is not set
|
# CONFIG_ENCLOSURE_SERVICES is not set
|
||||||
# CONFIG_HP_ILO is not set
|
# CONFIG_HP_ILO is not set
|
||||||
|
# CONFIG_C2PORT is not set
|
||||||
CONFIG_HAVE_IDE=y
|
CONFIG_HAVE_IDE=y
|
||||||
CONFIG_IDE=y
|
CONFIG_IDE=y
|
||||||
|
|
||||||
|
@ -387,6 +403,7 @@ CONFIG_IDE=y
|
||||||
# Please see Documentation/ide/ide.txt for help/info on IDE drives
|
# Please see Documentation/ide/ide.txt for help/info on IDE drives
|
||||||
#
|
#
|
||||||
CONFIG_IDE_TIMINGS=y
|
CONFIG_IDE_TIMINGS=y
|
||||||
|
CONFIG_IDE_ATAPI=y
|
||||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||||
CONFIG_IDE_GD=y
|
CONFIG_IDE_GD=y
|
||||||
CONFIG_IDE_GD_ATA=y
|
CONFIG_IDE_GD_ATA=y
|
||||||
|
@ -394,7 +411,6 @@ CONFIG_IDE_GD_ATA=y
|
||||||
CONFIG_BLK_DEV_IDECD=y
|
CONFIG_BLK_DEV_IDECD=y
|
||||||
CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
|
CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
|
||||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||||
# CONFIG_BLK_DEV_IDESCSI is not set
|
|
||||||
# CONFIG_IDE_TASK_IOCTL is not set
|
# CONFIG_IDE_TASK_IOCTL is not set
|
||||||
CONFIG_IDE_PROC_FS=y
|
CONFIG_IDE_PROC_FS=y
|
||||||
|
|
||||||
|
@ -477,6 +493,7 @@ CONFIG_SCSI_FC_ATTRS=y
|
||||||
# CONFIG_SCSI_SRP_ATTRS is not set
|
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||||
CONFIG_SCSI_LOWLEVEL=y
|
CONFIG_SCSI_LOWLEVEL=y
|
||||||
# CONFIG_ISCSI_TCP is not set
|
# CONFIG_ISCSI_TCP is not set
|
||||||
|
# CONFIG_SCSI_CXGB3_ISCSI is not set
|
||||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||||
# CONFIG_SCSI_3W_9XXX is not set
|
# CONFIG_SCSI_3W_9XXX is not set
|
||||||
# CONFIG_SCSI_ACARD is not set
|
# CONFIG_SCSI_ACARD is not set
|
||||||
|
@ -490,6 +507,8 @@ CONFIG_SCSI_LOWLEVEL=y
|
||||||
# CONFIG_MEGARAID_LEGACY is not set
|
# CONFIG_MEGARAID_LEGACY is not set
|
||||||
# CONFIG_MEGARAID_SAS is not set
|
# CONFIG_MEGARAID_SAS is not set
|
||||||
# CONFIG_SCSI_HPTIOP is not set
|
# CONFIG_SCSI_HPTIOP is not set
|
||||||
|
# CONFIG_LIBFC is not set
|
||||||
|
# CONFIG_FCOE is not set
|
||||||
# CONFIG_SCSI_DMX3191D is not set
|
# CONFIG_SCSI_DMX3191D is not set
|
||||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||||
# CONFIG_SCSI_IPS is not set
|
# CONFIG_SCSI_IPS is not set
|
||||||
|
@ -564,6 +583,9 @@ CONFIG_PHYLIB=m
|
||||||
# CONFIG_BROADCOM_PHY is not set
|
# CONFIG_BROADCOM_PHY is not set
|
||||||
# CONFIG_ICPLUS_PHY is not set
|
# CONFIG_ICPLUS_PHY is not set
|
||||||
# CONFIG_REALTEK_PHY is not set
|
# CONFIG_REALTEK_PHY is not set
|
||||||
|
# CONFIG_NATIONAL_PHY is not set
|
||||||
|
# CONFIG_STE10XP is not set
|
||||||
|
# CONFIG_LSI_ET1011C_PHY is not set
|
||||||
# CONFIG_MDIO_BITBANG is not set
|
# CONFIG_MDIO_BITBANG is not set
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NET_ETHERNET=y
|
||||||
CONFIG_MII=m
|
CONFIG_MII=m
|
||||||
|
@ -590,7 +612,6 @@ CONFIG_NET_PCI=y
|
||||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||||
# CONFIG_B44 is not set
|
# CONFIG_B44 is not set
|
||||||
# CONFIG_FORCEDETH is not set
|
# CONFIG_FORCEDETH is not set
|
||||||
# CONFIG_EEPRO100 is not set
|
|
||||||
# CONFIG_E100 is not set
|
# CONFIG_E100 is not set
|
||||||
# CONFIG_FEALNX is not set
|
# CONFIG_FEALNX is not set
|
||||||
# CONFIG_NATSEMI is not set
|
# CONFIG_NATSEMI is not set
|
||||||
|
@ -600,6 +621,7 @@ CONFIG_NET_PCI=y
|
||||||
# CONFIG_R6040 is not set
|
# CONFIG_R6040 is not set
|
||||||
# CONFIG_SIS900 is not set
|
# CONFIG_SIS900 is not set
|
||||||
# CONFIG_EPIC100 is not set
|
# CONFIG_EPIC100 is not set
|
||||||
|
# CONFIG_SMSC9420 is not set
|
||||||
# CONFIG_SUNDANCE is not set
|
# CONFIG_SUNDANCE is not set
|
||||||
# CONFIG_TLAN is not set
|
# CONFIG_TLAN is not set
|
||||||
# CONFIG_VIA_RHINE is not set
|
# CONFIG_VIA_RHINE is not set
|
||||||
|
@ -629,6 +651,7 @@ CONFIG_BNX2=m
|
||||||
# CONFIG_JME is not set
|
# CONFIG_JME is not set
|
||||||
CONFIG_NETDEV_10000=y
|
CONFIG_NETDEV_10000=y
|
||||||
# CONFIG_CHELSIO_T1 is not set
|
# CONFIG_CHELSIO_T1 is not set
|
||||||
|
CONFIG_CHELSIO_T3_DEPENDS=y
|
||||||
# CONFIG_CHELSIO_T3 is not set
|
# CONFIG_CHELSIO_T3 is not set
|
||||||
# CONFIG_ENIC is not set
|
# CONFIG_ENIC is not set
|
||||||
# CONFIG_IXGBE is not set
|
# CONFIG_IXGBE is not set
|
||||||
|
@ -778,6 +801,7 @@ CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
# CONFIG_SERIAL_JSM is not set
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
|
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_IPMI_HANDLER is not set
|
# CONFIG_IPMI_HANDLER is not set
|
||||||
CONFIG_HW_RANDOM=m
|
CONFIG_HW_RANDOM=m
|
||||||
|
@ -870,6 +894,7 @@ CONFIG_HWMON=y
|
||||||
# CONFIG_SENSORS_ADM1029 is not set
|
# CONFIG_SENSORS_ADM1029 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
# CONFIG_SENSORS_ADM9240 is not set
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
|
# CONFIG_SENSORS_ADT7462 is not set
|
||||||
# CONFIG_SENSORS_ADT7470 is not set
|
# CONFIG_SENSORS_ADT7470 is not set
|
||||||
# CONFIG_SENSORS_ADT7473 is not set
|
# CONFIG_SENSORS_ADT7473 is not set
|
||||||
# CONFIG_SENSORS_ATXP1 is not set
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
|
@ -919,11 +944,11 @@ CONFIG_HWMON=y
|
||||||
# CONFIG_THERMAL is not set
|
# CONFIG_THERMAL is not set
|
||||||
# CONFIG_THERMAL_HWMON is not set
|
# CONFIG_THERMAL_HWMON is not set
|
||||||
# CONFIG_WATCHDOG is not set
|
# CONFIG_WATCHDOG is not set
|
||||||
|
CONFIG_SSB_POSSIBLE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sonics Silicon Backplane
|
# Sonics Silicon Backplane
|
||||||
#
|
#
|
||||||
CONFIG_SSB_POSSIBLE=y
|
|
||||||
# CONFIG_SSB is not set
|
# CONFIG_SSB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1071,6 +1096,7 @@ CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER_OSS=y
|
||||||
|
# CONFIG_SND_HRTIMER is not set
|
||||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||||
CONFIG_SND_SUPPORT_OLD_API=y
|
CONFIG_SND_SUPPORT_OLD_API=y
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
|
@ -1242,11 +1268,11 @@ CONFIG_USB_UHCI_HCD=m
|
||||||
# CONFIG_USB_TMC is not set
|
# CONFIG_USB_TMC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# may also be needed; see USB_STORAGE Help for more information
|
# see USB_STORAGE Help for more information
|
||||||
#
|
#
|
||||||
CONFIG_USB_STORAGE=m
|
CONFIG_USB_STORAGE=m
|
||||||
# CONFIG_USB_STORAGE_DEBUG is not set
|
# CONFIG_USB_STORAGE_DEBUG is not set
|
||||||
|
@ -1337,6 +1363,7 @@ CONFIG_RTC_INTF_DEV=y
|
||||||
# CONFIG_RTC_DRV_M41T80 is not set
|
# CONFIG_RTC_DRV_M41T80 is not set
|
||||||
# CONFIG_RTC_DRV_S35390A is not set
|
# CONFIG_RTC_DRV_S35390A is not set
|
||||||
# CONFIG_RTC_DRV_FM3130 is not set
|
# CONFIG_RTC_DRV_FM3130 is not set
|
||||||
|
# CONFIG_RTC_DRV_RX8581 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SPI RTC drivers
|
# SPI RTC drivers
|
||||||
|
@ -1365,7 +1392,6 @@ CONFIG_RTC_DRV_STARFIRE=y
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
# CONFIG_STAGING is not set
|
# CONFIG_STAGING is not set
|
||||||
CONFIG_STAGING_EXCLUDE_BUILD=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc Linux/SPARC drivers
|
# Misc Linux/SPARC drivers
|
||||||
|
@ -1544,6 +1570,7 @@ CONFIG_SCHEDSTATS=y
|
||||||
# CONFIG_LOCK_STAT is not set
|
# CONFIG_LOCK_STAT is not set
|
||||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||||
|
CONFIG_STACKTRACE=y
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
CONFIG_DEBUG_BUGVERBOSE=y
|
CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
# CONFIG_DEBUG_INFO is not set
|
# CONFIG_DEBUG_INFO is not set
|
||||||
|
@ -1552,6 +1579,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
CONFIG_DEBUG_MEMORY_INIT=y
|
CONFIG_DEBUG_MEMORY_INIT=y
|
||||||
# CONFIG_DEBUG_LIST is not set
|
# CONFIG_DEBUG_LIST is not set
|
||||||
# CONFIG_DEBUG_SG is not set
|
# CONFIG_DEBUG_SG is not set
|
||||||
|
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||||
|
@ -1560,8 +1588,12 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
||||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||||
# CONFIG_LKDTM is not set
|
# CONFIG_LKDTM is not set
|
||||||
# CONFIG_FAULT_INJECTION is not set
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
|
# CONFIG_LATENCYTOP is not set
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||||
|
CONFIG_NOP_TRACER=y
|
||||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||||
|
CONFIG_RING_BUFFER=y
|
||||||
|
CONFIG_TRACING=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tracers
|
# Tracers
|
||||||
|
@ -1571,7 +1603,9 @@ CONFIG_HAVE_FUNCTION_TRACER=y
|
||||||
# CONFIG_SCHED_TRACER is not set
|
# CONFIG_SCHED_TRACER is not set
|
||||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||||
# CONFIG_BOOT_TRACER is not set
|
# CONFIG_BOOT_TRACER is not set
|
||||||
|
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||||
# CONFIG_STACK_TRACER is not set
|
# CONFIG_STACK_TRACER is not set
|
||||||
|
# CONFIG_FTRACE_STARTUP_TEST is not set
|
||||||
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
||||||
# CONFIG_SAMPLES is not set
|
# CONFIG_SAMPLES is not set
|
||||||
CONFIG_HAVE_ARCH_KGDB=y
|
CONFIG_HAVE_ARCH_KGDB=y
|
||||||
|
@ -1600,11 +1634,16 @@ CONFIG_CRYPTO=y
|
||||||
#
|
#
|
||||||
# CONFIG_CRYPTO_FIPS is not set
|
# CONFIG_CRYPTO_FIPS is not set
|
||||||
CONFIG_CRYPTO_ALGAPI=y
|
CONFIG_CRYPTO_ALGAPI=y
|
||||||
|
CONFIG_CRYPTO_ALGAPI2=y
|
||||||
CONFIG_CRYPTO_AEAD=y
|
CONFIG_CRYPTO_AEAD=y
|
||||||
|
CONFIG_CRYPTO_AEAD2=y
|
||||||
CONFIG_CRYPTO_BLKCIPHER=y
|
CONFIG_CRYPTO_BLKCIPHER=y
|
||||||
|
CONFIG_CRYPTO_BLKCIPHER2=y
|
||||||
CONFIG_CRYPTO_HASH=y
|
CONFIG_CRYPTO_HASH=y
|
||||||
CONFIG_CRYPTO_RNG=y
|
CONFIG_CRYPTO_HASH2=y
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
CONFIG_CRYPTO_MANAGER=y
|
CONFIG_CRYPTO_MANAGER=y
|
||||||
|
CONFIG_CRYPTO_MANAGER2=y
|
||||||
CONFIG_CRYPTO_GF128MUL=m
|
CONFIG_CRYPTO_GF128MUL=m
|
||||||
CONFIG_CRYPTO_NULL=m
|
CONFIG_CRYPTO_NULL=m
|
||||||
# CONFIG_CRYPTO_CRYPTD is not set
|
# CONFIG_CRYPTO_CRYPTD is not set
|
||||||
|
|
|
@ -1,21 +1,6 @@
|
||||||
# User exported sparc header files
|
# User exported sparc header files
|
||||||
include include/asm-generic/Kbuild.asm
|
include include/asm-generic/Kbuild.asm
|
||||||
|
|
||||||
header-y += ipcbuf_32.h
|
|
||||||
header-y += ipcbuf_64.h
|
|
||||||
header-y += posix_types_32.h
|
|
||||||
header-y += posix_types_64.h
|
|
||||||
header-y += ptrace_32.h
|
|
||||||
header-y += ptrace_64.h
|
|
||||||
header-y += sigcontext_32.h
|
|
||||||
header-y += sigcontext_64.h
|
|
||||||
header-y += siginfo_32.h
|
|
||||||
header-y += siginfo_64.h
|
|
||||||
header-y += signal_32.h
|
|
||||||
header-y += signal_64.h
|
|
||||||
header-y += stat_32.h
|
|
||||||
header-y += stat_64.h
|
|
||||||
|
|
||||||
header-y += apc.h
|
header-y += apc.h
|
||||||
header-y += asi.h
|
header-y += asi.h
|
||||||
header-y += display7seg.h
|
header-y += display7seg.h
|
||||||
|
@ -23,16 +8,11 @@ header-y += envctrl.h
|
||||||
header-y += fbio.h
|
header-y += fbio.h
|
||||||
header-y += jsflash.h
|
header-y += jsflash.h
|
||||||
header-y += openprom.h
|
header-y += openprom.h
|
||||||
header-y += openprom_32.h
|
|
||||||
header-y += openprom_64.h
|
|
||||||
header-y += openpromio.h
|
header-y += openpromio.h
|
||||||
header-y += perfctr.h
|
header-y += perfctr.h
|
||||||
header-y += psrcompat.h
|
header-y += psrcompat.h
|
||||||
header-y += psr.h
|
header-y += psr.h
|
||||||
header-y += pstate.h
|
header-y += pstate.h
|
||||||
header-y += reg.h
|
|
||||||
header-y += reg_32.h
|
|
||||||
header-y += reg_64.h
|
|
||||||
header-y += traps.h
|
header-y += traps.h
|
||||||
header-y += uctx.h
|
header-y += uctx.h
|
||||||
header-y += utrap.h
|
header-y += utrap.h
|
||||||
|
|
|
@ -1,16 +1,12 @@
|
||||||
#ifndef _SPARC_BYTEORDER_H
|
#ifndef _SPARC_BYTEORDER_H
|
||||||
#define _SPARC_BYTEORDER_H
|
#define _SPARC_BYTEORDER_H
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/asi.h>
|
#include <asm/asi.h>
|
||||||
|
|
||||||
#define __BIG_ENDIAN
|
#define __BIG_ENDIAN
|
||||||
|
|
||||||
#ifdef CONFIG_SPARC32
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
#define __SWAB_64_THRU_32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPARC64
|
|
||||||
static inline __u16 __arch_swab16p(const __u16 *addr)
|
static inline __u16 __arch_swab16p(const __u16 *addr)
|
||||||
{
|
{
|
||||||
__u16 ret;
|
__u16 ret;
|
||||||
|
@ -44,7 +40,9 @@ static inline __u64 __arch_swab64p(const __u64 *addr)
|
||||||
}
|
}
|
||||||
#define __arch_swab64p __arch_swab64p
|
#define __arch_swab64p __arch_swab64p
|
||||||
|
|
||||||
#endif /* CONFIG_SPARC64 */
|
#else
|
||||||
|
#define __SWAB_64_THRU_32__
|
||||||
|
#endif /* defined(__sparc__) && defined(__arch64__) */
|
||||||
|
|
||||||
#include <linux/byteorder.h>
|
#include <linux/byteorder.h>
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,32 @@
|
||||||
#ifndef ___ASM_SPARC_IPCBUF_H
|
#ifndef __SPARC_IPCBUF_H
|
||||||
#define ___ASM_SPARC_IPCBUF_H
|
#define __SPARC_IPCBUF_H
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
|
||||||
#include <asm/ipcbuf_64.h>
|
/*
|
||||||
#else
|
* The ipc64_perm structure for sparc/sparc64 architecture.
|
||||||
#include <asm/ipcbuf_32.h>
|
* Note extra padding because this structure is passed back and forth
|
||||||
#endif
|
* between kernel and user space.
|
||||||
|
*
|
||||||
|
* Pad space is left for:
|
||||||
|
* - 32-bit seq
|
||||||
|
* - on sparc for 32 bit mode (it is 32 bit on sparc64)
|
||||||
|
* - 2 miscellaneous 64-bit values
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct ipc64_perm
|
||||||
|
{
|
||||||
|
__kernel_key_t key;
|
||||||
|
__kernel_uid_t uid;
|
||||||
|
__kernel_gid_t gid;
|
||||||
|
__kernel_uid_t cuid;
|
||||||
|
__kernel_gid_t cgid;
|
||||||
|
#ifndef __arch64__
|
||||||
|
unsigned short __pad0;
|
||||||
#endif
|
#endif
|
||||||
|
__kernel_mode_t mode;
|
||||||
|
unsigned short __pad1;
|
||||||
|
unsigned short seq;
|
||||||
|
unsigned long long __unused1;
|
||||||
|
unsigned long long __unused2;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __SPARC_IPCBUF_H */
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef _SPARC_IPCBUF_H
|
|
||||||
#define _SPARC_IPCBUF_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The ipc64_perm structure for sparc architecture.
|
|
||||||
* Note extra padding because this structure is passed back and forth
|
|
||||||
* between kernel and user space.
|
|
||||||
*
|
|
||||||
* Pad space is left for:
|
|
||||||
* - 32-bit mode
|
|
||||||
* - 32-bit seq
|
|
||||||
* - 2 miscellaneous 64-bit values (so that this structure matches
|
|
||||||
* sparc64 ipc64_perm)
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct ipc64_perm
|
|
||||||
{
|
|
||||||
__kernel_key_t key;
|
|
||||||
__kernel_uid32_t uid;
|
|
||||||
__kernel_gid32_t gid;
|
|
||||||
__kernel_uid32_t cuid;
|
|
||||||
__kernel_gid32_t cgid;
|
|
||||||
unsigned short __pad1;
|
|
||||||
__kernel_mode_t mode;
|
|
||||||
unsigned short __pad2;
|
|
||||||
unsigned short seq;
|
|
||||||
unsigned long long __unused1;
|
|
||||||
unsigned long long __unused2;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _SPARC_IPCBUF_H */
|
|
|
@ -1,28 +0,0 @@
|
||||||
#ifndef _SPARC64_IPCBUF_H
|
|
||||||
#define _SPARC64_IPCBUF_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The ipc64_perm structure for sparc64 architecture.
|
|
||||||
* Note extra padding because this structure is passed back and forth
|
|
||||||
* between kernel and user space.
|
|
||||||
*
|
|
||||||
* Pad space is left for:
|
|
||||||
* - 32-bit seq
|
|
||||||
* - 2 miscellaneous 64-bit values
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct ipc64_perm
|
|
||||||
{
|
|
||||||
__kernel_key_t key;
|
|
||||||
__kernel_uid_t uid;
|
|
||||||
__kernel_gid_t gid;
|
|
||||||
__kernel_uid_t cuid;
|
|
||||||
__kernel_gid_t cgid;
|
|
||||||
__kernel_mode_t mode;
|
|
||||||
unsigned short __pad1;
|
|
||||||
unsigned short seq;
|
|
||||||
unsigned long __unused1;
|
|
||||||
unsigned long __unused2;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _SPARC64_IPCBUF_H */
|
|
|
@ -8,7 +8,7 @@
|
||||||
#define _SPARC_JSFLASH_H
|
#define _SPARC_JSFLASH_H
|
||||||
|
|
||||||
#ifndef _SPARC_TYPES_H
|
#ifndef _SPARC_TYPES_H
|
||||||
#include <asm/types.h>
|
#include <linux/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,8 +1,277 @@
|
||||||
#ifndef ___ASM_SPARC_OPENPROM_H
|
#ifndef __SPARC_OPENPROM_H
|
||||||
#define ___ASM_SPARC_OPENPROM_H
|
#define __SPARC_OPENPROM_H
|
||||||
|
|
||||||
|
/* openprom.h: Prom structures and defines for access to the OPENBOOT
|
||||||
|
* prom routines and data areas.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Empirical constants... */
|
||||||
|
#define LINUX_OPPROM_MAGIC 0x10010407
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
/* V0 prom device operations. */
|
||||||
|
struct linux_dev_v0_funcs {
|
||||||
|
int (*v0_devopen)(char *device_str);
|
||||||
|
int (*v0_devclose)(int dev_desc);
|
||||||
|
int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
||||||
|
int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
||||||
|
int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf);
|
||||||
|
int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf);
|
||||||
|
int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
||||||
|
int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
||||||
|
int (*v0_seekdev)(int dev_desc, long logical_offst, int from);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* V2 and later prom device operations. */
|
||||||
|
struct linux_dev_v2_funcs {
|
||||||
|
int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
|
||||||
|
char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
|
||||||
|
void (*v2_dumb_mem_free)(char *va, unsigned sz);
|
||||||
|
|
||||||
|
/* To map devices into virtual I/O space. */
|
||||||
|
char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz);
|
||||||
|
void (*v2_dumb_munmap)(char *virta, unsigned size);
|
||||||
|
|
||||||
|
int (*v2_dev_open)(char *devpath);
|
||||||
|
void (*v2_dev_close)(int d);
|
||||||
|
int (*v2_dev_read)(int d, char *buf, int nbytes);
|
||||||
|
int (*v2_dev_write)(int d, char *buf, int nbytes);
|
||||||
|
int (*v2_dev_seek)(int d, int hi, int lo);
|
||||||
|
|
||||||
|
/* Never issued (multistage load support) */
|
||||||
|
void (*v2_wheee2)(void);
|
||||||
|
void (*v2_wheee3)(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_mlist_v0 {
|
||||||
|
struct linux_mlist_v0 *theres_more;
|
||||||
|
unsigned int start_adr;
|
||||||
|
unsigned num_bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_mem_v0 {
|
||||||
|
struct linux_mlist_v0 **v0_totphys;
|
||||||
|
struct linux_mlist_v0 **v0_prommap;
|
||||||
|
struct linux_mlist_v0 **v0_available; /* What we can use */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Arguments sent to the kernel from the boot prompt. */
|
||||||
|
struct linux_arguments_v0 {
|
||||||
|
char *argv[8];
|
||||||
|
char args[100];
|
||||||
|
char boot_dev[2];
|
||||||
|
int boot_dev_ctrl;
|
||||||
|
int boot_dev_unit;
|
||||||
|
int dev_partition;
|
||||||
|
char *kernel_file_name;
|
||||||
|
void *aieee1; /* XXX */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* V2 and up boot things. */
|
||||||
|
struct linux_bootargs_v2 {
|
||||||
|
char **bootpath;
|
||||||
|
char **bootargs;
|
||||||
|
int *fd_stdin;
|
||||||
|
int *fd_stdout;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The top level PROM vector. */
|
||||||
|
struct linux_romvec {
|
||||||
|
/* Version numbers. */
|
||||||
|
unsigned int pv_magic_cookie;
|
||||||
|
unsigned int pv_romvers;
|
||||||
|
unsigned int pv_plugin_revision;
|
||||||
|
unsigned int pv_printrev;
|
||||||
|
|
||||||
|
/* Version 0 memory descriptors. */
|
||||||
|
struct linux_mem_v0 pv_v0mem;
|
||||||
|
|
||||||
|
/* Node operations. */
|
||||||
|
struct linux_nodeops *pv_nodeops;
|
||||||
|
|
||||||
|
char **pv_bootstr;
|
||||||
|
struct linux_dev_v0_funcs pv_v0devops;
|
||||||
|
|
||||||
|
char *pv_stdin;
|
||||||
|
char *pv_stdout;
|
||||||
|
#define PROMDEV_KBD 0 /* input from keyboard */
|
||||||
|
#define PROMDEV_SCREEN 0 /* output to screen */
|
||||||
|
#define PROMDEV_TTYA 1 /* in/out to ttya */
|
||||||
|
#define PROMDEV_TTYB 2 /* in/out to ttyb */
|
||||||
|
|
||||||
|
/* Blocking getchar/putchar. NOT REENTRANT! (grr) */
|
||||||
|
int (*pv_getchar)(void);
|
||||||
|
void (*pv_putchar)(int ch);
|
||||||
|
|
||||||
|
/* Non-blocking variants. */
|
||||||
|
int (*pv_nbgetchar)(void);
|
||||||
|
int (*pv_nbputchar)(int ch);
|
||||||
|
|
||||||
|
void (*pv_putstr)(char *str, int len);
|
||||||
|
|
||||||
|
/* Miscellany. */
|
||||||
|
void (*pv_reboot)(char *bootstr);
|
||||||
|
void (*pv_printf)(__const__ char *fmt, ...);
|
||||||
|
void (*pv_abort)(void);
|
||||||
|
__volatile__ int *pv_ticks;
|
||||||
|
void (*pv_halt)(void);
|
||||||
|
void (**pv_synchook)(void);
|
||||||
|
|
||||||
|
/* Evaluate a forth string, not different proto for V0 and V2->up. */
|
||||||
|
union {
|
||||||
|
void (*v0_eval)(int len, char *str);
|
||||||
|
void (*v2_eval)(char *str);
|
||||||
|
} pv_fortheval;
|
||||||
|
|
||||||
|
struct linux_arguments_v0 **pv_v0bootargs;
|
||||||
|
|
||||||
|
/* Get ether address. */
|
||||||
|
unsigned int (*pv_enaddr)(int d, char *enaddr);
|
||||||
|
|
||||||
|
struct linux_bootargs_v2 pv_v2bootargs;
|
||||||
|
struct linux_dev_v2_funcs pv_v2devops;
|
||||||
|
|
||||||
|
int filler[15];
|
||||||
|
|
||||||
|
/* This one is sun4c/sun4 only. */
|
||||||
|
void (*pv_setctxt)(int ctxt, char *va, int pmeg);
|
||||||
|
|
||||||
|
/* Prom version 3 Multiprocessor routines. This stuff is crazy.
|
||||||
|
* No joke. Calling these when there is only one cpu probably
|
||||||
|
* crashes the machine, have to test this. :-)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
|
||||||
|
* 'thiscontext' executing at address 'prog_counter'
|
||||||
|
*/
|
||||||
|
int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr,
|
||||||
|
int thiscontext, char *prog_counter);
|
||||||
|
|
||||||
|
/* v3_cpustop() will cause cpu 'whichcpu' to stop executing
|
||||||
|
* until a resume cpu call is made.
|
||||||
|
*/
|
||||||
|
int (*v3_cpustop)(unsigned int whichcpu);
|
||||||
|
|
||||||
|
/* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
|
||||||
|
* resume cpu call is made.
|
||||||
|
*/
|
||||||
|
int (*v3_cpuidle)(unsigned int whichcpu);
|
||||||
|
|
||||||
|
/* v3_cpuresume() will resume processor 'whichcpu' executing
|
||||||
|
* starting with whatever 'pc' and 'npc' were left at the
|
||||||
|
* last 'idle' or 'stop' call.
|
||||||
|
*/
|
||||||
|
int (*v3_cpuresume)(unsigned int whichcpu);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Routines for traversing the prom device tree. */
|
||||||
|
struct linux_nodeops {
|
||||||
|
int (*no_nextnode)(int node);
|
||||||
|
int (*no_child)(int node);
|
||||||
|
int (*no_proplen)(int node, const char *name);
|
||||||
|
int (*no_getprop)(int node, const char *name, char *val);
|
||||||
|
int (*no_setprop)(int node, const char *name, char *val, int len);
|
||||||
|
char * (*no_nextprop)(int node, char *name);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* More fun PROM structures for device probing. */
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
#include <asm/openprom_64.h>
|
#define PROMREG_MAX 24
|
||||||
|
#define PROMVADDR_MAX 16
|
||||||
|
#define PROMINTR_MAX 32
|
||||||
#else
|
#else
|
||||||
#include <asm/openprom_32.h>
|
#define PROMREG_MAX 16
|
||||||
|
#define PROMVADDR_MAX 16
|
||||||
|
#define PROMINTR_MAX 15
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct linux_prom_registers {
|
||||||
|
unsigned int which_io; /* hi part of physical address */
|
||||||
|
unsigned int phys_addr; /* The physical address of this register */
|
||||||
|
unsigned int reg_size; /* How many bytes does this register take up? */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_prom64_registers {
|
||||||
|
unsigned long phys_addr;
|
||||||
|
unsigned long reg_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_prom_irqs {
|
||||||
|
int pri; /* IRQ priority */
|
||||||
|
int vector; /* This is foobar, what does it do? */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Element of the "ranges" vector */
|
||||||
|
struct linux_prom_ranges {
|
||||||
|
unsigned int ot_child_space;
|
||||||
|
unsigned int ot_child_base; /* Bus feels this */
|
||||||
|
unsigned int ot_parent_space;
|
||||||
|
unsigned int ot_parent_base; /* CPU looks from here */
|
||||||
|
unsigned int or_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ranges and reg properties are a bit different for PCI.
|
||||||
|
*/
|
||||||
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
|
struct linux_prom_pci_registers {
|
||||||
|
unsigned int phys_hi;
|
||||||
|
unsigned int phys_mid;
|
||||||
|
unsigned int phys_lo;
|
||||||
|
|
||||||
|
unsigned int size_hi;
|
||||||
|
unsigned int size_lo;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
struct linux_prom_pci_registers {
|
||||||
|
/*
|
||||||
|
* We don't know what information this field contain.
|
||||||
|
* We guess, PCI device function is in bits 15:8
|
||||||
|
* So, ...
|
||||||
|
*/
|
||||||
|
unsigned int which_io; /* Let it be which_io */
|
||||||
|
|
||||||
|
unsigned int phys_hi;
|
||||||
|
unsigned int phys_lo;
|
||||||
|
|
||||||
|
unsigned int size_hi;
|
||||||
|
unsigned int size_lo;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct linux_prom_pci_ranges {
|
||||||
|
unsigned int child_phys_hi; /* Only certain bits are encoded here. */
|
||||||
|
unsigned int child_phys_mid;
|
||||||
|
unsigned int child_phys_lo;
|
||||||
|
|
||||||
|
unsigned int parent_phys_hi;
|
||||||
|
unsigned int parent_phys_lo;
|
||||||
|
|
||||||
|
unsigned int size_hi;
|
||||||
|
unsigned int size_lo;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_prom_pci_intmap {
|
||||||
|
unsigned int phys_hi;
|
||||||
|
unsigned int phys_mid;
|
||||||
|
unsigned int phys_lo;
|
||||||
|
|
||||||
|
unsigned int interrupt;
|
||||||
|
|
||||||
|
int cnode;
|
||||||
|
unsigned int cinterrupt;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct linux_prom_pci_intmask {
|
||||||
|
unsigned int phys_hi;
|
||||||
|
unsigned int phys_mid;
|
||||||
|
unsigned int phys_lo;
|
||||||
|
unsigned int interrupt;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* !(__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#endif /* !(__SPARC_OPENPROM_H) */
|
||||||
|
|
|
@ -1,255 +0,0 @@
|
||||||
#ifndef __SPARC_OPENPROM_H
|
|
||||||
#define __SPARC_OPENPROM_H
|
|
||||||
|
|
||||||
/* openprom.h: Prom structures and defines for access to the OPENBOOT
|
|
||||||
* prom routines and data areas.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Empirical constants... */
|
|
||||||
#define LINUX_OPPROM_MAGIC 0x10010407
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
/* V0 prom device operations. */
|
|
||||||
struct linux_dev_v0_funcs {
|
|
||||||
int (*v0_devopen)(char *device_str);
|
|
||||||
int (*v0_devclose)(int dev_desc);
|
|
||||||
int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
|
||||||
int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
|
||||||
int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf);
|
|
||||||
int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf);
|
|
||||||
int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
|
||||||
int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
|
||||||
int (*v0_seekdev)(int dev_desc, long logical_offst, int from);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* V2 and later prom device operations. */
|
|
||||||
struct linux_dev_v2_funcs {
|
|
||||||
int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
|
|
||||||
char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
|
|
||||||
void (*v2_dumb_mem_free)(char *va, unsigned sz);
|
|
||||||
|
|
||||||
/* To map devices into virtual I/O space. */
|
|
||||||
char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz);
|
|
||||||
void (*v2_dumb_munmap)(char *virta, unsigned size);
|
|
||||||
|
|
||||||
int (*v2_dev_open)(char *devpath);
|
|
||||||
void (*v2_dev_close)(int d);
|
|
||||||
int (*v2_dev_read)(int d, char *buf, int nbytes);
|
|
||||||
int (*v2_dev_write)(int d, char *buf, int nbytes);
|
|
||||||
int (*v2_dev_seek)(int d, int hi, int lo);
|
|
||||||
|
|
||||||
/* Never issued (multistage load support) */
|
|
||||||
void (*v2_wheee2)(void);
|
|
||||||
void (*v2_wheee3)(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_mlist_v0 {
|
|
||||||
struct linux_mlist_v0 *theres_more;
|
|
||||||
char *start_adr;
|
|
||||||
unsigned num_bytes;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_mem_v0 {
|
|
||||||
struct linux_mlist_v0 **v0_totphys;
|
|
||||||
struct linux_mlist_v0 **v0_prommap;
|
|
||||||
struct linux_mlist_v0 **v0_available; /* What we can use */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Arguments sent to the kernel from the boot prompt. */
|
|
||||||
struct linux_arguments_v0 {
|
|
||||||
char *argv[8];
|
|
||||||
char args[100];
|
|
||||||
char boot_dev[2];
|
|
||||||
int boot_dev_ctrl;
|
|
||||||
int boot_dev_unit;
|
|
||||||
int dev_partition;
|
|
||||||
char *kernel_file_name;
|
|
||||||
void *aieee1; /* XXX */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* V2 and up boot things. */
|
|
||||||
struct linux_bootargs_v2 {
|
|
||||||
char **bootpath;
|
|
||||||
char **bootargs;
|
|
||||||
int *fd_stdin;
|
|
||||||
int *fd_stdout;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The top level PROM vector. */
|
|
||||||
struct linux_romvec {
|
|
||||||
/* Version numbers. */
|
|
||||||
unsigned int pv_magic_cookie;
|
|
||||||
unsigned int pv_romvers;
|
|
||||||
unsigned int pv_plugin_revision;
|
|
||||||
unsigned int pv_printrev;
|
|
||||||
|
|
||||||
/* Version 0 memory descriptors. */
|
|
||||||
struct linux_mem_v0 pv_v0mem;
|
|
||||||
|
|
||||||
/* Node operations. */
|
|
||||||
struct linux_nodeops *pv_nodeops;
|
|
||||||
|
|
||||||
char **pv_bootstr;
|
|
||||||
struct linux_dev_v0_funcs pv_v0devops;
|
|
||||||
|
|
||||||
char *pv_stdin;
|
|
||||||
char *pv_stdout;
|
|
||||||
#define PROMDEV_KBD 0 /* input from keyboard */
|
|
||||||
#define PROMDEV_SCREEN 0 /* output to screen */
|
|
||||||
#define PROMDEV_TTYA 1 /* in/out to ttya */
|
|
||||||
#define PROMDEV_TTYB 2 /* in/out to ttyb */
|
|
||||||
|
|
||||||
/* Blocking getchar/putchar. NOT REENTRANT! (grr) */
|
|
||||||
int (*pv_getchar)(void);
|
|
||||||
void (*pv_putchar)(int ch);
|
|
||||||
|
|
||||||
/* Non-blocking variants. */
|
|
||||||
int (*pv_nbgetchar)(void);
|
|
||||||
int (*pv_nbputchar)(int ch);
|
|
||||||
|
|
||||||
void (*pv_putstr)(char *str, int len);
|
|
||||||
|
|
||||||
/* Miscellany. */
|
|
||||||
void (*pv_reboot)(char *bootstr);
|
|
||||||
void (*pv_printf)(__const__ char *fmt, ...);
|
|
||||||
void (*pv_abort)(void);
|
|
||||||
__volatile__ int *pv_ticks;
|
|
||||||
void (*pv_halt)(void);
|
|
||||||
void (**pv_synchook)(void);
|
|
||||||
|
|
||||||
/* Evaluate a forth string, not different proto for V0 and V2->up. */
|
|
||||||
union {
|
|
||||||
void (*v0_eval)(int len, char *str);
|
|
||||||
void (*v2_eval)(char *str);
|
|
||||||
} pv_fortheval;
|
|
||||||
|
|
||||||
struct linux_arguments_v0 **pv_v0bootargs;
|
|
||||||
|
|
||||||
/* Get ether address. */
|
|
||||||
unsigned int (*pv_enaddr)(int d, char *enaddr);
|
|
||||||
|
|
||||||
struct linux_bootargs_v2 pv_v2bootargs;
|
|
||||||
struct linux_dev_v2_funcs pv_v2devops;
|
|
||||||
|
|
||||||
int filler[15];
|
|
||||||
|
|
||||||
/* This one is sun4c/sun4 only. */
|
|
||||||
void (*pv_setctxt)(int ctxt, char *va, int pmeg);
|
|
||||||
|
|
||||||
/* Prom version 3 Multiprocessor routines. This stuff is crazy.
|
|
||||||
* No joke. Calling these when there is only one cpu probably
|
|
||||||
* crashes the machine, have to test this. :-)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
|
|
||||||
* 'thiscontext' executing at address 'prog_counter'
|
|
||||||
*/
|
|
||||||
int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr,
|
|
||||||
int thiscontext, char *prog_counter);
|
|
||||||
|
|
||||||
/* v3_cpustop() will cause cpu 'whichcpu' to stop executing
|
|
||||||
* until a resume cpu call is made.
|
|
||||||
*/
|
|
||||||
int (*v3_cpustop)(unsigned int whichcpu);
|
|
||||||
|
|
||||||
/* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
|
|
||||||
* resume cpu call is made.
|
|
||||||
*/
|
|
||||||
int (*v3_cpuidle)(unsigned int whichcpu);
|
|
||||||
|
|
||||||
/* v3_cpuresume() will resume processor 'whichcpu' executing
|
|
||||||
* starting with whatever 'pc' and 'npc' were left at the
|
|
||||||
* last 'idle' or 'stop' call.
|
|
||||||
*/
|
|
||||||
int (*v3_cpuresume)(unsigned int whichcpu);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Routines for traversing the prom device tree. */
|
|
||||||
struct linux_nodeops {
|
|
||||||
int (*no_nextnode)(int node);
|
|
||||||
int (*no_child)(int node);
|
|
||||||
int (*no_proplen)(int node, const char *name);
|
|
||||||
int (*no_getprop)(int node, const char *name, char *val);
|
|
||||||
int (*no_setprop)(int node, const char *name, char *val, int len);
|
|
||||||
char * (*no_nextprop)(int node, char *name);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* More fun PROM structures for device probing. */
|
|
||||||
#define PROMREG_MAX 16
|
|
||||||
#define PROMVADDR_MAX 16
|
|
||||||
#define PROMINTR_MAX 15
|
|
||||||
|
|
||||||
struct linux_prom_registers {
|
|
||||||
unsigned int which_io; /* is this in OBIO space? */
|
|
||||||
unsigned int phys_addr; /* The physical address of this register */
|
|
||||||
unsigned int reg_size; /* How many bytes does this register take up? */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_irqs {
|
|
||||||
int pri; /* IRQ priority */
|
|
||||||
int vector; /* This is foobar, what does it do? */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Element of the "ranges" vector */
|
|
||||||
struct linux_prom_ranges {
|
|
||||||
unsigned int ot_child_space;
|
|
||||||
unsigned int ot_child_base; /* Bus feels this */
|
|
||||||
unsigned int ot_parent_space;
|
|
||||||
unsigned int ot_parent_base; /* CPU looks from here */
|
|
||||||
unsigned int or_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Ranges and reg properties are a bit different for PCI. */
|
|
||||||
struct linux_prom_pci_registers {
|
|
||||||
/*
|
|
||||||
* We don't know what information this field contain.
|
|
||||||
* We guess, PCI device function is in bits 15:8
|
|
||||||
* So, ...
|
|
||||||
*/
|
|
||||||
unsigned int which_io; /* Let it be which_io */
|
|
||||||
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
|
|
||||||
unsigned int size_hi;
|
|
||||||
unsigned int size_lo;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_pci_ranges {
|
|
||||||
unsigned int child_phys_hi; /* Only certain bits are encoded here. */
|
|
||||||
unsigned int child_phys_mid;
|
|
||||||
unsigned int child_phys_lo;
|
|
||||||
|
|
||||||
unsigned int parent_phys_hi;
|
|
||||||
unsigned int parent_phys_lo;
|
|
||||||
|
|
||||||
unsigned int size_hi;
|
|
||||||
unsigned int size_lo;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_pci_assigned_addresses {
|
|
||||||
unsigned int which_io;
|
|
||||||
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
|
|
||||||
unsigned int size_hi;
|
|
||||||
unsigned int size_lo;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_ebus_ranges {
|
|
||||||
unsigned int child_phys_hi;
|
|
||||||
unsigned int child_phys_lo;
|
|
||||||
|
|
||||||
unsigned int parent_phys_hi;
|
|
||||||
unsigned int parent_phys_mid;
|
|
||||||
unsigned int parent_phys_lo;
|
|
||||||
|
|
||||||
unsigned int size;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* !(__ASSEMBLY__) */
|
|
||||||
|
|
||||||
#endif /* !(__SPARC_OPENPROM_H) */
|
|
|
@ -1,280 +0,0 @@
|
||||||
#ifndef __SPARC64_OPENPROM_H
|
|
||||||
#define __SPARC64_OPENPROM_H
|
|
||||||
|
|
||||||
/* openprom.h: Prom structures and defines for access to the OPENBOOT
|
|
||||||
* prom routines and data areas.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
/* V0 prom device operations. */
|
|
||||||
struct linux_dev_v0_funcs {
|
|
||||||
int (*v0_devopen)(char *device_str);
|
|
||||||
int (*v0_devclose)(int dev_desc);
|
|
||||||
int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
|
||||||
int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
|
|
||||||
int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf);
|
|
||||||
int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf);
|
|
||||||
int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
|
||||||
int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
|
|
||||||
int (*v0_seekdev)(int dev_desc, long logical_offst, int from);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* V2 and later prom device operations. */
|
|
||||||
struct linux_dev_v2_funcs {
|
|
||||||
int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
|
|
||||||
char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
|
|
||||||
void (*v2_dumb_mem_free)(char *va, unsigned sz);
|
|
||||||
|
|
||||||
/* To map devices into virtual I/O space. */
|
|
||||||
char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz);
|
|
||||||
void (*v2_dumb_munmap)(char *virta, unsigned size);
|
|
||||||
|
|
||||||
int (*v2_dev_open)(char *devpath);
|
|
||||||
void (*v2_dev_close)(int d);
|
|
||||||
int (*v2_dev_read)(int d, char *buf, int nbytes);
|
|
||||||
int (*v2_dev_write)(int d, char *buf, int nbytes);
|
|
||||||
int (*v2_dev_seek)(int d, int hi, int lo);
|
|
||||||
|
|
||||||
/* Never issued (multistage load support) */
|
|
||||||
void (*v2_wheee2)(void);
|
|
||||||
void (*v2_wheee3)(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_mlist_v0 {
|
|
||||||
struct linux_mlist_v0 *theres_more;
|
|
||||||
unsigned start_adr;
|
|
||||||
unsigned num_bytes;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_mem_v0 {
|
|
||||||
struct linux_mlist_v0 **v0_totphys;
|
|
||||||
struct linux_mlist_v0 **v0_prommap;
|
|
||||||
struct linux_mlist_v0 **v0_available; /* What we can use */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Arguments sent to the kernel from the boot prompt. */
|
|
||||||
struct linux_arguments_v0 {
|
|
||||||
char *argv[8];
|
|
||||||
char args[100];
|
|
||||||
char boot_dev[2];
|
|
||||||
int boot_dev_ctrl;
|
|
||||||
int boot_dev_unit;
|
|
||||||
int dev_partition;
|
|
||||||
char *kernel_file_name;
|
|
||||||
void *aieee1; /* XXX */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* V2 and up boot things. */
|
|
||||||
struct linux_bootargs_v2 {
|
|
||||||
char **bootpath;
|
|
||||||
char **bootargs;
|
|
||||||
int *fd_stdin;
|
|
||||||
int *fd_stdout;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The top level PROM vector. */
|
|
||||||
struct linux_romvec {
|
|
||||||
/* Version numbers. */
|
|
||||||
unsigned int pv_magic_cookie;
|
|
||||||
unsigned int pv_romvers;
|
|
||||||
unsigned int pv_plugin_revision;
|
|
||||||
unsigned int pv_printrev;
|
|
||||||
|
|
||||||
/* Version 0 memory descriptors. */
|
|
||||||
struct linux_mem_v0 pv_v0mem;
|
|
||||||
|
|
||||||
/* Node operations. */
|
|
||||||
struct linux_nodeops *pv_nodeops;
|
|
||||||
|
|
||||||
char **pv_bootstr;
|
|
||||||
struct linux_dev_v0_funcs pv_v0devops;
|
|
||||||
|
|
||||||
char *pv_stdin;
|
|
||||||
char *pv_stdout;
|
|
||||||
#define PROMDEV_KBD 0 /* input from keyboard */
|
|
||||||
#define PROMDEV_SCREEN 0 /* output to screen */
|
|
||||||
#define PROMDEV_TTYA 1 /* in/out to ttya */
|
|
||||||
#define PROMDEV_TTYB 2 /* in/out to ttyb */
|
|
||||||
|
|
||||||
/* Blocking getchar/putchar. NOT REENTRANT! (grr) */
|
|
||||||
int (*pv_getchar)(void);
|
|
||||||
void (*pv_putchar)(int ch);
|
|
||||||
|
|
||||||
/* Non-blocking variants. */
|
|
||||||
int (*pv_nbgetchar)(void);
|
|
||||||
int (*pv_nbputchar)(int ch);
|
|
||||||
|
|
||||||
void (*pv_putstr)(char *str, int len);
|
|
||||||
|
|
||||||
/* Miscellany. */
|
|
||||||
void (*pv_reboot)(char *bootstr);
|
|
||||||
void (*pv_printf)(__const__ char *fmt, ...);
|
|
||||||
void (*pv_abort)(void);
|
|
||||||
__volatile__ int *pv_ticks;
|
|
||||||
void (*pv_halt)(void);
|
|
||||||
void (**pv_synchook)(void);
|
|
||||||
|
|
||||||
/* Evaluate a forth string, not different proto for V0 and V2->up. */
|
|
||||||
union {
|
|
||||||
void (*v0_eval)(int len, char *str);
|
|
||||||
void (*v2_eval)(char *str);
|
|
||||||
} pv_fortheval;
|
|
||||||
|
|
||||||
struct linux_arguments_v0 **pv_v0bootargs;
|
|
||||||
|
|
||||||
/* Get ether address. */
|
|
||||||
unsigned int (*pv_enaddr)(int d, char *enaddr);
|
|
||||||
|
|
||||||
struct linux_bootargs_v2 pv_v2bootargs;
|
|
||||||
struct linux_dev_v2_funcs pv_v2devops;
|
|
||||||
|
|
||||||
int filler[15];
|
|
||||||
|
|
||||||
/* This one is sun4c/sun4 only. */
|
|
||||||
void (*pv_setctxt)(int ctxt, char *va, int pmeg);
|
|
||||||
|
|
||||||
/* Prom version 3 Multiprocessor routines. This stuff is crazy.
|
|
||||||
* No joke. Calling these when there is only one cpu probably
|
|
||||||
* crashes the machine, have to test this. :-)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
|
|
||||||
* 'thiscontext' executing at address 'prog_counter'
|
|
||||||
*/
|
|
||||||
int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr,
|
|
||||||
int thiscontext, char *prog_counter);
|
|
||||||
|
|
||||||
/* v3_cpustop() will cause cpu 'whichcpu' to stop executing
|
|
||||||
* until a resume cpu call is made.
|
|
||||||
*/
|
|
||||||
int (*v3_cpustop)(unsigned int whichcpu);
|
|
||||||
|
|
||||||
/* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
|
|
||||||
* resume cpu call is made.
|
|
||||||
*/
|
|
||||||
int (*v3_cpuidle)(unsigned int whichcpu);
|
|
||||||
|
|
||||||
/* v3_cpuresume() will resume processor 'whichcpu' executing
|
|
||||||
* starting with whatever 'pc' and 'npc' were left at the
|
|
||||||
* last 'idle' or 'stop' call.
|
|
||||||
*/
|
|
||||||
int (*v3_cpuresume)(unsigned int whichcpu);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Routines for traversing the prom device tree. */
|
|
||||||
struct linux_nodeops {
|
|
||||||
int (*no_nextnode)(int node);
|
|
||||||
int (*no_child)(int node);
|
|
||||||
int (*no_proplen)(int node, char *name);
|
|
||||||
int (*no_getprop)(int node, char *name, char *val);
|
|
||||||
int (*no_setprop)(int node, char *name, char *val, int len);
|
|
||||||
char * (*no_nextprop)(int node, char *name);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* More fun PROM structures for device probing. */
|
|
||||||
#define PROMREG_MAX 24
|
|
||||||
#define PROMVADDR_MAX 16
|
|
||||||
#define PROMINTR_MAX 32
|
|
||||||
|
|
||||||
struct linux_prom_registers {
|
|
||||||
unsigned which_io; /* hi part of physical address */
|
|
||||||
unsigned phys_addr; /* The physical address of this register */
|
|
||||||
int reg_size; /* How many bytes does this register take up? */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom64_registers {
|
|
||||||
unsigned long phys_addr;
|
|
||||||
unsigned long reg_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_irqs {
|
|
||||||
int pri; /* IRQ priority */
|
|
||||||
int vector; /* This is foobar, what does it do? */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Element of the "ranges" vector */
|
|
||||||
struct linux_prom_ranges {
|
|
||||||
unsigned int ot_child_space;
|
|
||||||
unsigned int ot_child_base; /* Bus feels this */
|
|
||||||
unsigned int ot_parent_space;
|
|
||||||
unsigned int ot_parent_base; /* CPU looks from here */
|
|
||||||
unsigned int or_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom64_ranges {
|
|
||||||
unsigned long ot_child_base; /* Bus feels this */
|
|
||||||
unsigned long ot_parent_base; /* CPU looks from here */
|
|
||||||
unsigned long or_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Ranges and reg properties are a bit different for PCI. */
|
|
||||||
struct linux_prom_pci_registers {
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_mid;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
|
|
||||||
unsigned int size_hi;
|
|
||||||
unsigned int size_lo;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_pci_ranges {
|
|
||||||
unsigned int child_phys_hi; /* Only certain bits are encoded here. */
|
|
||||||
unsigned int child_phys_mid;
|
|
||||||
unsigned int child_phys_lo;
|
|
||||||
|
|
||||||
unsigned int parent_phys_hi;
|
|
||||||
unsigned int parent_phys_lo;
|
|
||||||
|
|
||||||
unsigned int size_hi;
|
|
||||||
unsigned int size_lo;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_pci_intmap {
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_mid;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
|
|
||||||
unsigned int interrupt;
|
|
||||||
|
|
||||||
int cnode;
|
|
||||||
unsigned int cinterrupt;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_pci_intmask {
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_mid;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
unsigned int interrupt;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_ebus_ranges {
|
|
||||||
unsigned int child_phys_hi;
|
|
||||||
unsigned int child_phys_lo;
|
|
||||||
|
|
||||||
unsigned int parent_phys_hi;
|
|
||||||
unsigned int parent_phys_mid;
|
|
||||||
unsigned int parent_phys_lo;
|
|
||||||
|
|
||||||
unsigned int size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_ebus_intmap {
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
|
|
||||||
unsigned int interrupt;
|
|
||||||
|
|
||||||
int cnode;
|
|
||||||
unsigned int cinterrupt;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct linux_prom_ebus_intmask {
|
|
||||||
unsigned int phys_hi;
|
|
||||||
unsigned int phys_lo;
|
|
||||||
unsigned int interrupt;
|
|
||||||
};
|
|
||||||
#endif /* !(__ASSEMBLY__) */
|
|
||||||
|
|
||||||
#endif /* !(__SPARC64_OPENPROM_H) */
|
|
|
@ -1,8 +1,155 @@
|
||||||
#ifndef ___ASM_SPARC_POSIX_TYPES_H
|
/*
|
||||||
#define ___ASM_SPARC_POSIX_TYPES_H
|
* This file is generally used by user-level software, so you need to
|
||||||
|
* be a little careful about namespace pollution etc. Also, we cannot
|
||||||
|
* assume GCC is being used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPARC_POSIX_TYPES_H
|
||||||
|
#define __SPARC_POSIX_TYPES_H
|
||||||
|
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
#include <asm/posix_types_64.h>
|
/* sparc 64 bit */
|
||||||
|
typedef unsigned long __kernel_size_t;
|
||||||
|
typedef long __kernel_ssize_t;
|
||||||
|
typedef long __kernel_ptrdiff_t;
|
||||||
|
typedef long __kernel_time_t;
|
||||||
|
typedef long __kernel_clock_t;
|
||||||
|
typedef int __kernel_pid_t;
|
||||||
|
typedef int __kernel_ipc_pid_t;
|
||||||
|
typedef unsigned int __kernel_uid_t;
|
||||||
|
typedef unsigned int __kernel_gid_t;
|
||||||
|
typedef unsigned long __kernel_ino_t;
|
||||||
|
typedef unsigned int __kernel_mode_t;
|
||||||
|
typedef unsigned short __kernel_umode_t;
|
||||||
|
typedef unsigned int __kernel_nlink_t;
|
||||||
|
typedef int __kernel_daddr_t;
|
||||||
|
typedef long __kernel_off_t;
|
||||||
|
typedef char * __kernel_caddr_t;
|
||||||
|
typedef unsigned short __kernel_uid16_t;
|
||||||
|
typedef unsigned short __kernel_gid16_t;
|
||||||
|
typedef int __kernel_clockid_t;
|
||||||
|
typedef int __kernel_timer_t;
|
||||||
|
|
||||||
|
typedef unsigned short __kernel_old_uid_t;
|
||||||
|
typedef unsigned short __kernel_old_gid_t;
|
||||||
|
typedef __kernel_uid_t __kernel_uid32_t;
|
||||||
|
typedef __kernel_gid_t __kernel_gid32_t;
|
||||||
|
|
||||||
|
typedef unsigned int __kernel_old_dev_t;
|
||||||
|
|
||||||
|
/* Note this piece of asymmetry from the v9 ABI. */
|
||||||
|
typedef int __kernel_suseconds_t;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include <asm/posix_types_32.h>
|
/* sparc 32 bit */
|
||||||
#endif
|
|
||||||
|
typedef unsigned int __kernel_size_t;
|
||||||
|
typedef int __kernel_ssize_t;
|
||||||
|
typedef long int __kernel_ptrdiff_t;
|
||||||
|
typedef long __kernel_time_t;
|
||||||
|
typedef long __kernel_suseconds_t;
|
||||||
|
typedef long __kernel_clock_t;
|
||||||
|
typedef int __kernel_pid_t;
|
||||||
|
typedef unsigned short __kernel_ipc_pid_t;
|
||||||
|
typedef unsigned short __kernel_uid_t;
|
||||||
|
typedef unsigned short __kernel_gid_t;
|
||||||
|
typedef unsigned long __kernel_ino_t;
|
||||||
|
typedef unsigned short __kernel_mode_t;
|
||||||
|
typedef unsigned short __kernel_umode_t;
|
||||||
|
typedef short __kernel_nlink_t;
|
||||||
|
typedef long __kernel_daddr_t;
|
||||||
|
typedef long __kernel_off_t;
|
||||||
|
typedef char * __kernel_caddr_t;
|
||||||
|
typedef unsigned short __kernel_uid16_t;
|
||||||
|
typedef unsigned short __kernel_gid16_t;
|
||||||
|
typedef unsigned int __kernel_uid32_t;
|
||||||
|
typedef unsigned int __kernel_gid32_t;
|
||||||
|
typedef unsigned short __kernel_old_uid_t;
|
||||||
|
typedef unsigned short __kernel_old_gid_t;
|
||||||
|
typedef unsigned short __kernel_old_dev_t;
|
||||||
|
typedef int __kernel_clockid_t;
|
||||||
|
typedef int __kernel_timer_t;
|
||||||
|
|
||||||
|
#endif /* defined(__sparc__) && defined(__arch64__) */
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
typedef long long __kernel_loff_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int val[2];
|
||||||
|
} __kernel_fsid_t;
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#undef __FD_SET
|
||||||
|
static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp)
|
||||||
|
{
|
||||||
|
unsigned long _tmp = fd / __NFDBITS;
|
||||||
|
unsigned long _rem = fd % __NFDBITS;
|
||||||
|
fdsetp->fds_bits[_tmp] |= (1UL<<_rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __FD_CLR
|
||||||
|
static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
|
||||||
|
{
|
||||||
|
unsigned long _tmp = fd / __NFDBITS;
|
||||||
|
unsigned long _rem = fd % __NFDBITS;
|
||||||
|
fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __FD_ISSET
|
||||||
|
static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p)
|
||||||
|
{
|
||||||
|
unsigned long _tmp = fd / __NFDBITS;
|
||||||
|
unsigned long _rem = fd % __NFDBITS;
|
||||||
|
return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This will unroll the loop for the normal constant cases (8 or 32 longs,
|
||||||
|
* for 256 and 1024-bit fd_sets respectively)
|
||||||
|
*/
|
||||||
|
#undef __FD_ZERO
|
||||||
|
static inline void __FD_ZERO(__kernel_fd_set *p)
|
||||||
|
{
|
||||||
|
unsigned long *tmp = p->fds_bits;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (__builtin_constant_p(__FDSET_LONGS)) {
|
||||||
|
switch (__FDSET_LONGS) {
|
||||||
|
case 32:
|
||||||
|
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
||||||
|
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
||||||
|
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
||||||
|
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
||||||
|
tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0;
|
||||||
|
tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0;
|
||||||
|
tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0;
|
||||||
|
tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0;
|
||||||
|
return;
|
||||||
|
case 16:
|
||||||
|
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
||||||
|
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
||||||
|
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
||||||
|
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
||||||
|
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
||||||
|
return;
|
||||||
|
case 4:
|
||||||
|
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = __FDSET_LONGS;
|
||||||
|
while (i) {
|
||||||
|
i--;
|
||||||
|
*tmp = 0;
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
#endif /* __SPARC_POSIX_TYPES_H */
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
#ifndef __ARCH_SPARC_POSIX_TYPES_H
|
|
||||||
#define __ARCH_SPARC_POSIX_TYPES_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is generally used by user-level software, so you need to
|
|
||||||
* be a little careful about namespace pollution etc. Also, we cannot
|
|
||||||
* assume GCC is being used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef unsigned int __kernel_size_t;
|
|
||||||
typedef int __kernel_ssize_t;
|
|
||||||
typedef long int __kernel_ptrdiff_t;
|
|
||||||
typedef long __kernel_time_t;
|
|
||||||
typedef long __kernel_suseconds_t;
|
|
||||||
typedef long __kernel_clock_t;
|
|
||||||
typedef int __kernel_pid_t;
|
|
||||||
typedef unsigned short __kernel_ipc_pid_t;
|
|
||||||
typedef unsigned short __kernel_uid_t;
|
|
||||||
typedef unsigned short __kernel_gid_t;
|
|
||||||
typedef unsigned long __kernel_ino_t;
|
|
||||||
typedef unsigned short __kernel_mode_t;
|
|
||||||
typedef unsigned short __kernel_umode_t;
|
|
||||||
typedef short __kernel_nlink_t;
|
|
||||||
typedef long __kernel_daddr_t;
|
|
||||||
typedef long __kernel_off_t;
|
|
||||||
typedef char * __kernel_caddr_t;
|
|
||||||
typedef unsigned short __kernel_uid16_t;
|
|
||||||
typedef unsigned short __kernel_gid16_t;
|
|
||||||
typedef unsigned int __kernel_uid32_t;
|
|
||||||
typedef unsigned int __kernel_gid32_t;
|
|
||||||
typedef unsigned short __kernel_old_uid_t;
|
|
||||||
typedef unsigned short __kernel_old_gid_t;
|
|
||||||
typedef unsigned short __kernel_old_dev_t;
|
|
||||||
typedef int __kernel_clockid_t;
|
|
||||||
typedef int __kernel_timer_t;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
typedef long long __kernel_loff_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int val[2];
|
|
||||||
} __kernel_fsid_t;
|
|
||||||
|
|
||||||
#if defined(__KERNEL__)
|
|
||||||
|
|
||||||
#undef __FD_SET
|
|
||||||
static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
fdsetp->fds_bits[_tmp] |= (1UL<<_rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef __FD_CLR
|
|
||||||
static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef __FD_ISSET
|
|
||||||
static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This will unroll the loop for the normal constant cases (8 or 32 longs,
|
|
||||||
* for 256 and 1024-bit fd_sets respectively)
|
|
||||||
*/
|
|
||||||
#undef __FD_ZERO
|
|
||||||
static inline void __FD_ZERO(__kernel_fd_set *p)
|
|
||||||
{
|
|
||||||
unsigned long *tmp = p->fds_bits;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (__builtin_constant_p(__FDSET_LONGS)) {
|
|
||||||
switch (__FDSET_LONGS) {
|
|
||||||
case 32:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
|
||||||
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
|
||||||
tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0;
|
|
||||||
tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0;
|
|
||||||
tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0;
|
|
||||||
tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0;
|
|
||||||
return;
|
|
||||||
case 16:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
|
||||||
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
|
||||||
return;
|
|
||||||
case 8:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
return;
|
|
||||||
case 4:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = __FDSET_LONGS;
|
|
||||||
while (i) {
|
|
||||||
i--;
|
|
||||||
*tmp = 0;
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* defined(__KERNEL__) */
|
|
||||||
|
|
||||||
#endif /* !(__ARCH_SPARC_POSIX_TYPES_H) */
|
|
|
@ -1,122 +0,0 @@
|
||||||
#ifndef __ARCH_SPARC64_POSIX_TYPES_H
|
|
||||||
#define __ARCH_SPARC64_POSIX_TYPES_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is generally used by user-level software, so you need to
|
|
||||||
* be a little careful about namespace pollution etc. Also, we cannot
|
|
||||||
* assume GCC is being used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef unsigned long __kernel_size_t;
|
|
||||||
typedef long __kernel_ssize_t;
|
|
||||||
typedef long __kernel_ptrdiff_t;
|
|
||||||
typedef long __kernel_time_t;
|
|
||||||
typedef long __kernel_clock_t;
|
|
||||||
typedef int __kernel_pid_t;
|
|
||||||
typedef int __kernel_ipc_pid_t;
|
|
||||||
typedef unsigned int __kernel_uid_t;
|
|
||||||
typedef unsigned int __kernel_gid_t;
|
|
||||||
typedef unsigned long __kernel_ino_t;
|
|
||||||
typedef unsigned int __kernel_mode_t;
|
|
||||||
typedef unsigned short __kernel_umode_t;
|
|
||||||
typedef unsigned int __kernel_nlink_t;
|
|
||||||
typedef int __kernel_daddr_t;
|
|
||||||
typedef long __kernel_off_t;
|
|
||||||
typedef char * __kernel_caddr_t;
|
|
||||||
typedef unsigned short __kernel_uid16_t;
|
|
||||||
typedef unsigned short __kernel_gid16_t;
|
|
||||||
typedef int __kernel_clockid_t;
|
|
||||||
typedef int __kernel_timer_t;
|
|
||||||
|
|
||||||
typedef unsigned short __kernel_old_uid_t;
|
|
||||||
typedef unsigned short __kernel_old_gid_t;
|
|
||||||
typedef __kernel_uid_t __kernel_uid32_t;
|
|
||||||
typedef __kernel_gid_t __kernel_gid32_t;
|
|
||||||
|
|
||||||
typedef unsigned int __kernel_old_dev_t;
|
|
||||||
|
|
||||||
/* Note this piece of asymmetry from the v9 ABI. */
|
|
||||||
typedef int __kernel_suseconds_t;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
typedef long long __kernel_loff_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int val[2];
|
|
||||||
} __kernel_fsid_t;
|
|
||||||
|
|
||||||
#if defined(__KERNEL__)
|
|
||||||
|
|
||||||
#undef __FD_SET
|
|
||||||
static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
fdsetp->fds_bits[_tmp] |= (1UL<<_rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef __FD_CLR
|
|
||||||
static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef __FD_ISSET
|
|
||||||
static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p)
|
|
||||||
{
|
|
||||||
unsigned long _tmp = fd / __NFDBITS;
|
|
||||||
unsigned long _rem = fd % __NFDBITS;
|
|
||||||
return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This will unroll the loop for the normal constant cases (8 or 32 longs,
|
|
||||||
* for 256 and 1024-bit fd_sets respectively)
|
|
||||||
*/
|
|
||||||
#undef __FD_ZERO
|
|
||||||
static inline void __FD_ZERO(__kernel_fd_set *p)
|
|
||||||
{
|
|
||||||
unsigned long *tmp = p->fds_bits;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (__builtin_constant_p(__FDSET_LONGS)) {
|
|
||||||
switch (__FDSET_LONGS) {
|
|
||||||
case 32:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
|
||||||
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
|
||||||
tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0;
|
|
||||||
tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0;
|
|
||||||
tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0;
|
|
||||||
tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0;
|
|
||||||
return;
|
|
||||||
case 16:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
|
|
||||||
tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
|
|
||||||
return;
|
|
||||||
case 8:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
|
|
||||||
return;
|
|
||||||
case 4:
|
|
||||||
tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = __FDSET_LONGS;
|
|
||||||
while (i) {
|
|
||||||
i--;
|
|
||||||
*tmp = 0;
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* defined(__KERNEL__) */
|
|
||||||
|
|
||||||
#endif /* !(__ARCH_SPARC64_POSIX_TYPES_H) */
|
|
|
@ -99,7 +99,7 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
|
||||||
"st\t%%g0, [%0 + %3 + 0x3c]"
|
"st\t%%g0, [%0 + %3 + 0x3c]"
|
||||||
: /* no outputs */
|
: /* no outputs */
|
||||||
: "r" (regs),
|
: "r" (regs),
|
||||||
"r" (sp - sizeof(struct reg_window)),
|
"r" (sp - sizeof(struct reg_window32)),
|
||||||
"r" (zero),
|
"r" (zero),
|
||||||
"i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))
|
"i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
|
@ -1,8 +1,448 @@
|
||||||
#ifndef ___ASM_SPARC_PTRACE_H
|
#ifndef __SPARC_PTRACE_H
|
||||||
#define ___ASM_SPARC_PTRACE_H
|
#define __SPARC_PTRACE_H
|
||||||
|
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
#include <asm/ptrace_64.h>
|
/* 64 bit sparc */
|
||||||
|
#include <asm/pstate.h>
|
||||||
|
|
||||||
|
/* This struct defines the way the registers are stored on the
|
||||||
|
* stack during a system call and basically all traps.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This magic value must have the low 9 bits clear,
|
||||||
|
* as that is where we encode the %tt value, see below.
|
||||||
|
*/
|
||||||
|
#define PT_REGS_MAGIC 0x57ac6c00
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
struct pt_regs {
|
||||||
|
unsigned long u_regs[16]; /* globals and ins */
|
||||||
|
unsigned long tstate;
|
||||||
|
unsigned long tpc;
|
||||||
|
unsigned long tnpc;
|
||||||
|
unsigned int y;
|
||||||
|
|
||||||
|
/* We encode a magic number, PT_REGS_MAGIC, along
|
||||||
|
* with the %tt (trap type) register value at trap
|
||||||
|
* entry time. The magic number allows us to identify
|
||||||
|
* accurately a trap stack frame in the stack
|
||||||
|
* unwinder, and the %tt value allows us to test
|
||||||
|
* things like "in a system call" etc. for an arbitray
|
||||||
|
* process.
|
||||||
|
*
|
||||||
|
* The PT_REGS_MAGIC is choosen such that it can be
|
||||||
|
* loaded completely using just a sethi instruction.
|
||||||
|
*/
|
||||||
|
unsigned int magic;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pt_regs32 {
|
||||||
|
unsigned int psr;
|
||||||
|
unsigned int pc;
|
||||||
|
unsigned int npc;
|
||||||
|
unsigned int y;
|
||||||
|
unsigned int u_regs[16]; /* globals and ins */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A V9 register window */
|
||||||
|
struct reg_window {
|
||||||
|
unsigned long locals[8];
|
||||||
|
unsigned long ins[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A 32-bit register window. */
|
||||||
|
struct reg_window32 {
|
||||||
|
unsigned int locals[8];
|
||||||
|
unsigned int ins[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A V9 Sparc stack frame */
|
||||||
|
struct sparc_stackf {
|
||||||
|
unsigned long locals[8];
|
||||||
|
unsigned long ins[6];
|
||||||
|
struct sparc_stackf *fp;
|
||||||
|
unsigned long callers_pc;
|
||||||
|
char *structptr;
|
||||||
|
unsigned long xargs[6];
|
||||||
|
unsigned long xxargs[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A 32-bit Sparc stack frame */
|
||||||
|
struct sparc_stackf32 {
|
||||||
|
unsigned int locals[8];
|
||||||
|
unsigned int ins[6];
|
||||||
|
unsigned int fp;
|
||||||
|
unsigned int callers_pc;
|
||||||
|
unsigned int structptr;
|
||||||
|
unsigned int xargs[6];
|
||||||
|
unsigned int xxargs[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sparc_trapf {
|
||||||
|
unsigned long locals[8];
|
||||||
|
unsigned long ins[8];
|
||||||
|
unsigned long _unused;
|
||||||
|
struct pt_regs *regs;
|
||||||
|
};
|
||||||
|
#endif /* (!__ASSEMBLY__) */
|
||||||
#else
|
#else
|
||||||
#include <asm/ptrace_32.h>
|
/* 32 bit sparc */
|
||||||
|
|
||||||
|
#include <asm/psr.h>
|
||||||
|
|
||||||
|
/* This struct defines the way the registers are stored on the
|
||||||
|
* stack during a system call and basically all traps.
|
||||||
|
*/
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
struct pt_regs {
|
||||||
|
unsigned long psr;
|
||||||
|
unsigned long pc;
|
||||||
|
unsigned long npc;
|
||||||
|
unsigned long y;
|
||||||
|
unsigned long u_regs[16]; /* globals and ins */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A 32-bit register window. */
|
||||||
|
struct reg_window32 {
|
||||||
|
unsigned long locals[8];
|
||||||
|
unsigned long ins[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A Sparc stack frame */
|
||||||
|
struct sparc_stackf {
|
||||||
|
unsigned long locals[8];
|
||||||
|
unsigned long ins[6];
|
||||||
|
struct sparc_stackf *fp;
|
||||||
|
unsigned long callers_pc;
|
||||||
|
char *structptr;
|
||||||
|
unsigned long xargs[6];
|
||||||
|
unsigned long xxargs[1];
|
||||||
|
};
|
||||||
|
#endif /* (!__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#endif /* (defined(__sparc__) && defined(__arch64__))*/
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#define TRACEREG_SZ sizeof(struct pt_regs)
|
||||||
|
#define STACKFRAME_SZ sizeof(struct sparc_stackf)
|
||||||
|
|
||||||
|
#define TRACEREG32_SZ sizeof(struct pt_regs32)
|
||||||
|
#define STACKFRAME32_SZ sizeof(struct sparc_stackf32)
|
||||||
|
|
||||||
|
#endif /* (!__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#define UREG_G0 0
|
||||||
|
#define UREG_G1 1
|
||||||
|
#define UREG_G2 2
|
||||||
|
#define UREG_G3 3
|
||||||
|
#define UREG_G4 4
|
||||||
|
#define UREG_G5 5
|
||||||
|
#define UREG_G6 6
|
||||||
|
#define UREG_G7 7
|
||||||
|
#define UREG_I0 8
|
||||||
|
#define UREG_I1 9
|
||||||
|
#define UREG_I2 10
|
||||||
|
#define UREG_I3 11
|
||||||
|
#define UREG_I4 12
|
||||||
|
#define UREG_I5 13
|
||||||
|
#define UREG_I6 14
|
||||||
|
#define UREG_I7 15
|
||||||
|
#define UREG_FP UREG_I6
|
||||||
|
#define UREG_RETPC UREG_I7
|
||||||
|
|
||||||
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
|
/* 64 bit sparc */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#include <linux/threads.h>
|
||||||
|
#include <asm/system.h>
|
||||||
|
|
||||||
|
static inline int pt_regs_trap_type(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return regs->magic & 0x1ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool pt_regs_is_syscall(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return (regs->tstate & TSTATE_SYSCALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return (regs->tstate &= ~TSTATE_SYSCALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define arch_ptrace_stop_needed(exit_code, info) \
|
||||||
|
({ flush_user_windows(); \
|
||||||
|
get_thread_wsaved() != 0; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define arch_ptrace_stop(exit_code, info) \
|
||||||
|
synchronize_user_stack()
|
||||||
|
|
||||||
|
struct global_reg_snapshot {
|
||||||
|
unsigned long tstate;
|
||||||
|
unsigned long tpc;
|
||||||
|
unsigned long tnpc;
|
||||||
|
unsigned long o7;
|
||||||
|
unsigned long i7;
|
||||||
|
unsigned long rpc;
|
||||||
|
struct thread_info *thread;
|
||||||
|
unsigned long pad1;
|
||||||
|
};
|
||||||
|
extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
|
||||||
|
|
||||||
|
#define force_successful_syscall_return() \
|
||||||
|
do { current_thread_info()->syscall_noerror = 1; \
|
||||||
|
} while (0)
|
||||||
|
#define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
|
||||||
|
#define instruction_pointer(regs) ((regs)->tpc)
|
||||||
|
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
|
||||||
|
#define regs_return_value(regs) ((regs)->u_regs[UREG_I0])
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
extern unsigned long profile_pc(struct pt_regs *);
|
||||||
|
#else
|
||||||
|
#define profile_pc(regs) instruction_pointer(regs)
|
||||||
#endif
|
#endif
|
||||||
|
extern void show_regs(struct pt_regs *);
|
||||||
|
#endif /* (__KERNEL__) */
|
||||||
|
|
||||||
|
#else /* __ASSEMBLY__ */
|
||||||
|
/* For assembly code. */
|
||||||
|
#define TRACEREG_SZ 0xa0
|
||||||
|
#define STACKFRAME_SZ 0xc0
|
||||||
|
|
||||||
|
#define TRACEREG32_SZ 0x50
|
||||||
|
#define STACKFRAME32_SZ 0x60
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
#else /* (defined(__sparc__) && defined(__arch64__)) */
|
||||||
|
|
||||||
|
/* 32 bit sparc */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#include <asm/system.h>
|
||||||
|
|
||||||
|
static inline bool pt_regs_is_syscall(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return (regs->psr & PSR_SYSCALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
return (regs->psr &= ~PSR_SYSCALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define arch_ptrace_stop_needed(exit_code, info) \
|
||||||
|
({ flush_user_windows(); \
|
||||||
|
current_thread_info()->w_saved != 0; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define arch_ptrace_stop(exit_code, info) \
|
||||||
|
synchronize_user_stack()
|
||||||
|
|
||||||
|
#define user_mode(regs) (!((regs)->psr & PSR_PS))
|
||||||
|
#define instruction_pointer(regs) ((regs)->pc)
|
||||||
|
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
|
||||||
|
unsigned long profile_pc(struct pt_regs *);
|
||||||
|
extern void show_regs(struct pt_regs *);
|
||||||
|
#endif /* (__KERNEL__) */
|
||||||
|
|
||||||
|
#else /* (!__ASSEMBLY__) */
|
||||||
|
/* For assembly code. */
|
||||||
|
#define TRACEREG_SZ 0x50
|
||||||
|
#define STACKFRAME_SZ 0x60
|
||||||
|
#endif /* (!__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#endif /* (defined(__sparc__) && defined(__arch64__)) */
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
#define STACK_BIAS 2047
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* These are for pt_regs. */
|
||||||
|
#define PT_V9_G0 0x00
|
||||||
|
#define PT_V9_G1 0x08
|
||||||
|
#define PT_V9_G2 0x10
|
||||||
|
#define PT_V9_G3 0x18
|
||||||
|
#define PT_V9_G4 0x20
|
||||||
|
#define PT_V9_G5 0x28
|
||||||
|
#define PT_V9_G6 0x30
|
||||||
|
#define PT_V9_G7 0x38
|
||||||
|
#define PT_V9_I0 0x40
|
||||||
|
#define PT_V9_I1 0x48
|
||||||
|
#define PT_V9_I2 0x50
|
||||||
|
#define PT_V9_I3 0x58
|
||||||
|
#define PT_V9_I4 0x60
|
||||||
|
#define PT_V9_I5 0x68
|
||||||
|
#define PT_V9_I6 0x70
|
||||||
|
#define PT_V9_FP PT_V9_I6
|
||||||
|
#define PT_V9_I7 0x78
|
||||||
|
#define PT_V9_TSTATE 0x80
|
||||||
|
#define PT_V9_TPC 0x88
|
||||||
|
#define PT_V9_TNPC 0x90
|
||||||
|
#define PT_V9_Y 0x98
|
||||||
|
#define PT_V9_MAGIC 0x9c
|
||||||
|
#define PT_TSTATE PT_V9_TSTATE
|
||||||
|
#define PT_TPC PT_V9_TPC
|
||||||
|
#define PT_TNPC PT_V9_TNPC
|
||||||
|
|
||||||
|
/* These for pt_regs32. */
|
||||||
|
#define PT_PSR 0x0
|
||||||
|
#define PT_PC 0x4
|
||||||
|
#define PT_NPC 0x8
|
||||||
|
#define PT_Y 0xc
|
||||||
|
#define PT_G0 0x10
|
||||||
|
#define PT_WIM PT_G0
|
||||||
|
#define PT_G1 0x14
|
||||||
|
#define PT_G2 0x18
|
||||||
|
#define PT_G3 0x1c
|
||||||
|
#define PT_G4 0x20
|
||||||
|
#define PT_G5 0x24
|
||||||
|
#define PT_G6 0x28
|
||||||
|
#define PT_G7 0x2c
|
||||||
|
#define PT_I0 0x30
|
||||||
|
#define PT_I1 0x34
|
||||||
|
#define PT_I2 0x38
|
||||||
|
#define PT_I3 0x3c
|
||||||
|
#define PT_I4 0x40
|
||||||
|
#define PT_I5 0x44
|
||||||
|
#define PT_I6 0x48
|
||||||
|
#define PT_FP PT_I6
|
||||||
|
#define PT_I7 0x4c
|
||||||
|
|
||||||
|
/* Reg_window offsets */
|
||||||
|
#define RW_V9_L0 0x00
|
||||||
|
#define RW_V9_L1 0x08
|
||||||
|
#define RW_V9_L2 0x10
|
||||||
|
#define RW_V9_L3 0x18
|
||||||
|
#define RW_V9_L4 0x20
|
||||||
|
#define RW_V9_L5 0x28
|
||||||
|
#define RW_V9_L6 0x30
|
||||||
|
#define RW_V9_L7 0x38
|
||||||
|
#define RW_V9_I0 0x40
|
||||||
|
#define RW_V9_I1 0x48
|
||||||
|
#define RW_V9_I2 0x50
|
||||||
|
#define RW_V9_I3 0x58
|
||||||
|
#define RW_V9_I4 0x60
|
||||||
|
#define RW_V9_I5 0x68
|
||||||
|
#define RW_V9_I6 0x70
|
||||||
|
#define RW_V9_I7 0x78
|
||||||
|
|
||||||
|
#define RW_L0 0x00
|
||||||
|
#define RW_L1 0x04
|
||||||
|
#define RW_L2 0x08
|
||||||
|
#define RW_L3 0x0c
|
||||||
|
#define RW_L4 0x10
|
||||||
|
#define RW_L5 0x14
|
||||||
|
#define RW_L6 0x18
|
||||||
|
#define RW_L7 0x1c
|
||||||
|
#define RW_I0 0x20
|
||||||
|
#define RW_I1 0x24
|
||||||
|
#define RW_I2 0x28
|
||||||
|
#define RW_I3 0x2c
|
||||||
|
#define RW_I4 0x30
|
||||||
|
#define RW_I5 0x34
|
||||||
|
#define RW_I6 0x38
|
||||||
|
#define RW_I7 0x3c
|
||||||
|
|
||||||
|
/* Stack_frame offsets */
|
||||||
|
#define SF_V9_L0 0x00
|
||||||
|
#define SF_V9_L1 0x08
|
||||||
|
#define SF_V9_L2 0x10
|
||||||
|
#define SF_V9_L3 0x18
|
||||||
|
#define SF_V9_L4 0x20
|
||||||
|
#define SF_V9_L5 0x28
|
||||||
|
#define SF_V9_L6 0x30
|
||||||
|
#define SF_V9_L7 0x38
|
||||||
|
#define SF_V9_I0 0x40
|
||||||
|
#define SF_V9_I1 0x48
|
||||||
|
#define SF_V9_I2 0x50
|
||||||
|
#define SF_V9_I3 0x58
|
||||||
|
#define SF_V9_I4 0x60
|
||||||
|
#define SF_V9_I5 0x68
|
||||||
|
#define SF_V9_FP 0x70
|
||||||
|
#define SF_V9_PC 0x78
|
||||||
|
#define SF_V9_RETP 0x80
|
||||||
|
#define SF_V9_XARG0 0x88
|
||||||
|
#define SF_V9_XARG1 0x90
|
||||||
|
#define SF_V9_XARG2 0x98
|
||||||
|
#define SF_V9_XARG3 0xa0
|
||||||
|
#define SF_V9_XARG4 0xa8
|
||||||
|
#define SF_V9_XARG5 0xb0
|
||||||
|
#define SF_V9_XXARG 0xb8
|
||||||
|
|
||||||
|
#define SF_L0 0x00
|
||||||
|
#define SF_L1 0x04
|
||||||
|
#define SF_L2 0x08
|
||||||
|
#define SF_L3 0x0c
|
||||||
|
#define SF_L4 0x10
|
||||||
|
#define SF_L5 0x14
|
||||||
|
#define SF_L6 0x18
|
||||||
|
#define SF_L7 0x1c
|
||||||
|
#define SF_I0 0x20
|
||||||
|
#define SF_I1 0x24
|
||||||
|
#define SF_I2 0x28
|
||||||
|
#define SF_I3 0x2c
|
||||||
|
#define SF_I4 0x30
|
||||||
|
#define SF_I5 0x34
|
||||||
|
#define SF_FP 0x38
|
||||||
|
#define SF_PC 0x3c
|
||||||
|
#define SF_RETP 0x40
|
||||||
|
#define SF_XARG0 0x44
|
||||||
|
#define SF_XARG1 0x48
|
||||||
|
#define SF_XARG2 0x4c
|
||||||
|
#define SF_XARG3 0x50
|
||||||
|
#define SF_XARG4 0x54
|
||||||
|
#define SF_XARG5 0x58
|
||||||
|
#define SF_XXARG 0x5c
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
/* global_reg_snapshot offsets */
|
||||||
|
#define GR_SNAP_TSTATE 0x00
|
||||||
|
#define GR_SNAP_TPC 0x08
|
||||||
|
#define GR_SNAP_TNPC 0x10
|
||||||
|
#define GR_SNAP_O7 0x18
|
||||||
|
#define GR_SNAP_I7 0x20
|
||||||
|
#define GR_SNAP_RPC 0x28
|
||||||
|
#define GR_SNAP_THREAD 0x30
|
||||||
|
#define GR_SNAP_PAD1 0x38
|
||||||
|
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
/* Stuff for the ptrace system call */
|
||||||
|
#define PTRACE_SPARC_DETACH 11
|
||||||
|
#define PTRACE_GETREGS 12
|
||||||
|
#define PTRACE_SETREGS 13
|
||||||
|
#define PTRACE_GETFPREGS 14
|
||||||
|
#define PTRACE_SETFPREGS 15
|
||||||
|
#define PTRACE_READDATA 16
|
||||||
|
#define PTRACE_WRITEDATA 17
|
||||||
|
#define PTRACE_READTEXT 18
|
||||||
|
#define PTRACE_WRITETEXT 19
|
||||||
|
#define PTRACE_GETFPAREGS 20
|
||||||
|
#define PTRACE_SETFPAREGS 21
|
||||||
|
|
||||||
|
/* There are for debugging 64-bit processes, either from a 32 or 64 bit
|
||||||
|
* parent. Thus their complements are for debugging 32-bit processes only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PTRACE_GETREGS64 22
|
||||||
|
#define PTRACE_SETREGS64 23
|
||||||
|
/* PTRACE_SYSCALL is 24 */
|
||||||
|
#define PTRACE_GETFPREGS64 25
|
||||||
|
#define PTRACE_SETFPREGS64 26
|
||||||
|
|
||||||
|
#endif /* !(__SPARC_PTRACE_H) */
|
||||||
|
|
|
@ -1,186 +0,0 @@
|
||||||
#ifndef _SPARC_PTRACE_H
|
|
||||||
#define _SPARC_PTRACE_H
|
|
||||||
|
|
||||||
#include <asm/psr.h>
|
|
||||||
|
|
||||||
/* This struct defines the way the registers are stored on the
|
|
||||||
* stack during a system call and basically all traps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
struct pt_regs {
|
|
||||||
unsigned long psr;
|
|
||||||
unsigned long pc;
|
|
||||||
unsigned long npc;
|
|
||||||
unsigned long y;
|
|
||||||
unsigned long u_regs[16]; /* globals and ins */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define UREG_G0 0
|
|
||||||
#define UREG_G1 1
|
|
||||||
#define UREG_G2 2
|
|
||||||
#define UREG_G3 3
|
|
||||||
#define UREG_G4 4
|
|
||||||
#define UREG_G5 5
|
|
||||||
#define UREG_G6 6
|
|
||||||
#define UREG_G7 7
|
|
||||||
#define UREG_I0 8
|
|
||||||
#define UREG_I1 9
|
|
||||||
#define UREG_I2 10
|
|
||||||
#define UREG_I3 11
|
|
||||||
#define UREG_I4 12
|
|
||||||
#define UREG_I5 13
|
|
||||||
#define UREG_I6 14
|
|
||||||
#define UREG_I7 15
|
|
||||||
#define UREG_WIM UREG_G0
|
|
||||||
#define UREG_FADDR UREG_G0
|
|
||||||
#define UREG_FP UREG_I6
|
|
||||||
#define UREG_RETPC UREG_I7
|
|
||||||
|
|
||||||
/* A register window */
|
|
||||||
struct reg_window {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A Sparc stack frame */
|
|
||||||
struct sparc_stackf {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[6];
|
|
||||||
struct sparc_stackf *fp;
|
|
||||||
unsigned long callers_pc;
|
|
||||||
char *structptr;
|
|
||||||
unsigned long xargs[6];
|
|
||||||
unsigned long xxargs[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define TRACEREG_SZ sizeof(struct pt_regs)
|
|
||||||
#define STACKFRAME_SZ sizeof(struct sparc_stackf)
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
#include <asm/system.h>
|
|
||||||
|
|
||||||
static inline bool pt_regs_is_syscall(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return (regs->psr & PSR_SYSCALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return (regs->psr &= ~PSR_SYSCALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define arch_ptrace_stop_needed(exit_code, info) \
|
|
||||||
({ flush_user_windows(); \
|
|
||||||
current_thread_info()->w_saved != 0; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define arch_ptrace_stop(exit_code, info) \
|
|
||||||
synchronize_user_stack()
|
|
||||||
|
|
||||||
#define user_mode(regs) (!((regs)->psr & PSR_PS))
|
|
||||||
#define instruction_pointer(regs) ((regs)->pc)
|
|
||||||
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
|
|
||||||
unsigned long profile_pc(struct pt_regs *);
|
|
||||||
extern void show_regs(struct pt_regs *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
|
||||||
/* For assembly code. */
|
|
||||||
#define TRACEREG_SZ 0x50
|
|
||||||
#define STACKFRAME_SZ 0x60
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The asm-offsets.h is a generated file, so we cannot include it.
|
|
||||||
* It may be OK for glibc headers, but it's utterly pointless for C code.
|
|
||||||
* The assembly code using those offsets has to include it explicitly.
|
|
||||||
*/
|
|
||||||
/* #include <asm/asm-offsets.h> */
|
|
||||||
|
|
||||||
/* These are for pt_regs. */
|
|
||||||
#define PT_PSR 0x0
|
|
||||||
#define PT_PC 0x4
|
|
||||||
#define PT_NPC 0x8
|
|
||||||
#define PT_Y 0xc
|
|
||||||
#define PT_G0 0x10
|
|
||||||
#define PT_WIM PT_G0
|
|
||||||
#define PT_G1 0x14
|
|
||||||
#define PT_G2 0x18
|
|
||||||
#define PT_G3 0x1c
|
|
||||||
#define PT_G4 0x20
|
|
||||||
#define PT_G5 0x24
|
|
||||||
#define PT_G6 0x28
|
|
||||||
#define PT_G7 0x2c
|
|
||||||
#define PT_I0 0x30
|
|
||||||
#define PT_I1 0x34
|
|
||||||
#define PT_I2 0x38
|
|
||||||
#define PT_I3 0x3c
|
|
||||||
#define PT_I4 0x40
|
|
||||||
#define PT_I5 0x44
|
|
||||||
#define PT_I6 0x48
|
|
||||||
#define PT_FP PT_I6
|
|
||||||
#define PT_I7 0x4c
|
|
||||||
|
|
||||||
/* Reg_window offsets */
|
|
||||||
#define RW_L0 0x00
|
|
||||||
#define RW_L1 0x04
|
|
||||||
#define RW_L2 0x08
|
|
||||||
#define RW_L3 0x0c
|
|
||||||
#define RW_L4 0x10
|
|
||||||
#define RW_L5 0x14
|
|
||||||
#define RW_L6 0x18
|
|
||||||
#define RW_L7 0x1c
|
|
||||||
#define RW_I0 0x20
|
|
||||||
#define RW_I1 0x24
|
|
||||||
#define RW_I2 0x28
|
|
||||||
#define RW_I3 0x2c
|
|
||||||
#define RW_I4 0x30
|
|
||||||
#define RW_I5 0x34
|
|
||||||
#define RW_I6 0x38
|
|
||||||
#define RW_I7 0x3c
|
|
||||||
|
|
||||||
/* Stack_frame offsets */
|
|
||||||
#define SF_L0 0x00
|
|
||||||
#define SF_L1 0x04
|
|
||||||
#define SF_L2 0x08
|
|
||||||
#define SF_L3 0x0c
|
|
||||||
#define SF_L4 0x10
|
|
||||||
#define SF_L5 0x14
|
|
||||||
#define SF_L6 0x18
|
|
||||||
#define SF_L7 0x1c
|
|
||||||
#define SF_I0 0x20
|
|
||||||
#define SF_I1 0x24
|
|
||||||
#define SF_I2 0x28
|
|
||||||
#define SF_I3 0x2c
|
|
||||||
#define SF_I4 0x30
|
|
||||||
#define SF_I5 0x34
|
|
||||||
#define SF_FP 0x38
|
|
||||||
#define SF_PC 0x3c
|
|
||||||
#define SF_RETP 0x40
|
|
||||||
#define SF_XARG0 0x44
|
|
||||||
#define SF_XARG1 0x48
|
|
||||||
#define SF_XARG2 0x4c
|
|
||||||
#define SF_XARG3 0x50
|
|
||||||
#define SF_XARG4 0x54
|
|
||||||
#define SF_XARG5 0x58
|
|
||||||
#define SF_XXARG 0x5c
|
|
||||||
|
|
||||||
/* Stuff for the ptrace system call */
|
|
||||||
#define PTRACE_SPARC_DETACH 11
|
|
||||||
#define PTRACE_GETREGS 12
|
|
||||||
#define PTRACE_SETREGS 13
|
|
||||||
#define PTRACE_GETFPREGS 14
|
|
||||||
#define PTRACE_SETFPREGS 15
|
|
||||||
#define PTRACE_READDATA 16
|
|
||||||
#define PTRACE_WRITEDATA 17
|
|
||||||
#define PTRACE_READTEXT 18
|
|
||||||
#define PTRACE_WRITETEXT 19
|
|
||||||
#define PTRACE_GETFPAREGS 20
|
|
||||||
#define PTRACE_SETFPAREGS 21
|
|
||||||
|
|
||||||
#endif /* !(_SPARC_PTRACE_H) */
|
|
|
@ -1,356 +0,0 @@
|
||||||
#ifndef _SPARC64_PTRACE_H
|
|
||||||
#define _SPARC64_PTRACE_H
|
|
||||||
|
|
||||||
#include <asm/pstate.h>
|
|
||||||
|
|
||||||
/* This struct defines the way the registers are stored on the
|
|
||||||
* stack during a system call and basically all traps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This magic value must have the low 9 bits clear,
|
|
||||||
* as that is where we encode the %tt value, see below.
|
|
||||||
*/
|
|
||||||
#define PT_REGS_MAGIC 0x57ac6c00
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
struct pt_regs {
|
|
||||||
unsigned long u_regs[16]; /* globals and ins */
|
|
||||||
unsigned long tstate;
|
|
||||||
unsigned long tpc;
|
|
||||||
unsigned long tnpc;
|
|
||||||
unsigned int y;
|
|
||||||
|
|
||||||
/* We encode a magic number, PT_REGS_MAGIC, along
|
|
||||||
* with the %tt (trap type) register value at trap
|
|
||||||
* entry time. The magic number allows us to identify
|
|
||||||
* accurately a trap stack frame in the stack
|
|
||||||
* unwinder, and the %tt value allows us to test
|
|
||||||
* things like "in a system call" etc. for an arbitray
|
|
||||||
* process.
|
|
||||||
*
|
|
||||||
* The PT_REGS_MAGIC is choosen such that it can be
|
|
||||||
* loaded completely using just a sethi instruction.
|
|
||||||
*/
|
|
||||||
unsigned int magic;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct pt_regs32 {
|
|
||||||
unsigned int psr;
|
|
||||||
unsigned int pc;
|
|
||||||
unsigned int npc;
|
|
||||||
unsigned int y;
|
|
||||||
unsigned int u_regs[16]; /* globals and ins */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define UREG_G0 0
|
|
||||||
#define UREG_G1 1
|
|
||||||
#define UREG_G2 2
|
|
||||||
#define UREG_G3 3
|
|
||||||
#define UREG_G4 4
|
|
||||||
#define UREG_G5 5
|
|
||||||
#define UREG_G6 6
|
|
||||||
#define UREG_G7 7
|
|
||||||
#define UREG_I0 8
|
|
||||||
#define UREG_I1 9
|
|
||||||
#define UREG_I2 10
|
|
||||||
#define UREG_I3 11
|
|
||||||
#define UREG_I4 12
|
|
||||||
#define UREG_I5 13
|
|
||||||
#define UREG_I6 14
|
|
||||||
#define UREG_I7 15
|
|
||||||
#define UREG_FP UREG_I6
|
|
||||||
#define UREG_RETPC UREG_I7
|
|
||||||
|
|
||||||
/* A V9 register window */
|
|
||||||
struct reg_window {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A 32-bit register window. */
|
|
||||||
struct reg_window32 {
|
|
||||||
unsigned int locals[8];
|
|
||||||
unsigned int ins[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A V9 Sparc stack frame */
|
|
||||||
struct sparc_stackf {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[6];
|
|
||||||
struct sparc_stackf *fp;
|
|
||||||
unsigned long callers_pc;
|
|
||||||
char *structptr;
|
|
||||||
unsigned long xargs[6];
|
|
||||||
unsigned long xxargs[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A 32-bit Sparc stack frame */
|
|
||||||
struct sparc_stackf32 {
|
|
||||||
unsigned int locals[8];
|
|
||||||
unsigned int ins[6];
|
|
||||||
unsigned int fp;
|
|
||||||
unsigned int callers_pc;
|
|
||||||
unsigned int structptr;
|
|
||||||
unsigned int xargs[6];
|
|
||||||
unsigned int xxargs[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sparc_trapf {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[8];
|
|
||||||
unsigned long _unused;
|
|
||||||
struct pt_regs *regs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define TRACEREG_SZ sizeof(struct pt_regs)
|
|
||||||
#define STACKFRAME_SZ sizeof(struct sparc_stackf)
|
|
||||||
|
|
||||||
#define TRACEREG32_SZ sizeof(struct pt_regs32)
|
|
||||||
#define STACKFRAME32_SZ sizeof(struct sparc_stackf32)
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
#include <linux/threads.h>
|
|
||||||
#include <asm/system.h>
|
|
||||||
|
|
||||||
static inline int pt_regs_trap_type(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return regs->magic & 0x1ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool pt_regs_is_syscall(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return (regs->tstate & TSTATE_SYSCALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return (regs->tstate &= ~TSTATE_SYSCALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define arch_ptrace_stop_needed(exit_code, info) \
|
|
||||||
({ flush_user_windows(); \
|
|
||||||
get_thread_wsaved() != 0; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define arch_ptrace_stop(exit_code, info) \
|
|
||||||
synchronize_user_stack()
|
|
||||||
|
|
||||||
struct global_reg_snapshot {
|
|
||||||
unsigned long tstate;
|
|
||||||
unsigned long tpc;
|
|
||||||
unsigned long tnpc;
|
|
||||||
unsigned long o7;
|
|
||||||
unsigned long i7;
|
|
||||||
unsigned long rpc;
|
|
||||||
struct thread_info *thread;
|
|
||||||
unsigned long pad1;
|
|
||||||
};
|
|
||||||
extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
|
|
||||||
|
|
||||||
#define force_successful_syscall_return() \
|
|
||||||
do { current_thread_info()->syscall_noerror = 1; \
|
|
||||||
} while (0)
|
|
||||||
#define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
|
|
||||||
#define instruction_pointer(regs) ((regs)->tpc)
|
|
||||||
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
|
|
||||||
#define regs_return_value(regs) ((regs)->u_regs[UREG_I0])
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
extern unsigned long profile_pc(struct pt_regs *);
|
|
||||||
#else
|
|
||||||
#define profile_pc(regs) instruction_pointer(regs)
|
|
||||||
#endif
|
|
||||||
extern void show_regs(struct pt_regs *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
|
||||||
/* For assembly code. */
|
|
||||||
#define TRACEREG_SZ 0xa0
|
|
||||||
#define STACKFRAME_SZ 0xc0
|
|
||||||
|
|
||||||
#define TRACEREG32_SZ 0x50
|
|
||||||
#define STACKFRAME32_SZ 0x60
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#define STACK_BIAS 2047
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* These are for pt_regs. */
|
|
||||||
#define PT_V9_G0 0x00
|
|
||||||
#define PT_V9_G1 0x08
|
|
||||||
#define PT_V9_G2 0x10
|
|
||||||
#define PT_V9_G3 0x18
|
|
||||||
#define PT_V9_G4 0x20
|
|
||||||
#define PT_V9_G5 0x28
|
|
||||||
#define PT_V9_G6 0x30
|
|
||||||
#define PT_V9_G7 0x38
|
|
||||||
#define PT_V9_I0 0x40
|
|
||||||
#define PT_V9_I1 0x48
|
|
||||||
#define PT_V9_I2 0x50
|
|
||||||
#define PT_V9_I3 0x58
|
|
||||||
#define PT_V9_I4 0x60
|
|
||||||
#define PT_V9_I5 0x68
|
|
||||||
#define PT_V9_I6 0x70
|
|
||||||
#define PT_V9_FP PT_V9_I6
|
|
||||||
#define PT_V9_I7 0x78
|
|
||||||
#define PT_V9_TSTATE 0x80
|
|
||||||
#define PT_V9_TPC 0x88
|
|
||||||
#define PT_V9_TNPC 0x90
|
|
||||||
#define PT_V9_Y 0x98
|
|
||||||
#define PT_V9_MAGIC 0x9c
|
|
||||||
#define PT_TSTATE PT_V9_TSTATE
|
|
||||||
#define PT_TPC PT_V9_TPC
|
|
||||||
#define PT_TNPC PT_V9_TNPC
|
|
||||||
|
|
||||||
/* These for pt_regs32. */
|
|
||||||
#define PT_PSR 0x0
|
|
||||||
#define PT_PC 0x4
|
|
||||||
#define PT_NPC 0x8
|
|
||||||
#define PT_Y 0xc
|
|
||||||
#define PT_G0 0x10
|
|
||||||
#define PT_WIM PT_G0
|
|
||||||
#define PT_G1 0x14
|
|
||||||
#define PT_G2 0x18
|
|
||||||
#define PT_G3 0x1c
|
|
||||||
#define PT_G4 0x20
|
|
||||||
#define PT_G5 0x24
|
|
||||||
#define PT_G6 0x28
|
|
||||||
#define PT_G7 0x2c
|
|
||||||
#define PT_I0 0x30
|
|
||||||
#define PT_I1 0x34
|
|
||||||
#define PT_I2 0x38
|
|
||||||
#define PT_I3 0x3c
|
|
||||||
#define PT_I4 0x40
|
|
||||||
#define PT_I5 0x44
|
|
||||||
#define PT_I6 0x48
|
|
||||||
#define PT_FP PT_I6
|
|
||||||
#define PT_I7 0x4c
|
|
||||||
|
|
||||||
/* Reg_window offsets */
|
|
||||||
#define RW_V9_L0 0x00
|
|
||||||
#define RW_V9_L1 0x08
|
|
||||||
#define RW_V9_L2 0x10
|
|
||||||
#define RW_V9_L3 0x18
|
|
||||||
#define RW_V9_L4 0x20
|
|
||||||
#define RW_V9_L5 0x28
|
|
||||||
#define RW_V9_L6 0x30
|
|
||||||
#define RW_V9_L7 0x38
|
|
||||||
#define RW_V9_I0 0x40
|
|
||||||
#define RW_V9_I1 0x48
|
|
||||||
#define RW_V9_I2 0x50
|
|
||||||
#define RW_V9_I3 0x58
|
|
||||||
#define RW_V9_I4 0x60
|
|
||||||
#define RW_V9_I5 0x68
|
|
||||||
#define RW_V9_I6 0x70
|
|
||||||
#define RW_V9_I7 0x78
|
|
||||||
|
|
||||||
#define RW_L0 0x00
|
|
||||||
#define RW_L1 0x04
|
|
||||||
#define RW_L2 0x08
|
|
||||||
#define RW_L3 0x0c
|
|
||||||
#define RW_L4 0x10
|
|
||||||
#define RW_L5 0x14
|
|
||||||
#define RW_L6 0x18
|
|
||||||
#define RW_L7 0x1c
|
|
||||||
#define RW_I0 0x20
|
|
||||||
#define RW_I1 0x24
|
|
||||||
#define RW_I2 0x28
|
|
||||||
#define RW_I3 0x2c
|
|
||||||
#define RW_I4 0x30
|
|
||||||
#define RW_I5 0x34
|
|
||||||
#define RW_I6 0x38
|
|
||||||
#define RW_I7 0x3c
|
|
||||||
|
|
||||||
/* Stack_frame offsets */
|
|
||||||
#define SF_V9_L0 0x00
|
|
||||||
#define SF_V9_L1 0x08
|
|
||||||
#define SF_V9_L2 0x10
|
|
||||||
#define SF_V9_L3 0x18
|
|
||||||
#define SF_V9_L4 0x20
|
|
||||||
#define SF_V9_L5 0x28
|
|
||||||
#define SF_V9_L6 0x30
|
|
||||||
#define SF_V9_L7 0x38
|
|
||||||
#define SF_V9_I0 0x40
|
|
||||||
#define SF_V9_I1 0x48
|
|
||||||
#define SF_V9_I2 0x50
|
|
||||||
#define SF_V9_I3 0x58
|
|
||||||
#define SF_V9_I4 0x60
|
|
||||||
#define SF_V9_I5 0x68
|
|
||||||
#define SF_V9_FP 0x70
|
|
||||||
#define SF_V9_PC 0x78
|
|
||||||
#define SF_V9_RETP 0x80
|
|
||||||
#define SF_V9_XARG0 0x88
|
|
||||||
#define SF_V9_XARG1 0x90
|
|
||||||
#define SF_V9_XARG2 0x98
|
|
||||||
#define SF_V9_XARG3 0xa0
|
|
||||||
#define SF_V9_XARG4 0xa8
|
|
||||||
#define SF_V9_XARG5 0xb0
|
|
||||||
#define SF_V9_XXARG 0xb8
|
|
||||||
|
|
||||||
#define SF_L0 0x00
|
|
||||||
#define SF_L1 0x04
|
|
||||||
#define SF_L2 0x08
|
|
||||||
#define SF_L3 0x0c
|
|
||||||
#define SF_L4 0x10
|
|
||||||
#define SF_L5 0x14
|
|
||||||
#define SF_L6 0x18
|
|
||||||
#define SF_L7 0x1c
|
|
||||||
#define SF_I0 0x20
|
|
||||||
#define SF_I1 0x24
|
|
||||||
#define SF_I2 0x28
|
|
||||||
#define SF_I3 0x2c
|
|
||||||
#define SF_I4 0x30
|
|
||||||
#define SF_I5 0x34
|
|
||||||
#define SF_FP 0x38
|
|
||||||
#define SF_PC 0x3c
|
|
||||||
#define SF_RETP 0x40
|
|
||||||
#define SF_XARG0 0x44
|
|
||||||
#define SF_XARG1 0x48
|
|
||||||
#define SF_XARG2 0x4c
|
|
||||||
#define SF_XARG3 0x50
|
|
||||||
#define SF_XARG4 0x54
|
|
||||||
#define SF_XARG5 0x58
|
|
||||||
#define SF_XXARG 0x5c
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
/* global_reg_snapshot offsets */
|
|
||||||
#define GR_SNAP_TSTATE 0x00
|
|
||||||
#define GR_SNAP_TPC 0x08
|
|
||||||
#define GR_SNAP_TNPC 0x10
|
|
||||||
#define GR_SNAP_O7 0x18
|
|
||||||
#define GR_SNAP_I7 0x20
|
|
||||||
#define GR_SNAP_RPC 0x28
|
|
||||||
#define GR_SNAP_THREAD 0x30
|
|
||||||
#define GR_SNAP_PAD1 0x38
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
|
||||||
|
|
||||||
/* Stuff for the ptrace system call */
|
|
||||||
#define PTRACE_SPARC_DETACH 11
|
|
||||||
#define PTRACE_GETREGS 12
|
|
||||||
#define PTRACE_SETREGS 13
|
|
||||||
#define PTRACE_GETFPREGS 14
|
|
||||||
#define PTRACE_SETFPREGS 15
|
|
||||||
#define PTRACE_READDATA 16
|
|
||||||
#define PTRACE_WRITEDATA 17
|
|
||||||
#define PTRACE_READTEXT 18
|
|
||||||
#define PTRACE_WRITETEXT 19
|
|
||||||
#define PTRACE_GETFPAREGS 20
|
|
||||||
#define PTRACE_SETFPAREGS 21
|
|
||||||
|
|
||||||
/* There are for debugging 64-bit processes, either from a 32 or 64 bit
|
|
||||||
* parent. Thus their complements are for debugging 32-bit processes only.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PTRACE_GETREGS64 22
|
|
||||||
#define PTRACE_SETREGS64 23
|
|
||||||
/* PTRACE_SYSCALL is 24 */
|
|
||||||
#define PTRACE_GETFPREGS64 25
|
|
||||||
#define PTRACE_SETFPREGS64 26
|
|
||||||
|
|
||||||
#endif /* !(_SPARC64_PTRACE_H) */
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef ___ASM_SPARC_REG_H
|
|
||||||
#define ___ASM_SPARC_REG_H
|
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
|
||||||
#include <asm/reg_64.h>
|
|
||||||
#else
|
|
||||||
#include <asm/reg_32.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,79 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/include/asm/reg.h
|
|
||||||
* Layout of the registers as expected by gdb on the Sparc
|
|
||||||
* we should replace the user.h definitions with those in
|
|
||||||
* this file, we don't even use the other
|
|
||||||
* -miguel
|
|
||||||
*
|
|
||||||
* The names of the structures, constants and aliases in this file
|
|
||||||
* have the same names as the sunos ones, some programs rely on these
|
|
||||||
* names (gdb for example).
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SPARC_REG_H
|
|
||||||
#define __SPARC_REG_H
|
|
||||||
|
|
||||||
struct regs {
|
|
||||||
int r_psr;
|
|
||||||
#define r_ps r_psr
|
|
||||||
int r_pc;
|
|
||||||
int r_npc;
|
|
||||||
int r_y;
|
|
||||||
int r_g1;
|
|
||||||
int r_g2;
|
|
||||||
int r_g3;
|
|
||||||
int r_g4;
|
|
||||||
int r_g5;
|
|
||||||
int r_g6;
|
|
||||||
int r_g7;
|
|
||||||
int r_o0;
|
|
||||||
int r_o1;
|
|
||||||
int r_o2;
|
|
||||||
int r_o3;
|
|
||||||
int r_o4;
|
|
||||||
int r_o5;
|
|
||||||
int r_o6;
|
|
||||||
int r_o7;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fpq {
|
|
||||||
unsigned long *addr;
|
|
||||||
unsigned long instr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fq {
|
|
||||||
union {
|
|
||||||
double whole;
|
|
||||||
struct fpq fpq;
|
|
||||||
} FQu;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FPU_REGS_TYPE unsigned int
|
|
||||||
#define FPU_FSR_TYPE unsigned
|
|
||||||
|
|
||||||
struct fp_status {
|
|
||||||
union {
|
|
||||||
FPU_REGS_TYPE Fpu_regs[32];
|
|
||||||
double Fpu_dregs[16];
|
|
||||||
} fpu_fr;
|
|
||||||
FPU_FSR_TYPE Fpu_fsr;
|
|
||||||
unsigned Fpu_flags;
|
|
||||||
unsigned Fpu_extra;
|
|
||||||
unsigned Fpu_qcnt;
|
|
||||||
struct fq Fpu_q[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define fpu_regs f_fpstatus.fpu_fr.Fpu_regs
|
|
||||||
#define fpu_dregs f_fpstatus.fpu_fr.Fpu_dregs
|
|
||||||
#define fpu_fsr f_fpstatus.Fpu_fsr
|
|
||||||
#define fpu_flags f_fpstatus.Fpu_flags
|
|
||||||
#define fpu_extra f_fpstatus.Fpu_extra
|
|
||||||
#define fpu_q f_fpstatus.Fpu_q
|
|
||||||
#define fpu_qcnt f_fpstatus.Fpu_qcnt
|
|
||||||
|
|
||||||
struct fpu {
|
|
||||||
struct fp_status f_fpstatus;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __SPARC_REG_H */
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/asm/reg.h
|
|
||||||
* Layout of the registers as expected by gdb on the Sparc
|
|
||||||
* we should replace the user.h definitions with those in
|
|
||||||
* this file, we don't even use the other
|
|
||||||
* -miguel
|
|
||||||
*
|
|
||||||
* The names of the structures, constants and aliases in this file
|
|
||||||
* have the same names as the sunos ones, some programs rely on these
|
|
||||||
* names (gdb for example).
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SPARC64_REG_H
|
|
||||||
#define __SPARC64_REG_H
|
|
||||||
|
|
||||||
struct regs {
|
|
||||||
unsigned long r_g1;
|
|
||||||
unsigned long r_g2;
|
|
||||||
unsigned long r_g3;
|
|
||||||
unsigned long r_g4;
|
|
||||||
unsigned long r_g5;
|
|
||||||
unsigned long r_g6;
|
|
||||||
unsigned long r_g7;
|
|
||||||
unsigned long r_o0;
|
|
||||||
unsigned long r_o1;
|
|
||||||
unsigned long r_o2;
|
|
||||||
unsigned long r_o3;
|
|
||||||
unsigned long r_o4;
|
|
||||||
unsigned long r_o5;
|
|
||||||
unsigned long r_o6;
|
|
||||||
unsigned long r_o7;
|
|
||||||
unsigned long __pad;
|
|
||||||
unsigned long r_tstate;
|
|
||||||
unsigned long r_tpc;
|
|
||||||
unsigned long r_tnpc;
|
|
||||||
unsigned int r_y;
|
|
||||||
unsigned int r_fprs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FPU_REGS_TYPE unsigned int
|
|
||||||
#define FPU_FSR_TYPE unsigned long
|
|
||||||
|
|
||||||
struct fp_status {
|
|
||||||
unsigned long fpu_fr[32];
|
|
||||||
unsigned long Fpu_fsr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fpu {
|
|
||||||
struct fp_status f_fpstatus;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define fpu_regs f_fpstatus.fpu_fr
|
|
||||||
#define fpu_fsr f_fpstatus.Fpu_fsr
|
|
||||||
|
|
||||||
#endif /* __SPARC64_REG_H */
|
|
|
@ -1,8 +1,96 @@
|
||||||
#ifndef ___ASM_SPARC_SIGCONTEXT_H
|
#ifndef __SPARC_SIGCONTEXT_H
|
||||||
#define ___ASM_SPARC_SIGCONTEXT_H
|
#define __SPARC_SIGCONTEXT_H
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
|
||||||
#include <asm/sigcontext_64.h>
|
#ifdef __KERNEL__
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#define __SUNOS_MAXWIN 31
|
||||||
|
|
||||||
|
/* This is what SunOS does, so shall I unless we use new 32bit signals or rt signals. */
|
||||||
|
struct sigcontext32 {
|
||||||
|
int sigc_onstack; /* state to restore */
|
||||||
|
int sigc_mask; /* sigmask to restore */
|
||||||
|
int sigc_sp; /* stack pointer */
|
||||||
|
int sigc_pc; /* program counter */
|
||||||
|
int sigc_npc; /* next program counter */
|
||||||
|
int sigc_psr; /* for condition codes etc */
|
||||||
|
int sigc_g1; /* User uses these two registers */
|
||||||
|
int sigc_o0; /* within the trampoline code. */
|
||||||
|
|
||||||
|
/* Now comes information regarding the users window set
|
||||||
|
* at the time of the signal.
|
||||||
|
*/
|
||||||
|
int sigc_oswins; /* outstanding windows */
|
||||||
|
|
||||||
|
/* stack ptrs for each regwin buf */
|
||||||
|
unsigned sigc_spbuf[__SUNOS_MAXWIN];
|
||||||
|
|
||||||
|
/* Windows to restore after signal */
|
||||||
|
struct reg_window32 sigc_wbuf[__SUNOS_MAXWIN];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* This is what we use for 32bit new non-rt signals. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct {
|
||||||
|
unsigned int psr;
|
||||||
|
unsigned int pc;
|
||||||
|
unsigned int npc;
|
||||||
|
unsigned int y;
|
||||||
|
unsigned int u_regs[16]; /* globals and ins */
|
||||||
|
} si_regs;
|
||||||
|
int si_mask;
|
||||||
|
} __siginfo32_t;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPARC64
|
||||||
|
typedef struct {
|
||||||
|
unsigned int si_float_regs [64];
|
||||||
|
unsigned long si_fsr;
|
||||||
|
unsigned long si_gsr;
|
||||||
|
unsigned long si_fprs;
|
||||||
|
} __siginfo_fpu_t;
|
||||||
|
|
||||||
|
/* This is what SunOS doesn't, so we have to write this alone
|
||||||
|
and do it properly. */
|
||||||
|
struct sigcontext {
|
||||||
|
/* The size of this array has to match SI_MAX_SIZE from siginfo.h */
|
||||||
|
char sigc_info[128];
|
||||||
|
struct {
|
||||||
|
unsigned long u_regs[16]; /* globals and ins */
|
||||||
|
unsigned long tstate;
|
||||||
|
unsigned long tpc;
|
||||||
|
unsigned long tnpc;
|
||||||
|
unsigned int y;
|
||||||
|
unsigned int fprs;
|
||||||
|
} sigc_regs;
|
||||||
|
__siginfo_fpu_t * sigc_fpu_save;
|
||||||
|
struct {
|
||||||
|
void * ss_sp;
|
||||||
|
int ss_flags;
|
||||||
|
unsigned long ss_size;
|
||||||
|
} sigc_stack;
|
||||||
|
unsigned long sigc_mask;
|
||||||
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include <asm/sigcontext_32.h>
|
|
||||||
#endif
|
typedef struct {
|
||||||
#endif
|
unsigned long si_float_regs [32];
|
||||||
|
unsigned long si_fsr;
|
||||||
|
unsigned long si_fpqdepth;
|
||||||
|
struct {
|
||||||
|
unsigned long *insn_addr;
|
||||||
|
unsigned long insn;
|
||||||
|
} si_fpqueue [16];
|
||||||
|
} __siginfo_fpu_t;
|
||||||
|
#endif /* (CONFIG_SPARC64) */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !(__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#endif /* (__KERNEL__) */
|
||||||
|
|
||||||
|
#endif /* !(__SPARC_SIGCONTEXT_H) */
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
#ifndef __SPARC_SIGCONTEXT_H
|
|
||||||
#define __SPARC_SIGCONTEXT_H
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
#define __SUNOS_MAXWIN 31
|
|
||||||
|
|
||||||
/* This is what SunOS does, so shall I. */
|
|
||||||
struct sigcontext {
|
|
||||||
int sigc_onstack; /* state to restore */
|
|
||||||
int sigc_mask; /* sigmask to restore */
|
|
||||||
int sigc_sp; /* stack pointer */
|
|
||||||
int sigc_pc; /* program counter */
|
|
||||||
int sigc_npc; /* next program counter */
|
|
||||||
int sigc_psr; /* for condition codes etc */
|
|
||||||
int sigc_g1; /* User uses these two registers */
|
|
||||||
int sigc_o0; /* within the trampoline code. */
|
|
||||||
|
|
||||||
/* Now comes information regarding the users window set
|
|
||||||
* at the time of the signal.
|
|
||||||
*/
|
|
||||||
int sigc_oswins; /* outstanding windows */
|
|
||||||
|
|
||||||
/* stack ptrs for each regwin buf */
|
|
||||||
char *sigc_spbuf[__SUNOS_MAXWIN];
|
|
||||||
|
|
||||||
/* Windows to restore after signal */
|
|
||||||
struct {
|
|
||||||
unsigned long locals[8];
|
|
||||||
unsigned long ins[8];
|
|
||||||
} sigc_wbuf[__SUNOS_MAXWIN];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct {
|
|
||||||
unsigned long psr;
|
|
||||||
unsigned long pc;
|
|
||||||
unsigned long npc;
|
|
||||||
unsigned long y;
|
|
||||||
unsigned long u_regs[16]; /* globals and ins */
|
|
||||||
} si_regs;
|
|
||||||
int si_mask;
|
|
||||||
} __siginfo_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned long si_float_regs [32];
|
|
||||||
unsigned long si_fsr;
|
|
||||||
unsigned long si_fpqdepth;
|
|
||||||
struct {
|
|
||||||
unsigned long *insn_addr;
|
|
||||||
unsigned long insn;
|
|
||||||
} si_fpqueue [16];
|
|
||||||
} __siginfo_fpu_t;
|
|
||||||
|
|
||||||
#endif /* !(__ASSEMBLY__) */
|
|
||||||
|
|
||||||
#endif /* (__KERNEL__) */
|
|
||||||
|
|
||||||
#endif /* !(__SPARC_SIGCONTEXT_H) */
|
|
|
@ -1,87 +0,0 @@
|
||||||
#ifndef __SPARC64_SIGCONTEXT_H
|
|
||||||
#define __SPARC64_SIGCONTEXT_H
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
#define __SUNOS_MAXWIN 31
|
|
||||||
|
|
||||||
/* This is what SunOS does, so shall I unless we use new 32bit signals or rt signals. */
|
|
||||||
struct sigcontext32 {
|
|
||||||
int sigc_onstack; /* state to restore */
|
|
||||||
int sigc_mask; /* sigmask to restore */
|
|
||||||
int sigc_sp; /* stack pointer */
|
|
||||||
int sigc_pc; /* program counter */
|
|
||||||
int sigc_npc; /* next program counter */
|
|
||||||
int sigc_psr; /* for condition codes etc */
|
|
||||||
int sigc_g1; /* User uses these two registers */
|
|
||||||
int sigc_o0; /* within the trampoline code. */
|
|
||||||
|
|
||||||
/* Now comes information regarding the users window set
|
|
||||||
* at the time of the signal.
|
|
||||||
*/
|
|
||||||
int sigc_oswins; /* outstanding windows */
|
|
||||||
|
|
||||||
/* stack ptrs for each regwin buf */
|
|
||||||
unsigned sigc_spbuf[__SUNOS_MAXWIN];
|
|
||||||
|
|
||||||
/* Windows to restore after signal */
|
|
||||||
struct reg_window32 sigc_wbuf[__SUNOS_MAXWIN];
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
/* This is what we use for 32bit new non-rt signals. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct {
|
|
||||||
unsigned int psr;
|
|
||||||
unsigned int pc;
|
|
||||||
unsigned int npc;
|
|
||||||
unsigned int y;
|
|
||||||
unsigned int u_regs[16]; /* globals and ins */
|
|
||||||
} si_regs;
|
|
||||||
int si_mask;
|
|
||||||
} __siginfo32_t;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int si_float_regs [64];
|
|
||||||
unsigned long si_fsr;
|
|
||||||
unsigned long si_gsr;
|
|
||||||
unsigned long si_fprs;
|
|
||||||
} __siginfo_fpu_t;
|
|
||||||
|
|
||||||
/* This is what SunOS doesn't, so we have to write this alone
|
|
||||||
and do it properly. */
|
|
||||||
struct sigcontext {
|
|
||||||
/* The size of this array has to match SI_MAX_SIZE from siginfo.h */
|
|
||||||
char sigc_info[128];
|
|
||||||
struct {
|
|
||||||
unsigned long u_regs[16]; /* globals and ins */
|
|
||||||
unsigned long tstate;
|
|
||||||
unsigned long tpc;
|
|
||||||
unsigned long tnpc;
|
|
||||||
unsigned int y;
|
|
||||||
unsigned int fprs;
|
|
||||||
} sigc_regs;
|
|
||||||
__siginfo_fpu_t * sigc_fpu_save;
|
|
||||||
struct {
|
|
||||||
void * ss_sp;
|
|
||||||
int ss_flags;
|
|
||||||
unsigned long ss_size;
|
|
||||||
} sigc_stack;
|
|
||||||
unsigned long sigc_mask;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* !(__ASSEMBLY__) */
|
|
||||||
|
|
||||||
#endif /* !(__SPARC64_SIGCONTEXT_H) */
|
|
|
@ -1,8 +1,37 @@
|
||||||
#ifndef ___ASM_SPARC_SIGINFO_H
|
#ifndef __SPARC_SIGINFO_H
|
||||||
#define ___ASM_SPARC_SIGINFO_H
|
#define __SPARC_SIGINFO_H
|
||||||
|
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
#if defined(__sparc__) && defined(__arch64__)
|
||||||
#include <asm/siginfo_64.h>
|
|
||||||
#else
|
#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
|
||||||
#include <asm/siginfo_32.h>
|
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
|
||||||
#endif
|
#define __ARCH_SI_BAND_T int
|
||||||
#endif
|
|
||||||
|
#endif /* defined(__sparc__) && defined(__arch64__) */
|
||||||
|
|
||||||
|
|
||||||
|
#define __ARCH_SI_TRAPNO
|
||||||
|
|
||||||
|
#include <asm-generic/siginfo.h>
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#include <linux/compat.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
|
||||||
|
struct compat_siginfo;
|
||||||
|
|
||||||
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
#define SI_NOINFO 32767 /* no information in siginfo_t */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SIGEMT si_codes
|
||||||
|
*/
|
||||||
|
#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */
|
||||||
|
#define NSIGEMT 1
|
||||||
|
|
||||||
|
#endif /* !(__SPARC_SIGINFO_H) */
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
#ifndef _SPARC_SIGINFO_H
|
|
||||||
#define _SPARC_SIGINFO_H
|
|
||||||
|
|
||||||
#define __ARCH_SI_UID_T unsigned int
|
|
||||||
#define __ARCH_SI_TRAPNO
|
|
||||||
|
|
||||||
#include <asm-generic/siginfo.h>
|
|
||||||
|
|
||||||
#define SI_NOINFO 32767 /* no information in siginfo_t */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SIGEMT si_codes
|
|
||||||
*/
|
|
||||||
#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */
|
|
||||||
#define NSIGEMT 1
|
|
||||||
|
|
||||||
#endif /* !(_SPARC_SIGINFO_H) */
|
|
|
@ -1,32 +0,0 @@
|
||||||
#ifndef _SPARC64_SIGINFO_H
|
|
||||||
#define _SPARC64_SIGINFO_H
|
|
||||||
|
|
||||||
#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
|
|
||||||
|
|
||||||
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
|
|
||||||
#define __ARCH_SI_TRAPNO
|
|
||||||
#define __ARCH_SI_BAND_T int
|
|
||||||
|
|
||||||
#include <asm-generic/siginfo.h>
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
#include <linux/compat.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
|
||||||
|
|
||||||
struct compat_siginfo;
|
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
|
||||||
|
|
||||||
#define SI_NOINFO 32767 /* no information in siginfo_t */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SIGEMT si_codes
|
|
||||||
*/
|
|
||||||
#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */
|
|
||||||
#define NSIGEMT 1
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,8 +1,210 @@
|
||||||
#ifndef ___ASM_SPARC_SIGNAL_H
|
#ifndef __SPARC_SIGNAL_H
|
||||||
#define ___ASM_SPARC_SIGNAL_H
|
#define __SPARC_SIGNAL_H
|
||||||
#if defined(__sparc__) && defined(__arch64__)
|
|
||||||
#include <asm/signal_64.h>
|
#include <asm/sigcontext.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
#include <linux/personality.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On the Sparc the signal handlers get passed a 'sub-signal' code
|
||||||
|
* for certain signal types, which we document here.
|
||||||
|
*/
|
||||||
|
#define SIGHUP 1
|
||||||
|
#define SIGINT 2
|
||||||
|
#define SIGQUIT 3
|
||||||
|
#define SIGILL 4
|
||||||
|
#define SUBSIG_STACK 0
|
||||||
|
#define SUBSIG_ILLINST 2
|
||||||
|
#define SUBSIG_PRIVINST 3
|
||||||
|
#define SUBSIG_BADTRAP(t) (0x80 + (t))
|
||||||
|
|
||||||
|
#define SIGTRAP 5
|
||||||
|
#define SIGABRT 6
|
||||||
|
#define SIGIOT 6
|
||||||
|
|
||||||
|
#define SIGEMT 7
|
||||||
|
#define SUBSIG_TAG 10
|
||||||
|
|
||||||
|
#define SIGFPE 8
|
||||||
|
#define SUBSIG_FPDISABLED 0x400
|
||||||
|
#define SUBSIG_FPERROR 0x404
|
||||||
|
#define SUBSIG_FPINTOVFL 0x001
|
||||||
|
#define SUBSIG_FPSTSIG 0x002
|
||||||
|
#define SUBSIG_IDIVZERO 0x014
|
||||||
|
#define SUBSIG_FPINEXACT 0x0c4
|
||||||
|
#define SUBSIG_FPDIVZERO 0x0c8
|
||||||
|
#define SUBSIG_FPUNFLOW 0x0cc
|
||||||
|
#define SUBSIG_FPOPERROR 0x0d0
|
||||||
|
#define SUBSIG_FPOVFLOW 0x0d4
|
||||||
|
|
||||||
|
#define SIGKILL 9
|
||||||
|
#define SIGBUS 10
|
||||||
|
#define SUBSIG_BUSTIMEOUT 1
|
||||||
|
#define SUBSIG_ALIGNMENT 2
|
||||||
|
#define SUBSIG_MISCERROR 5
|
||||||
|
|
||||||
|
#define SIGSEGV 11
|
||||||
|
#define SUBSIG_NOMAPPING 3
|
||||||
|
#define SUBSIG_PROTECTION 4
|
||||||
|
#define SUBSIG_SEGERROR 5
|
||||||
|
|
||||||
|
#define SIGSYS 12
|
||||||
|
|
||||||
|
#define SIGPIPE 13
|
||||||
|
#define SIGALRM 14
|
||||||
|
#define SIGTERM 15
|
||||||
|
#define SIGURG 16
|
||||||
|
|
||||||
|
/* SunOS values which deviate from the Linux/i386 ones */
|
||||||
|
#define SIGSTOP 17
|
||||||
|
#define SIGTSTP 18
|
||||||
|
#define SIGCONT 19
|
||||||
|
#define SIGCHLD 20
|
||||||
|
#define SIGTTIN 21
|
||||||
|
#define SIGTTOU 22
|
||||||
|
#define SIGIO 23
|
||||||
|
#define SIGPOLL SIGIO /* SysV name for SIGIO */
|
||||||
|
#define SIGXCPU 24
|
||||||
|
#define SIGXFSZ 25
|
||||||
|
#define SIGVTALRM 26
|
||||||
|
#define SIGPROF 27
|
||||||
|
#define SIGWINCH 28
|
||||||
|
#define SIGLOST 29
|
||||||
|
#define SIGPWR SIGLOST
|
||||||
|
#define SIGUSR1 30
|
||||||
|
#define SIGUSR2 31
|
||||||
|
|
||||||
|
/* Most things should be clean enough to redefine this at will, if care
|
||||||
|
is taken to make libc match. */
|
||||||
|
|
||||||
|
#define __OLD_NSIG 32
|
||||||
|
#define __NEW_NSIG 64
|
||||||
|
#define _NSIG_BPW 64
|
||||||
|
#define _NSIG_WORDS (__NEW_NSIG / _NSIG_BPW)
|
||||||
|
|
||||||
|
#define SIGRTMIN 32
|
||||||
|
#define SIGRTMAX __NEW_NSIG
|
||||||
|
|
||||||
|
#if defined(__KERNEL__) || defined(__WANT_POSIX1B_SIGNALS__)
|
||||||
|
#define _NSIG __NEW_NSIG
|
||||||
|
#define __new_sigset_t sigset_t
|
||||||
|
#define __new_sigaction sigaction
|
||||||
|
#define __new_sigaction32 sigaction32
|
||||||
|
#define __old_sigset_t old_sigset_t
|
||||||
|
#define __old_sigaction old_sigaction
|
||||||
|
#define __old_sigaction32 old_sigaction32
|
||||||
#else
|
#else
|
||||||
#include <asm/signal_32.h>
|
#define _NSIG __OLD_NSIG
|
||||||
|
#define NSIG _NSIG
|
||||||
|
#define __old_sigset_t sigset_t
|
||||||
|
#define __old_sigaction sigaction
|
||||||
|
#define __old_sigaction32 sigaction32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
typedef unsigned long __old_sigset_t; /* at least 32 bits */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned long sig[_NSIG_WORDS];
|
||||||
|
} __new_sigset_t;
|
||||||
|
|
||||||
|
/* A SunOS sigstack */
|
||||||
|
struct sigstack {
|
||||||
|
/* XXX 32-bit pointers pinhead XXX */
|
||||||
|
char *the_stack;
|
||||||
|
int cur_status;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Sigvec flags */
|
||||||
|
#define _SV_SSTACK 1u /* This signal handler should use sig-stack */
|
||||||
|
#define _SV_INTR 2u /* Sig return should not restart system call */
|
||||||
|
#define _SV_RESET 4u /* Set handler to SIG_DFL upon taken signal */
|
||||||
|
#define _SV_IGNCHILD 8u /* Do not send SIGCHLD */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sa_flags values: SA_STACK is not currently supported, but will allow the
|
||||||
|
* usage of signal stacks by using the (now obsolete) sa_restorer field in
|
||||||
|
* the sigaction structure as a stack pointer. This is now possible due to
|
||||||
|
* the changes in signal handling. LBT 010493.
|
||||||
|
* SA_RESTART flag to get restarting signals (which were the default long ago)
|
||||||
|
*/
|
||||||
|
#define SA_NOCLDSTOP _SV_IGNCHILD
|
||||||
|
#define SA_STACK _SV_SSTACK
|
||||||
|
#define SA_ONSTACK _SV_SSTACK
|
||||||
|
#define SA_RESTART _SV_INTR
|
||||||
|
#define SA_ONESHOT _SV_RESET
|
||||||
|
#define SA_NOMASK 0x20u
|
||||||
|
#define SA_NOCLDWAIT 0x100u
|
||||||
|
#define SA_SIGINFO 0x200u
|
||||||
|
|
||||||
|
|
||||||
|
#define SIG_BLOCK 0x01 /* for blocking signals */
|
||||||
|
#define SIG_UNBLOCK 0x02 /* for unblocking signals */
|
||||||
|
#define SIG_SETMASK 0x04 /* for setting the signal mask */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sigaltstack controls
|
||||||
|
*/
|
||||||
|
#define SS_ONSTACK 1
|
||||||
|
#define SS_DISABLE 2
|
||||||
|
|
||||||
|
#define MINSIGSTKSZ 4096
|
||||||
|
#define SIGSTKSZ 16384
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
/*
|
||||||
|
* DJHR
|
||||||
|
* SA_STATIC_ALLOC is used for the sparc32 system to indicate that this
|
||||||
|
* interrupt handler's irq structure should be statically allocated
|
||||||
|
* by the request_irq routine.
|
||||||
|
* The alternative is that arch/sparc/kernel/irq.c has carnal knowledge
|
||||||
|
* of interrupt usage and that sucks. Also without a flag like this
|
||||||
|
* it may be possible for the free_irq routine to attempt to free
|
||||||
|
* statically allocated data.. which is NOT GOOD.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define SA_STATIC_ALLOC 0x8000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <asm-generic/signal.h>
|
||||||
|
|
||||||
|
struct __new_sigaction {
|
||||||
|
__sighandler_t sa_handler;
|
||||||
|
unsigned long sa_flags;
|
||||||
|
__sigrestore_t sa_restorer; /* not used by Linux/SPARC yet */
|
||||||
|
__new_sigset_t sa_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct __old_sigaction {
|
||||||
|
__sighandler_t sa_handler;
|
||||||
|
__old_sigset_t sa_mask;
|
||||||
|
unsigned long sa_flags;
|
||||||
|
void (*sa_restorer)(void); /* not used by Linux/SPARC yet */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct sigaltstack {
|
||||||
|
void __user *ss_sp;
|
||||||
|
int ss_flags;
|
||||||
|
size_t ss_size;
|
||||||
|
} stack_t;
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
struct k_sigaction {
|
||||||
|
struct __new_sigaction sa;
|
||||||
|
void __user *ka_restorer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
||||||
|
|
||||||
|
#endif /* !(__KERNEL__) */
|
||||||
|
|
||||||
|
#endif /* !(__ASSEMBLY__) */
|
||||||
|
|
||||||
|
#endif /* !(__SPARC_SIGNAL_H) */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue