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
Kirill Smelkov
linux
Commits
2e3e80c2
Commit
2e3e80c2
authored
May 31, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
parents
4e7c6816
fffcc150
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
222 additions
and
35 deletions
+222
-35
MAINTAINERS
MAINTAINERS
+2
-2
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+2
-2
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca.c
+2
-2
arch/ia64/kernel/minstate.h
arch/ia64/kernel/minstate.h
+1
-2
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+160
-15
arch/ia64/kernel/ptrace.c
arch/ia64/kernel/ptrace.c
+17
-3
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+1
-1
arch/ia64/kernel/sys_ia64.c
arch/ia64/kernel/sys_ia64.c
+0
-7
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+2
-0
include/asm-ia64/perfmon.h
include/asm-ia64/perfmon.h
+8
-0
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/sn/sn_sal.h
+27
-1
No files found.
MAINTAINERS
View file @
2e3e80c2
...
...
@@ -1023,8 +1023,8 @@ W: http://www.ia64-linux.org/
S: Maintained
SN-IA64 (Itanium) SUB-PLATFORM
P:
Jesse Barne
s
M:
jbarnes
@sgi.com
P:
Greg Edward
s
M:
edwardsg
@sgi.com
L: linux-altix@sgi.com
L: linux-ia64@vger.kernel.org
W: http://www.sgi.com/altix
...
...
arch/ia64/kernel/entry.S
View file @
2e3e80c2
...
...
@@ -1182,7 +1182,7 @@ ENTRY(notify_resume_user)
;;
(
pNonSys
)
mov
out2
=
0
//
out2
==
0
=>
not
a
syscall
.
fframe
16
.
spill
psp
ar
.
unat
,
16
//
(
note
that
offset
is
relative
to
psp
+
0x10
!)
.
spill
sp
ar
.
unat
,
16
st8
[
sp
]=
r9
,-
16
//
allocate
space
for
ar
.
unat
and
save
it
st8
[
out1
]=
loc1
,-
8
//
save
ar
.
pfs
,
out1
=&
sigscratch
.
body
...
...
@@ -1208,7 +1208,7 @@ GLOBAL_ENTRY(sys_rt_sigsuspend)
adds
out2
=
8
,
sp
//
out2
=&
sigscratch
->
ar_pfs
;;
.
fframe
16
.
spill
psp
ar
.
unat
,
16
//
(
note
that
offset
is
relative
to
psp
+
0x10
!)
.
spill
sp
ar
.
unat
,
16
st8
[
sp
]=
r9
,-
16
//
allocate
space
for
ar
.
unat
and
save
it
st8
[
out2
]=
loc1
,-
8
//
save
ar
.
pfs
,
out2
=&
sigscratch
.
body
...
...
arch/ia64/kernel/mca.c
View file @
2e3e80c2
...
...
@@ -1390,8 +1390,7 @@ ia64_mca_init(void)
register_percpu_irq
(
IA64_MCA_WAKEUP_VECTOR
,
&
mca_wkup_irqaction
);
#ifdef CONFIG_ACPI
/* Setup the CPEI/P vector and handler */
cpe_vector
=
acpi_request_vector
(
ACPI_INTERRUPT_CPEI
);
/* Setup the CPEI/P handler */
register_percpu_irq
(
IA64_CPEP_VECTOR
,
&
mca_cpep_irqaction
);
#endif
...
...
@@ -1436,6 +1435,7 @@ ia64_mca_late_init(void)
#ifdef CONFIG_ACPI
/* Setup the CPEI/P vector and handler */
cpe_vector
=
acpi_request_vector
(
ACPI_INTERRUPT_CPEI
);
init_timer
(
&
cpe_poll_timer
);
cpe_poll_timer
.
function
=
ia64_mca_cpe_poll
;
...
...
arch/ia64/kernel/minstate.h
View file @
2e3e80c2
...
...
@@ -41,7 +41,7 @@
(pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \
(pKStk) ld8 r3 = [r3];; \
(pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \
(pKStk) addl
sp
=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \
(pKStk) addl
r1
=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \
(pUStk) mov ar.rsc=0;
/* set enforced lazy mode, pl 0, little-endian, loadrs=0 */
\
(pUStk) addl r22=IA64_RBS_OFFSET,r1;
/* compute base of register backing store */
\
;; \
...
...
@@ -50,7 +50,6 @@
(pUStk) mov r23=ar.bspstore;
/* save ar.bspstore */
\
(pUStk) dep r22=-1,r22,61,3;
/* compute kernel virtual addr of RBS */
\
;; \
(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;
/* if in kernel mode, use sp (r12) */
\
(pUStk) mov ar.bspstore=r22;
/* switch to kernel RBS */
\
;; \
(pUStk) mov r18=ar.bsp; \
...
...
arch/ia64/kernel/perfmon.c
View file @
2e3e80c2
...
...
@@ -11,7 +11,7 @@
* Version Perfmon-2.x is a rewrite of perfmon-1.x
* by Stephane Eranian, Hewlett Packard Co.
*
* Copyright (C) 1999-200
3, 200
5 Hewlett Packard Co
* Copyright (C) 1999-2005 Hewlett Packard Co
* Stephane Eranian <eranian@hpl.hp.com>
* David Mosberger-Tang <davidm@hpl.hp.com>
*
...
...
@@ -497,6 +497,9 @@ typedef struct {
static
pfm_stats_t
pfm_stats
[
NR_CPUS
];
static
pfm_session_t
pfm_sessions
;
/* global sessions information */
static
spinlock_t
pfm_alt_install_check
=
SPIN_LOCK_UNLOCKED
;
static
pfm_intr_handler_desc_t
*
pfm_alt_intr_handler
;
static
struct
proc_dir_entry
*
perfmon_dir
;
static
pfm_uuid_t
pfm_null_uuid
=
{
0
,};
...
...
@@ -606,6 +609,7 @@ DEFINE_PER_CPU(unsigned long, pfm_syst_info);
DEFINE_PER_CPU
(
struct
task_struct
*
,
pmu_owner
);
DEFINE_PER_CPU
(
pfm_context_t
*
,
pmu_ctx
);
DEFINE_PER_CPU
(
unsigned
long
,
pmu_activation_number
);
EXPORT_PER_CPU_SYMBOL_GPL
(
pfm_syst_info
);
/* forward declaration */
...
...
@@ -1325,7 +1329,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)
error_conflict:
DPRINT
((
"system wide not possible, conflicting session [%d] on CPU%d
\n
"
,
pfm_sessions
.
pfs_sys_session
[
cpu
]
->
pid
,
smp_processor_id
()
));
cpu
));
abort:
UNLOCK_PFS
(
flags
);
...
...
@@ -5555,26 +5559,32 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
int
ret
;
this_cpu
=
get_cpu
();
min
=
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_min
;
max
=
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_max
;
if
(
likely
(
!
pfm_alt_intr_handler
))
{
min
=
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_min
;
max
=
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_max
;
start_cycles
=
ia64_get_itc
();
start_cycles
=
ia64_get_itc
();
ret
=
pfm_do_interrupt_handler
(
irq
,
arg
,
regs
);
ret
=
pfm_do_interrupt_handler
(
irq
,
arg
,
regs
);
total_cycles
=
ia64_get_itc
();
total_cycles
=
ia64_get_itc
();
/*
* don't measure spurious interrupts
*/
if
(
likely
(
ret
==
0
))
{
total_cycles
-=
start_cycles
;
/*
* don't measure spurious interrupts
*/
if
(
likely
(
ret
==
0
))
{
total_cycles
-=
start_cycles
;
if
(
total_cycles
<
min
)
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_min
=
total_cycles
;
if
(
total_cycles
>
max
)
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_max
=
total_cycles
;
if
(
total_cycles
<
min
)
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_min
=
total_cycles
;
if
(
total_cycles
>
max
)
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles_max
=
total_cycles
;
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles
+=
total_cycles
;
pfm_stats
[
this_cpu
].
pfm_ovfl_intr_cycles
+=
total_cycles
;
}
}
else
{
(
*
pfm_alt_intr_handler
->
handler
)(
irq
,
arg
,
regs
);
}
put_cpu_no_resched
();
return
IRQ_HANDLED
;
}
...
...
@@ -6425,6 +6435,141 @@ static struct irqaction perfmon_irqaction = {
.
name
=
"perfmon"
};
static
void
pfm_alt_save_pmu_state
(
void
*
data
)
{
struct
pt_regs
*
regs
;
regs
=
ia64_task_regs
(
current
);
DPRINT
((
"called
\n
"
));
/*
* should not be necessary but
* let's take not risk
*/
pfm_clear_psr_up
();
pfm_clear_psr_pp
();
ia64_psr
(
regs
)
->
pp
=
0
;
/*
* This call is required
* May cause a spurious interrupt on some processors
*/
pfm_freeze_pmu
();
ia64_srlz_d
();
}
void
pfm_alt_restore_pmu_state
(
void
*
data
)
{
struct
pt_regs
*
regs
;
regs
=
ia64_task_regs
(
current
);
DPRINT
((
"called
\n
"
));
/*
* put PMU back in state expected
* by perfmon
*/
pfm_clear_psr_up
();
pfm_clear_psr_pp
();
ia64_psr
(
regs
)
->
pp
=
0
;
/*
* perfmon runs with PMU unfrozen at all times
*/
pfm_unfreeze_pmu
();
ia64_srlz_d
();
}
int
pfm_install_alt_pmu_interrupt
(
pfm_intr_handler_desc_t
*
hdl
)
{
int
ret
,
i
;
int
reserve_cpu
;
/* some sanity checks */
if
(
hdl
==
NULL
||
hdl
->
handler
==
NULL
)
return
-
EINVAL
;
/* do the easy test first */
if
(
pfm_alt_intr_handler
)
return
-
EBUSY
;
/* one at a time in the install or remove, just fail the others */
if
(
!
spin_trylock
(
&
pfm_alt_install_check
))
{
return
-
EBUSY
;
}
/* reserve our session */
for_each_online_cpu
(
reserve_cpu
)
{
ret
=
pfm_reserve_session
(
NULL
,
1
,
reserve_cpu
);
if
(
ret
)
goto
cleanup_reserve
;
}
/* save the current system wide pmu states */
ret
=
on_each_cpu
(
pfm_alt_save_pmu_state
,
NULL
,
0
,
1
);
if
(
ret
)
{
DPRINT
((
"on_each_cpu() failed: %d
\n
"
,
ret
));
goto
cleanup_reserve
;
}
/* officially change to the alternate interrupt handler */
pfm_alt_intr_handler
=
hdl
;
spin_unlock
(
&
pfm_alt_install_check
);
return
0
;
cleanup_reserve:
for_each_online_cpu
(
i
)
{
/* don't unreserve more than we reserved */
if
(
i
>=
reserve_cpu
)
break
;
pfm_unreserve_session
(
NULL
,
1
,
i
);
}
spin_unlock
(
&
pfm_alt_install_check
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
pfm_install_alt_pmu_interrupt
);
int
pfm_remove_alt_pmu_interrupt
(
pfm_intr_handler_desc_t
*
hdl
)
{
int
i
;
int
ret
;
if
(
hdl
==
NULL
)
return
-
EINVAL
;
/* cannot remove someone else's handler! */
if
(
pfm_alt_intr_handler
!=
hdl
)
return
-
EINVAL
;
/* one at a time in the install or remove, just fail the others */
if
(
!
spin_trylock
(
&
pfm_alt_install_check
))
{
return
-
EBUSY
;
}
pfm_alt_intr_handler
=
NULL
;
ret
=
on_each_cpu
(
pfm_alt_restore_pmu_state
,
NULL
,
0
,
1
);
if
(
ret
)
{
DPRINT
((
"on_each_cpu() failed: %d
\n
"
,
ret
));
}
for_each_online_cpu
(
i
)
{
pfm_unreserve_session
(
NULL
,
1
,
i
);
}
spin_unlock
(
&
pfm_alt_install_check
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
pfm_remove_alt_pmu_interrupt
);
/*
* perfmon initialization routine, called from the initcall() table
*/
...
...
arch/ia64/kernel/ptrace.c
View file @
2e3e80c2
...
...
@@ -692,16 +692,30 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs *pt,
unsigned
long
cfm
)
{
struct
unw_frame_info
info
,
prev_info
;
unsigned
long
ip
,
pr
;
unsigned
long
ip
,
sp
,
pr
;
unw_init_from_blocked_task
(
&
info
,
child
);
while
(
1
)
{
prev_info
=
info
;
if
(
unw_unwind
(
&
info
)
<
0
)
return
;
if
(
unw_get_rp
(
&
info
,
&
ip
)
<
0
)
unw_get_sp
(
&
info
,
&
sp
);
if
((
long
)((
unsigned
long
)
child
+
IA64_STK_OFFSET
-
sp
)
<
IA64_PT_REGS_SIZE
)
{
dprintk
(
"ptrace.%s: ran off the top of the kernel "
"stack
\n
"
,
__FUNCTION__
);
return
;
}
if
(
unw_get_pr
(
&
prev_info
,
&
pr
)
<
0
)
{
unw_get_rp
(
&
prev_info
,
&
ip
);
dprintk
(
"ptrace.%s: failed to read "
"predicate register (ip=0x%lx)
\n
"
,
__FUNCTION__
,
ip
);
return
;
if
(
ip
<
FIXADDR_USER_END
)
}
if
(
unw_is_intr_frame
(
&
info
)
&&
(
pr
&
(
1UL
<<
PRED_USER_STACK
)))
break
;
}
...
...
arch/ia64/kernel/smpboot.c
View file @
2e3e80c2
...
...
@@ -624,7 +624,7 @@ static struct {
__u16
thread_id
;
__u16
proc_fixed_addr
;
__u8
valid
;
}
mt_info
[
NR_CPUS
]
__devinit
;
}
mt_info
[
NR_CPUS
]
__devinitdata
;
#ifdef CONFIG_HOTPLUG_CPU
static
inline
void
...
...
arch/ia64/kernel/sys_ia64.c
View file @
2e3e80c2
...
...
@@ -182,13 +182,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un
}
}
/*
* A zero mmap always succeeds in Linux, independent of whether or not the
* remaining arguments are valid.
*/
if
(
len
==
0
)
goto
out
;
/* Careful about overflows.. */
len
=
PAGE_ALIGN
(
len
);
if
(
!
len
||
len
>
TASK_SIZE
)
{
...
...
arch/ia64/sn/kernel/setup.c
View file @
2e3e80c2
...
...
@@ -271,6 +271,8 @@ void __init sn_setup(char **cmdline_p)
int
major
=
sn_sal_rev_major
(),
minor
=
sn_sal_rev_minor
();
extern
void
sn_cpu_init
(
void
);
ia64_sn_plat_set_error_handling_features
();
/*
* If the generic code has enabled vga console support - lets
* get rid of it again. This is a kludge for the fact that ACPI
...
...
include/asm-ia64/perfmon.h
View file @
2e3e80c2
...
...
@@ -177,6 +177,10 @@ typedef union {
extern
long
perfmonctl
(
int
fd
,
int
cmd
,
void
*
arg
,
int
narg
);
typedef
struct
{
void
(
*
handler
)(
int
irq
,
void
*
arg
,
struct
pt_regs
*
regs
);
}
pfm_intr_handler_desc_t
;
extern
void
pfm_save_regs
(
struct
task_struct
*
);
extern
void
pfm_load_regs
(
struct
task_struct
*
);
...
...
@@ -187,6 +191,10 @@ extern void pfm_syst_wide_update_task(struct task_struct *, unsigned long info,
extern
void
pfm_inherit
(
struct
task_struct
*
task
,
struct
pt_regs
*
regs
);
extern
void
pfm_init_percpu
(
void
);
extern
void
pfm_handle_work
(
void
);
extern
int
pfm_install_alt_pmu_interrupt
(
pfm_intr_handler_desc_t
*
h
);
extern
int
pfm_remove_alt_pmu_interrupt
(
pfm_intr_handler_desc_t
*
h
);
/*
* Reset PMD register flags
...
...
include/asm-ia64/sn/sn_sal.h
View file @
2e3e80c2
...
...
@@ -115,6 +115,13 @@
#define SAL_IROUTER_INTR_XMIT SAL_CONSOLE_INTR_XMIT
#define SAL_IROUTER_INTR_RECV SAL_CONSOLE_INTR_RECV
/*
* Error Handling Features
*/
#define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV 0x1
#define SAL_ERR_FEAT_LOG_SBES 0x2
#define SAL_ERR_FEAT_MFR_OVERRIDE 0x4
#define SAL_ERR_FEAT_SBE_THRESHOLD 0xffff0000
/*
* SAL Error Codes
...
...
@@ -341,6 +348,25 @@ ia64_sn_plat_cpei_handler(void)
return
ret_stuff
.
status
;
}
/*
* Set Error Handling Features
*/
static
inline
u64
ia64_sn_plat_set_error_handling_features
(
void
)
{
struct
ia64_sal_retval
ret_stuff
;
ret_stuff
.
status
=
0
;
ret_stuff
.
v0
=
0
;
ret_stuff
.
v1
=
0
;
ret_stuff
.
v2
=
0
;
SAL_CALL_REENTRANT
(
ret_stuff
,
SN_SAL_SET_ERROR_HANDLING_FEATURES
,
(
SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV
|
SAL_ERR_FEAT_LOG_SBES
),
0
,
0
,
0
,
0
,
0
,
0
);
return
ret_stuff
.
status
;
}
/*
* Checks for console input.
*/
...
...
@@ -472,7 +498,7 @@ static inline u64
ia64_sn_pod_mode
(
void
)
{
struct
ia64_sal_retval
isrv
;
SAL_CALL
(
isrv
,
SN_SAL_POD_MODE
,
0
,
0
,
0
,
0
,
0
,
0
,
0
);
SAL_CALL
_REENTRANT
(
isrv
,
SN_SAL_POD_MODE
,
0
,
0
,
0
,
0
,
0
,
0
,
0
);
if
(
isrv
.
status
)
return
0
;
return
isrv
.
v0
;
...
...
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