mirror of https://gitee.com/openkylin/linux.git
Merge branches 'x86/cleanups', 'x86/mpparse', 'x86/numa' and 'x86/uv' into x86/urgent
This commit is contained in:
commit
0936912274
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
|
||||
|
||||
N: Hugh Blemings
|
||||
E: hugh@misc.nu
|
||||
W: http://misc.nu/hugh/
|
||||
D: Author and maintainer of the Keyspan USB to Serial drivers
|
||||
S: Po Box 234
|
||||
E: hugh@blemings.org
|
||||
W: http://blemings.org/hugh
|
||||
D: Original author of the Keyspan USB to serial drivers, random PowerPC hacker
|
||||
S: PO Box 234
|
||||
S: Belconnen ACT 2616
|
||||
S: Australia
|
||||
|
||||
|
|
|
@ -31,3 +31,51 @@ not defined by include/asm-XXX/topology.h:
|
|||
2) core_id: 0
|
||||
3) thread_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
|
||||
- Directory change notification (F_NOTIFY)
|
||||
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
|
||||
- POSIX ACLs
|
||||
|
||||
Mount options
|
||||
=============
|
||||
|
@ -79,3 +78,5 @@ inode64 Indicates that Ocfs2 is allowed to create inodes at
|
|||
bits of significance.
|
||||
user_xattr (*) Enables 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 a file can go unnoticed.
|
||||
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
|
||||
|
|
|
@ -97,6 +97,7 @@ Code Seq# Include File Comments
|
|||
<http://linux01.gwdg.de/~alatham/ppdd.html>
|
||||
'M' all linux/soundcard.h
|
||||
'N' 00-1F drivers/usb/scanner.h
|
||||
'O' 00-02 include/mtd/ubi-user.h UBI
|
||||
'P' all linux/soundcard.h
|
||||
'Q' all linux/soundcard.h
|
||||
'R' 00-1F linux/random.h
|
||||
|
@ -142,6 +143,9 @@ Code Seq# Include File Comments
|
|||
'n' 00-7F linux/ncp_fs.h
|
||||
'n' E0-FF video/matrox.h matroxfb
|
||||
'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-3F linux/mc146818rtc.h conflict!
|
||||
'p' 40-7F linux/nvram.h
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
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
|
||||
- specification of Config Language, the language in Kconfig files
|
||||
makefiles.txt
|
||||
|
|
|
@ -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.
|
|
@ -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]
|
||||
152 -> Asus Tiger Rev:1.00 [1043:4857]
|
||||
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
|
||||
- 06e1:a155: ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF)
|
||||
- 1b80:d700: KWorld USB FM Radio SnapMusic Mobile 700 (FM700)
|
||||
- 10c5:819a: DealExtreme USB Radio
|
||||
|
||||
|
||||
Software
|
||||
|
|
|
@ -184,7 +184,7 @@ may be NULL if the subdev driver does not support anything from that category.
|
|||
It looks like this:
|
||||
|
||||
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 (*init)(struct v4l2_subdev *sd, u32 val);
|
||||
...
|
||||
|
@ -390,16 +390,18 @@ allocated memory.
|
|||
|
||||
You should also set these fields:
|
||||
|
||||
- parent: set to the parent device (same device as was used to register
|
||||
v4l2_device).
|
||||
- v4l2_dev: set to the v4l2_device parent device.
|
||||
- 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
|
||||
(highly recommended to use this and it might become compulsory in the
|
||||
future!), then set this to your v4l2_ioctl_ops struct.
|
||||
|
||||
If you use v4l2_ioctl_ops, then you should set .unlocked_ioctl to
|
||||
__video_ioctl2 or .ioctl to video_ioctl2 in your file_operations struct.
|
||||
If you use v4l2_ioctl_ops, then you should set either .unlocked_ioctl or
|
||||
.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
|
||||
|
@ -410,7 +412,7 @@ for you.
|
|||
|
||||
err = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
if (err) {
|
||||
video_device_release(vdev); // or kfree(my_vdev);
|
||||
video_device_release(vdev); /* or kfree(my_vdev); */
|
||||
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:
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
S: Supported
|
||||
|
||||
SPARC (sparc32)
|
||||
P: William L. Irwin
|
||||
M: wli@holomorphy.com
|
||||
SPARC + UltraSPARC (sparc/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
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
||||
S: Maintained
|
||||
|
||||
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
||||
|
@ -4302,13 +4304,6 @@ M: dushistov@mail.ru
|
|||
L: linux-kernel@vger.kernel.org
|
||||
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:
|
||||
P: David Vrabel
|
||||
M: david.vrabel@csr.com
|
||||
|
|
3
Makefile
3
Makefile
|
@ -321,7 +321,8 @@ KALLSYMS = scripts/kallsyms
|
|||
PERL = perl
|
||||
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
|
||||
CFLAGS_MODULE = $(MODFLAGS)
|
||||
AFLAGS_MODULE = $(MODFLAGS)
|
||||
|
|
32
README
32
README
|
@ -52,11 +52,11 @@ DOCUMENTATION:
|
|||
|
||||
- The Documentation/DocBook/ subdirectory contains several guides for
|
||||
kernel developers and users. These guides can be rendered in a
|
||||
number of formats: PostScript (.ps), PDF, and HTML, among others.
|
||||
After installation, "make psdocs", "make pdfdocs", or "make htmldocs"
|
||||
will render the documentation in the requested format.
|
||||
number of formats: PostScript (.ps), PDF, HTML, & man-pages, among others.
|
||||
After installation, "make psdocs", "make pdfdocs", "make htmldocs",
|
||||
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
|
||||
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
|
||||
values to random values.
|
||||
|
||||
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can
|
||||
also use the environment variable KCONFIG_ALLCONFIG to specify a
|
||||
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.
|
||||
|
||||
You can find more information on using the Linux kernel config tools
|
||||
in Documentation/kbuild/make-configs.txt.
|
||||
|
||||
NOTES on "make config":
|
||||
- having unnecessary drivers will make the kernel bigger, and can
|
||||
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
|
||||
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
|
||||
especially true for the development releases, since each new release
|
||||
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;
|
||||
}
|
||||
|
||||
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 cpumask_of_pcibus(bus) (cpu_online_mask)
|
||||
|
||||
#endif /* !CONFIG_NUMA */
|
||||
# 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 \
|
||||
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_SMP) += smp.o
|
||||
|
|
|
@ -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])
|
||||
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);
|
||||
last_cpu = cpu;
|
||||
|
||||
|
|
|
@ -79,6 +79,11 @@ int alpha_l3_cacheshape;
|
|||
unsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON;
|
||||
#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. */
|
||||
int boot_cpuid;
|
||||
|
||||
|
|
|
@ -2321,7 +2321,7 @@ static struct clk i2c2_fck = {
|
|||
};
|
||||
|
||||
static struct clk i2chs2_fck = {
|
||||
.name = "i2chs_fck",
|
||||
.name = "i2c_fck",
|
||||
.id = 2,
|
||||
.parent = &func_96m_ck,
|
||||
.flags = CLOCK_IN_OMAP243X,
|
||||
|
@ -2354,7 +2354,7 @@ static struct clk i2c1_fck = {
|
|||
};
|
||||
|
||||
static struct clk i2chs1_fck = {
|
||||
.name = "i2chs_fck",
|
||||
.name = "i2c_fck",
|
||||
.id = 1,
|
||||
.parent = &func_96m_ck,
|
||||
.flags = CLOCK_IN_OMAP243X,
|
||||
|
|
|
@ -263,6 +263,11 @@ static inline int fls(unsigned long word)
|
|||
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 size);
|
||||
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__ */
|
||||
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.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
|
||||
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
#include <asm-generic/bitops/hweight.h>
|
||||
#include <asm-generic/bitops/find.h>
|
||||
|
|
|
@ -207,6 +207,7 @@ static __inline__ unsigned long __ffs(unsigned long word)
|
|||
#endif /* __KERNEL__ */
|
||||
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#endif /* _H8300_BITOPS_H */
|
||||
|
|
|
@ -687,3 +687,6 @@ config IRQ_PER_CPU
|
|||
|
||||
config IOMMU_HELPER
|
||||
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);
|
||||
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
|
||||
|
||||
|
|
|
@ -467,7 +467,7 @@ struct kvm_arch {
|
|||
struct kvm_sal_data rdv_sal_data;
|
||||
|
||||
struct list_head assigned_dev_head;
|
||||
struct dmar_domain *intel_iommu_domain;
|
||||
struct iommu_domain *iommu_domain;
|
||||
struct hlist_head irq_ack_notifier_list;
|
||||
|
||||
unsigned long irq_sources_bitmap;
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
* Returns a bitmask of CPUs on Node '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'.
|
||||
|
@ -45,7 +46,7 @@
|
|||
/*
|
||||
* 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
|
||||
|
@ -109,6 +110,8 @@ void build_cpu_to_node_map(void);
|
|||
#define topology_core_id(cpu) (cpu_data(cpu)->core_id)
|
||||
#define topology_core_siblings(cpu) (cpu_core_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)
|
||||
#endif
|
||||
|
||||
|
@ -119,6 +122,10 @@ extern void arch_fix_phys_package_id(int num, u32 slot);
|
|||
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>
|
||||
|
||||
#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
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static int total_cpus __initdata;
|
||||
static int available_cpus __initdata;
|
||||
struct acpi_table_madt *acpi_madt __initdata;
|
||||
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);
|
||||
|
||||
if (node >= MAX_NUMNODES || !node_online(node) ||
|
||||
cpus_empty(node_to_cpumask(node)))
|
||||
cpumask_empty(cpumask_of_node(node)))
|
||||
return AE_OK;
|
||||
|
||||
/* We know a gsi to node mapping! */
|
||||
|
|
|
@ -695,32 +695,31 @@ get_target_cpu (unsigned int gsi, int irq)
|
|||
#ifdef CONFIG_NUMA
|
||||
{
|
||||
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);
|
||||
if (iosapic_index < 0 ||
|
||||
iosapic_lists[iosapic_index].node == MAX_NUMNODES)
|
||||
goto skip_numa_setup;
|
||||
|
||||
cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node);
|
||||
cpus_and(cpu_mask, cpu_mask, domain);
|
||||
for_each_cpu_mask(numa_cpu, cpu_mask) {
|
||||
if (!cpu_online(numa_cpu))
|
||||
cpu_clear(numa_cpu, cpu_mask);
|
||||
cpu_mask = cpumask_of_node(iosapic_lists[iosapic_index].node);
|
||||
num_cpus = 0;
|
||||
for_each_cpu_and(numa_cpu, cpu_mask, &domain) {
|
||||
if (cpu_online(numa_cpu))
|
||||
num_cpus++;
|
||||
}
|
||||
|
||||
num_cpus = cpus_weight(cpu_mask);
|
||||
|
||||
if (!num_cpus)
|
||||
goto skip_numa_setup;
|
||||
|
||||
/* Use irq assignment to distribute across cpus in node */
|
||||
cpu_index = irq % num_cpus;
|
||||
|
||||
for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++)
|
||||
numa_cpu = next_cpu(numa_cpu, cpu_mask);
|
||||
for_each_cpu_and(numa_cpu, cpu_mask, &domain)
|
||||
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);
|
||||
}
|
||||
skip_numa_setup:
|
||||
|
@ -731,7 +730,7 @@ get_target_cpu (unsigned int gsi, int irq)
|
|||
* case of NUMA.)
|
||||
*/
|
||||
do {
|
||||
if (++cpu >= NR_CPUS)
|
||||
if (++cpu >= nr_cpu_ids)
|
||||
cpu = 0;
|
||||
} 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")) {
|
||||
/* 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 true;
|
||||
|
|
|
@ -93,13 +93,14 @@ void ia64_account_on_switch(struct task_struct *prev, struct task_struct *next)
|
|||
now = ia64_get_itc();
|
||||
|
||||
delta_stime = cycle_to_cputime(pi->ac_stime + (now - pi->ac_stamp));
|
||||
account_system_time(prev, 0, delta_stime);
|
||||
account_system_time_scaled(prev, delta_stime);
|
||||
if (idle_task(smp_processor_id()) != prev)
|
||||
account_system_time(prev, 0, delta_stime, delta_stime);
|
||||
else
|
||||
account_idle_time(delta_stime);
|
||||
|
||||
if (pi->ac_utime) {
|
||||
delta_utime = cycle_to_cputime(pi->ac_utime);
|
||||
account_user_time(prev, delta_utime);
|
||||
account_user_time_scaled(prev, delta_utime);
|
||||
account_user_time(prev, delta_utime, delta_utime);
|
||||
}
|
||||
|
||||
pi->ac_stamp = ni->ac_stamp = now;
|
||||
|
@ -122,8 +123,10 @@ void account_system_vtime(struct task_struct *tsk)
|
|||
now = ia64_get_itc();
|
||||
|
||||
delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp));
|
||||
account_system_time(tsk, 0, delta_stime);
|
||||
account_system_time_scaled(tsk, delta_stime);
|
||||
if (irq_count() || idle_task(smp_processor_id()) != tsk)
|
||||
account_system_time(tsk, 0, delta_stime, delta_stime);
|
||||
else
|
||||
account_idle_time(delta_stime);
|
||||
ti->ac_stime = 0;
|
||||
|
||||
ti->ac_stamp = now;
|
||||
|
@ -143,8 +146,7 @@ void account_process_tick(struct task_struct *p, int user_tick)
|
|||
|
||||
if (ti->ac_utime) {
|
||||
delta_utime = cycle_to_cputime(ti->ac_utime);
|
||||
account_user_time(p, delta_utime);
|
||||
account_user_time_scaled(p, delta_utime);
|
||||
account_user_time(p, delta_utime, delta_utime);
|
||||
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 \
|
||||
coalesced_mmio.o irq_comm.o)
|
||||
|
||||
ifeq ($(CONFIG_DMAR),y)
|
||||
common-objs += $(addprefix ../../../virt/kvm/, vtd.o)
|
||||
ifeq ($(CONFIG_IOMMU_API),y)
|
||||
common-objs += $(addprefix ../../../virt/kvm/, iommu.o)
|
||||
endif
|
||||
|
||||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/intel-iommu.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -188,7 +189,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
|||
r = KVM_COALESCED_MMIO_PAGE_OFFSET;
|
||||
break;
|
||||
case KVM_CAP_IOMMU:
|
||||
r = intel_iommu_found();
|
||||
r = iommu_found();
|
||||
break;
|
||||
default:
|
||||
r = 0;
|
||||
|
|
|
@ -385,7 +385,6 @@ static int sn_topology_show(struct seq_file *s, void *d)
|
|||
int j;
|
||||
const char *slabname;
|
||||
int ordinal;
|
||||
cpumask_t cpumask;
|
||||
char slice;
|
||||
struct cpuinfo_ia64 *c;
|
||||
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
|
||||
*/
|
||||
if (!SN_HWPERF_IS_IONODE(obj)) {
|
||||
cpumask = node_to_cpumask(ordinal);
|
||||
for_each_online_cpu(i) {
|
||||
if (cpu_isset(i, cpumask)) {
|
||||
slice = 'a' + cpuid_to_slice(i);
|
||||
c = cpu_data(i);
|
||||
seq_printf(s, "cpu %d %s%c local"
|
||||
" freq %luMHz, arch ia64",
|
||||
i, obj->location, slice,
|
||||
c->proc_freq / 1000000);
|
||||
for_each_online_cpu(j) {
|
||||
seq_printf(s, j ? ":%d" : ", dist %d",
|
||||
node_distance(
|
||||
for_each_cpu_and(i, cpu_online_mask,
|
||||
cpumask_of_node(ordinal)) {
|
||||
slice = 'a' + cpuid_to_slice(i);
|
||||
c = cpu_data(i);
|
||||
seq_printf(s, "cpu %d %s%c local"
|
||||
" freq %luMHz, arch ia64",
|
||||
i, obj->location, slice,
|
||||
c->proc_freq / 1000000);
|
||||
for_each_online_cpu(j) {
|
||||
seq_printf(s, j ? ":%d" : ", dist %d",
|
||||
node_distance(
|
||||
cpu_to_node(i),
|
||||
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
|
||||
* accordingly.
|
||||
*/
|
||||
for (i = 0; i < NR_CPUS; ++i)
|
||||
for_each_possible_cpu(i)
|
||||
per_cpu(prof_multiplier, i) = multiplier;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -280,7 +280,6 @@ config M68060
|
|||
|
||||
config MMU_MOTOROLA
|
||||
bool
|
||||
depends on MMU && !MMU_SUN3
|
||||
|
||||
config MMU_SUN3
|
||||
bool
|
||||
|
|
|
@ -331,6 +331,7 @@ static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned lon
|
|||
#endif /* __KERNEL__ */
|
||||
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.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 parent_node(node) (node)
|
||||
#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;
|
||||
extern int pcibus_to_node(struct pci_bus *);
|
||||
|
||||
#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];
|
||||
|
||||
|
|
|
@ -23,8 +23,10 @@ struct mod_arch_specific
|
|||
{
|
||||
unsigned long got_offset, got_count, got_max;
|
||||
unsigned long fdesc_offset, fdesc_count, fdesc_max;
|
||||
unsigned long stub_offset, stub_count, stub_max;
|
||||
unsigned long init_stub_offset, init_stub_count, init_stub_max;
|
||||
struct {
|
||||
unsigned long stub_offset;
|
||||
unsigned int stub_entries;
|
||||
} *section;
|
||||
int unwind_section;
|
||||
struct unwind_table *unwind;
|
||||
};
|
||||
|
|
|
@ -16,8 +16,6 @@
|
|||
#include <linux/cpumask.h>
|
||||
typedef unsigned long address_t;
|
||||
|
||||
extern cpumask_t cpu_online_map;
|
||||
|
||||
|
||||
/*
|
||||
* Private routines/data
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
*
|
||||
* Linux/PA-RISC Project (http://www.parisc-linux.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
|
||||
|
@ -24,6 +25,19 @@
|
|||
*
|
||||
*
|
||||
* 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
|
||||
* We are not doing SEGREL32 handling correctly. According to the ABI, we
|
||||
* should do a value offset, like this:
|
||||
|
@ -58,9 +72,13 @@
|
|||
#define DEBUGP(fmt...)
|
||||
#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) \
|
||||
if ( ( !((val) & (1<<((bits)-1))) && ((val)>>(bits)) != 0 ) || \
|
||||
( ((val) & (1<<((bits)-1))) && ((val)>>(bits)) != (((__typeof__(val))(~0))>>((bits)+2)))) { \
|
||||
if (!RELOC_REACHABLE(val, bits)) { \
|
||||
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); \
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
struct got_entry {
|
||||
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 */
|
||||
void module_free(struct module *mod, void *module_region)
|
||||
{
|
||||
kfree(mod->arch.section);
|
||||
mod->arch.section = NULL;
|
||||
|
||||
vfree(module_region);
|
||||
/* FIXME: If module_region == mod->init_region, trim exception
|
||||
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
|
||||
int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||
CONST Elf_Shdr *sechdrs,
|
||||
CONST char *secstrings,
|
||||
struct module *me)
|
||||
{
|
||||
unsigned long gots = 0, fdescs = 0, stubs = 0, init_stubs = 0;
|
||||
unsigned long gots = 0, fdescs = 0, len;
|
||||
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++) {
|
||||
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 int count, s;
|
||||
|
||||
if (strncmp(secstrings + sechdrs[i].sh_name,
|
||||
".PARISC.unwind", 14) == 0)
|
||||
|
@ -290,11 +320,23 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
|||
*/
|
||||
gots += count_gots(rels, nrels);
|
||||
fdescs += count_fdescs(rels, nrels);
|
||||
if(strncmp(secstrings + sechdrs[i].sh_name,
|
||||
".rela.init", 10) == 0)
|
||||
init_stubs += count_stubs(rels, nrels);
|
||||
else
|
||||
stubs += count_stubs(rels, nrels);
|
||||
|
||||
/* XXX: By sorting the relocs and finding duplicate entries
|
||||
* we could reduce the number of necessary stubs and save
|
||||
* some memory. */
|
||||
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 */
|
||||
|
@ -306,18 +348,8 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
|||
me->arch.fdesc_offset = me->core_size;
|
||||
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.fdesc_max = fdescs;
|
||||
me->arch.stub_max = stubs;
|
||||
me->arch.init_stub_max = init_stubs;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -380,23 +412,27 @@ enum elf_stub_type {
|
|||
};
|
||||
|
||||
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;
|
||||
|
||||
if(init_section) {
|
||||
i = me->arch.init_stub_count++;
|
||||
BUG_ON(me->arch.init_stub_count > me->arch.init_stub_max);
|
||||
stub = me->module_init + me->arch.init_stub_offset +
|
||||
i * sizeof(struct stub_entry);
|
||||
} else {
|
||||
i = me->arch.stub_count++;
|
||||
BUG_ON(me->arch.stub_count > me->arch.stub_max);
|
||||
stub = me->module_core + me->arch.stub_offset +
|
||||
i * sizeof(struct stub_entry);
|
||||
/* initialize stub_offset to point in front of the section */
|
||||
if (!me->arch.section[targetsec].stub_offset) {
|
||||
loc0 -= (me->arch.section[targetsec].stub_entries + 1) *
|
||||
sizeof(struct stub_entry);
|
||||
/* get correct alignment for the stubs */
|
||||
loc0 = ALIGN(loc0, sizeof(struct stub_entry));
|
||||
me->arch.section[targetsec].stub_offset = loc0;
|
||||
}
|
||||
|
||||
/* 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
|
||||
/* for 32-bit the stub looks like this:
|
||||
* ldil L'XXX,%r1
|
||||
|
@ -489,15 +525,19 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||
Elf32_Addr val;
|
||||
Elf32_Sword addend;
|
||||
Elf32_Addr dot;
|
||||
Elf_Addr loc0;
|
||||
unsigned int targetsec = sechdrs[relsec].sh_info;
|
||||
//unsigned long dp = (unsigned long)$global$;
|
||||
register unsigned long dp asm ("r27");
|
||||
|
||||
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++) {
|
||||
/* 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;
|
||||
/* This is the start of the target section */
|
||||
loc0 = sechdrs[targetsec].sh_addr;
|
||||
/* This is the symbol it is referring to */
|
||||
sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
|
||||
+ ELF32_R_SYM(rel[i].r_info);
|
||||
|
@ -569,19 +609,32 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||
break;
|
||||
case R_PARISC_PCREL17F:
|
||||
/* 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;
|
||||
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);
|
||||
break;
|
||||
case R_PARISC_PCREL22F:
|
||||
/* 22-bit PC relative address; only defined for pa20 */
|
||||
val = get_stub(me, val, addend, ELF_STUB_GOT, in_init(me, loc));
|
||||
DEBUGP("STUB FOR %s loc %lx+%lx at %lx\n",
|
||||
strtab + sym->st_name, (unsigned long)loc, addend,
|
||||
val)
|
||||
/* calculate direct call offset */
|
||||
val += addend;
|
||||
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);
|
||||
break;
|
||||
|
||||
|
@ -610,13 +663,17 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||
Elf64_Addr val;
|
||||
Elf64_Sxword addend;
|
||||
Elf64_Addr dot;
|
||||
Elf_Addr loc0;
|
||||
unsigned int targetsec = sechdrs[relsec].sh_info;
|
||||
|
||||
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++) {
|
||||
/* 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;
|
||||
/* This is the start of the target section */
|
||||
loc0 = sechdrs[targetsec].sh_addr;
|
||||
/* This is the symbol it is referring to */
|
||||
sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
|
||||
+ 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",
|
||||
strtab + sym->st_name,
|
||||
loc, val);
|
||||
val += addend;
|
||||
/* 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 to the
|
||||
* module, but in a different
|
||||
* section, so stub the jump
|
||||
* in case it's more than 22
|
||||
* bits away */
|
||||
val = get_stub(me, val, addend, ELF_STUB_DIRECT,
|
||||
in_init(me, loc));
|
||||
else if (strncmp(strtab + sym->st_name, "$$", 2)
|
||||
if (in_local(me, (void *)val)) {
|
||||
/* this is the case where the symbol is local
|
||||
* to the module, but in a different section,
|
||||
* so stub the jump in case it's more than 22
|
||||
* bits away */
|
||||
val = (val - dot - 8)/4;
|
||||
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);
|
||||
} 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)
|
||||
val = get_stub(me, val, addend, ELF_STUB_MILLI,
|
||||
in_init(me, loc));
|
||||
loc0, targetsec);
|
||||
else
|
||||
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",
|
||||
strtab + sym->st_name, loc, sym->st_value,
|
||||
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;
|
||||
CHECK_RELOC(val, 22);
|
||||
*loc = (*loc & ~0x3ff1ffd) | reassemble_22(val);
|
||||
break;
|
||||
case R_PARISC_DIR64:
|
||||
|
@ -794,12 +849,8 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
addr = (u32 *)entry->addr;
|
||||
printk("INSNS: %x %x %x %x\n",
|
||||
addr[0], addr[1], addr[2], addr[3]);
|
||||
printk("stubs used %ld, stubs max %ld\n"
|
||||
"init_stubs used %ld, init stubs max %ld\n"
|
||||
"got entries used %ld, gots max %ld\n"
|
||||
printk("got entries used %ld, gots 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.fdesc_count, me->arch.fdesc_max);
|
||||
#endif
|
||||
|
@ -829,7 +880,10 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
me->name, me->arch.got_count, MAX_GOTS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
kfree(me->arch.section);
|
||||
me->arch.section = NULL;
|
||||
|
||||
/* no symbol table */
|
||||
if(symhdr == NULL)
|
||||
return 0;
|
||||
|
|
|
@ -22,11 +22,11 @@ static inline cpumask_t node_to_cpumask(int 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)
|
||||
{
|
||||
cpumask_t tmp;
|
||||
tmp = node_to_cpumask(node);
|
||||
return first_cpu(tmp);
|
||||
return cpumask_first(cpumask_of_node(node));
|
||||
}
|
||||
|
||||
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)) \
|
||||
)
|
||||
|
||||
#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 */
|
||||
#define SD_NODE_INIT (struct sched_domain) { \
|
||||
.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_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))
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/mqueue.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
|
|
@ -256,8 +256,10 @@ void account_system_vtime(struct task_struct *tsk)
|
|||
delta += sys_time;
|
||||
get_paca()->system_time = 0;
|
||||
}
|
||||
account_system_time(tsk, 0, delta);
|
||||
account_system_time_scaled(tsk, deltascaled);
|
||||
if (in_irq() || idle_task(smp_processor_id()) != tsk)
|
||||
account_system_time(tsk, 0, delta, deltascaled);
|
||||
else
|
||||
account_idle_time(delta);
|
||||
per_cpu(cputime_last_delta, smp_processor_id()) = delta;
|
||||
per_cpu(cputime_scaled_last_delta, smp_processor_id()) = deltascaled;
|
||||
local_irq_restore(flags);
|
||||
|
@ -275,10 +277,8 @@ void account_process_tick(struct task_struct *tsk, int user_tick)
|
|||
|
||||
utime = get_paca()->user_time;
|
||||
get_paca()->user_time = 0;
|
||||
account_user_time(tsk, 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();
|
||||
purr = mfspr(SPRN_PURR);
|
||||
stolen = (tb - pme->tb) - (purr - pme->purr);
|
||||
if (stolen > 0)
|
||||
account_steal_time(current, stolen);
|
||||
if (stolen > 0) {
|
||||
if (idle_task(smp_processor_id()) != current)
|
||||
account_steal_time(stolen);
|
||||
else
|
||||
account_idle_time(stolen);
|
||||
}
|
||||
pme->tb = tb;
|
||||
pme->purr = purr;
|
||||
}
|
||||
|
|
|
@ -80,10 +80,10 @@ static void cpu_affinity_set(struct spu *spu, int cpu)
|
|||
u64 route;
|
||||
|
||||
if (nr_cpus_node(spu->node)) {
|
||||
cpumask_t spumask = node_to_cpumask(spu->node);
|
||||
cpumask_t cpumask = node_to_cpumask(cpu_to_node(cpu));
|
||||
const struct cpumask *spumask = cpumask_of_node(spu->node),
|
||||
*cpumask = cpumask_of_node(cpu_to_node(cpu));
|
||||
|
||||
if (!cpus_intersects(spumask, cpumask))
|
||||
if (!cpumask_intersects(spumask, cpumask))
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,6 @@ spufs_new_inode(struct super_block *sb, int mode)
|
|||
inode->i_mode = mode;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
inode->i_blocks = 0;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
out:
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,6 @@ static struct inode *hypfs_make_inode(struct super_block *sb, int mode)
|
|||
ret->i_mode = mode;
|
||||
ret->i_uid = hypfs_info->uid;
|
||||
ret->i_gid = hypfs_info->gid;
|
||||
ret->i_blocks = 0;
|
||||
ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
|
||||
if (mode & S_IFDIR)
|
||||
ret->i_nlink = 2;
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
|
||||
struct s390_idle_data {
|
||||
spinlock_t lock;
|
||||
unsigned int in_idle;
|
||||
unsigned long long idle_count;
|
||||
unsigned long long idle_enter;
|
||||
unsigned long long idle_time;
|
||||
|
@ -22,12 +21,12 @@ struct s390_idle_data {
|
|||
|
||||
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)
|
||||
{
|
||||
if ((&__get_cpu_var(s390_idle))->in_idle)
|
||||
s390_idle_leave();
|
||||
if ((&__get_cpu_var(s390_idle))->idle_enter != 0ULL)
|
||||
vtime_start_cpu();
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_CPU_H_ */
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
#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 cputime64_t;
|
||||
|
@ -53,9 +53,9 @@ __div(unsigned long long n, unsigned int base)
|
|||
#define cputime_ge(__a, __b) ((__a) >= (__b))
|
||||
#define cputime_lt(__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 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_add(__a, __b) ((__a) + (__b))
|
||||
|
@ -64,7 +64,7 @@ __div(unsigned long long n, unsigned int base)
|
|||
static inline u64
|
||||
cputime64_to_jiffies64(cputime64_t cputime)
|
||||
{
|
||||
do_div(cputime, 1000000 / HZ);
|
||||
do_div(cputime, 4096000000ULL / HZ);
|
||||
return cputime;
|
||||
}
|
||||
|
||||
|
@ -74,13 +74,13 @@ cputime64_to_jiffies64(cputime64_t cputime)
|
|||
static inline unsigned int
|
||||
cputime_to_msecs(const cputime_t cputime)
|
||||
{
|
||||
return __div(cputime, 1000);
|
||||
return __div(cputime, 4096000);
|
||||
}
|
||||
|
||||
static inline cputime_t
|
||||
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
|
||||
cputime_to_secs(const cputime_t cputime)
|
||||
{
|
||||
return __div(cputime, 1000000);
|
||||
return __div(cputime, 2048000000) >> 1;
|
||||
}
|
||||
|
||||
static inline cputime_t
|
||||
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
|
||||
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
|
||||
|
@ -114,12 +114,12 @@ cputime_to_timespec(const cputime_t cputime, struct timespec *value)
|
|||
register_pair rp;
|
||||
|
||||
rp.pair = cputime >> 1;
|
||||
asm ("dr %0,%1" : "+d" (rp) : "d" (1000000 >> 1));
|
||||
value->tv_nsec = rp.subreg.even * 1000;
|
||||
asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
|
||||
value->tv_nsec = rp.subreg.even * 1000 / 4096;
|
||||
value->tv_sec = rp.subreg.odd;
|
||||
#else
|
||||
value->tv_nsec = (cputime % 1000000) * 1000;
|
||||
value->tv_sec = cputime / 1000000;
|
||||
value->tv_nsec = (cputime % 4096000000ULL) * 1000 / 4096;
|
||||
value->tv_sec = cputime / 4096000000ULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -131,7 +131,7 @@ cputime_to_timespec(const cputime_t cputime, struct timespec *value)
|
|||
static inline cputime_t
|
||||
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
|
||||
|
@ -141,12 +141,12 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
|
|||
register_pair rp;
|
||||
|
||||
rp.pair = cputime >> 1;
|
||||
asm ("dr %0,%1" : "+d" (rp) : "d" (1000000 >> 1));
|
||||
value->tv_usec = rp.subreg.even;
|
||||
asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
|
||||
value->tv_usec = rp.subreg.even / 4096;
|
||||
value->tv_sec = rp.subreg.odd;
|
||||
#else
|
||||
value->tv_usec = cputime % 1000000;
|
||||
value->tv_sec = cputime / 1000000;
|
||||
value->tv_usec = cputime % 4096000000ULL;
|
||||
value->tv_sec = cputime / 4096000000ULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -156,13 +156,13 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
|
|||
static inline clock_t
|
||||
cputime_to_clock_t(cputime_t cputime)
|
||||
{
|
||||
return __div(cputime, 1000000 / USER_HZ);
|
||||
return __div(cputime, 4096000000ULL / USER_HZ);
|
||||
}
|
||||
|
||||
static inline cputime_t
|
||||
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
|
||||
cputime64_to_clock_t(cputime64_t cputime)
|
||||
{
|
||||
return __div(cputime, 1000000 / USER_HZ);
|
||||
return __div(cputime, 4096000000ULL / USER_HZ);
|
||||
}
|
||||
|
||||
#endif /* _S390_CPUTIME_H */
|
||||
|
|
|
@ -67,11 +67,11 @@
|
|||
#define __LC_SYNC_ENTER_TIMER 0x248
|
||||
#define __LC_ASYNC_ENTER_TIMER 0x250
|
||||
#define __LC_EXIT_TIMER 0x258
|
||||
#define __LC_LAST_UPDATE_TIMER 0x260
|
||||
#define __LC_USER_TIMER 0x268
|
||||
#define __LC_SYSTEM_TIMER 0x270
|
||||
#define __LC_LAST_UPDATE_CLOCK 0x278
|
||||
#define __LC_STEAL_CLOCK 0x280
|
||||
#define __LC_USER_TIMER 0x260
|
||||
#define __LC_SYSTEM_TIMER 0x268
|
||||
#define __LC_STEAL_TIMER 0x270
|
||||
#define __LC_LAST_UPDATE_TIMER 0x278
|
||||
#define __LC_LAST_UPDATE_CLOCK 0x280
|
||||
#define __LC_RETURN_MCCK_PSW 0x288
|
||||
#define __LC_KERNEL_STACK 0xC40
|
||||
#define __LC_THREAD_INFO 0xC44
|
||||
|
@ -89,11 +89,11 @@
|
|||
#define __LC_SYNC_ENTER_TIMER 0x250
|
||||
#define __LC_ASYNC_ENTER_TIMER 0x258
|
||||
#define __LC_EXIT_TIMER 0x260
|
||||
#define __LC_LAST_UPDATE_TIMER 0x268
|
||||
#define __LC_USER_TIMER 0x270
|
||||
#define __LC_SYSTEM_TIMER 0x278
|
||||
#define __LC_LAST_UPDATE_CLOCK 0x280
|
||||
#define __LC_STEAL_CLOCK 0x288
|
||||
#define __LC_USER_TIMER 0x268
|
||||
#define __LC_SYSTEM_TIMER 0x270
|
||||
#define __LC_STEAL_TIMER 0x278
|
||||
#define __LC_LAST_UPDATE_TIMER 0x280
|
||||
#define __LC_LAST_UPDATE_CLOCK 0x288
|
||||
#define __LC_RETURN_MCCK_PSW 0x290
|
||||
#define __LC_KERNEL_STACK 0xD40
|
||||
#define __LC_THREAD_INFO 0xD48
|
||||
|
@ -106,8 +106,10 @@
|
|||
#define __LC_IPLDEV 0xDB8
|
||||
#define __LC_CURRENT 0xDD8
|
||||
#define __LC_INT_CLOCK 0xDE8
|
||||
#define __LC_VDSO_PER_CPU 0xE38
|
||||
#endif /* __s390x__ */
|
||||
|
||||
#define __LC_PASTE 0xE40
|
||||
|
||||
#define __LC_PANIC_MAGIC 0xE00
|
||||
#ifndef __s390x__
|
||||
|
@ -252,11 +254,11 @@ struct _lowcore
|
|||
__u64 sync_enter_timer; /* 0x248 */
|
||||
__u64 async_enter_timer; /* 0x250 */
|
||||
__u64 exit_timer; /* 0x258 */
|
||||
__u64 last_update_timer; /* 0x260 */
|
||||
__u64 user_timer; /* 0x268 */
|
||||
__u64 system_timer; /* 0x270 */
|
||||
__u64 last_update_clock; /* 0x278 */
|
||||
__u64 steal_clock; /* 0x280 */
|
||||
__u64 user_timer; /* 0x260 */
|
||||
__u64 system_timer; /* 0x268 */
|
||||
__u64 steal_timer; /* 0x270 */
|
||||
__u64 last_update_timer; /* 0x278 */
|
||||
__u64 last_update_clock; /* 0x280 */
|
||||
psw_t return_mcck_psw; /* 0x288 */
|
||||
__u8 pad8[0xc00-0x290]; /* 0x290 */
|
||||
|
||||
|
@ -343,11 +345,11 @@ struct _lowcore
|
|||
__u64 sync_enter_timer; /* 0x250 */
|
||||
__u64 async_enter_timer; /* 0x258 */
|
||||
__u64 exit_timer; /* 0x260 */
|
||||
__u64 last_update_timer; /* 0x268 */
|
||||
__u64 user_timer; /* 0x270 */
|
||||
__u64 system_timer; /* 0x278 */
|
||||
__u64 last_update_clock; /* 0x280 */
|
||||
__u64 steal_clock; /* 0x288 */
|
||||
__u64 user_timer; /* 0x268 */
|
||||
__u64 system_timer; /* 0x270 */
|
||||
__u64 steal_timer; /* 0x278 */
|
||||
__u64 last_update_timer; /* 0x280 */
|
||||
__u64 last_update_clock; /* 0x288 */
|
||||
psw_t return_mcck_psw; /* 0x290 */
|
||||
__u8 pad8[0xc00-0x2a0]; /* 0x2a0 */
|
||||
/* System info area */
|
||||
|
@ -381,7 +383,12 @@ struct _lowcore
|
|||
/* whether the kernel died with panic() or not */
|
||||
__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 */
|
||||
__u64 ext_params2; /* 0x11B8 */
|
||||
|
|
|
@ -99,7 +99,7 @@ static inline void restore_access_regs(unsigned int *acrs)
|
|||
prev = __switch_to(prev,next); \
|
||||
} 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_system_vtime(struct task_struct *);
|
||||
|
||||
|
@ -121,7 +121,7 @@ static inline void cmma_init(void) { }
|
|||
|
||||
#define finish_arch_switch(prev) do { \
|
||||
set_fs(current->thread.mm_segment); \
|
||||
account_vtime(prev); \
|
||||
account_vtime(prev, current); \
|
||||
} while (0)
|
||||
|
||||
#define nop() asm volatile("nop")
|
||||
|
|
|
@ -47,6 +47,8 @@ struct thread_info {
|
|||
unsigned int cpu; /* current CPU */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
struct restart_block restart_block;
|
||||
__u64 user_timer;
|
||||
__u64 system_timer;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -23,20 +23,18 @@ struct vtimer_list {
|
|||
__u64 expires;
|
||||
__u64 interval;
|
||||
|
||||
spinlock_t lock;
|
||||
unsigned long magic;
|
||||
|
||||
void (*function)(unsigned long);
|
||||
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 list_head list;
|
||||
spinlock_t lock;
|
||||
__u64 to_expire; /* current event expire time */
|
||||
__u64 offset; /* list offset to zero */
|
||||
__u64 idle; /* temp var for idle */
|
||||
__u64 timer; /* last programmed timer */
|
||||
__u64 elapsed; /* elapsed time of timer expire values */
|
||||
__u64 idle; /* temp var for idle */
|
||||
int do_spt; /* =1: reprogram cpu timer in idle */
|
||||
};
|
||||
|
||||
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 vtime_init(void);
|
||||
|
||||
extern void vtime_start_cpu_timer(void);
|
||||
extern void vtime_stop_cpu_timer(void);
|
||||
extern void vtime_stop_cpu(void);
|
||||
extern void vtime_start_leave(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
@ -6,10 +6,12 @@
|
|||
#define mc_capable() (1)
|
||||
|
||||
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];
|
||||
|
||||
#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);
|
||||
void topology_schedule_update(void);
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
#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
|
||||
* itself and may change without notice.
|
||||
*/
|
||||
|
@ -28,10 +28,21 @@ struct vdso_data {
|
|||
__u64 wtom_clock_nsec; /* 0x28 */
|
||||
__u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */
|
||||
__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;
|
||||
|
||||
#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 /* __KERNEL__ */
|
||||
|
|
|
@ -48,6 +48,11 @@ int main(void)
|
|||
DEFINE(__VDSO_WTOM_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
||||
DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
||||
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 */
|
||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||
|
|
|
@ -583,8 +583,8 @@ kernel_per:
|
|||
|
||||
.globl io_int_handler
|
||||
io_int_handler:
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stck __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
SAVE_ALL_BASE __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
|
||||
|
@ -723,8 +723,8 @@ io_notify_resume:
|
|||
|
||||
.globl ext_int_handler
|
||||
ext_int_handler:
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stck __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
SAVE_ALL_BASE __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
|
||||
|
@ -750,6 +750,7 @@ __critical_end:
|
|||
|
||||
.globl mcck_int_handler
|
||||
mcck_int_handler:
|
||||
stck __LC_INT_CLOCK
|
||||
spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer
|
||||
lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs
|
||||
SAVE_ALL_BASE __LC_SAVE_AREA+32
|
||||
|
|
|
@ -177,8 +177,11 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
|||
.if !\sync
|
||||
ni \psworg+1,0xfd # clear wait state bit
|
||||
.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
|
||||
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
|
||||
.endm
|
||||
|
||||
|
@ -559,8 +562,8 @@ kernel_per:
|
|||
*/
|
||||
.globl io_int_handler
|
||||
io_int_handler:
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stck __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
SAVE_ALL_BASE __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
|
||||
|
@ -721,8 +724,8 @@ io_notify_resume:
|
|||
*/
|
||||
.globl ext_int_handler
|
||||
ext_int_handler:
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stck __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
SAVE_ALL_BASE __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
|
||||
|
@ -746,6 +749,7 @@ __critical_end:
|
|||
*/
|
||||
.globl mcck_int_handler
|
||||
mcck_int_handler:
|
||||
stck __LC_INT_CLOCK
|
||||
la %r1,4095 # revalidate r1
|
||||
spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer
|
||||
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
|
||||
|
@ -979,23 +983,23 @@ cleanup_sysc_return:
|
|||
|
||||
cleanup_sysc_leave:
|
||||
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn)
|
||||
je 2f
|
||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||
je 3f
|
||||
clc 8(8,%r12),BASED(cleanup_sysc_leave_insn+8)
|
||||
je 2f
|
||||
mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||
jhe 0f
|
||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||
0: mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||
cghi %r12,__LC_MCK_OLD_PSW
|
||||
jne 0f
|
||||
jne 1f
|
||||
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
||||
j 1f
|
||||
0: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||
1: lmg %r0,%r11,SP_R0(%r15)
|
||||
j 2f
|
||||
1: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||
2: lmg %r0,%r11,SP_R0(%r15)
|
||||
lg %r15,SP_R15(%r15)
|
||||
2: la %r12,__LC_RETURN_PSW
|
||||
3: la %r12,__LC_RETURN_PSW
|
||||
br %r14
|
||||
cleanup_sysc_leave_insn:
|
||||
.quad sysc_done - 4
|
||||
.quad sysc_done - 8
|
||||
.quad sysc_done - 16
|
||||
|
||||
cleanup_io_return:
|
||||
mvc __LC_RETURN_PSW(8),0(%r12)
|
||||
|
@ -1005,23 +1009,23 @@ cleanup_io_return:
|
|||
|
||||
cleanup_io_leave:
|
||||
clc 8(8,%r12),BASED(cleanup_io_leave_insn)
|
||||
je 2f
|
||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||
je 3f
|
||||
clc 8(8,%r12),BASED(cleanup_io_leave_insn+8)
|
||||
je 2f
|
||||
mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||
jhe 0f
|
||||
mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER
|
||||
0: mvc __LC_RETURN_PSW(16),SP_PSW(%r15)
|
||||
cghi %r12,__LC_MCK_OLD_PSW
|
||||
jne 0f
|
||||
jne 1f
|
||||
mvc __LC_SAVE_AREA+64(32),SP_R12(%r15)
|
||||
j 1f
|
||||
0: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||
1: lmg %r0,%r11,SP_R0(%r15)
|
||||
j 2f
|
||||
1: mvc __LC_SAVE_AREA+32(32),SP_R12(%r15)
|
||||
2: lmg %r0,%r11,SP_R0(%r15)
|
||||
lg %r15,SP_R15(%r15)
|
||||
2: la %r12,__LC_RETURN_PSW
|
||||
3: la %r12,__LC_RETURN_PSW
|
||||
br %r14
|
||||
cleanup_io_leave_insn:
|
||||
.quad io_done - 4
|
||||
.quad io_done - 8
|
||||
.quad io_done - 16
|
||||
|
||||
/*
|
||||
* Integer constants
|
||||
|
|
|
@ -87,6 +87,8 @@ startup_continue:
|
|||
lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
|
||||
# move IPL device to lowcore
|
||||
mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
|
||||
lghi %r0,__LC_PASTE
|
||||
stg %r0,__LC_VDSO_PER_CPU
|
||||
#
|
||||
# Setup stack
|
||||
#
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include <linux/utsname.h>
|
||||
#include <linux/tick.h>
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/system.h>
|
||||
|
@ -45,7 +46,6 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/cpu.h>
|
||||
#include "entry.h"
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
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);
|
||||
/*
|
||||
* The idle loop on a S390...
|
||||
|
@ -117,10 +87,6 @@ static void default_idle(void)
|
|||
local_irq_enable();
|
||||
return;
|
||||
}
|
||||
if (s390_idle_enter() == NOTIFY_BAD) {
|
||||
local_irq_enable();
|
||||
return;
|
||||
}
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (cpu_is_offline(smp_processor_id())) {
|
||||
preempt_enable_no_resched();
|
||||
|
@ -130,7 +96,6 @@ static void default_idle(void)
|
|||
local_mcck_disable();
|
||||
if (test_thread_flag(TIF_MCCK_PENDING)) {
|
||||
local_mcck_enable();
|
||||
s390_idle_leave();
|
||||
local_irq_enable();
|
||||
s390_handle_mcck();
|
||||
return;
|
||||
|
@ -138,9 +103,9 @@ static void default_idle(void)
|
|||
trace_hardirqs_on();
|
||||
/* Don't trace preempt off for idle. */
|
||||
stop_critical_timings();
|
||||
/* Wait for external, I/O or machine check interrupt. */
|
||||
__load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
|
||||
PSW_MASK_IO | PSW_MASK_EXT);
|
||||
/* Stop virtual timer and halt the cpu. */
|
||||
vtime_stop_cpu();
|
||||
/* Reenable preemption tracer. */
|
||||
start_critical_timings();
|
||||
}
|
||||
|
||||
|
|
|
@ -119,8 +119,8 @@ void do_extint(struct pt_regs *regs, unsigned short code)
|
|||
struct pt_regs *old_regs;
|
||||
|
||||
old_regs = set_irq_regs(regs);
|
||||
irq_enter();
|
||||
s390_idle_check();
|
||||
irq_enter();
|
||||
if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator)
|
||||
/* Serve timer interrupts first. */
|
||||
clock_comparator_work();
|
||||
|
|
|
@ -427,6 +427,8 @@ setup_lowcore(void)
|
|||
/* enable extended save area */
|
||||
__ctl_set_bit(14, 29);
|
||||
}
|
||||
#else
|
||||
lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0];
|
||||
#endif
|
||||
set_prefix((u32)(unsigned long) lc);
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include <asm/lowcore.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/vdso.h>
|
||||
#include "entry.h"
|
||||
|
||||
/*
|
||||
|
@ -500,6 +501,9 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
|
|||
goto out;
|
||||
lowcore->extended_save_area_addr = (u32) save_area;
|
||||
}
|
||||
#else
|
||||
if (vdso_alloc_per_cpu(cpu, lowcore))
|
||||
goto out;
|
||||
#endif
|
||||
lowcore_ptr[cpu] = lowcore;
|
||||
return 0;
|
||||
|
@ -522,6 +526,8 @@ static void smp_free_lowcore(int cpu)
|
|||
#ifndef CONFIG_64BIT
|
||||
if (MACHINE_HAS_IEEE)
|
||||
free_page((unsigned long) lowcore->extended_save_area_addr);
|
||||
#else
|
||||
vdso_free_per_cpu(cpu, lowcore);
|
||||
#endif
|
||||
free_page(lowcore->panic_stack - PAGE_SIZE);
|
||||
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);
|
||||
panic_stack = __get_free_page(GFP_KERNEL);
|
||||
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
|
||||
BUG_ON(!lowcore || !panic_stack || !async_stack);
|
||||
#ifndef CONFIG_64BIT
|
||||
if (MACHINE_HAS_IEEE)
|
||||
save_area = get_zeroed_page(GFP_KERNEL);
|
||||
|
@ -677,6 +684,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
#ifndef CONFIG_64BIT
|
||||
if (MACHINE_HAS_IEEE)
|
||||
lowcore->extended_save_area_addr = (u32) save_area;
|
||||
#else
|
||||
BUG_ON(vdso_alloc_per_cpu(smp_processor_id(), lowcore));
|
||||
#endif
|
||||
set_prefix((u32)(unsigned long) lowcore);
|
||||
local_mcck_enable();
|
||||
|
@ -845,9 +854,11 @@ static ssize_t show_idle_count(struct sys_device *dev,
|
|||
unsigned long long idle_count;
|
||||
|
||||
idle = &per_cpu(s390_idle, dev->id);
|
||||
spin_lock_irq(&idle->lock);
|
||||
spin_lock(&idle->lock);
|
||||
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);
|
||||
}
|
||||
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 s390_idle_data *idle;
|
||||
unsigned long long new_time;
|
||||
unsigned long long now, idle_time, idle_enter;
|
||||
|
||||
idle = &per_cpu(s390_idle, dev->id);
|
||||
spin_lock_irq(&idle->lock);
|
||||
if (idle->in_idle) {
|
||||
new_time = get_clock();
|
||||
idle->idle_time += new_time - idle->idle_enter;
|
||||
idle->idle_enter = new_time;
|
||||
}
|
||||
new_time = idle->idle_time;
|
||||
spin_unlock_irq(&idle->lock);
|
||||
return sprintf(buf, "%llu\n", new_time >> 12);
|
||||
spin_lock(&idle->lock);
|
||||
now = get_clock();
|
||||
idle_time = idle->idle_time;
|
||||
idle_enter = idle->idle_enter;
|
||||
if (idle_enter != 0ULL && idle_enter < now)
|
||||
idle_time += now - idle_enter;
|
||||
spin_unlock(&idle->lock);
|
||||
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
|
|
@ -31,9 +31,6 @@
|
|||
#include <asm/sections.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
/* Max supported size for symbol names */
|
||||
#define MAX_SYMNAME 64
|
||||
|
||||
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
||||
extern char vdso32_start, vdso32_end;
|
||||
static void *vdso32_kbase = &vdso32_start;
|
||||
|
@ -70,6 +67,119 @@ static union {
|
|||
} vdso_data_store __attribute__((__section__(".data.page_aligned")));
|
||||
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
|
||||
* vDSO and insert it into the mm struct tree
|
||||
|
@ -172,6 +282,9 @@ static int __init vdso_init(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!vdso_enabled)
|
||||
return 0;
|
||||
vdso_init_data(vdso_data);
|
||||
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
||||
/* Calculate the size of the 32 bit vDSO */
|
||||
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] = NULL;
|
||||
#ifndef CONFIG_SMP
|
||||
BUG_ON(vdso_alloc_per_cpu(0, S390_lowcore));
|
||||
#endif
|
||||
vdso_init_cr5();
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
get_page(virt_to_page(vdso_data));
|
||||
|
|
|
@ -22,7 +22,12 @@ __kernel_clock_getres:
|
|||
cghi %r2,CLOCK_REALTIME
|
||||
je 0f
|
||||
cghi %r2,CLOCK_MONOTONIC
|
||||
je 0f
|
||||
cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */
|
||||
jne 2f
|
||||
larl %r5,_vdso_data
|
||||
icm %r0,15,__LC_ECTG_OK(%r5)
|
||||
jz 2f
|
||||
0: ltgr %r3,%r3
|
||||
jz 1f /* res == NULL */
|
||||
larl %r1,3f
|
||||
|
|
|
@ -22,8 +22,10 @@ __kernel_clock_gettime:
|
|||
larl %r5,_vdso_data
|
||||
cghi %r2,CLOCK_REALTIME
|
||||
je 4f
|
||||
cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */
|
||||
je 9f
|
||||
cghi %r2,CLOCK_MONOTONIC
|
||||
jne 9f
|
||||
jne 12f
|
||||
|
||||
/* CLOCK_MONOTONIC */
|
||||
ltgr %r3,%r3
|
||||
|
@ -42,7 +44,7 @@ __kernel_clock_gettime:
|
|||
alg %r0,__VDSO_WTOM_SEC(%r5)
|
||||
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
||||
jne 0b
|
||||
larl %r5,10f
|
||||
larl %r5,13f
|
||||
1: clg %r1,0(%r5)
|
||||
jl 2f
|
||||
slg %r1,0(%r5)
|
||||
|
@ -68,7 +70,7 @@ __kernel_clock_gettime:
|
|||
lg %r0,__VDSO_XTIME_SEC(%r5)
|
||||
clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */
|
||||
jne 5b
|
||||
larl %r5,10f
|
||||
larl %r5,13f
|
||||
6: clg %r1,0(%r5)
|
||||
jl 7f
|
||||
slg %r1,0(%r5)
|
||||
|
@ -79,11 +81,38 @@ __kernel_clock_gettime:
|
|||
8: lghi %r2,0
|
||||
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 */
|
||||
9: lghi %r1,__NR_clock_gettime
|
||||
12: lghi %r1,__NR_clock_gettime
|
||||
svc 0
|
||||
br %r14
|
||||
|
||||
10: .quad 1000000000
|
||||
13: .quad 1000000000
|
||||
14: .quad 19342813113834067
|
||||
.cfi_endproc
|
||||
.size __kernel_clock_gettime,.-__kernel_clock_gettime
|
||||
|
|
|
@ -23,94 +23,24 @@
|
|||
#include <asm/s390_ext.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/cpu.h>
|
||||
|
||||
static ext_int_info_t ext_int_info_timer;
|
||||
|
||||
static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);
|
||||
|
||||
/*
|
||||
* Update process times based on virtual cpu times stored by entry.S
|
||||
* to the lowcore fields user_timer, system_timer & steal_clock.
|
||||
*/
|
||||
void account_process_tick(struct task_struct *tsk, int user_tick)
|
||||
DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock)
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
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.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);
|
||||
asm volatile("STPT %0" : "=m" (timer));
|
||||
return timer;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
__u64 timer;
|
||||
|
@ -120,56 +50,192 @@ static inline void set_vtimer(__u64 expires)
|
|||
: "=m" (timer) : "m" (expires) );
|
||||
S390_lowcore.system_timer += S390_lowcore.last_update_timer - timer;
|
||||
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 */
|
||||
if (vt_list->idle & 1LL<<63)
|
||||
return;
|
||||
user = S390_lowcore.user_timer - ti->user_timer;
|
||||
S390_lowcore.steal_timer -= user;
|
||||
ti->user_timer = S390_lowcore.user_timer;
|
||||
account_user_time(tsk, user, user);
|
||||
|
||||
if (!list_empty(&vt_list->list))
|
||||
set_vtimer(vt_list->idle);
|
||||
system = S390_lowcore.system_timer - ti->system_timer;
|
||||
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 */
|
||||
if (list_empty(&vt_list->list)) {
|
||||
vt_list->idle = VTIMER_MAX_SLICE;
|
||||
goto fire;
|
||||
void account_process_tick(struct task_struct *tsk, int user_tick)
|
||||
{
|
||||
do_account_vtime(tsk, HARDIRQ_OFFSET);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
asm volatile ("STPT %0" : "=m" (vt_list->idle));
|
||||
spin_lock(&idle->lock);
|
||||
idle->idle_time += idle_time;
|
||||
idle->idle_enter = 0ULL;
|
||||
idle->idle_count++;
|
||||
spin_unlock(&idle->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the CPU timer is negative we don't reprogramm
|
||||
* it because we will get instantly an interrupt.
|
||||
*/
|
||||
if (vt_list->idle & 1LL<<63)
|
||||
return;
|
||||
void vtime_stop_cpu(void)
|
||||
{
|
||||
struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
|
||||
struct vtimer_queue *vq = &__get_cpu_var(virt_cpu_timer);
|
||||
psw_t psw;
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
* We cannot halt the CPU timer, we just write a value that
|
||||
* nearly never expires (only after 71 years) and re-write
|
||||
* the stored expire value if we continue the timer
|
||||
*/
|
||||
fire:
|
||||
set_vtimer(VTIMER_MAX_SLICE);
|
||||
/* Check if the CPU timer needs to be reprogrammed. */
|
||||
if (vq->do_spt) {
|
||||
__u64 vmax = VTIMER_MAX_SLICE;
|
||||
/*
|
||||
* The inline assembly is equivalent to
|
||||
* vq->idle = get_cpu_timer();
|
||||
* 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)
|
||||
{
|
||||
struct vtimer_queue *vt_list;
|
||||
struct vtimer_queue *vq;
|
||||
struct vtimer_list *event, *tmp;
|
||||
void (*fn)(unsigned long);
|
||||
unsigned long data;
|
||||
|
||||
if (list_empty(cb_list))
|
||||
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) {
|
||||
fn = event->function;
|
||||
data = event->data;
|
||||
fn(data);
|
||||
|
||||
if (!event->interval)
|
||||
/* delete one shot timer */
|
||||
list_del_init(&event->entry);
|
||||
else {
|
||||
/* 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);
|
||||
list_del_init(&event->entry);
|
||||
(event->function)(event->data);
|
||||
if (event->interval) {
|
||||
/* Recharge interval timer */
|
||||
event->expires = event->interval + vq->elapsed;
|
||||
spin_lock(&vq->lock);
|
||||
list_add_sorted(event, &vq->list);
|
||||
spin_unlock(&vq->lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -228,64 +287,57 @@ static void do_callbacks(struct list_head *cb_list)
|
|||
*/
|
||||
static void do_cpu_timer_interrupt(__u16 error_code)
|
||||
{
|
||||
__u64 next, delta;
|
||||
struct vtimer_queue *vt_list;
|
||||
struct vtimer_queue *vq;
|
||||
struct vtimer_list *event, *tmp;
|
||||
struct list_head *ptr;
|
||||
/* the callback queue */
|
||||
struct list_head cb_list;
|
||||
struct list_head cb_list; /* the callback queue */
|
||||
__u64 elapsed, next;
|
||||
|
||||
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 */
|
||||
spin_lock(&vt_list->lock);
|
||||
spin_lock(&vq->lock);
|
||||
|
||||
if (vt_list->to_expire < VTIMER_MAX_SLICE)
|
||||
vt_list->offset += vt_list->to_expire;
|
||||
|
||||
list_for_each_entry_safe(event, tmp, &vt_list->list, entry) {
|
||||
if (event->expires > vt_list->offset)
|
||||
/* found first unexpired event, leave */
|
||||
break;
|
||||
|
||||
/* re-charge interval timer, we have to add the offset */
|
||||
if (event->interval)
|
||||
event->expires = event->interval + vt_list->offset;
|
||||
|
||||
/* move expired timer to the callback queue */
|
||||
list_move_tail(&event->entry, &cb_list);
|
||||
elapsed = vq->elapsed + (vq->timer - S390_lowcore.async_enter_timer);
|
||||
BUG_ON((s64) elapsed < 0);
|
||||
vq->elapsed = 0;
|
||||
list_for_each_entry_safe(event, tmp, &vq->list, entry) {
|
||||
if (event->expires < elapsed)
|
||||
/* move expired timer to the callback queue */
|
||||
list_move_tail(&event->entry, &cb_list);
|
||||
else
|
||||
event->expires -= elapsed;
|
||||
}
|
||||
spin_unlock(&vt_list->lock);
|
||||
spin_unlock(&vq->lock);
|
||||
|
||||
vq->do_spt = list_empty(&cb_list);
|
||||
do_callbacks(&cb_list);
|
||||
|
||||
/* next event is first in list */
|
||||
spin_lock(&vt_list->lock);
|
||||
if (!list_empty(&vt_list->list)) {
|
||||
ptr = vt_list->list.next;
|
||||
event = list_entry(ptr, struct vtimer_list, entry);
|
||||
next = event->expires - vt_list->offset;
|
||||
|
||||
/* add the expired time from this interrupt handler
|
||||
* and the callback functions
|
||||
*/
|
||||
asm volatile ("STPT %0" : "=m" (delta));
|
||||
delta = 0xffffffffffffffffLL - delta + 1;
|
||||
vt_list->offset += delta;
|
||||
next -= delta;
|
||||
} else {
|
||||
vt_list->offset = 0;
|
||||
next = VTIMER_MAX_SLICE;
|
||||
}
|
||||
spin_unlock(&vt_list->lock);
|
||||
set_vtimer(next);
|
||||
next = VTIMER_MAX_SLICE;
|
||||
spin_lock(&vq->lock);
|
||||
if (!list_empty(&vq->list)) {
|
||||
event = list_first_entry(&vq->list, struct vtimer_list, entry);
|
||||
next = event->expires;
|
||||
} else
|
||||
vq->do_spt = 0;
|
||||
spin_unlock(&vq->lock);
|
||||
/*
|
||||
* To improve precision add the time spent by the
|
||||
* interrupt handler to the elapsed time.
|
||||
* Note: CPU timer counts down and we got an interrupt,
|
||||
* the current content is negative
|
||||
*/
|
||||
elapsed = S390_lowcore.async_enter_timer - get_vtimer();
|
||||
set_vtimer(next - elapsed);
|
||||
vq->timer = next - elapsed;
|
||||
vq->elapsed = elapsed;
|
||||
}
|
||||
|
||||
void init_virt_timer(struct vtimer_list *timer)
|
||||
{
|
||||
timer->function = NULL;
|
||||
INIT_LIST_HEAD(&timer->entry);
|
||||
spin_lock_init(&timer->lock);
|
||||
}
|
||||
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)
|
||||
{
|
||||
struct vtimer_queue *vq;
|
||||
unsigned long flags;
|
||||
__u64 done;
|
||||
struct vtimer_list *event;
|
||||
struct vtimer_queue *vt_list;
|
||||
__u64 left, expires;
|
||||
|
||||
vt_list = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||
spin_lock_irqsave(&vt_list->lock, flags);
|
||||
vq = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||
spin_lock_irqsave(&vq->lock, flags);
|
||||
|
||||
BUG_ON(timer->cpu != smp_processor_id());
|
||||
|
||||
/* if list is empty we only have to set the timer */
|
||||
if (list_empty(&vt_list->list)) {
|
||||
/* reset the offset, this may happen if the last timer was
|
||||
* just deleted by mod_virt_timer and the interrupt
|
||||
* didn't happen until here
|
||||
*/
|
||||
vt_list->offset = 0;
|
||||
goto fire;
|
||||
if (list_empty(&vq->list)) {
|
||||
/* First timer on this cpu, just program it. */
|
||||
list_add(&timer->entry, &vq->list);
|
||||
set_vtimer(timer->expires);
|
||||
vq->timer = timer->expires;
|
||||
vq->elapsed = 0;
|
||||
} else {
|
||||
/* 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 */
|
||||
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);
|
||||
spin_unlock_irqrestore(&vq->lock, flags);
|
||||
/* release CPU acquired in prepare_vtimer or mod_virt_timer() */
|
||||
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
|
||||
* 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
|
||||
* we do the same. The timer will be added on the current CPU as a oneshot timer.
|
||||
* The original mod_timer adds the timer if it is not pending. For
|
||||
* 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)
|
||||
*/
|
||||
int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
||||
{
|
||||
struct vtimer_queue *vt_list;
|
||||
struct vtimer_queue *vq;
|
||||
unsigned long flags;
|
||||
int cpu;
|
||||
|
||||
|
@ -404,17 +453,17 @@ int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
|||
return 1;
|
||||
|
||||
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 */
|
||||
BUG_ON(timer->cpu != cpu);
|
||||
|
||||
/* 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 (!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 */
|
||||
timer->interval = 0;
|
||||
timer->expires = expires;
|
||||
|
@ -431,7 +480,7 @@ int mod_virt_timer(struct vtimer_list *timer, __u64 expires)
|
|||
timer->interval = expires;
|
||||
|
||||
/* 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);
|
||||
return 1;
|
||||
}
|
||||
|
@ -445,25 +494,19 @@ EXPORT_SYMBOL(mod_virt_timer);
|
|||
int del_virt_timer(struct vtimer_list *timer)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct vtimer_queue *vt_list;
|
||||
struct vtimer_queue *vq;
|
||||
|
||||
/* check if timer is pending */
|
||||
if (!vtimer_pending(timer))
|
||||
return 0;
|
||||
|
||||
vt_list = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||
spin_lock_irqsave(&vt_list->lock, flags);
|
||||
vq = &per_cpu(virt_cpu_timer, timer->cpu);
|
||||
spin_lock_irqsave(&vq->lock, flags);
|
||||
|
||||
/* we don't interrupt a running timer, just let it expire! */
|
||||
list_del_init(&timer->entry);
|
||||
|
||||
/* last timer removed */
|
||||
if (list_empty(&vt_list->list)) {
|
||||
vt_list->to_expire = 0;
|
||||
vt_list->offset = 0;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&vt_list->lock, flags);
|
||||
spin_unlock_irqrestore(&vq->lock, flags);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(del_virt_timer);
|
||||
|
@ -473,24 +516,19 @@ EXPORT_SYMBOL(del_virt_timer);
|
|||
*/
|
||||
void init_cpu_vtimer(void)
|
||||
{
|
||||
struct vtimer_queue *vt_list;
|
||||
struct vtimer_queue *vq;
|
||||
|
||||
/* 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 ("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 */
|
||||
__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)
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#define parent_node(node) ((void)(node),0)
|
||||
|
||||
#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 pcibus_to_node(bus) ((void)(bus), -1)
|
||||
|
|
|
@ -4,6 +4,17 @@
|
|||
|
||||
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
|
||||
bool
|
||||
default y
|
||||
|
@ -15,22 +26,11 @@ config SPARC
|
|||
select RTC_CLASS
|
||||
select RTC_DRV_M48T59
|
||||
|
||||
# Identify this as a Sparc32 build
|
||||
config SPARC32
|
||||
bool
|
||||
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/>.
|
||||
def_bool !64BIT
|
||||
|
||||
config SPARC64
|
||||
bool
|
||||
default y if ARCH = "sparc64"
|
||||
def_bool 64BIT
|
||||
select ARCH_SUPPORTS_MSI
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_KRETPROBES
|
||||
|
@ -53,9 +53,6 @@ config BITS
|
|||
default 32 if SPARC32
|
||||
default 64 if SPARC64
|
||||
|
||||
config 64BIT
|
||||
def_bool y if SPARC64
|
||||
|
||||
config GENERIC_TIME
|
||||
bool
|
||||
default y if SPARC64
|
||||
|
@ -188,14 +185,6 @@ config ARCH_MAY_HAVE_PC_FDC
|
|||
bool
|
||||
default y
|
||||
|
||||
config ARCH_HAS_ILOG2_U32
|
||||
bool
|
||||
default n
|
||||
|
||||
config ARCH_HAS_ILOG2_U64
|
||||
bool
|
||||
default n
|
||||
|
||||
config EMULATED_CMPXCHG
|
||||
bool
|
||||
default y if SPARC32
|
||||
|
@ -442,26 +431,6 @@ config SERIAL_CONSOLE
|
|||
endmenu
|
||||
|
||||
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
|
||||
bool
|
||||
default y
|
||||
|
|
|
@ -1,27 +1,27 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.28-rc4
|
||||
# Mon Nov 10 12:35:09 2008
|
||||
# Linux kernel version: 2.6.28
|
||||
# Fri Jan 2 18:14:26 2009
|
||||
#
|
||||
CONFIG_SPARC=y
|
||||
CONFIG_SPARC64=y
|
||||
CONFIG_ARCH_DEFCONFIG="arch/sparc/configs/sparc64_defconfig"
|
||||
CONFIG_BITS=64
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
CONFIG_QUICKLIST=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
CONFIG_AUDIT_ARCH=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_OF=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
|
@ -86,6 +86,7 @@ CONFIG_SLUB_DEBUG=y
|
|||
CONFIG_SLUB=y
|
||||
# CONFIG_SLOB is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_TRACEPOINTS=y
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_OPROFILE=m
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
|
@ -127,34 +128,40 @@ CONFIG_DEFAULT_AS=y
|
|||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
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
|
||||
|
||||
#
|
||||
# Processor type and features
|
||||
#
|
||||
CONFIG_SPARC64_PAGE_SIZE_8KB=y
|
||||
# CONFIG_SPARC64_PAGE_SIZE_64KB is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=64
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=100
|
||||
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_GENERIC_HARDIRQS=y
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=64
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
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_512K 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_NR_QUICK=1
|
||||
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_SBUSCHAR=y
|
||||
CONFIG_SUN_AUXIO=y
|
||||
CONFIG_SUN_IO=y
|
||||
CONFIG_SUN_LDOMS=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
|
@ -195,7 +210,9 @@ CONFIG_ARCH_SUPPORTS_MSI=y
|
|||
CONFIG_PCI_MSI=y
|
||||
# CONFIG_PCI_LEGACY is not set
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
# CONFIG_PCCARD is not set
|
||||
CONFIG_SUN_OPENPROMFS=m
|
||||
CONFIG_SPARC64_PCI=y
|
||||
|
||||
#
|
||||
# Executable file formats
|
||||
|
@ -207,17 +224,13 @@ CONFIG_COMPAT_BINFMT_ELF=y
|
|||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_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
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NET_NS is not set
|
||||
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -314,6 +327,7 @@ CONFIG_VLAN_8021Q=m
|
|||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
|
@ -330,8 +344,8 @@ CONFIG_WIRELESS=y
|
|||
# CONFIG_CFG80211 is not set
|
||||
CONFIG_WIRELESS_OLD_REGULATORY=y
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_LIB80211 is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
|
@ -378,8 +392,10 @@ CONFIG_MISC_DEVICES=y
|
|||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_ICS932S401 is not set
|
||||
# CONFIG_ENCLOSURE_SERVICES is not set
|
||||
# CONFIG_HP_ILO is not set
|
||||
# CONFIG_C2PORT is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_IDE=y
|
||||
|
||||
|
@ -387,6 +403,7 @@ CONFIG_IDE=y
|
|||
# Please see Documentation/ide/ide.txt for help/info on IDE drives
|
||||
#
|
||||
CONFIG_IDE_TIMINGS=y
|
||||
CONFIG_IDE_ATAPI=y
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_IDE_GD=y
|
||||
CONFIG_IDE_GD_ATA=y
|
||||
|
@ -394,7 +411,6 @@ CONFIG_IDE_GD_ATA=y
|
|||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDESCSI is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
CONFIG_IDE_PROC_FS=y
|
||||
|
||||
|
@ -477,6 +493,7 @@ CONFIG_SCSI_FC_ATTRS=y
|
|||
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_CXGB3_ISCSI is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX 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_SAS 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_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
|
@ -564,6 +583,9 @@ CONFIG_PHYLIB=m
|
|||
# CONFIG_BROADCOM_PHY is not set
|
||||
# CONFIG_ICPLUS_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_NET_ETHERNET=y
|
||||
CONFIG_MII=m
|
||||
|
@ -590,7 +612,6 @@ CONFIG_NET_PCI=y
|
|||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
# CONFIG_E100 is not set
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
|
@ -600,6 +621,7 @@ CONFIG_NET_PCI=y
|
|||
# CONFIG_R6040 is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SMSC9420 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_TLAN is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
|
@ -629,6 +651,7 @@ CONFIG_BNX2=m
|
|||
# CONFIG_JME is not set
|
||||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
CONFIG_CHELSIO_T3_DEPENDS=y
|
||||
# CONFIG_CHELSIO_T3 is not set
|
||||
# CONFIG_ENIC is not set
|
||||
# CONFIG_IXGBE is not set
|
||||
|
@ -778,6 +801,7 @@ CONFIG_SERIAL_CORE=y
|
|||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
CONFIG_HW_RANDOM=m
|
||||
|
@ -870,6 +894,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ADT7462 is not set
|
||||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ADT7473 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
|
@ -919,11 +944,11 @@ CONFIG_HWMON=y
|
|||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
|
@ -1071,6 +1096,7 @@ CONFIG_SND_MIXER_OSS=m
|
|||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_HRTIMER is not set
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
CONFIG_SND_VERBOSE_PROCFS=y
|
||||
|
@ -1242,11 +1268,11 @@ CONFIG_USB_UHCI_HCD=m
|
|||
# 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_DEBUG is not set
|
||||
|
@ -1337,6 +1363,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_M41T80 is not set
|
||||
# CONFIG_RTC_DRV_S35390A is not set
|
||||
# CONFIG_RTC_DRV_FM3130 is not set
|
||||
# CONFIG_RTC_DRV_RX8581 is not set
|
||||
|
||||
#
|
||||
# SPI RTC drivers
|
||||
|
@ -1365,7 +1392,6 @@ CONFIG_RTC_DRV_STARFIRE=y
|
|||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_UIO is not set
|
||||
# CONFIG_STAGING is not set
|
||||
CONFIG_STAGING_EXCLUDE_BUILD=y
|
||||
|
||||
#
|
||||
# Misc Linux/SPARC drivers
|
||||
|
@ -1544,6 +1570,7 @@ CONFIG_SCHEDSTATS=y
|
|||
# CONFIG_LOCK_STAT is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
CONFIG_STACKTRACE=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
|
@ -1552,6 +1579,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST 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_LKDTM is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_NOP_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_RING_BUFFER=y
|
||||
CONFIG_TRACING=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
|
@ -1571,7 +1603,9 @@ CONFIG_HAVE_FUNCTION_TRACER=y
|
|||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_FTRACE_STARTUP_TEST is not set
|
||||
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
|
@ -1600,11 +1634,16 @@ CONFIG_CRYPTO=y
|
|||
#
|
||||
# CONFIG_CRYPTO_FIPS is not set
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_ALGAPI2=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=y
|
||||
CONFIG_CRYPTO_BLKCIPHER2=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
CONFIG_CRYPTO_GF128MUL=m
|
||||
CONFIG_CRYPTO_NULL=m
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
|
|
|
@ -1,21 +1,6 @@
|
|||
# User exported sparc header files
|
||||
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 += asi.h
|
||||
header-y += display7seg.h
|
||||
|
@ -23,16 +8,11 @@ header-y += envctrl.h
|
|||
header-y += fbio.h
|
||||
header-y += jsflash.h
|
||||
header-y += openprom.h
|
||||
header-y += openprom_32.h
|
||||
header-y += openprom_64.h
|
||||
header-y += openpromio.h
|
||||
header-y += perfctr.h
|
||||
header-y += psrcompat.h
|
||||
header-y += psr.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 += uctx.h
|
||||
header-y += utrap.h
|
||||
|
|
|
@ -1,16 +1,12 @@
|
|||
#ifndef _SPARC_BYTEORDER_H
|
||||
#define _SPARC_BYTEORDER_H
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/asi.h>
|
||||
|
||||
#define __BIG_ENDIAN
|
||||
|
||||
#ifdef CONFIG_SPARC32
|
||||
#define __SWAB_64_THRU_32__
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPARC64
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
static inline __u16 __arch_swab16p(const __u16 *addr)
|
||||
{
|
||||
__u16 ret;
|
||||
|
@ -44,7 +40,9 @@ static inline __u64 __arch_swab64p(const __u64 *addr)
|
|||
}
|
||||
#define __arch_swab64p __arch_swab64p
|
||||
|
||||
#endif /* CONFIG_SPARC64 */
|
||||
#else
|
||||
#define __SWAB_64_THRU_32__
|
||||
#endif /* defined(__sparc__) && defined(__arch64__) */
|
||||
|
||||
#include <linux/byteorder.h>
|
||||
|
||||
|
|
|
@ -1,8 +1,32 @@
|
|||
#ifndef ___ASM_SPARC_IPCBUF_H
|
||||
#define ___ASM_SPARC_IPCBUF_H
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
#include <asm/ipcbuf_64.h>
|
||||
#else
|
||||
#include <asm/ipcbuf_32.h>
|
||||
#endif
|
||||
#ifndef __SPARC_IPCBUF_H
|
||||
#define __SPARC_IPCBUF_H
|
||||
|
||||
/*
|
||||
* The ipc64_perm structure for sparc/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
|
||||
* - 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
|
||||
__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
|
||||
|
||||
#ifndef _SPARC_TYPES_H
|
||||
#include <asm/types.h>
|
||||
#include <linux/types.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,8 +1,277 @@
|
|||
#ifndef ___ASM_SPARC_OPENPROM_H
|
||||
#define ___ASM_SPARC_OPENPROM_H
|
||||
#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,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__)
|
||||
#include <asm/openprom_64.h>
|
||||
#define PROMREG_MAX 24
|
||||
#define PROMVADDR_MAX 16
|
||||
#define PROMINTR_MAX 32
|
||||
#else
|
||||
#include <asm/openprom_32.h>
|
||||
#define PROMREG_MAX 16
|
||||
#define PROMVADDR_MAX 16
|
||||
#define PROMINTR_MAX 15
|
||||
#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
|
||||
|
||||
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__)
|
||||
#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
|
||||
#include <asm/posix_types_32.h>
|
||||
#endif
|
||||
/* sparc 32 bit */
|
||||
|
||||
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
|
||||
|
||||
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]"
|
||||
: /* no outputs */
|
||||
: "r" (regs),
|
||||
"r" (sp - sizeof(struct reg_window)),
|
||||
"r" (sp - sizeof(struct reg_window32)),
|
||||
"r" (zero),
|
||||
"i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))
|
||||
: "memory");
|
||||
|
|
|
@ -1,8 +1,448 @@
|
|||
#ifndef ___ASM_SPARC_PTRACE_H
|
||||
#define ___ASM_SPARC_PTRACE_H
|
||||
#ifndef __SPARC_PTRACE_H
|
||||
#define __SPARC_PTRACE_H
|
||||
|
||||
#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
|
||||
#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
|
||||
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
|
||||
|
||||
/* 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
|
||||
#define ___ASM_SPARC_SIGCONTEXT_H
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
#include <asm/sigcontext_64.h>
|
||||
#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 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
|
||||
#include <asm/sigcontext_32.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
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 /* (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
|
||||
#define ___ASM_SPARC_SIGINFO_H
|
||||
#ifndef __SPARC_SIGINFO_H
|
||||
#define __SPARC_SIGINFO_H
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
#include <asm/siginfo_64.h>
|
||||
#else
|
||||
#include <asm/siginfo_32.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
|
||||
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
|
||||
#define __ARCH_SI_BAND_T int
|
||||
|
||||
#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
|
||||
#define ___ASM_SPARC_SIGNAL_H
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
#include <asm/signal_64.h>
|
||||
#ifndef __SPARC_SIGNAL_H
|
||||
#define __SPARC_SIGNAL_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
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
#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…
Reference in New Issue