Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
eb0c34c8
Commit
eb0c34c8
authored
May 21, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/to-linus-2.5
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
46866963
0e2800fb
Changes
52
Show whitespace changes
Inline
Side-by-side
Showing
52 changed files
with
719 additions
and
628 deletions
+719
-628
arch/ia64/defconfig
arch/ia64/defconfig
+46
-48
arch/ia64/hp/sim/boot/boot_head.S
arch/ia64/hp/sim/boot/boot_head.S
+7
-7
arch/ia64/ia32/Makefile
arch/ia64/ia32/Makefile
+4
-0
arch/ia64/ia32/ia32_signal.c
arch/ia64/ia32/ia32_signal.c
+2
-17
arch/ia64/kernel/Makefile
arch/ia64/kernel/Makefile
+3
-0
arch/ia64/kernel/efi.c
arch/ia64/kernel/efi.c
+20
-7
arch/ia64/kernel/fsys.S
arch/ia64/kernel/fsys.S
+19
-24
arch/ia64/kernel/head.S
arch/ia64/kernel/head.S
+1
-2
arch/ia64/kernel/ivt.S
arch/ia64/kernel/ivt.S
+35
-0
arch/ia64/kernel/machvec.c
arch/ia64/kernel/machvec.c
+1
-1
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+328
-215
arch/ia64/kernel/perfmon_generic.h
arch/ia64/kernel/perfmon_generic.h
+1
-9
arch/ia64/kernel/perfmon_hpsim.h
arch/ia64/kernel/perfmon_hpsim.h
+0
-75
arch/ia64/kernel/perfmon_itanium.h
arch/ia64/kernel/perfmon_itanium.h
+23
-25
arch/ia64/kernel/perfmon_mckinley.h
arch/ia64/kernel/perfmon_mckinley.h
+19
-26
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+1
-0
arch/ia64/kernel/signal.c
arch/ia64/kernel/signal.c
+0
-17
arch/ia64/kernel/smp.c
arch/ia64/kernel/smp.c
+0
-1
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+22
-25
arch/ia64/kernel/traps.c
arch/ia64/kernel/traps.c
+0
-23
arch/ia64/kernel/unwind.c
arch/ia64/kernel/unwind.c
+53
-15
arch/ia64/kernel/unwind_i.h
arch/ia64/kernel/unwind_i.h
+1
-0
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+1
-0
arch/ia64/scripts/check-serialize.S
arch/ia64/scripts/check-serialize.S
+2
-0
arch/ia64/scripts/toolchain-flags
arch/ia64/scripts/toolchain-flags
+10
-0
arch/ia64/sn/io/io.c
arch/ia64/sn/io/io.c
+1
-1
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
+30
-3
arch/ia64/sn/io/platform_init/sgi_io_init.c
arch/ia64/sn/io/platform_init/sgi_io_init.c
+3
-4
arch/ia64/sn/io/sn2/klgraph.c
arch/ia64/sn/io/sn2/klgraph.c
+11
-11
arch/ia64/sn/io/sn2/ml_SN_init.c
arch/ia64/sn/io/sn2/ml_SN_init.c
+2
-6
arch/ia64/sn/io/sn2/ml_SN_intr.c
arch/ia64/sn/io/sn2/ml_SN_intr.c
+3
-5
arch/ia64/sn/io/sn2/ml_iograph.c
arch/ia64/sn/io/sn2/ml_iograph.c
+4
-4
arch/ia64/sn/io/sn2/module.c
arch/ia64/sn/io/sn2/module.c
+2
-2
arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c
arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c
+3
-3
arch/ia64/sn/io/sn2/pic.c
arch/ia64/sn/io/sn2/pic.c
+2
-2
arch/ia64/sn/io/sn2/shuberror.c
arch/ia64/sn/io/sn2/shuberror.c
+2
-2
arch/ia64/sn/io/sn2/shubio.c
arch/ia64/sn/io/sn2/shubio.c
+2
-2
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+1
-5
arch/ia64/sn/kernel/sn2/prominfo_proc.c
arch/ia64/sn/kernel/sn2/prominfo_proc.c
+7
-6
drivers/char/sn_serial.c
drivers/char/sn_serial.c
+1
-1
include/asm-ia64/asmmacro.h
include/asm-ia64/asmmacro.h
+8
-0
include/asm-ia64/delay.h
include/asm-ia64/delay.h
+6
-0
include/asm-ia64/gcc_intrin.h
include/asm-ia64/gcc_intrin.h
+11
-3
include/asm-ia64/intel_intrin.h
include/asm-ia64/intel_intrin.h
+3
-0
include/asm-ia64/sn/arch.h
include/asm-ia64/sn/arch.h
+2
-10
include/asm-ia64/sn/intr.h
include/asm-ia64/sn/intr.h
+2
-0
include/asm-ia64/sn/module.h
include/asm-ia64/sn/module.h
+0
-4
include/asm-ia64/sn/nodepda.h
include/asm-ia64/sn/nodepda.h
+0
-7
include/asm-ia64/sn/sn2/sn_private.h
include/asm-ia64/sn/sn2/sn_private.h
+1
-1
include/asm-ia64/sn/types.h
include/asm-ia64/sn/types.h
+0
-2
include/asm-ia64/system.h
include/asm-ia64/system.h
+9
-3
include/asm-ia64/unistd.h
include/asm-ia64/unistd.h
+4
-4
No files found.
arch/ia64/defconfig
View file @
eb0c34c8
...
...
@@ -16,8 +16,10 @@ CONFIG_BROKEN_ON_SMP=y
#
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16
CONFIG_HOTPLUG=y
CONFIG_IKCONFIG=y
...
...
@@ -29,6 +31,7 @@ CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
...
...
@@ -69,7 +72,6 @@ CONFIG_VIRTUAL_MEM_MAP=y
# CONFIG_IA64_CYCLONE is not set
CONFIG_IOSAPIC=y
CONFIG_FORCE_MAX_ZONEORDER=18
# CONFIG_IA64_PAL_IDLE is not set
CONFIG_SMP=y
CONFIG_NR_CPUS=16
# CONFIG_PREEMPT is not set
...
...
@@ -78,6 +80,10 @@ CONFIG_IA32_SUPPORT=y
CONFIG_COMPAT=y
CONFIG_PERFMON=y
CONFIG_IA64_PALINFO=y
#
# Firmware Drivers
#
CONFIG_EFI_VARS=y
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
...
...
@@ -87,13 +93,12 @@ CONFIG_BINFMT_MISC=y
#
CONFIG_PM=y
CONFIG_ACPI=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_KERNEL_CONFIG=y
#
# ACPI (Advanced Configuration and Power Interface) Support
#
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
...
...
@@ -109,6 +114,7 @@ CONFIG_ACPI_SYSTEM=y
#
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_USE_VECTOR is not set
CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y
...
...
@@ -149,7 +155,6 @@ CONFIG_PCI_NAMES=y
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
...
...
@@ -345,7 +350,6 @@ CONFIG_IP_MULTICAST=y
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
...
...
@@ -356,8 +360,6 @@ CONFIG_IP_MULTICAST=y
#
# CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
...
...
@@ -376,10 +378,11 @@ CONFIG_IP_NF_ARPTABLES=y
#
# SCTP Configuration (EXPERIMENTAL)
#
CONFIG_IPV6_SCTP__=y
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
...
...
@@ -400,16 +403,21 @@ CONFIG_IPV6_SCTP__=y
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y
CONFIG_DUMMY=y
CONFIG_BONDING=y
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
CONFIG_DUMMY=y
CONFIG_BONDING=y
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
#
# Ethernet (10 or 100Mbit)
...
...
@@ -456,7 +464,6 @@ CONFIG_E1000=y
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SK98LIN is not set
CONFIG_TIGON3=y
...
...
@@ -464,45 +471,29 @@ CONFIG_TIGON3=y
# Ethernet (10000 Mbit)
#
# CONFIG_IXGB is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
# CONFIG_S2IO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
# Wireless LAN (non-hamradio)
#
# CONFIG_
IRDA
is not set
# CONFIG_
NET_RADIO
is not set
#
#
Bluetooth support
#
Wan interfaces
#
# CONFIG_BT is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
#
# ISDN subsystem
...
...
@@ -577,11 +568,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_QIC02_TAPE is not set
#
...
...
@@ -594,7 +580,6 @@ CONFIG_LEGACY_PTY_COUNT=256
#
# CONFIG_WATCHDOG is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_GEN_RTC is not set
CONFIG_EFI_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
...
...
@@ -631,6 +616,7 @@ CONFIG_I2C_ALGOBIT=y
# I2C Hardware Bus support
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
...
...
@@ -674,6 +660,8 @@ CONFIG_I2C_ALGOBIT=y
# Other I2C Chip support
#
# CONFIG_SENSORS_EEPROM is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
...
...
@@ -704,7 +692,7 @@ CONFIG_FB=y
CONFIG_FB_RIVA=m
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON_OLD is not set
CONFIG_FB_RADEON=
y
CONFIG_FB_RADEON=
m
CONFIG_FB_RADEON_I2C=y
# CONFIG_FB_RADEON_DEBUG is not set
# CONFIG_FB_ATY128 is not set
...
...
@@ -837,6 +825,8 @@ CONFIG_USB_BANDWIDTH=y
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_SPLIT_ISO is not set
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_UHCI_HCD=y
...
...
@@ -861,7 +851,9 @@ CONFIG_USB_HIDDEV=y
# CONFIG_USB_WACOM is not set
# CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set
# CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set
#
# USB Imaging devices
...
...
@@ -908,6 +900,7 @@ CONFIG_USB_HIDDEV=y
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_TEST is not set
#
...
...
@@ -959,6 +952,7 @@ CONFIG_VFAT_FS=y
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y
...
...
@@ -1075,6 +1069,7 @@ CONFIG_NLS_UTF8=y
# Library routines
#
CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set
#
# Profiling support
...
...
@@ -1090,6 +1085,7 @@ CONFIG_DEBUG_KERNEL=y
CONFIG_IA64_PRINT_HAZARDS=y
CONFIG_DISABLE_VHPT=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_IA64_EARLY_PRINTK_VGA is not set
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
...
...
@@ -1123,4 +1119,6 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set
arch/ia64/hp/sim/boot/boot_head.S
View file @
eb0c34c8
...
...
@@ -105,37 +105,37 @@ static: cmp.eq p6,p7=6,r28 /* PAL_PTCE_INFO */
1
:
cmp.eq
p6
,
p7
=
15
,
r28
/*
PAL_PERF_MON_INFO
*/
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
movl
r9
=
0x
12082004
/*
generic
=
4
width
=
32
retired
=
8
cycles
=
18
*/
movl
r9
=
0x
08122f04
/*
generic
=
4
width
=
47
retired
=
8
cycles
=
18
*/
mov
r10
=
0
/*
reserved
*/
mov
r11
=
0
/*
reserved
*/
mov
r16
=
0xffff
/*
implemented
PMC
*/
mov
r17
=
0xffff
/*
implemented
PMD
*/
mov
r17
=
0x
3
ffff
/*
implemented
PMD
*/
add
r18
=
8
,
r29
/*
second
index
*/
;;
st8
[
r29
]=
r16
,
16
/*
store
implemented
PMC
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
st8
[
r29
]=
r0
,
16
/*
store
implemented
PMC
*/
st8
[
r29
]=
r0
,
16
/*
clear
remaining
bits
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
st8
[
r29
]=
r17
,
16
/*
store
implemented
PMD
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
mov
r16
=
0xf0
/*
cycles
count
capable
PMC
*/
;;
st8
[
r29
]=
r0
,
16
/*
store
implemented
PMC
*/
st8
[
r29
]=
r0
,
16
/*
clear
remaining
bits
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
mov
r17
=
0x
1
0
/*
retired
bundles
capable
PMC
*/
mov
r17
=
0x
f
0
/*
retired
bundles
capable
PMC
*/
;;
st8
[
r29
]=
r16
,
16
/*
store
cycles
capable
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
st8
[
r29
]=
r0
,
16
/*
store
implemented
PMC
*/
st8
[
r29
]=
r0
,
16
/*
clear
remaining
bits
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
st8
[
r29
]=
r17
,
16
/*
store
retired
bundle
capable
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
st8
[
r29
]=
r0
,
16
/*
store
implemented
PMC
*/
st8
[
r29
]=
r0
,
16
/*
clear
remaining
bits
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
1
:
br.cond.sptk.few
rp
...
...
arch/ia64/ia32/Makefile
View file @
eb0c34c8
...
...
@@ -6,3 +6,7 @@ obj-y := ia32_entry.o sys_ia32.o ia32_ioctl.o ia32_signal.o \
ia32_support.o ia32_traps.o binfmt_elf32.o ia32_ldt.o
CFLAGS_ia32_ioctl.o
+=
-Ifs
/
# Don't let GCC uses f16-f31 so that save_ia32_fpstate_live() and
# restore_ia32_fpstate_live() can be sure the live register contain user-level state.
CFLAGS_ia32_signal.o
+=
-mfixed-range
=
f16-f31
arch/ia64/ia32/ia32_signal.c
View file @
eb0c34c8
...
...
@@ -43,22 +43,6 @@
#define __IA32_NR_sigreturn 119
#define __IA32_NR_rt_sigreturn 173
#ifdef ASM_SUPPORTED
/*
* Don't let GCC uses f16-f31 so that save_ia32_fpstate_live() and
* restore_ia32_fpstate_live() can be sure the live register contain user-level state.
*/
register
double
f16
asm
(
"f16"
);
register
double
f17
asm
(
"f17"
);
register
double
f18
asm
(
"f18"
);
register
double
f19
asm
(
"f19"
);
register
double
f20
asm
(
"f20"
);
register
double
f21
asm
(
"f21"
);
register
double
f22
asm
(
"f22"
);
register
double
f23
asm
(
"f23"
);
register
double
f24
asm
(
"f24"
);
register
double
f25
asm
(
"f25"
);
register
double
f26
asm
(
"f26"
);
register
double
f27
asm
(
"f27"
);
register
double
f28
asm
(
"f28"
);
register
double
f29
asm
(
"f29"
);
register
double
f30
asm
(
"f30"
);
register
double
f31
asm
(
"f31"
);
#endif
struct
sigframe_ia32
{
int
pretcode
;
...
...
@@ -173,7 +157,8 @@ copy_siginfo_to_user32 (siginfo_t32 *to, siginfo_t *from)
case
__SI_MESGQ
>>
16
:
err
|=
__put_user
(
from
->
si_uid
,
&
to
->
si_uid
);
err
|=
__put_user
(
from
->
si_pid
,
&
to
->
si_pid
);
err
|=
__put_user
(
from
->
si_ptr
,
&
to
->
si_ptr
);
addr
=
(
unsigned
long
)
from
->
si_ptr
;
err
|=
__put_user
(
addr
,
&
to
->
si_ptr
);
break
;
}
}
...
...
arch/ia64/kernel/Makefile
View file @
eb0c34c8
...
...
@@ -23,6 +23,9 @@ targets += gate.so gate-syms.o
extra-y
+=
gate.so gate-syms.o gate.lds.s gate.o
# fp_emulate() expects f2-f5,f16-f31 to contain the user-level state.
CFLAGS_traps.o
+=
-mfixed-range
=
f2-f5,f16-f31
AFLAGS_gate.lds.o
+=
-P
-C
-U
$(ARCH)
quiet_cmd_gate
=
GATE
$@
...
...
arch/ia64/kernel/efi.c
View file @
eb0c34c8
...
...
@@ -39,7 +39,7 @@ extern efi_status_t efi_call_phys (void *, ...);
struct
efi
efi
;
EXPORT_SYMBOL
(
efi
);
static
efi_runtime_services_t
*
runtime
;
static
unsigned
long
mem_limit
=
~
0UL
;
static
unsigned
long
mem_limit
=
~
0UL
,
max_addr
=
~
0UL
;
#define efi_call_virt(f, args...) (*(f))(args)
...
...
@@ -290,6 +290,7 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
void
*
efi_map_start
,
*
efi_map_end
,
*
p
,
*
q
;
efi_memory_desc_t
*
md
,
*
check_md
;
u64
efi_desc_size
,
start
,
end
,
granule_addr
,
last_granule_addr
,
first_non_wb_addr
=
0
;
unsigned
long
total_mem
=
0
;
efi_map_start
=
__va
(
ia64_boot_param
->
efi_memmap
);
efi_map_end
=
efi_map_start
+
ia64_boot_param
->
efi_memmap_size
;
...
...
@@ -331,12 +332,18 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
trim_top
(
md
,
last_granule_addr
);
if
(
is_available_memory
(
md
))
{
if
(
md
->
phys_addr
+
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
)
>
m
em_limit
)
{
if
(
md
->
phys_addr
>
m
em_limit
)
if
(
md
->
phys_addr
+
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
)
>
m
ax_addr
)
{
if
(
md
->
phys_addr
>
m
ax_addr
)
continue
;
md
->
num_pages
=
(
m
em_limit
-
md
->
phys_addr
)
>>
EFI_PAGE_SHIFT
;
md
->
num_pages
=
(
m
ax_addr
-
md
->
phys_addr
)
>>
EFI_PAGE_SHIFT
;
}
if
(
total_mem
>=
mem_limit
)
continue
;
total_mem
+=
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
);
if
(
total_mem
>
mem_limit
)
md
->
num_pages
-=
((
total_mem
-
mem_limit
)
>>
EFI_PAGE_SHIFT
);
if
(
md
->
num_pages
==
0
)
continue
;
...
...
@@ -470,7 +477,13 @@ efi_init (void)
for
(
cp
=
saved_command_line
;
*
cp
;
)
{
if
(
memcmp
(
cp
,
"mem="
,
4
)
==
0
)
{
cp
+=
4
;
mem_limit
=
memparse
(
cp
,
&
end
)
-
1
;
mem_limit
=
memparse
(
cp
,
&
end
)
-
2
;
if
(
end
!=
cp
)
break
;
cp
=
end
;
}
else
if
(
memcmp
(
cp
,
"max_addr="
,
9
)
==
0
)
{
cp
+=
9
;
max_addr
=
memparse
(
cp
,
&
end
)
-
1
;
if
(
end
!=
cp
)
break
;
cp
=
end
;
...
...
@@ -481,8 +494,8 @@ efi_init (void)
++
cp
;
}
}
if
(
m
em_limit
!=
~
0UL
)
printk
(
KERN_INFO
"Ignoring memory above %luMB
\n
"
,
m
em_limit
>>
20
);
if
(
m
ax_addr
!=
~
0UL
)
printk
(
KERN_INFO
"Ignoring memory above %luMB
\n
"
,
m
ax_addr
>>
20
);
efi
.
systab
=
__va
(
ia64_boot_param
->
efi_systab
);
...
...
arch/ia64/kernel/fsys.S
View file @
eb0c34c8
...
...
@@ -345,40 +345,33 @@ ENTRY(fsys_rt_sigprocmask)
.
altrp
b6
.
body
mf
//
ensure
reading
of
current
->
blocked
is
ordered
add
r2
=
IA64_TASK_BLOCKED_OFFSET
,
r16
add
r9
=
TI_FLAGS
+
IA64_TASK_SIZE
,
r16
cmp4.ltu
p6
,
p0
=
SIG_SETMASK
,
r32
cmp.ne
p15
,
p0
=
r0
,
r34
//
oset
!=
NULL
?
tnat.nz
p8
,
p0
=
r34
add
r31
=
IA64_TASK_SIGHAND_OFFSET
,
r16
;;
/
*
*
Since
we
're only reading a single word, we can do it
*
atomically
without
acquiring
current
->
sighand
->
siglock
.
To
*
be
on
the
safe
side
,
we
need
a
fully
-
ordered
load
,
though
:
*/
ld8.acq
r3
=[
r2
]
//
read
/
prefetch
current
->
blocked
ld8
r3
=[
r2
]
//
read
/
prefetch
current
->
blocked
ld4
r9
=[
r9
]
add
r31
=
IA64_TASK_SIGHAND_OFFSET
,
r16
tnat.nz.or
p6
,
p0
=
r35
cmp.ne.or
p6
,
p0
=
_NSIG_WORDS
*
8
,
r35
tnat.nz.or
p6
,
p0
=
r32
(
p6
)
br.spnt.few
.
fail_einval
//
fail
with
EINVAL
;;
#ifdef CONFIG_SMP
ld8
r31
=[
r31
]
//
r31
<-
current
->
sighand
#endif
and
r9
=
TIF_ALLWORK_MASK
,
r9
tnat.nz
p6
,
p0
=
r32
;;
cmp.ne
p7
,
p0
=
0
,
r9
tnat.nz.or
p6
,
p0
=
r35
tnat.nz
p8
,
p0
=
r34
;;
cmp.ne
p15
,
p0
=
r0
,
r34
//
oset
!=
NULL
?
cmp.ne.or
p6
,
p0
=
_NSIG_WORDS
*
8
,
r35
tnat.nz.or
p8
,
p0
=
r33
(
p6
)
br.spnt.few
.
fail_einval
//
fail
with
EINVAL
(
p7
)
br.spnt.many
fsys_fallback_syscall
//
got
pending
kernel
work
...
(
p8
)
br.spnt.few
.
fail_efault
//
fail
with
EFAULT
;;
cmp.eq
p6
,
p
7
=
r0
,
r33
//
set
==
NULL
?
cmp.ne
p7
,
p0
=
0
,
r9
cmp.eq
p6
,
p
0
=
r0
,
r33
//
set
==
NULL
?
add
r31
=
IA64_SIGHAND_SIGLOCK_OFFSET
,
r31
//
r31
<-
current
->
sighand
->
siglock
(
p8
)
br.spnt.few
.
fail_efault
//
fail
with
EFAULT
(
p7
)
br.spnt.many
fsys_fallback_syscall
//
got
pending
kernel
work
...
(
p6
)
br.dpnt.many
.
store_mask
//
->
short
-
circuit
to
just
reading
the
signal
mask
/
*
Argh
,
we
actually
have
to
do
some
work
and
_update_
the
signal
mask
:
*/
...
...
@@ -462,12 +455,10 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
st4.rel
[
r31
]=
r0
//
release
the
lock
#endif
ssm
psr
.
i
cmp.ne
p9
,
p0
=
r8
,
r0
//
check
for
bad
HOW
value
;;
srlz.d
//
ensure
psr
.
i
is
set
again
mov
r18
=
0
//
i
must
not
leak
kernel
bits
...
(
p9
)
br.spnt.few
.
fail_einval
//
bail
out
for
bad
HOW
value
.
store_mask
:
EX
(.
fail_efault
,
(
p15
)
probe
.
w
.
fault
r34
,
3
)
//
verify
user
has
write
-
access
to
*
oset
...
...
@@ -574,6 +565,10 @@ GLOBAL_ENTRY(fsys_bubble_down)
or
r29
=
r8
,
r29
//
construct
cr
.
ipsr
value
to
save
addl
r22
=
IA64_RBS_OFFSET
,
r2
//
compute
base
of
RBS
;;
//
GAS
reports
a
spurious
RAW
hazard
on
the
read
of
ar
.
rnat
because
it
thinks
//
we
may
be
reading
ar
.
itc
after
writing
to
psr
.
l
.
Avoid
that
message
with
//
this
directive
:
dv_serialize_data
mov.m
r24
=
ar
.
rnat
//
read
ar
.
rnat
(
5
cyc
lat
)
lfetch.fault.excl.nt1
[
r22
]
adds
r16
=
IA64_TASK_THREAD_ON_USTACK_OFFSET
,
r2
...
...
arch/ia64/kernel/head.S
View file @
eb0c34c8
...
...
@@ -56,8 +56,7 @@ halt_msg:
GLOBAL_ENTRY
(
_start
)
start_ap
:
.
prologue
.
save
rp
,
r4
//
terminate
unwind
chain
with
a
NULL
rp
mov
r4
=
r0
.
save
rp
,
r0
//
terminate
unwind
chain
with
a
NULL
rp
.
body
rsm
psr
.
i
|
psr
.
ic
...
...
arch/ia64/kernel/ivt.S
View file @
eb0c34c8
...
...
@@ -181,6 +181,12 @@ ENTRY(vhpt_miss)
(
p7
)
itc.d
r24
;;
#ifdef CONFIG_SMP
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
/
*
*
Re
-
check
L2
and
L3
pagetable
.
If
they
changed
,
we
may
have
received
a
ptc
.
g
*
between
reading
the
pagetable
and
the
"itc"
.
If
so
,
flush
the
entry
we
...
...
@@ -229,6 +235,12 @@ ENTRY(itlb_miss)
itc.i
r18
;;
#ifdef CONFIG_SMP
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
ld8
r19
=[
r17
]
//
read
L3
PTE
again
and
see
if
same
mov
r20
=
PAGE_SHIFT
<<
2
//
setup
page
size
for
purge
;;
...
...
@@ -267,6 +279,12 @@ dtlb_fault:
itc.d
r18
;;
#ifdef CONFIG_SMP
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
ld8
r19
=[
r17
]
//
read
L3
PTE
again
and
see
if
same
mov
r20
=
PAGE_SHIFT
<<
2
//
setup
page
size
for
purge
;;
...
...
@@ -504,6 +522,12 @@ ENTRY(dirty_bit)
;;
(
p6
)
itc.d
r25
//
install
updated
PTE
;;
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
ld8
r18
=[
r17
]
//
read
PTE
again
;;
cmp.eq
p6
,
p7
=
r18
,
r25
//
is
it
same
as
the
newly
installed
...
...
@@ -563,6 +587,12 @@ ENTRY(iaccess_bit)
;;
(
p6
)
itc.i
r25
//
install
updated
PTE
;;
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
ld8
r18
=[
r17
]
//
read
PTE
again
;;
cmp.eq
p6
,
p7
=
r18
,
r25
//
is
it
same
as
the
newly
installed
...
...
@@ -610,6 +640,11 @@ ENTRY(daccess_bit)
cmp.eq
p6
,
p7
=
r26
,
r18
;;
(
p6
)
itc.d
r25
//
install
updated
PTE
/
*
*
Tell
the
assemblers
dependency
-
violation
checker
that
the
above
"itc"
instructions
*
cannot
possibly
affect
the
following
loads
:
*/
dv_serialize_data
;;
ld8
r18
=[
r17
]
//
read
PTE
again
;;
...
...
arch/ia64/kernel/machvec.c
View file @
eb0c34c8
#include <linux/config.h>
#include <linux/module.h>
#include <asm/machvec.h>
#include <asm/system.h>
#ifdef CONFIG_IA64_GENERIC
...
...
@@ -8,7 +9,6 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <asm/machvec.h>
#include <asm/page.h>
struct
ia64_machine_vector
ia64_mv
;
...
...
arch/ia64/kernel/perfmon.c
View file @
eb0c34c8
...
...
@@ -26,6 +26,7 @@
#include <linux/interrupt.h>
#include <linux/smp_lock.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/vmalloc.h>
#include <linux/mm.h>
...
...
@@ -86,27 +87,25 @@
#define PFM_REG_CONFIG (0x8<<4|PFM_REG_IMPL)
/* configuration register */
#define PFM_REG_BUFFER (0xc<<4|PFM_REG_IMPL)
/* PMD used as buffer */
#define PMC_IS_LAST(i) (pmu_conf.pmc_desc[i].type & PFM_REG_END)
#define PMD_IS_LAST(i) (pmu_conf.pmd_desc[i].type & PFM_REG_END)
#define PFM_IS_DISABLED() (pmu_conf.enabled == 0)
#define PMC_IS_LAST(i) (pmu_conf->pmc_desc[i].type & PFM_REG_END)
#define PMD_IS_LAST(i) (pmu_conf->pmd_desc[i].type & PFM_REG_END)
#define PMC_OVFL_NOTIFY(ctx, i) ((ctx)->ctx_pmds[i].flags & PFM_REGFL_OVFL_NOTIFY)
/* i assumed unsigned */
#define PMC_IS_IMPL(i) (i< PMU_MAX_PMCS && (pmu_conf
.
pmc_desc[i].type & PFM_REG_IMPL))
#define PMD_IS_IMPL(i) (i< PMU_MAX_PMDS && (pmu_conf
.
pmd_desc[i].type & PFM_REG_IMPL))
#define PMC_IS_IMPL(i) (i< PMU_MAX_PMCS && (pmu_conf
->
pmc_desc[i].type & PFM_REG_IMPL))
#define PMD_IS_IMPL(i) (i< PMU_MAX_PMDS && (pmu_conf
->
pmd_desc[i].type & PFM_REG_IMPL))
/* XXX: these assume that register i is implemented */
#define PMD_IS_COUNTING(i) ((pmu_conf
.
pmd_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
#define PMC_IS_COUNTING(i) ((pmu_conf
.
pmc_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
#define PMC_IS_MONITOR(i) ((pmu_conf
.
pmc_desc[i].type & PFM_REG_MONITOR) == PFM_REG_MONITOR)
#define PMC_IS_CONTROL(i) ((pmu_conf
.
pmc_desc[i].type & PFM_REG_CONTROL) == PFM_REG_CONTROL)
#define PMD_IS_COUNTING(i) ((pmu_conf
->
pmd_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
#define PMC_IS_COUNTING(i) ((pmu_conf
->
pmc_desc[i].type & PFM_REG_COUNTING) == PFM_REG_COUNTING)
#define PMC_IS_MONITOR(i) ((pmu_conf
->
pmc_desc[i].type & PFM_REG_MONITOR) == PFM_REG_MONITOR)
#define PMC_IS_CONTROL(i) ((pmu_conf
->
pmc_desc[i].type & PFM_REG_CONTROL) == PFM_REG_CONTROL)
#define PMC_DFL_VAL(i) pmu_conf
.
pmc_desc[i].default_value
#define PMC_RSVD_MASK(i) pmu_conf
.
pmc_desc[i].reserved_mask
#define PMD_PMD_DEP(i) pmu_conf
.
pmd_desc[i].dep_pmd[0]
#define PMC_PMD_DEP(i) pmu_conf
.
pmc_desc[i].dep_pmd[0]
#define PMC_DFL_VAL(i) pmu_conf
->
pmc_desc[i].default_value
#define PMC_RSVD_MASK(i) pmu_conf
->
pmc_desc[i].reserved_mask
#define PMD_PMD_DEP(i) pmu_conf
->
pmd_desc[i].dep_pmd[0]
#define PMC_PMD_DEP(i) pmu_conf
->
pmc_desc[i].dep_pmd[0]
#define PFM_NUM_IBRS IA64_NUM_DBG_REGS
#define PFM_NUM_DBRS IA64_NUM_DBG_REGS
...
...
@@ -133,6 +132,8 @@
#define PFM_CPUINFO_SET(v) pfm_get_cpu_var(pfm_syst_info) |= (v)
#define PFM_CPUINFO_GET() pfm_get_cpu_var(pfm_syst_info)
#define RDEP(x) (1UL<<(x))
/*
* context protection macros
* in SMP:
...
...
@@ -374,26 +375,32 @@ typedef struct {
* dep_pmd[]: a bitmask of dependent PMD registers
* dep_pmc[]: a bitmask of dependent PMC registers
*/
typedef
int
(
*
pfm_reg_check_t
)(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
typedef
struct
{
unsigned
int
type
;
int
pm_pos
;
unsigned
long
default_value
;
/* power-on default value */
unsigned
long
reserved_mask
;
/* bitmask of reserved bits */
int
(
*
read_check
)(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
)
;
int
(
*
write_check
)(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
)
;
pfm_reg_check_t
read_check
;
pfm_reg_check_t
write_check
;
unsigned
long
dep_pmd
[
4
];
unsigned
long
dep_pmc
[
4
];
}
pfm_reg_desc_t
;
/* assume cnum is a valid monitor */
#define PMC_PM(cnum, val) (((val) >> (pmu_conf.pmc_desc[cnum].pm_pos)) & 0x1)
#define PMC_WR_FUNC(cnum) (pmu_conf.pmc_desc[cnum].write_check)
#define PMD_WR_FUNC(cnum) (pmu_conf.pmd_desc[cnum].write_check)
#define PMD_RD_FUNC(cnum) (pmu_conf.pmd_desc[cnum].read_check)
#define PMC_PM(cnum, val) (((val) >> (pmu_conf->pmc_desc[cnum].pm_pos)) & 0x1)
/*
* This structure is initialized at boot time and contains
* a description of the PMU main characteristics.
*
* If the probe function is defined, detection is based
* on its return value:
* - 0 means recognized PMU
* - anything else means not supported
* When the probe function is not defined, then the pmu_family field
* is used and it must match the host CPU family such that:
* - cpu->family & config->pmu_family != 0
*/
typedef
struct
{
unsigned
long
ovfl_val
;
/* overflow value for counters */
...
...
@@ -407,15 +414,18 @@ typedef struct {
unsigned
long
impl_pmds
[
4
];
/* bitmask of implemented PMDS */
char
*
pmu_name
;
/* PMU family name */
unsigned
int
enabled
;
/* indicates if perfmon initialized properly */
unsigned
int
pmu_family
;
/* cpuid family pattern used to identify pmu */
unsigned
int
flags
;
/* pmu specific flags */
unsigned
int
num_ibrs
;
/* number of IBRS: computed at init time */
unsigned
int
num_dbrs
;
/* number of DBRS: computed at init time */
unsigned
int
num_counters
;
/* PMC/PMD counting pairs : computed at init time */
int
(
*
probe
)(
void
);
/* customized probe routine */
unsigned
int
use_rr_dbregs
:
1
;
/* set if debug registers used for range restriction */
}
pmu_config_t
;
/*
* PMU specific flags
*/
#define PFM_PMU_IRQ_RESEND 1
/* PMU needs explicit IRQ resend */
/*
* debug register related type definitions
...
...
@@ -500,6 +510,8 @@ static pfm_uuid_t pfm_null_uuid = {0,};
static
spinlock_t
pfm_buffer_fmt_lock
;
static
LIST_HEAD
(
pfm_buffer_fmt_list
);
static
pmu_config_t
*
pmu_conf
;
/* sysctl() controls */
static
pfm_sysctl_t
pfm_sysctl
;
int
pfm_debug_var
;
...
...
@@ -620,20 +632,19 @@ static void pfm_lazy_save_regs (struct task_struct *ta);
#endif
void
dump_pmu_state
(
const
char
*
);
static
int
pfm_write_ibr_dbr
(
int
mode
,
pfm_context_t
*
ctx
,
void
*
arg
,
int
count
,
struct
pt_regs
*
regs
);
/*
* the HP simulator must be first because
* CONFIG_IA64_HP_SIM is independent of CONFIG_MCKINLEY or CONFIG_ITANIUM
*/
#if defined(CONFIG_IA64_HP_SIM)
#include "perfmon_hpsim.h"
#elif defined(CONFIG_ITANIUM)
#include "perfmon_itanium.h"
#elif defined(CONFIG_MCKINLEY)
#include "perfmon_mckinley.h"
#else
#include "perfmon_generic.h"
#endif
static
pmu_config_t
*
pmu_confs
[]
=
{
&
pmu_conf_mck
,
&
pmu_conf_ita
,
&
pmu_conf_gen
,
/* must be last */
NULL
};
static
int
pfm_end_notify_user
(
pfm_context_t
*
ctx
);
...
...
@@ -702,6 +713,7 @@ pfm_restore_ibrs(unsigned long *ibrs, unsigned int nibrs)
for
(
i
=
0
;
i
<
nibrs
;
i
++
)
{
ia64_set_ibr
(
i
,
ibrs
[
i
]);
ia64_dv_serialize_instruction
();
}
ia64_srlz_i
();
}
...
...
@@ -713,6 +725,7 @@ pfm_restore_dbrs(unsigned long *dbrs, unsigned int ndbrs)
for
(
i
=
0
;
i
<
ndbrs
;
i
++
)
{
ia64_set_dbr
(
i
,
dbrs
[
i
]);
ia64_dv_serialize_data
();
}
ia64_srlz_d
();
}
...
...
@@ -723,7 +736,7 @@ pfm_restore_dbrs(unsigned long *dbrs, unsigned int ndbrs)
static
inline
unsigned
long
pfm_read_soft_counter
(
pfm_context_t
*
ctx
,
int
i
)
{
return
ctx
->
ctx_pmds
[
i
].
val
+
(
ia64_get_pmd
(
i
)
&
pmu_conf
.
ovfl_val
);
return
ctx
->
ctx_pmds
[
i
].
val
+
(
ia64_get_pmd
(
i
)
&
pmu_conf
->
ovfl_val
);
}
/*
...
...
@@ -732,7 +745,7 @@ pfm_read_soft_counter(pfm_context_t *ctx, int i)
static
inline
void
pfm_write_soft_counter
(
pfm_context_t
*
ctx
,
int
i
,
unsigned
long
val
)
{
unsigned
long
ovfl_val
=
pmu_conf
.
ovfl_val
;
unsigned
long
ovfl_val
=
pmu_conf
->
ovfl_val
;
ctx
->
ctx_pmds
[
i
].
val
=
val
&
~
ovfl_val
;
/*
...
...
@@ -878,7 +891,7 @@ pfm_mask_monitoring(struct task_struct *task)
DPRINT_ovfl
((
"masking monitoring for [%d]
\n
"
,
task
->
pid
));
ovfl_mask
=
pmu_conf
.
ovfl_val
;
ovfl_mask
=
pmu_conf
->
ovfl_val
;
/*
* monitoring can only be masked as a result of a valid
* counter overflow. In UP, it means that the PMU still
...
...
@@ -953,7 +966,7 @@ pfm_restore_monitoring(struct task_struct *task)
int
i
,
is_system
;
is_system
=
ctx
->
ctx_fl_system
;
ovfl_mask
=
pmu_conf
.
ovfl_val
;
ovfl_mask
=
pmu_conf
->
ovfl_val
;
if
(
task
!=
current
)
{
printk
(
KERN_ERR
"perfmon.%d: invalid task[%d] current[%d]
\n
"
,
__LINE__
,
task
->
pid
,
current
->
pid
);
...
...
@@ -1024,8 +1037,8 @@ pfm_restore_monitoring(struct task_struct *task)
* XXX: need to optimize
*/
if
(
ctx
->
ctx_fl_using_dbreg
)
{
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
.
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
.
num_dbrs
);
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
->
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
->
num_dbrs
);
}
/*
...
...
@@ -1058,7 +1071,7 @@ static inline void
pfm_restore_pmds
(
unsigned
long
*
pmds
,
unsigned
long
mask
)
{
int
i
;
unsigned
long
val
,
ovfl_val
=
pmu_conf
.
ovfl_val
;
unsigned
long
val
,
ovfl_val
=
pmu_conf
->
ovfl_val
;
for
(
i
=
0
;
mask
;
i
++
,
mask
>>=
1
)
{
if
((
mask
&
0x1
)
==
0
)
continue
;
...
...
@@ -1075,7 +1088,7 @@ static inline void
pfm_copy_pmds
(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
)
{
struct
thread_struct
*
thread
=
&
task
->
thread
;
unsigned
long
ovfl_val
=
pmu_conf
.
ovfl_val
;
unsigned
long
ovfl_val
=
pmu_conf
->
ovfl_val
;
unsigned
long
mask
=
ctx
->
ctx_all_pmds
[
0
];
unsigned
long
val
;
int
i
;
...
...
@@ -2513,12 +2526,12 @@ pfm_reset_pmu_state(pfm_context_t *ctx)
*
* PMC0 is treated differently.
*/
ctx
->
ctx_all_pmcs
[
0
]
=
pmu_conf
.
impl_pmcs
[
0
]
&
~
0x1
;
ctx
->
ctx_all_pmcs
[
0
]
=
pmu_conf
->
impl_pmcs
[
0
]
&
~
0x1
;
/*
* bitmask of all PMDs that are accesible to this context
*/
ctx
->
ctx_all_pmds
[
0
]
=
pmu_conf
.
impl_pmds
[
0
];
ctx
->
ctx_all_pmds
[
0
]
=
pmu_conf
->
impl_pmds
[
0
];
DPRINT
((
"<%d> all_pmcs=0x%lx all_pmds=0x%lx
\n
"
,
ctx
->
ctx_fd
,
ctx
->
ctx_all_pmcs
[
0
],
ctx
->
ctx_all_pmds
[
0
]));
...
...
@@ -2858,16 +2871,17 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
unsigned
long
value
,
pmc_pm
;
unsigned
long
smpl_pmds
,
reset_pmds
,
impl_pmds
;
unsigned
int
cnum
,
reg_flags
,
flags
,
pmc_type
;
int
i
,
can_access_pmu
=
0
,
is_loaded
,
is_system
;
int
i
,
can_access_pmu
=
0
,
is_loaded
,
is_system
,
expert_mode
;
int
is_monitor
,
is_counting
,
state
;
int
ret
=
-
EINVAL
;
pfm_reg_check_t
wr_func
;
#define PFM_CHECK_PMC_PM(x, y, z) ((x)->ctx_fl_system ^ PMC_PM(y, z))
state
=
ctx
->
ctx_state
;
is_loaded
=
state
==
PFM_CTX_LOADED
?
1
:
0
;
is_system
=
ctx
->
ctx_fl_system
;
task
=
ctx
->
ctx_task
;
impl_pmds
=
pmu_conf
.
impl_pmds
[
0
];
impl_pmds
=
pmu_conf
->
impl_pmds
[
0
];
if
(
state
==
PFM_CTX_ZOMBIE
)
return
-
EINVAL
;
...
...
@@ -2884,6 +2898,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
}
can_access_pmu
=
GET_PMU_OWNER
()
==
task
||
is_system
?
1
:
0
;
}
expert_mode
=
pfm_sysctl
.
expert_mode
;
for
(
i
=
0
;
i
<
count
;
i
++
,
req
++
)
{
...
...
@@ -2900,8 +2915,8 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
goto
error
;
}
pmc_type
=
pmu_conf
.
pmc_desc
[
cnum
].
type
;
pmc_pm
=
(
value
>>
pmu_conf
.
pmc_desc
[
cnum
].
pm_pos
)
&
0x1
;
pmc_type
=
pmu_conf
->
pmc_desc
[
cnum
].
type
;
pmc_pm
=
(
value
>>
pmu_conf
->
pmc_desc
[
cnum
].
pm_pos
)
&
0x1
;
is_counting
=
(
pmc_type
&
PFM_REG_COUNTING
)
==
PFM_REG_COUNTING
?
1
:
0
;
is_monitor
=
(
pmc_type
&
PFM_REG_MONITOR
)
==
PFM_REG_MONITOR
?
1
:
0
;
...
...
@@ -2914,6 +2929,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
DPRINT
((
"pmc%u is unimplemented or no-access pmc_type=%x
\n
"
,
cnum
,
pmc_type
));
goto
error
;
}
wr_func
=
pmu_conf
->
pmc_desc
[
cnum
].
write_check
;
/*
* If the PMC is a monitor, then if the value is not the default:
* - system-wide session: PMCx.pm=1 (privileged monitor)
...
...
@@ -2962,8 +2978,8 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
/*
* execute write checker, if any
*/
if
(
pfm_sysctl
.
expert_mode
==
0
&&
PMC_WR_FUNC
(
cnum
))
{
ret
=
PMC_WR_FUNC
(
cnum
)(
task
,
ctx
,
cnum
,
&
value
,
regs
);
if
(
likely
(
expert_mode
==
0
&&
wr_func
))
{
ret
=
(
*
wr_func
)(
task
,
ctx
,
cnum
,
&
value
,
regs
);
if
(
ret
)
goto
error
;
ret
=
-
EINVAL
;
}
...
...
@@ -3014,7 +3030,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
* PMD. Clearing is done indirectly via pfm_reset_pmu_state() so there is no
* possible leak here.
*/
CTX_USED_PMD
(
ctx
,
pmu_conf
.
pmc_desc
[
cnum
].
dep_pmd
[
0
]);
CTX_USED_PMD
(
ctx
,
pmu_conf
->
pmc_desc
[
cnum
].
dep_pmd
[
0
]);
/*
* keep track of the monitor PMC that we are using.
...
...
@@ -3096,14 +3112,15 @@ pfm_write_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
unsigned
long
value
,
hw_value
,
ovfl_mask
;
unsigned
int
cnum
;
int
i
,
can_access_pmu
=
0
,
state
;
int
is_counting
,
is_loaded
,
is_system
;
int
is_counting
,
is_loaded
,
is_system
,
expert_mode
;
int
ret
=
-
EINVAL
;
pfm_reg_check_t
wr_func
;
state
=
ctx
->
ctx_state
;
is_loaded
=
state
==
PFM_CTX_LOADED
?
1
:
0
;
is_system
=
ctx
->
ctx_fl_system
;
ovfl_mask
=
pmu_conf
.
ovfl_val
;
ovfl_mask
=
pmu_conf
->
ovfl_val
;
task
=
ctx
->
ctx_task
;
if
(
unlikely
(
state
==
PFM_CTX_ZOMBIE
))
return
-
EINVAL
;
...
...
@@ -3125,6 +3142,7 @@ pfm_write_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
}
can_access_pmu
=
GET_PMU_OWNER
()
==
task
||
is_system
?
1
:
0
;
}
expert_mode
=
pfm_sysctl
.
expert_mode
;
for
(
i
=
0
;
i
<
count
;
i
++
,
req
++
)
{
...
...
@@ -3136,14 +3154,15 @@ pfm_write_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
goto
abort_mission
;
}
is_counting
=
PMD_IS_COUNTING
(
cnum
);
wr_func
=
pmu_conf
->
pmd_desc
[
cnum
].
write_check
;
/*
* execute write checker, if any
*/
if
(
pfm_sysctl
.
expert_mode
==
0
&&
PMD_WR_FUNC
(
cnum
))
{
if
(
unlikely
(
expert_mode
==
0
&&
wr_func
))
{
unsigned
long
v
=
value
;
ret
=
PMD_WR_FUNC
(
cnum
)(
task
,
ctx
,
cnum
,
&
v
,
regs
);
ret
=
(
*
wr_func
)(
task
,
ctx
,
cnum
,
&
v
,
regs
);
if
(
ret
)
goto
abort_mission
;
value
=
v
;
...
...
@@ -3289,8 +3308,9 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
pfarg_reg_t
*
req
=
(
pfarg_reg_t
*
)
arg
;
unsigned
int
cnum
,
reg_flags
=
0
;
int
i
,
can_access_pmu
=
0
,
state
;
int
is_loaded
,
is_system
,
is_counting
;
int
is_loaded
,
is_system
,
is_counting
,
expert_mode
;
int
ret
=
-
EINVAL
;
pfm_reg_check_t
rd_func
;
/*
* access is possible when loaded only for
...
...
@@ -3300,7 +3320,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
state
=
ctx
->
ctx_state
;
is_loaded
=
state
==
PFM_CTX_LOADED
?
1
:
0
;
is_system
=
ctx
->
ctx_fl_system
;
ovfl_mask
=
pmu_conf
.
ovfl_val
;
ovfl_mask
=
pmu_conf
->
ovfl_val
;
task
=
ctx
->
ctx_task
;
if
(
state
==
PFM_CTX_ZOMBIE
)
return
-
EINVAL
;
...
...
@@ -3323,6 +3343,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
if
(
can_access_pmu
)
ia64_srlz_d
();
}
expert_mode
=
pfm_sysctl
.
expert_mode
;
DPRINT
((
"loaded=%d access_pmu=%d ctx_state=%d
\n
"
,
is_loaded
,
...
...
@@ -3369,6 +3390,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
*/
val
=
is_loaded
?
thread
->
pmds
[
cnum
]
:
0UL
;
}
rd_func
=
pmu_conf
->
pmd_desc
[
cnum
].
read_check
;
if
(
is_counting
)
{
/*
...
...
@@ -3381,9 +3403,9 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
/*
* execute read checker, if any
*/
if
(
unlikely
(
pfm_sysctl
.
expert_mode
==
0
&&
PMD_RD_FUNC
(
cnum
)
))
{
if
(
unlikely
(
expert_mode
==
0
&&
rd_func
))
{
unsigned
long
v
=
val
;
ret
=
PMD_RD_FUNC
(
cnum
)(
ctx
->
ctx_task
,
ctx
,
cnum
,
&
v
,
regs
);
ret
=
(
*
rd_func
)(
ctx
->
ctx_task
,
ctx
,
cnum
,
&
v
,
regs
);
if
(
ret
)
goto
error
;
val
=
v
;
ret
=
-
EINVAL
;
...
...
@@ -3463,7 +3485,7 @@ pfm_use_debug_registers(struct task_struct *task)
unsigned
long
flags
;
int
ret
=
0
;
if
(
pmu_conf
.
use_rr_dbregs
==
0
)
return
0
;
if
(
pmu_conf
->
use_rr_dbregs
==
0
)
return
0
;
DPRINT
((
"called for [%d]
\n
"
,
task
->
pid
));
...
...
@@ -3517,7 +3539,7 @@ pfm_release_debug_registers(struct task_struct *task)
unsigned
long
flags
;
int
ret
;
if
(
pmu_conf
.
use_rr_dbregs
==
0
)
return
0
;
if
(
pmu_conf
->
use_rr_dbregs
==
0
)
return
0
;
LOCK_PFS
(
flags
);
if
(
pfm_sessions
.
pfs_ptrace_use_dbregs
==
0
)
{
...
...
@@ -3720,7 +3742,7 @@ pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_
int
i
,
can_access_pmu
=
0
;
int
is_system
,
is_loaded
;
if
(
pmu_conf
.
use_rr_dbregs
==
0
)
return
-
EINVAL
;
if
(
pmu_conf
->
use_rr_dbregs
==
0
)
return
-
EINVAL
;
state
=
ctx
->
ctx_state
;
is_loaded
=
state
==
PFM_CTX_LOADED
?
1
:
0
;
...
...
@@ -3802,14 +3824,14 @@ pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_
*/
if
(
first_time
&&
can_access_pmu
)
{
DPRINT
((
"[%d] clearing ibrs, dbrs
\n
"
,
task
->
pid
));
for
(
i
=
0
;
i
<
pmu_conf
.
num_ibrs
;
i
++
)
{
for
(
i
=
0
;
i
<
pmu_conf
->
num_ibrs
;
i
++
)
{
ia64_set_ibr
(
i
,
0UL
);
ia64_
srlz_i
();
ia64_
dv_serialize_instruction
();
}
ia64_srlz_i
();
for
(
i
=
0
;
i
<
pmu_conf
.
num_dbrs
;
i
++
)
{
for
(
i
=
0
;
i
<
pmu_conf
->
num_dbrs
;
i
++
)
{
ia64_set_dbr
(
i
,
0UL
);
ia64_
srlz_d
();
ia64_
dv_serialize_data
();
}
ia64_srlz_d
();
}
...
...
@@ -3856,7 +3878,10 @@ pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_
if
(
mode
==
PFM_CODE_RR
)
{
CTX_USED_IBR
(
ctx
,
rnum
);
if
(
can_access_pmu
)
ia64_set_ibr
(
rnum
,
dbreg
.
val
);
if
(
can_access_pmu
)
{
ia64_set_ibr
(
rnum
,
dbreg
.
val
);
ia64_dv_serialize_instruction
();
}
ctx
->
ctx_ibrs
[
rnum
]
=
dbreg
.
val
;
...
...
@@ -3865,8 +3890,10 @@ pfm_write_ibr_dbr(int mode, pfm_context_t *ctx, void *arg, int count, struct pt_
}
else
{
CTX_USED_DBR
(
ctx
,
rnum
);
if
(
can_access_pmu
)
ia64_set_dbr
(
rnum
,
dbreg
.
val
);
if
(
can_access_pmu
)
{
ia64_set_dbr
(
rnum
,
dbreg
.
val
);
ia64_dv_serialize_data
();
}
ctx
->
ctx_dbrs
[
rnum
]
=
dbreg
.
val
;
DPRINT
((
"write dbr%u=0x%lx used_dbrs=0x%x is_loaded=%d access_pmu=%d
\n
"
,
...
...
@@ -4367,8 +4394,8 @@ pfm_context_load(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
* guaranteed safe by earlier check against DBG_VALID
*/
if
(
ctx
->
ctx_fl_using_dbreg
)
{
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
.
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
.
num_dbrs
);
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
->
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
->
num_dbrs
);
}
/*
* set new ownership
...
...
@@ -4777,7 +4804,7 @@ sys_perfmonctl (int fd, int cmd, void *arg, int count, long arg5, long arg6, lon
/*
* reject any call if perfmon was disabled at initialization
*/
if
(
unlikely
(
PFM_IS_DISABLED
()
))
return
-
ENOSYS
;
if
(
unlikely
(
pmu_conf
==
NULL
))
return
-
ENOSYS
;
if
(
unlikely
(
cmd
<
0
||
cmd
>=
PFM_CMD_COUNT
))
{
DPRINT
((
"invalid cmd=%d
\n
"
,
cmd
));
...
...
@@ -5178,7 +5205,7 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
tstamp
=
ia64_get_itc
();
mask
=
pmc0
>>
PMU_FIRST_COUNTER
;
ovfl_val
=
pmu_conf
.
ovfl_val
;
ovfl_val
=
pmu_conf
->
ovfl_val
;
has_smpl
=
CTX_HAS_SMPL
(
ctx
);
DPRINT_ovfl
((
"pmc0=0x%lx pid=%d iip=0x%lx, %s "
...
...
@@ -5536,57 +5563,65 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
return
IRQ_HANDLED
;
}
/*
* /proc/perfmon interface, for debug only
*/
#define PFM_PROC_SHOW_HEADER ((void *)NR_CPUS+1)
/* for debug only */
static
int
pfm_proc_info
(
char
*
page
)
static
void
*
pfm_proc_start
(
struct
seq_file
*
m
,
loff_t
*
pos
)
{
char
*
p
=
page
;
struct
list_head
*
pos
;
pfm_buffer_fmt_t
*
entry
;
unsigned
long
psr
,
flags
;
int
online_cpus
=
0
;
int
i
;
if
(
*
pos
==
0
)
{
return
PFM_PROC_SHOW_HEADER
;
}
p
+=
sprintf
(
p
,
"perfmon version : %u.%u
\n
"
,
PFM_VERSION_MAJ
,
PFM_VERSION_MIN
);
p
+=
sprintf
(
p
,
"model : %s
\n
"
,
pmu_conf
.
pmu_name
);
p
+=
sprintf
(
p
,
"fastctxsw : %s
\n
"
,
pfm_sysctl
.
fastctxsw
>
0
?
"Yes"
:
"No"
);
p
+=
sprintf
(
p
,
"expert mode : %s
\n
"
,
pfm_sysctl
.
expert_mode
>
0
?
"Yes"
:
"No"
);
p
+=
sprintf
(
p
,
"ovfl_mask : 0x%lx
\n
"
,
pmu_conf
.
ovfl_val
);
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
cpu_online
(
i
)
==
0
)
continue
;
p
+=
sprintf
(
p
,
"CPU%-2d overflow intrs : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_ovfl_intr_count
);
p
+=
sprintf
(
p
,
"CPU%-2d overflow cycles : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_ovfl_intr_cycles
);
p
+=
sprintf
(
p
,
"CPU%-2d overflow min : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_ovfl_intr_cycles_min
);
p
+=
sprintf
(
p
,
"CPU%-2d overflow max : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_ovfl_intr_cycles_max
);
p
+=
sprintf
(
p
,
"CPU%-2d smpl handler calls : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_smpl_handler_calls
);
p
+=
sprintf
(
p
,
"CPU%-2d smpl handler cycles : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_smpl_handler_cycles
);
p
+=
sprintf
(
p
,
"CPU%-2d spurious intrs : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_spurious_ovfl_intr_count
);
p
+=
sprintf
(
p
,
"CPU%-2d replay intrs : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_replay_ovfl_intr_count
);
p
+=
sprintf
(
p
,
"CPU%-2d syst_wide : %d
\n
"
,
i
,
pfm_get_cpu_data
(
pfm_syst_info
,
i
)
&
PFM_CPUINFO_SYST_WIDE
?
1
:
0
);
p
+=
sprintf
(
p
,
"CPU%-2d dcr_pp : %d
\n
"
,
i
,
pfm_get_cpu_data
(
pfm_syst_info
,
i
)
&
PFM_CPUINFO_DCR_PP
?
1
:
0
);
p
+=
sprintf
(
p
,
"CPU%-2d exclude idle : %d
\n
"
,
i
,
pfm_get_cpu_data
(
pfm_syst_info
,
i
)
&
PFM_CPUINFO_EXCL_IDLE
?
1
:
0
);
p
+=
sprintf
(
p
,
"CPU%-2d owner : %d
\n
"
,
i
,
pfm_get_cpu_data
(
pmu_owner
,
i
)
?
pfm_get_cpu_data
(
pmu_owner
,
i
)
->
pid
:
-
1
);
p
+=
sprintf
(
p
,
"CPU%-2d context : %p
\n
"
,
i
,
pfm_get_cpu_data
(
pmu_ctx
,
i
));
p
+=
sprintf
(
p
,
"CPU%-2d activations : %lu
\n
"
,
i
,
pfm_get_cpu_data
(
pmu_activation_number
,
i
));
online_cpus
++
;
}
if
(
online_cpus
==
1
)
{
psr
=
pfm_get_psr
();
ia64_srlz_d
();
p
+=
sprintf
(
p
,
"CPU%-2d psr : 0x%lx
\n
"
,
smp_processor_id
(),
psr
);
p
+=
sprintf
(
p
,
"CPU%-2d pmc0 : 0x%lx
\n
"
,
smp_processor_id
(),
ia64_get_pmc
(
0
));
for
(
i
=
4
;
i
<
8
;
i
++
)
{
p
+=
sprintf
(
p
,
"CPU%-2d pmc%u : 0x%lx
\n
"
,
smp_processor_id
(),
i
,
ia64_get_pmc
(
i
));
p
+=
sprintf
(
p
,
"CPU%-2d pmd%u : 0x%lx
\n
"
,
smp_processor_id
(),
i
,
ia64_get_pmd
(
i
));
while
(
*
pos
<=
NR_CPUS
)
{
if
(
cpu_online
(
*
pos
-
1
))
{
return
(
void
*
)
*
pos
;
}
++*
pos
;
}
return
NULL
;
}
static
void
*
pfm_proc_next
(
struct
seq_file
*
m
,
void
*
v
,
loff_t
*
pos
)
{
++*
pos
;
return
pfm_proc_start
(
m
,
pos
);
}
static
void
pfm_proc_stop
(
struct
seq_file
*
m
,
void
*
v
)
{
}
static
void
pfm_proc_show_header
(
struct
seq_file
*
m
)
{
struct
list_head
*
pos
;
pfm_buffer_fmt_t
*
entry
;
unsigned
long
flags
;
seq_printf
(
m
,
"perfmon version : %u.%u
\n
"
"model : %s
\n
"
"fastctxsw : %s
\n
"
"expert mode : %s
\n
"
"ovfl_mask : 0x%lx
\n
"
"PMU flags : 0x%x
\n
"
,
PFM_VERSION_MAJ
,
PFM_VERSION_MIN
,
pmu_conf
->
pmu_name
,
pfm_sysctl
.
fastctxsw
>
0
?
"Yes"
:
"No"
,
pfm_sysctl
.
expert_mode
>
0
?
"Yes"
:
"No"
,
pmu_conf
->
ovfl_val
,
pmu_conf
->
flags
);
LOCK_PFS
(
flags
);
p
+=
sprintf
(
p
,
"proc_sessions : %u
\n
"
seq_printf
(
m
,
"proc_sessions : %u
\n
"
"sys_sessions : %u
\n
"
"sys_use_dbregs : %u
\n
"
"ptrace_use_dbregs : %u
\n
"
,
...
...
@@ -5594,13 +5629,14 @@ pfm_proc_info(char *page)
pfm_sessions
.
pfs_sys_sessions
,
pfm_sessions
.
pfs_sys_use_dbregs
,
pfm_sessions
.
pfs_ptrace_use_dbregs
);
UNLOCK_PFS
(
flags
);
spin_lock
(
&
pfm_buffer_fmt_lock
);
list_for_each
(
pos
,
&
pfm_buffer_fmt_list
)
{
entry
=
list_entry
(
pos
,
pfm_buffer_fmt_t
,
fmt_list
);
p
+=
sprintf
(
p
,
"format : %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x %s
\n
"
,
seq_printf
(
m
,
"format : %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x %s
\n
"
,
entry
->
fmt_uuid
[
0
],
entry
->
fmt_uuid
[
1
],
entry
->
fmt_uuid
[
2
],
...
...
@@ -5621,26 +5657,91 @@ pfm_proc_info(char *page)
}
spin_unlock
(
&
pfm_buffer_fmt_lock
);
return
p
-
page
;
}
/* /proc interface, for debug only */
static
int
p
erfmon_read_entry
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
p
fm_proc_show
(
struct
seq_file
*
m
,
void
*
v
)
{
int
len
=
pfm_proc_info
(
page
);
unsigned
long
psr
;
unsigned
int
i
;
int
cpu
;
if
(
v
==
PFM_PROC_SHOW_HEADER
)
{
pfm_proc_show_header
(
m
);
return
0
;
}
if
(
len
<=
off
+
count
)
*
eof
=
1
;
/* show info for CPU (v - 1) */
cpu
=
(
long
)
v
-
1
;
seq_printf
(
m
,
"CPU%-2d overflow intrs : %lu
\n
"
"CPU%-2d overflow cycles : %lu
\n
"
"CPU%-2d overflow min : %lu
\n
"
"CPU%-2d overflow max : %lu
\n
"
"CPU%-2d smpl handler calls : %lu
\n
"
"CPU%-2d smpl handler cycles : %lu
\n
"
"CPU%-2d spurious intrs : %lu
\n
"
"CPU%-2d replay intrs : %lu
\n
"
"CPU%-2d syst_wide : %d
\n
"
"CPU%-2d dcr_pp : %d
\n
"
"CPU%-2d exclude idle : %d
\n
"
"CPU%-2d owner : %d
\n
"
"CPU%-2d context : %p
\n
"
"CPU%-2d activations : %lu
\n
"
,
cpu
,
pfm_stats
[
cpu
].
pfm_ovfl_intr_count
,
cpu
,
pfm_stats
[
cpu
].
pfm_ovfl_intr_cycles
,
cpu
,
pfm_stats
[
cpu
].
pfm_ovfl_intr_cycles_min
,
cpu
,
pfm_stats
[
cpu
].
pfm_ovfl_intr_cycles_max
,
cpu
,
pfm_stats
[
cpu
].
pfm_smpl_handler_calls
,
cpu
,
pfm_stats
[
cpu
].
pfm_smpl_handler_cycles
,
cpu
,
pfm_stats
[
cpu
].
pfm_spurious_ovfl_intr_count
,
cpu
,
pfm_stats
[
cpu
].
pfm_replay_ovfl_intr_count
,
cpu
,
pfm_get_cpu_data
(
pfm_syst_info
,
cpu
)
&
PFM_CPUINFO_SYST_WIDE
?
1
:
0
,
cpu
,
pfm_get_cpu_data
(
pfm_syst_info
,
cpu
)
&
PFM_CPUINFO_DCR_PP
?
1
:
0
,
cpu
,
pfm_get_cpu_data
(
pfm_syst_info
,
cpu
)
&
PFM_CPUINFO_EXCL_IDLE
?
1
:
0
,
cpu
,
pfm_get_cpu_data
(
pmu_owner
,
cpu
)
?
pfm_get_cpu_data
(
pmu_owner
,
cpu
)
->
pid
:
-
1
,
cpu
,
pfm_get_cpu_data
(
pmu_ctx
,
cpu
),
cpu
,
pfm_get_cpu_data
(
pmu_activation_number
,
cpu
));
if
(
num_online_cpus
()
==
1
&&
pfm_sysctl
.
debug
>
0
)
{
*
start
=
page
+
off
;
len
-=
off
;
psr
=
pfm_get_psr
();
if
(
len
>
count
)
len
=
count
;
if
(
len
<
0
)
len
=
0
;
ia64_srlz_d
();
return
len
;
seq_printf
(
m
,
"CPU%-2d psr : 0x%lx
\n
"
"CPU%-2d pmc0 : 0x%lx
\n
"
,
cpu
,
psr
,
cpu
,
ia64_get_pmc
(
0
));
for
(
i
=
0
;
PMC_IS_LAST
(
i
)
==
0
;
i
++
)
{
if
(
PMC_IS_COUNTING
(
i
)
==
0
)
continue
;
seq_printf
(
m
,
"CPU%-2d pmc%u : 0x%lx
\n
"
"CPU%-2d pmd%u : 0x%lx
\n
"
,
cpu
,
i
,
ia64_get_pmc
(
i
),
cpu
,
i
,
ia64_get_pmd
(
i
));
}
}
return
0
;
}
struct
seq_operations
pfm_seq_ops
=
{
.
start
=
pfm_proc_start
,
.
next
=
pfm_proc_next
,
.
stop
=
pfm_proc_stop
,
.
show
=
pfm_proc_show
};
static
int
pfm_proc_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
pfm_seq_ops
);
}
/*
* we come here as soon as local_cpu_data->pfm_syst_wide is set. this happens
* during pfm_enable() hence before pfm_start(). We cannot assume monitoring
...
...
@@ -5899,6 +6000,7 @@ pfm_load_regs (struct task_struct *task)
unsigned
long
pmc_mask
=
0UL
,
pmd_mask
=
0UL
;
unsigned
long
flags
;
u64
psr
,
psr_up
;
int
need_irq_resend
;
ctx
=
PFM_GET_CTX
(
task
);
if
(
unlikely
(
ctx
==
NULL
))
return
;
...
...
@@ -5919,6 +6021,8 @@ pfm_load_regs (struct task_struct *task)
flags
=
pfm_protect_ctx_ctxsw
(
ctx
);
psr
=
pfm_get_psr
();
need_irq_resend
=
pmu_conf
->
flags
&
PFM_PMU_IRQ_RESEND
;
BUG_ON
(
psr
&
(
IA64_PSR_UP
|
IA64_PSR_PP
));
BUG_ON
(
psr
&
IA64_PSR_I
);
...
...
@@ -5944,8 +6048,8 @@ pfm_load_regs (struct task_struct *task)
* stale state.
*/
if
(
ctx
->
ctx_fl_using_dbreg
)
{
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
.
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
.
num_dbrs
);
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
->
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
->
num_dbrs
);
}
/*
* retrieve saved psr.up
...
...
@@ -6004,12 +6108,12 @@ pfm_load_regs (struct task_struct *task)
ia64_set_pmc
(
0
,
t
->
pmcs
[
0
]);
ia64_srlz_d
();
t
->
pmcs
[
0
]
=
0UL
;
#ifndef CONFIG_MCKINLEY
/*
* will replay the PMU interrupt
*/
hw_resend_irq
(
NULL
,
IA64_PERFMON_VECTOR
);
#endif
if
(
need_irq_resend
)
hw_resend_irq
(
NULL
,
IA64_PERFMON_VECTOR
);
pfm_stats
[
smp_processor_id
()].
pfm_replay_ovfl_intr_count
++
;
}
...
...
@@ -6061,6 +6165,7 @@ pfm_load_regs (struct task_struct *task)
struct
task_struct
*
owner
;
unsigned
long
pmd_mask
,
pmc_mask
;
u64
psr
,
psr_up
;
int
need_irq_resend
;
owner
=
GET_PMU_OWNER
();
ctx
=
PFM_GET_CTX
(
task
);
...
...
@@ -6079,14 +6184,15 @@ pfm_load_regs (struct task_struct *task)
* (not perfmon) by the previous task.
*/
if
(
ctx
->
ctx_fl_using_dbreg
)
{
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
.
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
.
num_dbrs
);
pfm_restore_ibrs
(
ctx
->
ctx_ibrs
,
pmu_conf
->
num_ibrs
);
pfm_restore_dbrs
(
ctx
->
ctx_dbrs
,
pmu_conf
->
num_dbrs
);
}
/*
* retrieved saved psr.up
*/
psr_up
=
ctx
->
ctx_saved_psr_up
;
need_irq_resend
=
pmu_conf
->
flags
&
PFM_PMU_IRQ_RESEND
;
/*
* short path, our state is still there, just
...
...
@@ -6143,12 +6249,11 @@ pfm_load_regs (struct task_struct *task)
t
->
pmcs
[
0
]
=
0UL
;
#ifndef CONFIG_MCKINLEY
/*
* will replay the PMU interrupt
*/
hw_resend_irq
(
NULL
,
IA64_PERFMON_VECTOR
);
#endif
if
(
need_irq_resend
)
hw_resend_irq
(
NULL
,
IA64_PERFMON_VECTOR
);
pfm_stats
[
smp_processor_id
()].
pfm_replay_ovfl_intr_count
++
;
}
...
...
@@ -6222,7 +6327,7 @@ pfm_flush_pmds(struct task_struct *task, pfm_context_t *ctx)
*/
task
->
thread
.
pmcs
[
0
]
=
0
;
}
ovfl_val
=
pmu_conf
.
ovfl_val
;
ovfl_val
=
pmu_conf
->
ovfl_val
;
/*
* we save all the used pmds
* we take care of overflows for counting PMDs
...
...
@@ -6287,6 +6392,36 @@ static struct irqaction perfmon_irqaction = {
*/
static
int
init_pfm_fs
(
void
);
static
int
__init
pfm_probe_pmu
(
void
)
{
pmu_config_t
**
p
;
int
family
;
family
=
local_cpu_data
->
family
;
p
=
pmu_confs
;
while
(
*
p
)
{
if
((
*
p
)
->
probe
)
{
if
((
*
p
)
->
probe
()
==
0
)
goto
found
;
}
else
if
((
*
p
)
->
pmu_family
==
family
||
(
*
p
)
->
pmu_family
==
0xff
)
{
goto
found
;
}
p
++
;
}
return
-
1
;
found:
pmu_conf
=
*
p
;
return
0
;
}
static
struct
file_operations
pfm_proc_fops
=
{
.
open
=
pfm_proc_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
int
__init
pfm_init
(
void
)
{
...
...
@@ -6297,12 +6432,9 @@ pfm_init(void)
PFM_VERSION_MIN
,
IA64_PERFMON_VECTOR
);
/*
* PMU type sanity check
* XXX: maybe better to implement autodetection (but then we have a larger kernel)
*/
if
(
local_cpu_data
->
family
!=
pmu_conf
.
pmu_family
)
{
printk
(
KERN_INFO
"perfmon: disabled, kernel only supports %s PMU family
\n
"
,
pmu_conf
.
pmu_name
);
if
(
pfm_probe_pmu
())
{
printk
(
KERN_INFO
"perfmon: disabled, there is no support for processor family %d
\n
"
,
local_cpu_data
->
family
);
return
-
ENODEV
;
}
...
...
@@ -6313,56 +6445,64 @@ pfm_init(void)
n
=
0
;
for
(
i
=
0
;
PMC_IS_LAST
(
i
)
==
0
;
i
++
)
{
if
(
PMC_IS_IMPL
(
i
)
==
0
)
continue
;
pmu_conf
.
impl_pmcs
[
i
>>
6
]
|=
1UL
<<
(
i
&
63
);
pmu_conf
->
impl_pmcs
[
i
>>
6
]
|=
1UL
<<
(
i
&
63
);
n
++
;
}
pmu_conf
.
num_pmcs
=
n
;
pmu_conf
->
num_pmcs
=
n
;
n
=
0
;
n_counters
=
0
;
for
(
i
=
0
;
PMD_IS_LAST
(
i
)
==
0
;
i
++
)
{
if
(
PMD_IS_IMPL
(
i
)
==
0
)
continue
;
pmu_conf
.
impl_pmds
[
i
>>
6
]
|=
1UL
<<
(
i
&
63
);
pmu_conf
->
impl_pmds
[
i
>>
6
]
|=
1UL
<<
(
i
&
63
);
n
++
;
if
(
PMD_IS_COUNTING
(
i
))
n_counters
++
;
}
pmu_conf
.
num_pmds
=
n
;
pmu_conf
.
num_counters
=
n_counters
;
pmu_conf
->
num_pmds
=
n
;
pmu_conf
->
num_counters
=
n_counters
;
/*
* sanity checks on the number of debug registers
*/
if
(
pmu_conf
.
use_rr_dbregs
)
{
if
(
pmu_conf
.
num_ibrs
>
IA64_NUM_DBG_REGS
)
{
printk
(
KERN_INFO
"perfmon: unsupported number of code debug registers (%u)
\n
"
,
pmu_conf
.
num_ibrs
);
if
(
pmu_conf
->
use_rr_dbregs
)
{
if
(
pmu_conf
->
num_ibrs
>
IA64_NUM_DBG_REGS
)
{
printk
(
KERN_INFO
"perfmon: unsupported number of code debug registers (%u)
\n
"
,
pmu_conf
->
num_ibrs
);
pmu_conf
=
NULL
;
return
-
1
;
}
if
(
pmu_conf
.
num_dbrs
>
IA64_NUM_DBG_REGS
)
{
printk
(
KERN_INFO
"perfmon: unsupported number of data debug registers (%u)
\n
"
,
pmu_conf
.
num_ibrs
);
if
(
pmu_conf
->
num_dbrs
>
IA64_NUM_DBG_REGS
)
{
printk
(
KERN_INFO
"perfmon: unsupported number of data debug registers (%u)
\n
"
,
pmu_conf
->
num_ibrs
);
pmu_conf
=
NULL
;
return
-
1
;
}
}
printk
(
"perfmon: %s PMU detected, %u PMCs, %u PMDs, %u counters (%lu bits)
\n
"
,
pmu_conf
.
pmu_name
,
pmu_conf
.
num_pmcs
,
pmu_conf
.
num_pmds
,
pmu_conf
.
num_counters
,
ffz
(
pmu_conf
.
ovfl_val
));
pmu_conf
->
pmu_name
,
pmu_conf
->
num_pmcs
,
pmu_conf
->
num_pmds
,
pmu_conf
->
num_counters
,
ffz
(
pmu_conf
->
ovfl_val
));
/* sanity check */
if
(
pmu_conf
.
num_pmds
>=
IA64_NUM_PMD_REGS
||
pmu_conf
.
num_pmcs
>=
IA64_NUM_PMC_REGS
)
{
if
(
pmu_conf
->
num_pmds
>=
IA64_NUM_PMD_REGS
||
pmu_conf
->
num_pmcs
>=
IA64_NUM_PMC_REGS
)
{
printk
(
KERN_ERR
"perfmon: not enough pmc/pmd, perfmon disabled
\n
"
);
pmu_conf
=
NULL
;
return
-
1
;
}
/*
* create /proc/perfmon (mostly for debugging purposes)
*/
perfmon_dir
=
create_proc_read_entry
(
"perfmon"
,
0
,
0
,
perfmon_read_entry
,
NULL
);
perfmon_dir
=
create_proc_entry
(
"perfmon"
,
S_IRUGO
,
NULL
);
if
(
perfmon_dir
==
NULL
)
{
printk
(
KERN_ERR
"perfmon: cannot create /proc entry, perfmon disabled
\n
"
);
pmu_conf
=
NULL
;
return
-
1
;
}
/*
* install customized file operations for /proc/perfmon entry
*/
perfmon_dir
->
proc_fops
=
&
pfm_proc_fops
;
/*
* create /proc/sys/kernel/perfmon (for debugging purposes)
...
...
@@ -6379,9 +6519,6 @@ pfm_init(void)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
pfm_stats
[
i
].
pfm_ovfl_intr_cycles_min
=
~
0UL
;
/* we are all set */
pmu_conf
.
enabled
=
1
;
return
0
;
}
...
...
@@ -6393,8 +6530,6 @@ __initcall(pfm_init);
void
pfm_init_percpu
(
void
)
{
int
i
;
/*
* make sure no measurement is active
* (may inherit programmed PMCs from EFI).
...
...
@@ -6412,28 +6547,6 @@ pfm_init_percpu (void)
ia64_setreg
(
_IA64_REG_CR_PMV
,
IA64_PERFMON_VECTOR
);
ia64_srlz_d
();
/*
* we first initialize the PMU to a stable state.
* the values may have been changed from their power-up
* values by software executed before the kernel took over.
*
* At this point, pmu_conf has not yet been initialized
*
* On McKinley, this code is ineffective until PMC4 is initialized
* but that's all right because we take care of pmc0 later.
*
* XXX: potential problems with pmc1.
*/
for
(
i
=
1
;
PMC_IS_LAST
(
i
)
==
0
;
i
++
)
{
if
(
PMC_IS_IMPL
(
i
)
==
0
)
continue
;
ia64_set_pmc
(
i
,
PMC_DFL_VAL
(
i
));
}
for
(
i
=
0
;
PMD_IS_LAST
(
i
)
==
0
;
i
++
)
{
if
(
PMD_IS_IMPL
(
i
)
==
0
)
continue
;
ia64_set_pmd
(
i
,
0UL
);
}
}
/*
...
...
arch/ia64/kernel/perfmon_generic.h
View file @
eb0c34c8
...
...
@@ -6,13 +6,6 @@
* Stephane Eranian <eranian@hpl.hp.com>
*/
#define RDEP(x) (1UL<<(x))
#if defined(CONFIG_ITANIUM) || defined (CONFIG_MCKINLEY)
#error "This file should not be used when CONFIG_ITANIUM or CONFIG_MCKINLEY is defined"
#endif
static
pfm_reg_desc_t
pfm_gen_pmc_desc
[
PMU_MAX_PMCS
]
=
{
/* pmc0 */
{
PFM_REG_CONTROL
,
0
,
0x1UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc1 */
{
PFM_REG_CONTROL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
...
...
@@ -40,10 +33,9 @@ static pfm_reg_desc_t pfm_gen_pmd_desc[PMU_MAX_PMDS]={
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf
=
{
static
pmu_config_t
pmu_conf
_gen
=
{
.
pmu_name
=
"Generic"
,
.
pmu_family
=
0xff
,
/* any */
.
enabled
=
0
,
.
ovfl_val
=
(
1UL
<<
32
)
-
1
,
.
num_ibrs
=
0
,
/* does not use */
.
num_dbrs
=
0
,
/* does not use */
...
...
arch/ia64/kernel/perfmon_hpsim.h
deleted
100644 → 0
View file @
46866963
/*
* This file contains the HP SKI Simulator PMU register description tables
* and pmc checkers used by perfmon.c.
*
* Copyright (C) 2002-2003 Hewlett Packard Co
* Stephane Eranian <eranian@hpl.hp.com>
*
* File mostly contributed by Ian Wienand <ianw@gelato.unsw.edu.au>
*
* This file is included as a dummy template so the kernel does not
* try to initalize registers the simulator can't handle.
*
* Note the simulator does not (currently) implement these registers, i.e.,
* they do not count anything. But you can read/write them.
*/
#define RDEP(x) (1UL<<(x))
#ifndef CONFIG_IA64_HP_SIM
#error "This file should only be included for the HP Simulator"
#endif
static
pfm_reg_desc_t
pfm_hpsim_pmc_desc
[
PMU_MAX_PMCS
]
=
{
/* pmc0 */
{
PFM_REG_CONTROL
,
0
,
0x1UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc1 */
{
PFM_REG_CONTROL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc2 */
{
PFM_REG_CONTROL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc3 */
{
PFM_REG_CONTROL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc4 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc5 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc6 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc7 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc8 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc9 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
9
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc10 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc11 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc12 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc13 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
13
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc14 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
14
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc15 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
15
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
{
PFM_REG_END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
static
pfm_reg_desc_t
pfm_hpsim_pmd_desc
[
PMU_MAX_PMDS
]
=
{
/* pmd0 */
{
PFM_REG_BUFFER
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmd1 */
{
PFM_REG_BUFFER
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmd2 */
{
PFM_REG_BUFFER
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmd3 */
{
PFM_REG_BUFFER
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmd4 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
}},
/* pmd5 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
}},
/* pmd6 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
}},
/* pmd7 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
}},
/* pmd8 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
8
),
0UL
,
0UL
,
0UL
}},
/* pmd9 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
9
),
0UL
,
0UL
,
0UL
}},
/* pmd10 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
}},
/* pmd11 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
/* pmd12 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd13 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
13
),
0UL
,
0UL
,
0UL
}},
/* pmd14 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
14
),
0UL
,
0UL
,
0UL
}},
/* pmd15 */
{
PFM_REG_COUNTING
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
15
),
0UL
,
0UL
,
0UL
}},
{
PFM_REG_END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf
=
{
.
pmu_name
=
"hpsim"
,
.
pmu_family
=
0x7
,
/* ski emulator reports as Itanium */
.
enabled
=
0
,
.
ovfl_val
=
(
1UL
<<
32
)
-
1
,
.
num_ibrs
=
0
,
/* does not use */
.
num_dbrs
=
0
,
/* does not use */
.
pmd_desc
=
pfm_hpsim_pmd_desc
,
.
pmc_desc
=
pfm_hpsim_pmc_desc
};
arch/ia64/kernel/perfmon_itanium.h
View file @
eb0c34c8
...
...
@@ -5,15 +5,7 @@
* Copyright (C) 2002-2003 Hewlett Packard Co
* Stephane Eranian <eranian@hpl.hp.com>
*/
#define RDEP(x) (1UL<<(x))
#ifndef CONFIG_ITANIUM
#error "This file is only valid when CONFIG_ITANIUM is defined"
#endif
static
int
pfm_ita_pmc_check
(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
static
int
pfm_write_ibr_dbr
(
int
mode
,
pfm_context_t
*
ctx
,
void
*
arg
,
int
count
,
struct
pt_regs
*
regs
);
static
pfm_reg_desc_t
pfm_ita_pmc_desc
[
PMU_MAX_PMCS
]
=
{
/* pmc0 */
{
PFM_REG_CONTROL
,
0
,
0x1UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
...
...
@@ -55,31 +47,22 @@ static pfm_reg_desc_t pfm_ita_pmd_desc[PMU_MAX_PMDS]={
{
PFM_REG_END
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf
=
{
.
pmu_name
=
"Itanium"
,
.
pmu_family
=
0x7
,
.
enabled
=
0
,
.
ovfl_val
=
(
1UL
<<
32
)
-
1
,
.
pmd_desc
=
pfm_ita_pmd_desc
,
.
pmc_desc
=
pfm_ita_pmc_desc
,
.
num_ibrs
=
8
,
.
num_dbrs
=
8
,
.
use_rr_dbregs
=
1
/* debug register are use for range retrictions */
};
static
int
pfm_ita_pmc_check
(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
)
{
int
ret
;
int
is_loaded
;
/* sanitfy check */
if
(
ctx
==
NULL
)
return
-
EINVAL
;
is_loaded
=
ctx
->
ctx_state
==
PFM_CTX_LOADED
||
ctx
->
ctx_state
==
PFM_CTX_MASKED
;
/*
* we must clear the (instruction) debug registers if pmc13.ta bit is cleared
* before they are written (fl_using_dbreg==0) to avoid picking up stale information.
*/
if
(
cnum
==
13
&&
((
*
val
&
0x1
)
==
0UL
)
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
if
(
cnum
==
13
&&
is_loaded
&&
((
*
val
&
0x1
)
==
0UL
)
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
DPRINT
((
"pmc[%d]=0x%lx has active pmc13.ta cleared, clearing ibr
\n
"
,
cnum
,
*
val
));
...
...
@@ -98,7 +81,7 @@ pfm_ita_pmc_check(struct task_struct *task, pfm_context_t *ctx, unsigned int cnu
* we must clear the (data) debug registers if pmc11.pt bit is cleared
* before they are written (fl_using_dbreg==0) to avoid picking up stale information.
*/
if
(
cnum
==
11
&&
((
*
val
>>
28
)
&
0x1
)
==
0
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
if
(
cnum
==
11
&&
is_loaded
&&
((
*
val
>>
28
)
&
0x1
)
==
0
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
DPRINT
((
"pmc[%d]=0x%lx has active pmc11.pt cleared, clearing dbr
\n
"
,
cnum
,
*
val
));
...
...
@@ -115,3 +98,18 @@ pfm_ita_pmc_check(struct task_struct *task, pfm_context_t *ctx, unsigned int cnu
return
0
;
}
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf_ita
=
{
.
pmu_name
=
"Itanium"
,
.
pmu_family
=
0x7
,
.
ovfl_val
=
(
1UL
<<
32
)
-
1
,
.
pmd_desc
=
pfm_ita_pmd_desc
,
.
pmc_desc
=
pfm_ita_pmc_desc
,
.
num_ibrs
=
8
,
.
num_dbrs
=
8
,
.
use_rr_dbregs
=
1
,
/* debug register are use for range retrictions */
};
arch/ia64/kernel/perfmon_mckinley.h
View file @
eb0c34c8
...
...
@@ -5,15 +5,7 @@
* Copyright (C) 2002-2003 Hewlett Packard Co
* Stephane Eranian <eranian@hpl.hp.com>
*/
#define RDEP(x) (1UL<<(x))
#ifndef CONFIG_MCKINLEY
#error "This file is only valid when CONFIG_MCKINLEY is defined"
#endif
static
int
pfm_mck_pmc_check
(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
static
int
pfm_write_ibr_dbr
(
int
mode
,
pfm_context_t
*
ctx
,
void
*
arg
,
int
count
,
struct
pt_regs
*
regs
);
static
pfm_reg_desc_t
pfm_mck_pmc_desc
[
PMU_MAX_PMCS
]
=
{
/* pmc0 */
{
PFM_REG_CONTROL
,
0
,
0x1UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
...
...
@@ -57,21 +49,6 @@ static pfm_reg_desc_t pfm_mck_pmd_desc[PMU_MAX_PMDS]={
{
PFM_REG_END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf
=
{
.
pmu_name
=
"Itanium 2"
,
.
pmu_family
=
0x1f
,
.
enabled
=
0
,
.
ovfl_val
=
(
1UL
<<
47
)
-
1
,
.
pmd_desc
=
pfm_mck_pmd_desc
,
.
pmc_desc
=
pfm_mck_pmc_desc
,
.
num_ibrs
=
8
,
.
num_dbrs
=
8
,
.
use_rr_dbregs
=
1
/* debug register are use for range retrictions */
};
/*
* PMC reserved fields must have their power-up values preserved
*/
...
...
@@ -120,12 +97,11 @@ pfm_mck_pmc_check(struct task_struct *task, pfm_context_t *ctx, unsigned int cnu
* one of the pmc13.cfg_dbrpXX field is different from 0x3
* AND
* at the corresponding pmc13.ena_dbrpXX is set.
*
* For now, we just check on cfg_dbrXX != 0x3.
*/
DPRINT
((
"cnum=%u val=0x%lx, using_dbreg=%d loaded=%d
\n
"
,
cnum
,
*
val
,
ctx
->
ctx_fl_using_dbreg
,
is_loaded
));
if
(
cnum
==
13
&&
is_loaded
&&
((
*
val
&
0x18181818UL
)
!=
0x18181818UL
)
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
if
(
cnum
==
13
&&
is_loaded
&&
(
*
val
&
0x1e00000000000UL
)
&&
(
*
val
&
0x18181818UL
)
!=
0x18181818UL
&&
ctx
->
ctx_fl_using_dbreg
==
0
)
{
DPRINT
((
"pmc[%d]=0x%lx has active pmc13 settings, clearing dbr
\n
"
,
cnum
,
*
val
));
...
...
@@ -192,3 +168,20 @@ pfm_mck_pmc_check(struct task_struct *task, pfm_context_t *ctx, unsigned int cnu
return
ret
?
-
EINVAL
:
0
;
}
/*
* impl_pmcs, impl_pmds are computed at runtime to minimize errors!
*/
static
pmu_config_t
pmu_conf_mck
=
{
.
pmu_name
=
"Itanium 2"
,
.
pmu_family
=
0x1f
,
.
flags
=
PFM_PMU_IRQ_RESEND
,
.
ovfl_val
=
(
1UL
<<
47
)
-
1
,
.
pmd_desc
=
pfm_mck_pmd_desc
,
.
pmc_desc
=
pfm_mck_pmc_desc
,
.
num_ibrs
=
8
,
.
num_dbrs
=
8
,
.
use_rr_dbregs
=
1
/* debug register are use for range retrictions */
};
arch/ia64/kernel/process.c
View file @
eb0c34c8
...
...
@@ -96,6 +96,7 @@ show_regs (struct pt_regs *regs)
{
unsigned
long
ip
=
regs
->
cr_iip
+
ia64_psr
(
regs
)
->
ri
;
print_modules
();
printk
(
"
\n
Pid: %d, CPU %d, comm: %20s
\n
"
,
current
->
pid
,
smp_processor_id
(),
current
->
comm
);
printk
(
"psr : %016lx ifs : %016lx ip : [<%016lx>] %s
\n
"
,
regs
->
cr_ipsr
,
regs
->
cr_ifs
,
ip
,
print_tainted
());
...
...
arch/ia64/kernel/signal.c
View file @
eb0c34c8
...
...
@@ -42,23 +42,6 @@
# define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0])
#endif
#ifdef ASM_SUPPORTED
/*
* Don't let GCC uses f16-f31 so that when we setup/restore the registers in the signal
* context in __kernel_sigtramp(), we can be sure that registers f16-f31 contain user-level
* values.
*/
register
double
f16
asm
(
"f16"
);
register
double
f17
asm
(
"f17"
);
register
double
f18
asm
(
"f18"
);
register
double
f19
asm
(
"f19"
);
register
double
f20
asm
(
"f20"
);
register
double
f21
asm
(
"f21"
);
register
double
f22
asm
(
"f22"
);
register
double
f23
asm
(
"f23"
);
register
double
f24
asm
(
"f24"
);
register
double
f25
asm
(
"f25"
);
register
double
f26
asm
(
"f26"
);
register
double
f27
asm
(
"f27"
);
register
double
f28
asm
(
"f28"
);
register
double
f29
asm
(
"f29"
);
register
double
f30
asm
(
"f30"
);
register
double
f31
asm
(
"f31"
);
#endif
long
ia64_rt_sigsuspend
(
sigset_t
*
uset
,
size_t
sigsetsize
,
struct
sigscratch
*
scr
)
{
...
...
arch/ia64/kernel/smp.c
View file @
eb0c34c8
...
...
@@ -28,7 +28,6 @@
#include <linux/mm.h>
#include <linux/cache.h>
#include <linux/delay.h>
#include <linux/cache.h>
#include <linux/efi.h>
#include <asm/atomic.h>
...
...
arch/ia64/kernel/smpboot.c
View file @
eb0c34c8
...
...
@@ -212,6 +212,14 @@ ia64_sync_itc (unsigned int master)
}
t
[
NUM_ROUNDS
];
#endif
/*
* Make sure local timer ticks are disabled while we sync. If
* they were enabled, we'd have to worry about nasty issues
* like setting the ITC ahead of (or a long time before) the
* next scheduled tick.
*/
BUG_ON
((
ia64_get_itv
()
&
(
1
<<
16
))
==
0
);
go
[
MASTER
]
=
1
;
if
(
smp_call_function_single
(
master
,
sync_master
,
NULL
,
1
,
0
)
<
0
)
{
...
...
@@ -257,16 +265,6 @@ ia64_sync_itc (unsigned int master)
printk
(
KERN_INFO
"CPU %d: synchronized ITC with CPU %u (last diff %ld cycles, "
"maxerr %lu cycles)
\n
"
,
smp_processor_id
(),
master
,
delta
,
rt
);
/*
* Check whether we sync'd the itc ahead of the next timer interrupt. If so, just
* reset it.
*/
if
(
time_after
(
ia64_get_itc
(),
local_cpu_data
->
itm_next
))
{
Dprintk
(
"CPU %d: oops, jumped a timer tick; resetting timer.
\n
"
,
smp_processor_id
());
ia64_cpu_local_tick
();
}
}
/*
...
...
@@ -302,16 +300,6 @@ smp_callin (void)
smp_setup_percpu_timer
();
/*
* Get our bogomips.
*/
ia64_init_itm
();
/*
* Set I/O port base per CPU
*/
ia64_set_kr
(
IA64_KR_IO_BASE
,
__pa
(
ia64_iobase
));
ia64_mca_cmc_vector_setup
();
/* Setup vector on AP & enable */
#ifdef CONFIG_PERFMON
...
...
@@ -319,11 +307,6 @@ smp_callin (void)
#endif
local_irq_enable
();
calibrate_delay
();
local_cpu_data
->
loops_per_jiffy
=
loops_per_jiffy
;
#ifdef CONFIG_IA32_SUPPORT
ia32_gdt_init
();
#endif
if
(
!
(
sal_platform_features
&
IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT
))
{
/*
...
...
@@ -336,6 +319,17 @@ smp_callin (void)
ia64_sync_itc
(
0
);
}
/*
* Get our bogomips.
*/
ia64_init_itm
();
calibrate_delay
();
local_cpu_data
->
loops_per_jiffy
=
loops_per_jiffy
;
#ifdef CONFIG_IA32_SUPPORT
ia32_gdt_init
();
#endif
/*
* Allow the master to continue.
*/
...
...
@@ -352,6 +346,9 @@ start_secondary (void *unused)
{
extern
int
cpu_idle
(
void
);
/* Early console may use I/O ports */
ia64_set_kr
(
IA64_KR_IO_BASE
,
__pa
(
ia64_iobase
));
Dprintk
(
"start_secondary: starting CPU 0x%x
\n
"
,
hard_smp_processor_id
());
efi_map_pal_code
();
cpu_init
();
...
...
arch/ia64/kernel/traps.c
View file @
eb0c34c8
...
...
@@ -22,29 +22,6 @@
#include <asm/processor.h>
#include <asm/uaccess.h>
/*
* fp_emulate() needs to be able to access and update all floating point registers. Those
* saved in pt_regs can be accessed through that structure, but those not saved, will be
* accessed directly. To make this work, we need to ensure that the compiler does not end
* up using a preserved floating point register on its own. The following achieves this
* by declaring preserved registers that are not marked as "fixed" as global register
* variables.
*/
#ifdef ASM_SUPPORTED
register
double
f2
asm
(
"f2"
);
register
double
f3
asm
(
"f3"
);
register
double
f4
asm
(
"f4"
);
register
double
f5
asm
(
"f5"
);
register
long
f16
asm
(
"f16"
);
register
long
f17
asm
(
"f17"
);
register
long
f18
asm
(
"f18"
);
register
long
f19
asm
(
"f19"
);
register
long
f20
asm
(
"f20"
);
register
long
f21
asm
(
"f21"
);
register
long
f22
asm
(
"f22"
);
register
long
f23
asm
(
"f23"
);
register
double
f24
asm
(
"f24"
);
register
double
f25
asm
(
"f25"
);
register
double
f26
asm
(
"f26"
);
register
double
f27
asm
(
"f27"
);
register
double
f28
asm
(
"f28"
);
register
double
f29
asm
(
"f29"
);
register
double
f30
asm
(
"f30"
);
register
double
f31
asm
(
"f31"
);
#endif
extern
spinlock_t
timerlist_lock
;
fpswa_interface_t
*
fpswa_interface
;
...
...
arch/ia64/kernel/unwind.c
View file @
eb0c34c8
/*
* Copyright (C) 1999-200
3
Hewlett-Packard Co
* Copyright (C) 1999-200
4
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 2003 Fenghua Yu <fenghua.yu@intel.com>
* - Change pt_regs_off() to make it less dependant on pt_regs structure.
...
...
@@ -89,6 +89,8 @@ static struct {
/* list of unwind tables (one per load-module) */
struct
unw_table
*
tables
;
unsigned
long
r0
;
/* constant 0 for r0 */
/* table of registers that prologues can save (and order in which they're saved): */
const
unsigned
char
save_order
[
8
];
...
...
@@ -239,7 +241,11 @@ static struct {
#endif
};
/* Unwind accessors. */
static
inline
int
read_only
(
void
*
addr
)
{
return
(
unsigned
long
)
((
char
*
)
addr
-
(
char
*
)
&
unw
.
r0
)
<
sizeof
(
unw
.
r0
);
}
/*
* Returns offset of rREG in struct pt_regs.
...
...
@@ -274,6 +280,8 @@ get_scratch_regs (struct unw_frame_info *info)
return
(
struct
pt_regs
*
)
info
->
pt
;
}
/* Unwind accessors. */
int
unw_access_gr
(
struct
unw_frame_info
*
info
,
int
regnum
,
unsigned
long
*
val
,
char
*
nat
,
int
write
)
{
...
...
@@ -377,11 +385,15 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
}
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
{
*
addr
=
*
val
;
if
(
*
nat
)
*
nat_addr
|=
nat_mask
;
else
*
nat_addr
&=
~
nat_mask
;
}
}
else
{
if
((
*
nat_addr
&
nat_mask
)
==
0
)
{
*
val
=
*
addr
;
...
...
@@ -420,6 +432,9 @@ unw_access_br (struct unw_frame_info *info, int regnum, unsigned long *val, int
return
-
1
;
}
if
(
write
)
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
*
addr
=
*
val
;
else
*
val
=
*
addr
;
...
...
@@ -465,6 +480,9 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val,
}
if
(
write
)
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
*
addr
=
*
val
;
else
*
val
=
*
addr
;
...
...
@@ -557,9 +575,12 @@ unw_access_ar (struct unw_frame_info *info, int regnum, unsigned long *val, int
return
-
1
;
}
if
(
write
)
*
addr
=
*
val
;
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
*
addr
=
*
val
;
}
else
*
val
=
*
addr
;
return
0
;
}
...
...
@@ -574,9 +595,12 @@ unw_access_pr (struct unw_frame_info *info, unsigned long *val, int write)
if
(
!
addr
)
addr
=
&
info
->
sw
->
pr
;
if
(
write
)
*
addr
=
*
val
;
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
*
addr
=
*
val
;
}
else
*
val
=
*
addr
;
return
0
;
}
...
...
@@ -1407,6 +1431,9 @@ compile_reg (struct unw_state_record *sr, int i, struct unw_script *script)
need_nat_info
=
0
;
}
val
=
unw
.
preg_index
[
UNW_REG_R4
+
(
rval
-
4
)];
}
else
if
(
rval
==
0
)
{
opc
=
UNW_INSN_MOVE_CONST
;
val
=
0
;
}
else
{
/* register got spilled to a scratch register */
opc
=
UNW_INSN_MOVE_SCRATCH
;
...
...
@@ -1729,6 +1756,17 @@ run_script (struct unw_script *script, struct unw_frame_info *state)
}
break
;
case
UNW_INSN_MOVE_CONST
:
if
(
val
==
0
)
s
[
dst
]
=
(
unsigned
long
)
&
unw
.
r0
;
else
{
s
[
dst
]
=
0
;
UNW_DPRINT
(
0
,
"unwind.%s: UNW_INSN_MOVE_CONST bad val=%ld
\n
"
,
__FUNCTION__
,
val
);
}
break
;
case
UNW_INSN_MOVE_STACKED
:
s
[
dst
]
=
(
unsigned
long
)
ia64_rse_skip_regs
((
unsigned
long
*
)
state
->
bsp
,
val
);
...
...
arch/ia64/kernel/unwind_i.h
View file @
eb0c34c8
...
...
@@ -133,6 +133,7 @@ enum unw_insn_opcode {
UNW_INSN_SETNAT_TYPE
,
/* s[dst+1].nat.type = val */
UNW_INSN_LOAD
,
/* s[dst] = *s[val] */
UNW_INSN_MOVE_SCRATCH
,
/* s[dst] = scratch reg "val" */
UNW_INSN_MOVE_CONST
,
/* s[dst] = constant reg "val" */
};
struct
unw_insn
{
...
...
arch/ia64/mm/init.c
View file @
eb0c34c8
...
...
@@ -343,6 +343,7 @@ ia64_mmu_init (void *my_cpu_data)
#ifdef CONFIG_HUGETLB_PAGE
ia64_set_rr
(
HPAGE_REGION_BASE
,
HPAGE_SHIFT
<<
2
);
ia64_srlz_d
();
#endif
cpu
=
smp_processor_id
();
...
...
arch/ia64/scripts/check-serialize.S
0 → 100644
View file @
eb0c34c8
.
serialize.data
.
serialize.instruction
arch/ia64/scripts/toolchain-flags
View file @
eb0c34c8
...
...
@@ -40,4 +40,14 @@ then
CPPFLAGS
=
"
$CPPFLAGS
-DHAVE_MODEL_SMALL_ATTRIBUTE"
fi
rm
-f
$out
# Check whether assembler supports .serialize.{data,instruction} directive.
$CC
-c
$dir
/check-serialize.S
-o
$out
2>/dev/null
res
=
$?
rm
-f
$out
if
[
$res
-eq
0
]
;
then
CPPFLAGS
=
"
$CPPFLAGS
-DHAVE_SERIALIZE_DIRECTIVE"
fi
echo
$CPPFLAGS
arch/ia64/sn/io/io.c
View file @
eb0c34c8
...
...
@@ -651,7 +651,7 @@ hub_set_piomode(nasid_t nasid, int conveyor)
hubii_wcr_t
ii_wcr
;
int
prbnum
;
ASSERT
(
NASID_TO_COMPACT_NODEID
(
nasid
)
!=
INVALID_CNODEID
);
ASSERT
(
nasid_to_cnodeid
(
nasid
)
!=
INVALID_CNODEID
);
ii_iowa
=
REMOTE_HUB_L
(
nasid
,
IIO_OUTWIDGET_ACCESS
);
REMOTE_HUB_S
(
nasid
,
IIO_OUTWIDGET_ACCESS
,
0
);
...
...
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
View file @
eb0c34c8
...
...
@@ -328,6 +328,34 @@ sn_pci_fixup_slot(struct pci_dev *dev)
cmd
|=
PCI_COMMAND_MEMORY
;
}
/*
* Assign addresses to the ROMs, but don't enable them yet
* Also note that we only map display card ROMs due to PIO mapping
* space scarcity.
*/
if
((
dev
->
class
>>
16
)
==
PCI_BASE_CLASS_DISPLAY
)
{
unsigned
long
addr
;
size
=
dev
->
resource
[
PCI_ROM_RESOURCE
].
end
-
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
;
if
(
size
)
{
addr
=
(
unsigned
long
)
pciio_pio_addr
(
vhdl
,
0
,
PCIIO_SPACE_ROM
,
0
,
size
,
0
,
PIOMAP_FIXED
);
if
(
!
addr
)
{
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
=
0
;
dev
->
resource
[
PCI_ROM_RESOURCE
].
end
=
0
;
printk
(
"sn_pci_fixup(): ROM pio map failure "
"for %s
\n
"
,
dev
->
slot_name
);
}
addr
|=
__IA64_UNCACHED_OFFSET
;
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
=
addr
;
dev
->
resource
[
PCI_ROM_RESOURCE
].
end
=
addr
+
size
;
if
(
dev
->
resource
[
PCI_ROM_RESOURCE
].
flags
&
IORESOURCE_MEM
)
cmd
|=
PCI_COMMAND_MEMORY
;
}
}
/*
* Update the Command Word on the Card.
*/
...
...
@@ -712,7 +740,7 @@ pci_bus_to_hcl_cvlink(void)
/* Is this PCI bus associated with this moduleid? */
moduleid
=
NODE_MODULEID
(
NASID_TO_COMPACT_NODEID
(
pcibr_soft
->
bs_nasid
));
nasid_to_cnodeid
(
pcibr_soft
->
bs_nasid
));
if
(
modules
[
i
]
->
id
==
moduleid
)
{
struct
pcibr_list_s
*
new_element
;
...
...
@@ -791,8 +819,7 @@ sn_pci_init (void)
struct
list_head
*
ln
;
struct
pci_bus
*
pci_bus
=
NULL
;
struct
pci_dev
*
pci_dev
=
NULL
;
extern
int
numnodes
;
int
cnode
,
ret
;
int
ret
;
#ifdef CONFIG_PROC_FS
extern
void
register_sn_procfs
(
void
);
#endif
...
...
arch/ia64/sn/io/platform_init/sgi_io_init.c
View file @
eb0c34c8
...
...
@@ -26,7 +26,6 @@ extern vertex_hdl_t hwgraph_root;
extern
void
io_module_init
(
void
);
extern
int
pci_bus_to_hcl_cvlink
(
void
);
cpuid_t
master_procid
;
nasid_t
console_nasid
=
(
nasid_t
)
-
1
;
char
master_baseio_wid
;
...
...
@@ -47,10 +46,10 @@ per_hub_init(cnodeid_t cnode)
ii_ibcr_u_t
ii_ibcr
;
ii_ilcsr_u_t
ii_ilcsr
;
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
ASSERT
(
nasid
!=
INVALID_NASID
);
ASSERT
(
NASID_TO_COMPACT_NODEID
(
nasid
)
==
cnode
);
ASSERT
(
nasid_to_cnodeid
(
nasid
)
==
cnode
);
npdap
=
NODEPDA
(
cnode
);
...
...
@@ -150,7 +149,7 @@ inline int
check_nasid_equiv
(
nasid_t
nasida
,
nasid_t
nasidb
)
{
if
((
nasida
==
nasidb
)
||
(
nasida
==
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
nasidb
))
->
xbow_peer
))
||
(
nasida
==
NODEPDA
(
nasid_to_cnodeid
(
nasidb
))
->
xbow_peer
))
return
1
;
else
return
0
;
...
...
arch/ia64/sn/io/sn2/klgraph.c
View file @
eb0c34c8
...
...
@@ -65,7 +65,7 @@ klhwg_add_disabled_cpu(vertex_hdl_t node_vertex, cnodeid_t cnode, klcpu_t *cpu,
cpuid_t
cpu_id
;
nasid_t
nasid
;
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
cpu_id
=
nasid_slice_to_cpuid
(
nasid
,
cpu
->
cpu_info
.
physid
);
if
(
cpu_id
!=
-
1
){
snprintf
(
name
,
120
,
"%s/%s/%c"
,
EDGE_LBL_DISABLED
,
EDGE_LBL_CPU
,
'a'
+
cpu
->
cpu_info
.
physid
);
...
...
@@ -88,7 +88,7 @@ klhwg_add_cpu(vertex_hdl_t node_vertex, cnodeid_t cnode, klcpu_t *cpu)
cpuid_t
cpu_id
;
nasid_t
nasid
;
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
cpu_id
=
nasid_slice_to_cpuid
(
nasid
,
cpu
->
cpu_info
.
physid
);
snprintf
(
name
,
120
,
"%s/%d/%c"
,
...
...
@@ -145,7 +145,7 @@ klhwg_add_xbow(cnodeid_t cnode, nasid_t nasid)
continue
;
}
hub_cnode
=
NASID_TO_COMPACT_NODEID
(
hub_nasid
);
hub_cnode
=
nasid_to_cnodeid
(
hub_nasid
);
if
(
hub_cnode
==
INVALID_CNODEID
)
{
continue
;
...
...
@@ -178,7 +178,7 @@ klhwg_add_xbow(cnodeid_t cnode, nasid_t nasid)
*/
if
(
hub_nasid
!=
nasid
)
{
NODEPDA
(
hub_cnode
)
->
xbow_peer
=
nasid
;
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
nasid
))
->
xbow_peer
=
NODEPDA
(
nasid_to_cnodeid
(
nasid
))
->
xbow_peer
=
hub_nasid
;
}
}
...
...
@@ -200,7 +200,7 @@ klhwg_add_node(vertex_hdl_t hwgraph_root, cnodeid_t cnode)
klcpu_t
*
cpu
;
vertex_hdl_t
cpu_dir
;
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
brd
=
find_lboard_any
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
KLTYPE_SNIA
);
ASSERT
(
brd
);
...
...
@@ -280,7 +280,7 @@ klhwg_add_all_routers(vertex_hdl_t hwgraph_root)
int
rv
;
for
(
cnode
=
0
;
cnode
<
numnodes
;
cnode
++
)
{
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
brd
=
find_lboard_class_any
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
KLTYPE_ROUTER
);
...
...
@@ -363,7 +363,7 @@ klhwg_connect_one_router(vertex_hdl_t hwgraph_root, lboard_t *brd,
port
));
continue
;
}
if
(
NASID_TO_COMPACT_NODEID
(
router
->
rou_port
[
port
].
port_nasid
)
if
(
nasid_to_cnodeid
(
router
->
rou_port
[
port
].
port_nasid
)
==
INVALID_CNODEID
)
{
continue
;
}
...
...
@@ -414,7 +414,7 @@ klhwg_connect_routers(vertex_hdl_t hwgraph_root)
lboard_t
*
brd
;
for
(
cnode
=
0
;
cnode
<
numnodes
;
cnode
++
)
{
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
brd
=
find_lboard_class_any
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
KLTYPE_ROUTER
);
...
...
@@ -423,7 +423,7 @@ klhwg_connect_routers(vertex_hdl_t hwgraph_root)
do
{
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
klhwg_connect_one_router
(
hwgraph_root
,
brd
,
cnode
,
nasid
);
...
...
@@ -451,7 +451,7 @@ klhwg_connect_hubs(vertex_hdl_t hwgraph_root)
int
port
;
for
(
cnode
=
0
;
cnode
<
numionodes
;
cnode
++
)
{
nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
nasid
=
cnodeid_to_nasid
(
cnode
);
brd
=
find_lboard_any
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
KLTYPE_SNIA
);
...
...
@@ -463,7 +463,7 @@ klhwg_connect_hubs(vertex_hdl_t hwgraph_root)
continue
;
/* Port not active */
}
if
(
NASID_TO_COMPACT_NODEID
(
hub
->
hub_port
[
port
].
port_nasid
)
==
INVALID_CNODEID
)
if
(
nasid_to_cnodeid
(
hub
->
hub_port
[
port
].
port_nasid
)
==
INVALID_CNODEID
)
continue
;
/* Generate a hardware graph path for this board. */
...
...
arch/ia64/sn/io/sn2/ml_SN_init.c
View file @
eb0c34c8
...
...
@@ -31,13 +31,9 @@ void init_platform_nodepda(nodepda_t *npda, cnodeid_t node)
hubinfo_t
hubinfo
;
nasid_t
nasid
;
extern
void
router_map_init
(
nodepda_t
*
);
extern
void
router_queue_init
(
nodepda_t
*
,
cnodeid_t
);
extern
void
intr_init_vecblk
(
nodepda_t
*
,
cnodeid_t
,
int
);
/* Allocate per-node platform-dependent data */
nasid
=
COMPACT_TO_NASID_NODEID
(
node
);
nasid
=
cnodeid_to_nasid
(
node
);
if
(
node
>=
numnodes
)
/* Headless/memless IO nodes */
hubinfo
=
(
hubinfo_t
)
alloc_bootmem_node
(
NODE_DATA
(
0
),
sizeof
(
struct
hubinfo_s
));
else
...
...
@@ -81,7 +77,7 @@ init_platform_hubinfo(nodepda_t **nodepdaindr)
for
(
cnode
=
0
;
cnode
<
numionodes
;
cnode
++
)
{
npda
=
nodepdaindr
[
cnode
];
hubinfo
=
(
hubinfo_t
)
npda
->
pdinfo
;
hubinfo
->
h_nasid
=
COMPACT_TO_NASID_NODEID
(
cnode
);
hubinfo
->
h_nasid
=
cnodeid_to_nasid
(
cnode
);
hubinfo
->
h_widgetid
=
hub_widget_id
(
hubinfo
->
h_nasid
);
}
}
...
...
arch/ia64/sn/io/sn2/ml_SN_intr.c
View file @
eb0c34c8
...
...
@@ -12,6 +12,7 @@
#include <asm/smp.h>
#include <asm/irq.h>
#include <asm/hw_irq.h>
#include <asm/topology.h>
#include <asm/sn/sgi.h>
#include <asm/sn/iograph.h>
#include <asm/sn/hcl.h>
...
...
@@ -43,7 +44,6 @@ void intr_init_vecblk(cnodeid_t node)
sh_ii_int0_config_u_t
ii_int_config
;
cpuid_t
cpu
;
cpuid_t
cpu0
,
cpu1
;
nodepda_t
*
lnodepda
;
sh_ii_int0_enable_u_t
ii_int_enable
;
sh_int_node_id_config_u_t
node_id_config
;
sh_local_int5_config_u_t
local5_config
;
...
...
@@ -60,15 +60,13 @@ void intr_init_vecblk(cnodeid_t node)
HUB_S
((
unsigned
long
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_INT_NODE_ID_CONFIG
),
node_id_config
.
sh_int_node_id_config_regval
);
cnode
=
nasid_to_cnodeid
(
master_nasid
);
lnodepda
=
NODEPDA
(
cnode
);
cpu
=
lnodepda
->
node_first_cpu
;
cpu
=
first_cpu
(
node_to_cpumask
(
cnode
));
cpu
=
cpu_physical_id
(
cpu
);
SAL_CALL
(
ret_stuff
,
SN_SAL_REGISTER_CE
,
nasid
,
cpu
,
master_nasid
,
0
,
0
,
0
,
0
);
if
(
ret_stuff
.
status
<
0
)
printk
(
"%s: SN_SAL_REGISTER_CE SAL_CALL failed
\n
"
,
__FUNCTION__
);
}
else
{
lnodepda
=
NODEPDA
(
node
);
cpu
=
lnodepda
->
node_first_cpu
;
cpu
=
first_cpu
(
node_to_cpumask
(
node
));
cpu
=
cpu_physical_id
(
cpu
);
}
...
...
arch/ia64/sn/io/sn2/ml_iograph.c
View file @
eb0c34c8
...
...
@@ -313,7 +313,7 @@ io_xswitch_widget_init(vertex_hdl_t xswitchv,
hubinfo_get
(
hubv
,
&
hubinfo
);
nasid
=
hubinfo
->
h_nasid
;
cnode
=
NASID_TO_COMPACT_NODEID
(
nasid
);
cnode
=
nasid_to_cnodeid
(
nasid
);
hub_widgetid
=
hubinfo
->
h_widgetid
;
/*
...
...
@@ -567,7 +567,7 @@ io_init_node(cnodeid_t cnodeid)
* and hence widget id is Not 0.
*/
widget_partnum
=
(((
*
(
volatile
int32_t
*
)(
NODE_SWIN_BASE
(
COMPACT_TO_NASID_NODEID
(
cnodeid
),
0
)
+
(
cnodeid_to_nasid
(
cnodeid
),
0
)
+
WIDGET_ID
)))
&
WIDGET_PART_NUM
)
>>
WIDGET_PART_NUM_SHFT
;
...
...
@@ -584,7 +584,7 @@ io_init_node(cnodeid_t cnodeid)
}
else
{
void
*
bridge
;
bridge
=
(
void
*
)
NODE_SWIN_BASE
(
COMPACT_TO_NASID_NODEID
(
cnodeid
),
0
);
bridge
=
(
void
*
)
NODE_SWIN_BASE
(
cnodeid_to_nasid
(
cnodeid
),
0
);
npdap
->
basew_id
=
pcireg_bridge_control_get
(
bridge
)
&
WIDGET_WIDGET_ID
;
printk
(
" ****io_init_node: Unknown Widget Part Number 0x%x Widget ID 0x%x attached to Hubv 0x%p ****
\n
"
,
widget_partnum
,
npdap
->
basew_id
,
(
void
*
)
hubv
);
...
...
@@ -637,7 +637,7 @@ io_init_node(cnodeid_t cnodeid)
/* If there's someone else on this crossbow, recognize him */
if
(
npdap
->
xbow_peer
!=
INVALID_NASID
)
{
nodepda_t
*
peer_npdap
=
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
npdap
->
xbow_peer
));
nodepda_t
*
peer_npdap
=
NODEPDA
(
nasid_to_cnodeid
(
npdap
->
xbow_peer
));
peer_sema
=
&
peer_npdap
->
xbow_sema
;
volunteer_for_widgets
(
switchv
,
peer_npdap
->
node_vertex
);
}
...
...
arch/ia64/sn/io/sn2/module.c
View file @
eb0c34c8
...
...
@@ -196,7 +196,7 @@ io_module_init(void)
* We do not support memoryless compute nodes.
*/
for
(
node
=
0
;
node
<
numnodes
;
node
++
)
{
nasid
=
COMPACT_TO_NASID_NODEID
(
node
);
nasid
=
cnodeid_to_nasid
(
node
);
board
=
find_lboard_nasid
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
nasid
,
KLTYPE_SNIA
);
ASSERT
(
board
);
...
...
@@ -214,7 +214,7 @@ io_module_init(void)
nasid_t
nasid
;
char
serial_number
[
16
];
nasid
=
COMPACT_TO_NASID_NODEID
(
node
);
nasid
=
cnodeid_to_nasid
(
node
);
board
=
find_lboard_nasid
((
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
),
nasid
,
KLTYPE_SNIA
);
ASSERT
(
board
);
...
...
arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c
View file @
eb0c34c8
...
...
@@ -758,7 +758,7 @@ pcibr_directmap_init(pcibr_soft_t pcibr_soft)
cnodeid_t
cnodeid
=
0
;
/* We need api for diroff api */
nasid_t
nasid
;
nasid
=
COMPACT_TO_NASID_NODEID
(
cnodeid
);
nasid
=
cnodeid_to_nasid
(
cnodeid
);
paddr
=
NODE_OFFSET
(
nasid
)
+
0
;
/* Assume that if we ask for a DMA mapping to zero the XIO host will
...
...
@@ -2092,7 +2092,7 @@ pcibr_get_dmatrans_node(vertex_hdl_t pconn_vhdl)
pciio_info_t
pciio_info
=
pciio_info_get
(
pconn_vhdl
);
pcibr_soft_t
pcibr_soft
=
(
pcibr_soft_t
)
pciio_info_mfast_get
(
pciio_info
);
return
NASID_TO_COMPACT_NODEID
(
NASID_GET
(
pcibr_soft
->
bs_dir_xbase
));
return
nasid_to_cnodeid
(
NASID_GET
(
pcibr_soft
->
bs_dir_xbase
));
}
/*ARGSUSED */
...
...
@@ -2645,7 +2645,7 @@ isIO9(nasid_t nasid)
brd
=
KLCF_NEXT
(
brd
);
}
/* if it's dual ported, check the peer also */
nasid
=
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
nasid
))
->
xbow_peer
;
nasid
=
NODEPDA
(
nasid_to_cnodeid
(
nasid
))
->
xbow_peer
;
if
(
nasid
<
0
)
return
0
;
brd
=
(
lboard_t
*
)
KL_CONFIG_INFO
(
nasid
);
while
(
brd
)
{
...
...
arch/ia64/sn/io/sn2/pic.c
View file @
eb0c34c8
...
...
@@ -124,7 +124,7 @@ pic_bus1_widget_info_dup(vertex_hdl_t conn_v, vertex_hdl_t peer_conn_v,
static
vertex_hdl_t
pic_bus1_redist
(
nasid_t
nasid
,
vertex_hdl_t
conn_v
)
{
cnodeid_t
cnode
=
NASID_TO_COMPACT_NODEID
(
nasid
);
cnodeid_t
cnode
=
nasid_to_cnodeid
(
nasid
);
cnodeid_t
xbow_peer
=
-
1
;
char
pathname
[
256
],
peer_path
[
256
],
tmpbuf
[
256
];
char
*
p
;
...
...
@@ -137,7 +137,7 @@ pic_bus1_redist(nasid_t nasid, vertex_hdl_t conn_v)
/* create a path for this widget on the peer Cbrick */
/* pcibr widget hw/module/001c11/slab/0/Pbrick/xtalk/12 */
/* sprintf(pathname, "%v", conn_v); */
xbow_peer
=
NASID_TO_COMPACT_NODEID
(
NODEPDA
(
cnode
)
->
xbow_peer
);
xbow_peer
=
nasid_to_cnodeid
(
NODEPDA
(
cnode
)
->
xbow_peer
);
pos
=
hwgfs_generate_path
(
conn_v
,
tmpbuf
,
256
);
strcpy
(
pathname
,
&
tmpbuf
[
pos
]);
p
=
pathname
+
strlen
(
"hw/module/001c01/slab/0/"
);
...
...
arch/ia64/sn/io/sn2/shuberror.c
View file @
eb0c34c8
...
...
@@ -157,7 +157,7 @@ hubii_eint_init(cnodeid_t cnode)
hubio_eint
.
ii_iidsr_regval
=
0
;
hubio_eint
.
ii_iidsr_fld_s
.
i_enable
=
1
;
hubio_eint
.
ii_iidsr_fld_s
.
i_level
=
bit
;
/* Take the least significant bits*/
hubio_eint
.
ii_iidsr_fld_s
.
i_node
=
COMPACT_TO_NASID_NODEID
(
cnode
);
hubio_eint
.
ii_iidsr_fld_s
.
i_node
=
cnodeid_to_nasid
(
cnode
);
hubio_eint
.
ii_iidsr_fld_s
.
i_pi_id
=
cpuid_to_subnode
(
intr_cpu
);
REMOTE_HUB_S
(
hinfo
->
h_nasid
,
IIO_IIDSR
,
hubio_eint
.
ii_iidsr_regval
);
...
...
@@ -450,7 +450,7 @@ hubiio_crb_error_handler(vertex_hdl_t hub_v, hubinfo_t hinfo)
int
rc
;
nasid
=
hinfo
->
h_nasid
;
cnode
=
NASID_TO_COMPACT_NODEID
(
nasid
);
cnode
=
nasid_to_cnodeid
(
nasid
);
/*
* XXX - Add locking for any recovery actions
...
...
arch/ia64/sn/io/sn2/shubio.c
View file @
eb0c34c8
...
...
@@ -76,7 +76,7 @@ hub_xp_error_handler(
/* Get the error state of the hub */
e_state
=
error_state_get
(
hub_v
);
cnode
=
NASID_TO_COMPACT_NODEID
(
nasid
);
cnode
=
nasid_to_cnodeid
(
nasid
);
xswitch
=
NODEPDA
(
cnode
)
->
basew_xc
;
...
...
@@ -119,7 +119,7 @@ is_widget_pio_enabled(ioerror_t *ioerror)
return
(
0
);
/* Get the nasid for the cnode */
src_nasid
=
COMPACT_TO_NASID_NODEID
(
src_node
);
src_nasid
=
cnodeid_to_nasid
(
src_node
);
if
(
src_nasid
==
INVALID_NASID
)
return
(
0
);
...
...
arch/ia64/sn/kernel/setup.c
View file @
eb0c34c8
...
...
@@ -451,10 +451,6 @@ sn_cpu_init(void)
}
pda
->
shub_1_1_found
=
shub_1_1_found
;
if
(
local_node_data
->
active_cpu_count
==
1
)
nodepda
->
node_first_cpu
=
cpuid
;
/*
* We must use different memory allocators for first cpu (bootmem
...
...
@@ -474,7 +470,7 @@ sn_cpu_init(void)
pda
->
mem_write_status_addr
=
(
volatile
u64
*
)
LOCAL_MMR_ADDR
((
slice
<
2
?
SH_MEMORY_WRITE_STATUS_0
:
SH_MEMORY_WRITE_STATUS_1
)
);
if
(
nodepda
->
node_first_cpu
==
cpuid
)
{
if
(
local_node_data
->
active_cpu_count
++
==
0
)
{
int
buddy_nasid
;
buddy_nasid
=
cnodeid_to_nasid
(
numa_node_id
()
==
numnodes
-
1
?
0
:
numa_node_id
()
+
1
);
pda
->
pio_shub_war_cam_addr
=
(
volatile
unsigned
long
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_PI_CAM_CONTROL
);
...
...
arch/ia64/sn/kernel/sn2/prominfo_proc.c
View file @
eb0c34c8
...
...
@@ -228,11 +228,9 @@ read_version_entry(char *page, char **start, off_t off, int count, int *eof,
{
int
len
=
0
;
MOD_INC_USE_COUNT
;
/* data holds the pointer to this node's FIT */
len
=
dump_version
(
page
,
(
unsigned
long
*
)
data
);
len
=
proc_calc_metrics
(
page
,
start
,
off
,
count
,
eof
,
len
);
MOD_DEC_USE_COUNT
;
return
len
;
}
...
...
@@ -242,11 +240,9 @@ read_fit_entry(char *page, char **start, off_t off, int count, int *eof,
{
int
len
=
0
;
MOD_INC_USE_COUNT
;
/* data holds the pointer to this node's FIT */
len
=
dump_fit
(
page
,
(
unsigned
long
*
)
data
);
len
=
proc_calc_metrics
(
page
,
start
,
off
,
count
,
eof
,
len
);
MOD_DEC_USE_COUNT
;
return
len
;
}
...
...
@@ -310,6 +306,7 @@ int __init
prominfo_init
(
void
)
{
struct
proc_dir_entry
**
entp
;
struct
proc_dir_entry
*
p
;
cnodeid_t
cnodeid
;
nasid_t
nasid
;
char
name
[
NODE_NAME_LEN
];
...
...
@@ -333,12 +330,16 @@ prominfo_init(void)
sprintf
(
name
,
"node%d"
,
cnodeid
);
*
entp
=
proc_mkdir
(
name
,
sgi_prominfo_entry
);
nasid
=
cnodeid_to_nasid
(
cnodeid
);
create_proc_read_entry
(
p
=
create_proc_read_entry
(
"fit"
,
0
,
*
entp
,
read_fit_entry
,
lookup_fit
(
nasid
));
create_proc_read_entry
(
if
(
p
)
p
->
owner
=
THIS_MODULE
;
p
=
create_proc_read_entry
(
"version"
,
0
,
*
entp
,
read_version_entry
,
lookup_fit
(
nasid
));
if
(
p
)
p
->
owner
=
THIS_MODULE
;
}
return
0
;
...
...
drivers/char/sn_serial.c
View file @
eb0c34c8
...
...
@@ -502,7 +502,7 @@ sn_sal_connect_interrupt(void)
int
result
;
console_nasid
=
ia64_sn_get_console_nasid
();
intr_cpuid
=
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
console_nasid
))
->
node_first_cpu
;
intr_cpuid
=
first_cpu
(
node_to_cpumask
(
nasid_to_cnodeid
(
console_nasid
)))
;
intr_cpuloc
=
cpu_physical_id
(
intr_cpuid
);
console_irq
=
CPU_VECTOR_TO_IRQ
(
intr_cpuloc
,
SGI_UART_VECTOR
);
...
...
include/asm-ia64/asmmacro.h
View file @
eb0c34c8
...
...
@@ -100,4 +100,12 @@
# define TEXT_ALIGN(n)
#endif
#ifdef HAVE_SERIALIZE_DIRECTIVE
# define dv_serialize_data .serialize.data
# define dv_serialize_instruction .serialize.instruction
#else
# define dv_serialize_data
# define dv_serialize_instruction
#endif
#endif
/* _ASM_IA64_ASMMACRO_H */
include/asm-ia64/delay.h
View file @
eb0c34c8
...
...
@@ -44,6 +44,12 @@ ia64_set_itv (unsigned long val)
ia64_srlz_d
();
}
static
__inline__
unsigned
long
ia64_get_itv
(
void
)
{
return
ia64_getreg
(
_IA64_REG_CR_ITV
);
}
static
__inline__
void
ia64_set_itc
(
unsigned
long
val
)
{
...
...
include/asm-ia64/gcc_intrin.h
View file @
eb0c34c8
...
...
@@ -4,9 +4,10 @@
*
* Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
* Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
*
*/
#include <linux/compiler.h>
/* define this macro to get some asm stmts included in 'c' files */
#define ASM_SUPPORTED
...
...
@@ -23,7 +24,7 @@
extern
void
ia64_bad_param_for_setreg
(
void
);
extern
void
ia64_bad_param_for_getreg
(
void
);
register
unsigned
long
ia64_r13
asm
(
"r13"
);
register
unsigned
long
ia64_r13
asm
(
"r13"
)
__attribute_used__
;
#define ia64_setreg(regnum, val) \
({ \
...
...
@@ -377,9 +378,16 @@ register unsigned long ia64_r13 asm ("r13");
})
#define ia64_srlz_i() asm volatile (";; srlz.i ;;" ::: "memory")
#define ia64_srlz_d() asm volatile (";; srlz.d" ::: "memory");
#ifdef HAVE_SERIALIZE_DIRECTIVE
# define ia64_dv_serialize_data() asm volatile (".serialize.data");
# define ia64_dv_serialize_instruction() asm volatile (".serialize.instruction");
#else
# define ia64_dv_serialize_data()
# define ia64_dv_serialize_instruction()
#endif
#define ia64_nop(x) asm volatile ("nop %0"::"i"(x));
#define ia64_itci(addr) asm volatile ("itc.i %0;;" :: "r"(addr) : "memory")
...
...
include/asm-ia64/intel_intrin.h
View file @
eb0c34c8
...
...
@@ -204,6 +204,9 @@ __s64 _m64_popcnt(__s64 a);
#define ia64_srlz_d __dsrlz
#define ia64_srlz_i __isrlz
#define ia64_dv_serialize_data()
#define ia64_dv_serialize_instruction()
#define ia64_st1_rel __st1_rel
#define ia64_st2_rel __st2_rel
#define ia64_st4_rel __st4_rel
...
...
include/asm-ia64/sn/arch.h
View file @
eb0c34c8
...
...
@@ -20,12 +20,6 @@ typedef u64 hubreg_t;
typedef
u64
mmr_t
;
typedef
u64
nic_t
;
#define CNODE_TO_CPU_BASE(_cnode) (NODEPDA(_cnode)->node_first_cpu)
#define NASID_TO_COMPACT_NODEID(nasid) (nasid_to_cnodeid(nasid))
#define COMPACT_TO_NASID_NODEID(cnode) (cnodeid_to_nasid(cnode))
#define INVALID_NASID ((nasid_t)-1)
#define INVALID_CNODEID ((cnodeid_t)-1)
#define INVALID_PNODEID ((pnodeid_t)-1)
...
...
@@ -34,9 +28,7 @@ typedef u64 nic_t;
#define INVALID_PARTID ((partid_t)-1)
extern
cpuid_t
cnodetocpu
(
cnodeid_t
);
void
sn_flush_all_caches
(
long
addr
,
long
bytes
);
extern
void
sn_flush_all_caches
(
long
addr
,
long
bytes
);
extern
int
is_fine_dirmode
(
void
);
#endif
/* _ASM_IA64_SN_ARCH_H */
include/asm-ia64/sn/intr.h
View file @
eb0c34c8
...
...
@@ -8,9 +8,11 @@
#ifndef _ASM_IA64_SN_INTR_H
#define _ASM_IA64_SN_INTR_H
#include <asm/sn/types.h>
#include <asm/sn/sn2/intr.h>
extern
void
sn_send_IPI_phys
(
long
,
int
,
int
);
extern
void
intr_init_vecblk
(
cnodeid_t
node
);
#define CPU_VECTOR_TO_IRQ(cpuid,vector) (vector)
#define SN_CPU_FROM_IRQ(irq) (0)
...
...
include/asm-ia64/sn/module.h
View file @
eb0c34c8
...
...
@@ -184,10 +184,6 @@ extern module_t *modules[MODULE_MAX]; /* Indexed by cmoduleid_t */
extern
int
nummodules
;
extern
module_t
*
module_lookup
(
moduleid_t
id
);
extern
int
get_kmod_sys_snum
(
cmoduleid_t
cmod
,
char
*
snum
);
extern
void
format_module_id
(
char
*
buffer
,
moduleid_t
m
,
int
fmt
);
extern
int
parse_module_id
(
char
*
buffer
);
...
...
include/asm-ia64/sn/nodepda.h
View file @
eb0c34c8
...
...
@@ -36,13 +36,6 @@
struct
nodepda_s
{
cpuid_t
node_first_cpu
;
/* Starting cpu number for node */
/* WARNING: no guarantee that */
/* the second cpu on a node is */
/* node_first_cpu+1. */
vertex_hdl_t
xbow_vhdl
;
nasid_t
xbow_peer
;
/* NASID of our peer hub on xbow */
struct
semaphore
xbow_sema
;
/* Sema for xbow synchronization */
...
...
include/asm-ia64/sn/sn2/sn_private.h
View file @
eb0c34c8
...
...
@@ -233,7 +233,7 @@ extern void sysctlr_keepalive(void);
* address.
*/
#define paddr_dimm(_pa) ((_pa & MD_BANK_MASK) >> MD_BANK_SHFT)
#define paddr_cnode(_pa) (
NASID_TO_COMPACT_NODEID
(NASID_GET(_pa)))
#define paddr_cnode(_pa) (
nasid_to_cnodeid
(NASID_GET(_pa)))
extern
void
membank_pathname_get
(
paddr_t
,
char
*
);
extern
void
crbx
(
nasid_t
nasid
,
void
(
*
pf
)
(
char
*
,
...));
...
...
include/asm-ia64/sn/types.h
View file @
eb0c34c8
...
...
@@ -15,11 +15,9 @@ typedef signed char partid_t; /* partition ID type */
typedef
unsigned
int
moduleid_t
;
/* user-visible module number type */
typedef
unsigned
int
cmoduleid_t
;
/* kernel compact module id type */
typedef
signed
char
slabid_t
;
typedef
unsigned
char
clusterid_t
;
/* Clusterid of the cell */
typedef
unsigned
long
iopaddr_t
;
typedef
unsigned
long
paddr_t
;
typedef
unsigned
long
pfn_t
;
typedef
short
cnodeid_t
;
#endif
/* _ASM_IA64_SN_TYPES_H */
include/asm-ia64/system.h
View file @
eb0c34c8
...
...
@@ -114,10 +114,16 @@ extern struct ia64_boot_param {
*/
/* For spinlocks etc */
/* clearing psr.i is implicitly serialized (visible by next insn) */
/* setting psr.i requires data serialization */
/*
* - clearing psr.i is implicitly serialized (visible by next insn)
* - setting psr.i requires data serialization
* - we need a stop-bit before reading PSR because we sometimes
* write a floating-point register right before reading the PSR
* and that writes to PSR.mfl
*/
#define __local_irq_save(x) \
do { \
ia64_stop(); \
(x) = ia64_getreg(_IA64_REG_PSR); \
ia64_stop(); \
ia64_rsm(IA64_PSR_I); \
...
...
@@ -166,7 +172,7 @@ do { \
#endif
/* !CONFIG_IA64_DEBUG_IRQ */
#define local_irq_enable() ({ ia64_ssm(IA64_PSR_I); ia64_srlz_d(); })
#define local_save_flags(flags) (
(flags) = ia64_getreg(_IA64_REG_PSR)
)
#define local_save_flags(flags) (
{ ia64_stop(); (flags) = ia64_getreg(_IA64_REG_PSR); }
)
#define irqs_disabled() \
({ \
...
...
include/asm-ia64/unistd.h
View file @
eb0c34c8
...
...
@@ -4,7 +4,7 @@
/*
* IA-64 Linux syscall numbers and inline-functions.
*
* Copyright (C) 1998-200
3
Hewlett-Packard Co
* Copyright (C) 1998-200
4
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
...
...
@@ -304,10 +304,10 @@ lseek (int fd, off_t off, int whence)
return
sys_lseek
(
fd
,
off
,
whence
);
}
static
inline
long
static
inline
void
_exit
(
int
value
)
{
return
sys_exit
(
value
);
sys_exit
(
value
);
}
#define exit(x) _exit(x)
...
...
@@ -373,7 +373,7 @@ asmlinkage long sys_rt_sigaction(int sig,
* proper prototype, but we can't use __typeof__ either, because not all cond_syscall()
* declarations have prototypes at the moment.
*/
#define cond_syscall(x) asmlinkage long x
(
) __attribute__((weak,alias("sys_ni_syscall")));
#define cond_syscall(x) asmlinkage long x
(void
) __attribute__((weak,alias("sys_ni_syscall")));
#endif
/* !__ASSEMBLY__ */
#endif
/* __KERNEL__ */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment