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
ac6e91af
Commit
ac6e91af
authored
Sep 27, 2002
by
David Mosberger
Browse files
Options
Browse Files
Download
Plain Diff
Merge tiger.hpl.hp.com:/data1/bk/vanilla/linux-2.5
into tiger.hpl.hp.com:/data1/bk/lia64/to-linus-2.5
parents
b2fd37fa
e6c94d25
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
671 additions
and
259 deletions
+671
-259
arch/ia64/ia32/ia32_ioctl.c
arch/ia64/ia32/ia32_ioctl.c
+238
-0
arch/ia64/kernel/efi.c
arch/ia64/kernel/efi.c
+143
-54
arch/ia64/kernel/fw-emu.c
arch/ia64/kernel/fw-emu.c
+1
-1
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+23
-7
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca.c
+7
-22
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+80
-73
arch/ia64/kernel/perfmon_generic.h
arch/ia64/kernel/perfmon_generic.h
+29
-0
arch/ia64/kernel/perfmon_itanium.h
arch/ia64/kernel/perfmon_itanium.h
+36
-36
arch/ia64/kernel/perfmon_mckinley.h
arch/ia64/kernel/perfmon_mckinley.h
+66
-38
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+2
-5
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+1
-1
include/asm-ia64/iosapic.h
include/asm-ia64/iosapic.h
+2
-0
include/asm-ia64/perfmon.h
include/asm-ia64/perfmon.h
+1
-1
include/asm-ia64/siginfo.h
include/asm-ia64/siginfo.h
+2
-2
include/asm-ia64/sn/bte_copy.h
include/asm-ia64/sn/bte_copy.h
+1
-1
include/asm-ia64/tlb.h
include/asm-ia64/tlb.h
+39
-18
No files found.
arch/ia64/ia32/ia32_ioctl.c
View file @
ac6e91af
...
...
@@ -26,6 +26,12 @@
#include <linux/if_ppp.h>
#include <linux/ixjuser.h>
#include <linux/i2o-dev.h>
#include <scsi/scsi.h>
/* Ugly hack. */
#undef __KERNEL__
#include <scsi/scsi_ioctl.h>
#define __KERNEL__
#include <scsi/sg.h>
#include <asm/ia32.h>
...
...
@@ -60,6 +66,235 @@ put_dirent32 (struct dirent *d, struct linux32_dirent *d32)
||
put_user
(
d
->
d_reclen
,
&
d32
->
d_reclen
)
||
copy_to_user
(
d32
->
d_name
,
d
->
d_name
,
namelen
+
1
));
}
/*
* The transform code for the SG_IO ioctl was brazenly lifted from
* the Sparc64 port in the file `arch/sparc64/kernel/ioctl32.c'.
* Thanks to Jakub Jelinek & Eddie C. Dost.
*/
typedef
struct
sg_io_hdr32
{
int
interface_id
;
/* [i] 'S' for SCSI generic (required) */
int
dxfer_direction
;
/* [i] data transfer direction */
char
cmd_len
;
/* [i] SCSI command length ( <= 16 bytes) */
char
mx_sb_len
;
/* [i] max length to write to sbp */
short
iovec_count
;
/* [i] 0 implies no scatter gather */
int
dxfer_len
;
/* [i] byte count of data transfer */
int
dxferp
;
/* [i], [*io] points to data transfer memory
or scatter gather list */
int
cmdp
;
/* [i], [*i] points to command to perform */
int
sbp
;
/* [i], [*o] points to sense_buffer memory */
int
timeout
;
/* [i] MAX_UINT->no timeout (unit: millisec) */
int
flags
;
/* [i] 0 -> default, see SG_FLAG... */
int
pack_id
;
/* [i->o] unused internally (normally) */
int
usr_ptr
;
/* [i->o] unused internally */
char
status
;
/* [o] scsi status */
char
masked_status
;
/* [o] shifted, masked scsi status */
char
msg_status
;
/* [o] messaging level data (optional) */
char
sb_len_wr
;
/* [o] byte count actually written to sbp */
short
host_status
;
/* [o] errors from host adapter */
short
driver_status
;
/* [o] errors from software driver */
int
resid
;
/* [o] dxfer_len - actual_transferred */
int
duration
;
/* [o] time taken by cmd (unit: millisec) */
int
info
;
/* [o] auxiliary information */
}
sg_io_hdr32_t
;
/* 64 bytes long (on IA32) */
struct
iovec32
{
unsigned
int
iov_base
;
int
iov_len
;
};
static
int
alloc_sg_iovec
(
sg_io_hdr_t
*
sgp
,
int
uptr32
)
{
struct
iovec32
*
uiov
=
(
struct
iovec32
*
)
P
(
uptr32
);
sg_iovec_t
*
kiov
;
int
i
;
sgp
->
dxferp
=
kmalloc
(
sgp
->
iovec_count
*
sizeof
(
sg_iovec_t
),
GFP_KERNEL
);
if
(
!
sgp
->
dxferp
)
return
-
ENOMEM
;
memset
(
sgp
->
dxferp
,
0
,
sgp
->
iovec_count
*
sizeof
(
sg_iovec_t
));
kiov
=
(
sg_iovec_t
*
)
sgp
->
dxferp
;
for
(
i
=
0
;
i
<
sgp
->
iovec_count
;
i
++
)
{
int
iov_base32
;
if
(
__get_user
(
iov_base32
,
&
uiov
->
iov_base
)
||
__get_user
(
kiov
->
iov_len
,
&
uiov
->
iov_len
))
return
-
EFAULT
;
kiov
->
iov_base
=
kmalloc
(
kiov
->
iov_len
,
GFP_KERNEL
);
if
(
!
kiov
->
iov_base
)
return
-
ENOMEM
;
if
(
copy_from_user
(
kiov
->
iov_base
,
(
void
*
)
P
(
iov_base32
),
kiov
->
iov_len
))
return
-
EFAULT
;
uiov
++
;
kiov
++
;
}
return
0
;
}
static
int
copy_back_sg_iovec
(
sg_io_hdr_t
*
sgp
,
int
uptr32
)
{
struct
iovec32
*
uiov
=
(
struct
iovec32
*
)
P
(
uptr32
);
sg_iovec_t
*
kiov
=
(
sg_iovec_t
*
)
sgp
->
dxferp
;
int
i
;
for
(
i
=
0
;
i
<
sgp
->
iovec_count
;
i
++
)
{
int
iov_base32
;
if
(
__get_user
(
iov_base32
,
&
uiov
->
iov_base
))
return
-
EFAULT
;
if
(
copy_to_user
((
void
*
)
P
(
iov_base32
),
kiov
->
iov_base
,
kiov
->
iov_len
))
return
-
EFAULT
;
uiov
++
;
kiov
++
;
}
return
0
;
}
static
void
free_sg_iovec
(
sg_io_hdr_t
*
sgp
)
{
sg_iovec_t
*
kiov
=
(
sg_iovec_t
*
)
sgp
->
dxferp
;
int
i
;
for
(
i
=
0
;
i
<
sgp
->
iovec_count
;
i
++
)
{
if
(
kiov
->
iov_base
)
{
kfree
(
kiov
->
iov_base
);
kiov
->
iov_base
=
NULL
;
}
kiov
++
;
}
kfree
(
sgp
->
dxferp
);
sgp
->
dxferp
=
NULL
;
}
static
int
sg_ioctl_trans
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
sg_io_hdr32_t
*
sg_io32
;
sg_io_hdr_t
sg_io64
;
int
dxferp32
,
cmdp32
,
sbp32
;
mm_segment_t
old_fs
;
int
err
=
0
;
sg_io32
=
(
sg_io_hdr32_t
*
)
arg
;
err
=
__get_user
(
sg_io64
.
interface_id
,
&
sg_io32
->
interface_id
);
err
|=
__get_user
(
sg_io64
.
dxfer_direction
,
&
sg_io32
->
dxfer_direction
);
err
|=
__get_user
(
sg_io64
.
cmd_len
,
&
sg_io32
->
cmd_len
);
err
|=
__get_user
(
sg_io64
.
mx_sb_len
,
&
sg_io32
->
mx_sb_len
);
err
|=
__get_user
(
sg_io64
.
iovec_count
,
&
sg_io32
->
iovec_count
);
err
|=
__get_user
(
sg_io64
.
dxfer_len
,
&
sg_io32
->
dxfer_len
);
err
|=
__get_user
(
sg_io64
.
timeout
,
&
sg_io32
->
timeout
);
err
|=
__get_user
(
sg_io64
.
flags
,
&
sg_io32
->
flags
);
err
|=
__get_user
(
sg_io64
.
pack_id
,
&
sg_io32
->
pack_id
);
sg_io64
.
dxferp
=
NULL
;
sg_io64
.
cmdp
=
NULL
;
sg_io64
.
sbp
=
NULL
;
err
|=
__get_user
(
cmdp32
,
&
sg_io32
->
cmdp
);
sg_io64
.
cmdp
=
kmalloc
(
sg_io64
.
cmd_len
,
GFP_KERNEL
);
if
(
!
sg_io64
.
cmdp
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
copy_from_user
(
sg_io64
.
cmdp
,
(
void
*
)
P
(
cmdp32
),
sg_io64
.
cmd_len
))
{
err
=
-
EFAULT
;
goto
out
;
}
err
|=
__get_user
(
sbp32
,
&
sg_io32
->
sbp
);
sg_io64
.
sbp
=
kmalloc
(
sg_io64
.
mx_sb_len
,
GFP_KERNEL
);
if
(
!
sg_io64
.
sbp
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
copy_from_user
(
sg_io64
.
sbp
,
(
void
*
)
P
(
sbp32
),
sg_io64
.
mx_sb_len
))
{
err
=
-
EFAULT
;
goto
out
;
}
err
|=
__get_user
(
dxferp32
,
&
sg_io32
->
dxferp
);
if
(
sg_io64
.
iovec_count
)
{
int
ret
;
if
((
ret
=
alloc_sg_iovec
(
&
sg_io64
,
dxferp32
)))
{
err
=
ret
;
goto
out
;
}
}
else
{
sg_io64
.
dxferp
=
kmalloc
(
sg_io64
.
dxfer_len
,
GFP_KERNEL
);
if
(
!
sg_io64
.
dxferp
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
copy_from_user
(
sg_io64
.
dxferp
,
(
void
*
)
P
(
dxferp32
),
sg_io64
.
dxfer_len
))
{
err
=
-
EFAULT
;
goto
out
;
}
}
/* Unused internally, do not even bother to copy it over. */
sg_io64
.
usr_ptr
=
NULL
;
if
(
err
)
return
-
EFAULT
;
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
err
=
sys_ioctl
(
fd
,
cmd
,
(
unsigned
long
)
&
sg_io64
);
set_fs
(
old_fs
);
if
(
err
<
0
)
goto
out
;
err
=
__put_user
(
sg_io64
.
pack_id
,
&
sg_io32
->
pack_id
);
err
|=
__put_user
(
sg_io64
.
status
,
&
sg_io32
->
status
);
err
|=
__put_user
(
sg_io64
.
masked_status
,
&
sg_io32
->
masked_status
);
err
|=
__put_user
(
sg_io64
.
msg_status
,
&
sg_io32
->
msg_status
);
err
|=
__put_user
(
sg_io64
.
sb_len_wr
,
&
sg_io32
->
sb_len_wr
);
err
|=
__put_user
(
sg_io64
.
host_status
,
&
sg_io32
->
host_status
);
err
|=
__put_user
(
sg_io64
.
driver_status
,
&
sg_io32
->
driver_status
);
err
|=
__put_user
(
sg_io64
.
resid
,
&
sg_io32
->
resid
);
err
|=
__put_user
(
sg_io64
.
duration
,
&
sg_io32
->
duration
);
err
|=
__put_user
(
sg_io64
.
info
,
&
sg_io32
->
info
);
err
|=
copy_to_user
((
void
*
)
P
(
sbp32
),
sg_io64
.
sbp
,
sg_io64
.
mx_sb_len
);
if
(
sg_io64
.
dxferp
)
{
if
(
sg_io64
.
iovec_count
)
err
|=
copy_back_sg_iovec
(
&
sg_io64
,
dxferp32
);
else
err
|=
copy_to_user
((
void
*
)
P
(
dxferp32
),
sg_io64
.
dxferp
,
sg_io64
.
dxfer_len
);
}
if
(
err
)
err
=
-
EFAULT
;
out:
if
(
sg_io64
.
cmdp
)
kfree
(
sg_io64
.
cmdp
);
if
(
sg_io64
.
sbp
)
kfree
(
sg_io64
.
sbp
);
if
(
sg_io64
.
dxferp
)
{
if
(
sg_io64
.
iovec_count
)
{
free_sg_iovec
(
&
sg_io64
);
}
else
{
kfree
(
sg_io64
.
dxferp
);
}
}
return
err
;
}
asmlinkage
long
sys32_ioctl
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
int
arg
)
...
...
@@ -271,6 +506,9 @@ sys32_ioctl (unsigned int fd, unsigned int cmd, unsigned int arg)
default:
return
sys_ioctl
(
fd
,
cmd
,
(
unsigned
long
)
arg
);
case
IOCTL_NR
(
SG_IO
):
return
(
sg_ioctl_trans
(
fd
,
cmd
,
arg
));
}
printk
(
"%x:unimplemented IA32 ioctl system call
\n
"
,
cmd
);
return
-
EINVAL
;
...
...
arch/ia64/kernel/efi.c
View file @
ac6e91af
...
...
@@ -60,67 +60,157 @@ struct proc_dir_entry *efi_dir = NULL;
static
unsigned
long
mem_limit
=
~
0UL
;
static
efi_status_t
phys_get_time
(
efi_time_t
*
tm
,
efi_time_cap_t
*
tc
)
{
return
efi_call_phys
(
__va
(
runtime
->
get_time
),
__pa
(
tm
),
__pa
(
tc
));
#define efi_call_virt(f, args...) (*(f))(args)
#define STUB_GET_TIME(prefix, adjust_arg) \
static efi_status_t \
prefix##_get_time (efi_time_t *tm, efi_time_cap_t *tc) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_get_time_t *) __va(runtime->get_time), adjust_arg(tm), \
adjust_arg(tc)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_set_time
(
efi_time_t
*
tm
)
{
return
efi_call_phys
(
__va
(
runtime
->
set_time
),
__pa
(
tm
));
#define STUB_SET_TIME(prefix, adjust_arg) \
static efi_status_t \
prefix##_set_time (efi_time_t *tm) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_set_time_t *) __va(runtime->set_time), adjust_arg(tm)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_get_wakeup_time
(
efi_bool_t
*
enabled
,
efi_bool_t
*
pending
,
efi_time_t
*
tm
)
{
return
efi_call_phys
(
__va
(
runtime
->
get_wakeup_time
),
__pa
(
enabled
),
__pa
(
pending
),
__pa
(
tm
));
#define STUB_GET_WAKEUP_TIME(prefix, adjust_arg) \
static efi_status_t \
prefix##_get_wakeup_time (efi_bool_t *enabled, efi_bool_t *pending, efi_time_t *tm) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_get_wakeup_time_t *) __va(runtime->get_wakeup_time), \
adjust_arg(enabled), adjust_arg(pending), adjust_arg(tm)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_set_wakeup_time
(
efi_bool_t
enabled
,
efi_time_t
*
tm
)
{
return
efi_call_phys
(
__va
(
runtime
->
set_wakeup_time
),
enabled
,
__pa
(
tm
));
#define STUB_SET_WAKEUP_TIME(prefix, adjust_arg) \
static efi_status_t \
prefix##_set_wakeup_time (efi_bool_t enabled, efi_time_t *tm) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_set_wakeup_time_t *) __va(runtime->set_wakeup_time), \
enabled, adjust_arg(tm)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_get_variable
(
efi_char16_t
*
name
,
efi_guid_t
*
vendor
,
u32
*
attr
,
unsigned
long
*
data_size
,
void
*
data
)
{
return
efi_call_phys
(
__va
(
runtime
->
get_variable
),
__pa
(
name
),
__pa
(
vendor
),
__pa
(
attr
),
__pa
(
data_size
),
__pa
(
data
));
#define STUB_GET_VARIABLE(prefix, adjust_arg) \
static efi_status_t \
prefix##_get_variable (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, \
unsigned long *data_size, void *data) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_get_variable_t *) __va(runtime->get_variable), \
adjust_arg(name), adjust_arg(vendor), adjust_arg(attr), \
adjust_arg(data_size), adjust_arg(data)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_get_next_variable
(
unsigned
long
*
name_size
,
efi_char16_t
*
name
,
efi_guid_t
*
vendor
)
{
return
efi_call_phys
(
__va
(
runtime
->
get_next_variable
),
__pa
(
name_size
),
__pa
(
name
),
__pa
(
vendor
));
#define STUB_GET_NEXT_VARIABLE(prefix, adjust_arg) \
static efi_status_t \
prefix##_get_next_variable (unsigned long *name_size, efi_char16_t *name, efi_guid_t *vendor) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_get_next_variable_t *) __va(runtime->get_next_variable), \
adjust_arg(name_size), adjust_arg(name), adjust_arg(vendor)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_set_variable
(
efi_char16_t
*
name
,
efi_guid_t
*
vendor
,
u32
attr
,
unsigned
long
data_size
,
void
*
data
)
{
return
efi_call_phys
(
__va
(
runtime
->
set_variable
),
__pa
(
name
),
__pa
(
vendor
),
attr
,
data_size
,
__pa
(
data
));
#define STUB_SET_VARIABLE(prefix, adjust_arg) \
static efi_status_t \
prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor, u32 attr, \
unsigned long data_size, void *data) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_set_variable_t *) __va(runtime->set_variable), \
adjust_arg(name), adjust_arg(vendor), attr, data_size, \
adjust_arg(data)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
efi_status_t
phys_get_next_high_mono_count
(
u64
*
count
)
{
return
efi_call_phys
(
__va
(
runtime
->
get_next_high_mono_count
),
__pa
(
count
));
#define STUB_GET_NEXT_HIGH_MONO_COUNT(prefix, adjust_arg) \
static efi_status_t \
prefix##_get_next_high_mono_count (u64 *count) \
{ \
struct ia64_fpreg fr[6]; \
efi_status_t ret; \
\
ia64_save_scratch_fpregs(fr); \
ret = efi_call_##prefix((efi_get_next_high_mono_count_t *) \
__va(runtime->get_next_high_mono_count), adjust_arg(count)); \
ia64_load_scratch_fpregs(fr); \
return ret; \
}
static
void
phys_reset_system
(
int
reset_type
,
efi_status_t
status
,
unsigned
long
data_size
,
efi_char16_t
*
data
)
{
efi_call_phys
(
__va
(
runtime
->
reset_system
),
status
,
data_size
,
__pa
(
data
));
#define STUB_RESET_SYSTEM(prefix, adjust_arg) \
static void \
prefix##_reset_system (int reset_type, efi_status_t status, \
unsigned long data_size, efi_char16_t *data) \
{ \
struct ia64_fpreg fr[6]; \
\
ia64_save_scratch_fpregs(fr); \
efi_call_##prefix((efi_reset_system_t *) __va(runtime->reset_system), \
reset_type, status, data_size, adjust_arg(data)); \
/* should not return, but just in case... */
\
ia64_load_scratch_fpregs(fr); \
}
STUB_GET_TIME
(
phys
,
__pa
)
STUB_SET_TIME
(
phys
,
__pa
)
STUB_GET_WAKEUP_TIME
(
phys
,
__pa
)
STUB_SET_WAKEUP_TIME
(
phys
,
__pa
)
STUB_GET_VARIABLE
(
phys
,
__pa
)
STUB_GET_NEXT_VARIABLE
(
phys
,
__pa
)
STUB_SET_VARIABLE
(
phys
,
__pa
)
STUB_GET_NEXT_HIGH_MONO_COUNT
(
phys
,
__pa
)
STUB_RESET_SYSTEM
(
phys
,
__pa
)
STUB_GET_TIME
(
virt
,
)
STUB_SET_TIME
(
virt
,
)
STUB_GET_WAKEUP_TIME
(
virt
,
)
STUB_SET_WAKEUP_TIME
(
virt
,
)
STUB_GET_VARIABLE
(
virt
,
)
STUB_GET_NEXT_VARIABLE
(
virt
,
)
STUB_SET_VARIABLE
(
virt
,
)
STUB_GET_NEXT_HIGH_MONO_COUNT
(
virt
,
)
STUB_RESET_SYSTEM
(
virt
,
)
void
efi_gettimeofday
(
struct
timeval
*
tv
)
{
...
...
@@ -574,18 +664,17 @@ efi_enter_virtual_mode (void)
}
/*
* Now that EFI is in virtual mode, we arrange for EFI functions to be
* called directly:
* Now that EFI is in virtual mode, we call the EFI functions more efficiently:
*/
efi
.
get_time
=
__va
(
runtime
->
get_time
)
;
efi
.
set_time
=
__va
(
runtime
->
set_time
)
;
efi
.
get_wakeup_time
=
__va
(
runtime
->
get_wakeup_time
)
;
efi
.
set_wakeup_time
=
__va
(
runtime
->
set_wakeup_time
)
;
efi
.
get_variable
=
__va
(
runtime
->
get_variable
)
;
efi
.
get_next_variable
=
__va
(
runtime
->
get_next_variable
)
;
efi
.
set_variable
=
__va
(
runtime
->
set_variable
)
;
efi
.
get_next_high_mono_count
=
__va
(
runtime
->
get_next_high_mono_count
)
;
efi
.
reset_system
=
__va
(
runtime
->
reset_system
)
;
efi
.
get_time
=
virt_get_time
;
efi
.
set_time
=
virt_set_time
;
efi
.
get_wakeup_time
=
virt_get_wakeup_time
;
efi
.
set_wakeup_time
=
virt_set_wakeup_time
;
efi
.
get_variable
=
virt_get_variable
;
efi
.
get_next_variable
=
virt_get_next_variable
;
efi
.
set_variable
=
virt_set_variable
;
efi
.
get_next_high_mono_count
=
virt_get_next_high_mono_count
;
efi
.
reset_system
=
virt_reset_system
;
}
/*
...
...
arch/ia64/kernel/fw-emu.c
View file @
ac6e91af
...
...
@@ -2,7 +2,7 @@
* PAL & SAL emulation.
*
* Copyright (C) 1998-2001 Hewlett-Packard Co
*
Copyright (C) 1998-2001
David Mosberger-Tang <davidm@hpl.hp.com>
*
David Mosberger-Tang <davidm@hpl.hp.com>
*
* For the HP simulator, this file gets include in boot/bootloader.c.
* For SoftSDV, this file gets included in sys_softsdv.c.
...
...
arch/ia64/kernel/iosapic.c
View file @
ac6e91af
...
...
@@ -133,12 +133,8 @@ find_iosapic (unsigned int gsi)
return
-
1
;
}
/*
* Translate GSI number to the corresponding IA-64 interrupt vector. If no
* entry exists, return -1.
*/
int
gsi_to_vector
(
unsigned
int
gsi
)
static
inline
int
_gsi_to_vector
(
unsigned
int
gsi
)
{
struct
iosapic_intr_info
*
info
;
...
...
@@ -148,6 +144,26 @@ gsi_to_vector (unsigned int gsi)
return
-
1
;
}
/*
* Translate GSI number to the corresponding IA-64 interrupt vector. If no
* entry exists, return -1.
*/
inline
int
gsi_to_vector
(
unsigned
int
gsi
)
{
return
_gsi_to_vector
(
gsi
);
}
int
gsi_to_irq
(
unsigned
int
gsi
)
{
/*
* XXX fix me: this assumes an identity mapping vetween IA-64 vector and Linux irq
* numbers...
*/
return
_gsi_to_vector
(
gsi
);
}
static
void
set_rte
(
unsigned
int
vector
,
unsigned
int
dest
)
{
...
...
@@ -157,7 +173,7 @@ set_rte (unsigned int vector, unsigned int dest)
int
rte_index
;
char
redir
;
DBG
(
KERN_DEBUG
"IOSAPIC: routing vector %d to %x
\n
"
,
vector
,
dest
);
DBG
(
KERN_DEBUG
"IOSAPIC: routing vector %d to
0x
%x
\n
"
,
vector
,
dest
);
rte_index
=
iosapic_intr_info
[
vector
].
rte_index
;
if
(
rte_index
<
0
)
...
...
arch/ia64/kernel/mca.c
View file @
ac6e91af
...
...
@@ -1012,28 +1012,13 @@ ia64_log_prt_oem_data (int header_len, int sect_len, u8 *p_data, prfunc_t prfunc
void
ia64_log_rec_header_print
(
sal_log_record_header_t
*
lh
,
prfunc_t
prfunc
)
{
char
str_buf
[
32
];
sprintf
(
str_buf
,
"%2d.%02d"
,
(
lh
->
revision
.
major
>>
4
)
*
10
+
(
lh
->
revision
.
major
&
0xf
),
(
lh
->
revision
.
minor
>>
4
)
*
10
+
(
lh
->
revision
.
minor
&
0xf
));
prfunc
(
"+Err Record ID: %d SAL Rev: %s
\n
"
,
lh
->
id
,
str_buf
);
sprintf
(
str_buf
,
"%02d/%02d/%04d/ %02d:%02d:%02d"
,
(
lh
->
timestamp
.
slh_month
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_month
&
0xf
),
(
lh
->
timestamp
.
slh_day
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_day
&
0xf
),
(
lh
->
timestamp
.
slh_century
>>
4
)
*
1000
+
(
lh
->
timestamp
.
slh_century
&
0xf
)
*
100
+
(
lh
->
timestamp
.
slh_year
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_year
&
0xf
),
(
lh
->
timestamp
.
slh_hour
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_hour
&
0xf
),
(
lh
->
timestamp
.
slh_minute
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_minute
&
0xf
),
(
lh
->
timestamp
.
slh_second
>>
4
)
*
10
+
(
lh
->
timestamp
.
slh_second
&
0xf
));
prfunc
(
"+Time: %s Severity %d
\n
"
,
str_buf
,
lh
->
severity
);
prfunc
(
"+Err Record ID: %d SAL Rev: %2x.%02x
\n
"
,
lh
->
id
,
lh
->
revision
.
major
,
lh
->
revision
.
minor
);
prfunc
(
"+Time: %02x/%02x/%02x%02x %02x:%02x:%02x Severity %d
\n
"
,
lh
->
timestamp
.
slh_month
,
lh
->
timestamp
.
slh_day
,
lh
->
timestamp
.
slh_century
,
lh
->
timestamp
.
slh_year
,
lh
->
timestamp
.
slh_hour
,
lh
->
timestamp
.
slh_minute
,
lh
->
timestamp
.
slh_second
,
lh
->
severity
);
}
/*
...
...
arch/ia64/kernel/perfmon.c
View file @
ac6e91af
...
...
@@ -63,6 +63,26 @@
* Misc macros and definitions
*/
#define PMU_FIRST_COUNTER 4
#define PMU_MAX_PMCS 256
#define PMU_MAX_PMDS 256
/*
* type of a PMU register (bitmask).
* bitmask structure:
* bit0 : register implemented
* bit1 : end marker
* bit2-3 : reserved
* bit4-7 : register type
* bit8-31: reserved
*/
#define PFM_REG_IMPL 0x1
/* register implemented */
#define PFM_REG_END 0x2
/* end marker */
#define PFM_REG_MONITOR (0x1<<4|PFM_REG_IMPL)
/* a PMC with a pmc.pm field only */
#define PFM_REG_COUNTING (0x2<<4|PFM_REG_IMPL)
/* a PMC with a pmc.pm AND pmc.oi, a PMD used as a counter */
#define PFM_REG_CONTROL (0x3<<4|PFM_REG_IMPL)
/* PMU control register */
#define PFM_REG_CONFIG (0x4<<4|PFM_REG_IMPL)
/* refine configuration */
#define PFM_REG_BUFFER (0x5<<4|PFM_REG_IMPL)
/* PMD used as buffer */
#define PFM_IS_DISABLED() pmu_conf.pfm_is_disabled
...
...
@@ -70,13 +90,18 @@
#define PFM_FL_INHERIT_MASK (PFM_FL_INHERIT_NONE|PFM_FL_INHERIT_ONCE|PFM_FL_INHERIT_ALL)
/* i assume unsigned */
#define PMC_IS_IMPL(i) (i<
pmu_conf.num_pmcs && pmu_conf.impl_regs[i>>6] & (1UL<< (i) %64
))
#define PMD_IS_IMPL(i) (i<
pmu_conf.num_pmds && pmu_conf.impl_regs[4+(i>>6)] & (1UL<<(i) % 64
))
#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 three assume that register i is implemented */
#define PMD_IS_COUNTING(i) (pmu_conf.pmd_desc[i].type == PFM_REG_COUNTING)
#define PMC_IS_COUNTING(i) (pmu_conf.pmc_desc[i].type == PFM_REG_COUNTING)
#define PMC_IS_MONITOR(i) (pmu_conf.pmc_desc[i].type == PFM_REG_MONITOR)
#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]
/* k assume unsigned */
#define IBR_IS_IMPL(k) (k<pmu_conf.num_ibrs)
...
...
@@ -175,19 +200,6 @@ typedef struct _pfm_smpl_buffer_desc {
#define LOCK_PSB(p) spin_lock(&(p)->psb_lock)
#define UNLOCK_PSB(p) spin_unlock(&(p)->psb_lock)
/*
* The possible type of a PMU register
*/
typedef
enum
{
PFM_REG_NOTIMPL
,
/* not implemented */
PFM_REG_NONE
,
/* end marker */
PFM_REG_MONITOR
,
/* a PMC with a pmc.pm field only */
PFM_REG_COUNTING
,
/* a PMC with a pmc.pm AND pmc.oi, a PMD used as a counter */
PFM_REG_CONTROL
,
/* PMU control register */
PFM_REG_CONFIG
,
/* refine configuration */
PFM_REG_BUFFER
/* PMD used as buffer */
}
pfm_pmu_reg_type_t
;
/*
* 64-bit software counter structure
*/
...
...
@@ -283,13 +295,16 @@ typedef struct {
* dep_pmc[]: a bitmask of dependent PMC registers
*/
typedef
struct
{
pfm_pmu_reg_type_t
type
;
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
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
int
(
*
write_check
)(
struct
task_struct
*
task
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
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)
...
...
@@ -401,8 +416,6 @@ static ctl_table pfm_sysctl_root[] = {
};
static
struct
ctl_table_header
*
pfm_sysctl_header
;
static
unsigned
long
reset_pmcs
[
IA64_NUM_PMC_REGS
];
/* contains PAL reset values for PMCS */
static
void
pfm_vm_close
(
struct
vm_area_struct
*
area
);
static
struct
vm_operations_struct
pfm_vm_ops
=
{
...
...
@@ -422,7 +435,7 @@ static struct {
/*
* forward declarations
*/
static
void
ia64
_reset_pmu
(
struct
task_struct
*
);
static
void
pfm
_reset_pmu
(
struct
task_struct
*
);
#ifdef CONFIG_SMP
static
void
pfm_fetch_regs
(
int
cpu
,
struct
task_struct
*
task
,
pfm_context_t
*
ctx
);
#endif
...
...
@@ -2244,7 +2257,7 @@ pfm_enable(struct task_struct *task, pfm_context_t *ctx, void *arg, int count,
pfm_lazy_save_regs
(
PMU_OWNER
());
/* reset all registers to stable quiet state */
ia64
_reset_pmu
(
task
);
pfm
_reset_pmu
(
task
);
/* make sure nothing starts */
if
(
ctx
->
ctx_fl_system
)
{
...
...
@@ -2307,7 +2320,7 @@ pfm_get_pmc_reset(struct task_struct *task, pfm_context_t *ctx, void *arg, int c
if
(
!
PMC_IS_IMPL
(
cnum
))
goto
abort_mission
;
tmp
.
reg_value
=
reset_pmcs
[
cnum
]
;
tmp
.
reg_value
=
PMC_DFL_VAL
(
cnum
)
;
PFM_REG_RETFLAG_SET
(
tmp
.
reg_flags
,
0
);
...
...
@@ -2998,6 +3011,8 @@ perfmon_proc_info(char *page)
p
+=
sprintf
(
p
,
"CPU%-2d recorded samples : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_recorded_samples_count
);
p
+=
sprintf
(
p
,
"CPU%-2d smpl buffer full : %lu
\n
"
,
i
,
pfm_stats
[
i
].
pfm_full_smpl_buffer_count
);
p
+=
sprintf
(
p
,
"CPU%-2d owner : %d
\n
"
,
i
,
pmu_owners
[
i
].
owner
?
pmu_owners
[
i
].
owner
->
pid
:
-
1
);
p
+=
sprintf
(
p
,
"CPU%-2d syst_wide : %d
\n
"
,
i
,
per_cpu
(
pfm_syst_wide
,
i
));
p
+=
sprintf
(
p
,
"CPU%-2d dcr_pp : %d
\n
"
,
i
,
per_cpu
(
pfm_dcr_pp
,
i
));
}
LOCK_PFS
();
...
...
@@ -3398,11 +3413,10 @@ pfm_load_regs (struct task_struct *task)
* XXX: make this routine able to work with non current context
*/
static
void
ia64
_reset_pmu
(
struct
task_struct
*
task
)
pfm
_reset_pmu
(
struct
task_struct
*
task
)
{
struct
thread_struct
*
t
=
&
task
->
thread
;
pfm_context_t
*
ctx
=
t
->
pfm_context
;
unsigned
long
mask
;
int
i
;
if
(
task
!=
current
)
{
...
...
@@ -3415,30 +3429,27 @@ ia64_reset_pmu(struct task_struct *task)
/*
* install reset values for PMC. We skip PMC0 (done above)
* XX: good up to 64 PMCS
*/
mask
=
pmu_conf
.
impl_regs
[
0
]
>>
1
;
for
(
i
=
1
;
mask
;
mask
>>=
1
,
i
++
)
{
if
(
mask
&
0x1
)
{
ia64_set_pmc
(
i
,
reset_pmcs
[
i
]);
/*
* When restoring context, we must restore ALL pmcs, even the ones
* that the task does not use to avoid leaks and possibly corruption
* of the sesion because of configuration conflicts. So here, we
* initialize the entire set used in the context switch restore routine.
*/
t
->
pmc
[
i
]
=
reset_pmcs
[
i
];
DBprintk
((
" pmc[%d]=0x%lx
\n
"
,
i
,
reset_pmcs
[
i
]));
}
for
(
i
=
1
;
(
pmu_conf
.
pmc_desc
[
i
].
type
&
PFM_REG_END
)
==
0
;
i
++
)
{
if
((
pmu_conf
.
pmc_desc
[
i
].
type
&
PFM_REG_IMPL
)
==
0
)
continue
;
ia64_set_pmc
(
i
,
PMC_DFL_VAL
(
i
));
/*
* When restoring context, we must restore ALL pmcs, even the ones
* that the task does not use to avoid leaks and possibly corruption
* of the sesion because of configuration conflicts. So here, we
* initialize the entire set used in the context switch restore routine.
*/
t
->
pmc
[
i
]
=
PMC_DFL_VAL
(
i
);
DBprintk
((
"pmc[%d]=0x%lx
\n
"
,
i
,
t
->
pmc
[
i
]));
}
/*
* clear reset values for PMD.
* XXX: good up to 64 PMDS. Suppose that zero is a valid value.
*/
mask
=
pmu_conf
.
impl_regs
[
4
];
for
(
i
=
0
;
mask
;
mask
>>=
1
,
i
++
)
{
i
f
(
mask
&
0x1
)
i
a64_set_pmd
(
i
,
0UL
);
for
(
i
=
0
;
(
pmu_conf
.
pmd_desc
[
i
].
type
&
PFM_REG_END
)
==
0
;
i
++
)
{
if
((
pmu_conf
.
pmd_desc
[
i
].
type
&
PFM_REG_IMPL
)
==
0
)
continue
;
ia64_set_pmd
(
i
,
0UL
);
t
->
pmd
[
i
]
=
0UL
;
}
...
...
@@ -4119,23 +4130,6 @@ static struct irqaction perfmon_irqaction = {
};
static
void
pfm_pmu_snapshot
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
IA64_NUM_PMC_REGS
;
i
++
)
{
if
(
i
>=
pmu_conf
.
num_pmcs
)
break
;
if
(
PMC_IS_IMPL
(
i
))
reset_pmcs
[
i
]
=
ia64_get_pmc
(
i
);
}
#ifdef CONFIG_MCKINLEY
/*
* set the 'stupid' enable bit to power the PMU!
*/
reset_pmcs
[
4
]
|=
1UL
<<
23
;
#endif
}
/*
* perfmon initialization routine, called from the initcall() table
*/
...
...
@@ -4160,6 +4154,9 @@ perfmon_init (void)
}
pmu_conf
.
perf_ovfl_val
=
(
1UL
<<
pm_info
.
pal_perf_mon_info_s
.
width
)
-
1
;
/*
* XXX: use the pfm_*_desc tables instead and simply verify with PAL
*/
pmu_conf
.
max_counters
=
pm_info
.
pal_perf_mon_info_s
.
generic
;
pmu_conf
.
num_pmcs
=
find_num_pm_regs
(
pmu_conf
.
impl_regs
);
pmu_conf
.
num_pmds
=
find_num_pm_regs
(
&
pmu_conf
.
impl_regs
[
4
]);
...
...
@@ -4183,24 +4180,11 @@ perfmon_init (void)
pmu_conf
.
num_ibrs
<<=
1
;
pmu_conf
.
num_dbrs
<<=
1
;
/*
* take a snapshot of all PMU registers. PAL is supposed
* to configure them with stable/safe values, i.e., not
* capturing anything.
* We take a snapshot now, before we make any modifications. This
* will become our master copy. Then we will reuse the snapshot
* to reset the PMU in pfm_enable(). Using this technique, perfmon
* does NOT have to know about the specific values to program for
* the PMC/PMD. The safe values may be different from one CPU model to
* the other.
*/
pfm_pmu_snapshot
();
/*
* setup the register configuration descriptions for the CPU
*/
pmu_conf
.
pmc_desc
=
pmc_desc
;
pmu_conf
.
pmd_desc
=
pmd_desc
;
pmu_conf
.
pmc_desc
=
p
fm_p
mc_desc
;
pmu_conf
.
pmd_desc
=
p
fm_p
md_desc
;
/* we are all set */
pmu_conf
.
pfm_is_disabled
=
0
;
...
...
@@ -4222,11 +4206,34 @@ __initcall(perfmon_init);
void
perfmon_init_percpu
(
void
)
{
int
i
;
if
(
smp_processor_id
()
==
0
)
register_percpu_irq
(
IA64_PERFMON_VECTOR
,
&
perfmon_irqaction
);
ia64_set_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.
*/
for
(
i
=
1
;
(
pfm_pmc_desc
[
i
].
type
&
PFM_REG_END
)
==
0
;
i
++
)
{
if
((
pfm_pmc_desc
[
i
].
type
&
PFM_REG_IMPL
)
==
0
)
continue
;
ia64_set_pmc
(
i
,
pfm_pmc_desc
[
i
].
default_value
);
}
for
(
i
=
0
;
(
pfm_pmd_desc
[
i
].
type
&
PFM_REG_END
)
==
0
;
i
++
)
{
if
((
pfm_pmd_desc
[
i
].
type
&
PFM_REG_IMPL
)
==
0
)
continue
;
ia64_set_pmd
(
i
,
0UL
);
}
ia64_set_pmc
(
0
,
1UL
);
ia64_srlz_d
();
}
#else
/* !CONFIG_PERFMON */
...
...
arch/ia64/kernel/perfmon_generic.h
0 → 100644
View file @
ac6e91af
#define RDEP(x) (1UL<<(x))
#if defined(CONFIG_ITANIUM) || defined(CONFIG_MCKINLEY)
#error "This file should only be used when CONFIG_ITANIUM and CONFIG_MCKINLEY are not defined"
#endif
static
pfm_reg_desc_t
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
}},
{
PFM_REG_END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
static
pfm_reg_desc_t
pmd_desc
[
PMU_MAX_PMDS
]
=
{
/* pmd0 */
{
PFM_REG_NOTIMPL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* pmd1 */
{
PFM_REG_NOTIMPL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* pmd2 */
{
PFM_REG_NOTIMPL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* pmd3 */
{
PFM_REG_NOTIMPL
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* 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
}},
{
PFM_REG_END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
arch/ia64/kernel/perfmon_itanium.h
View file @
ac6e91af
...
...
@@ -15,44 +15,44 @@
static
int
pfm_ita_pmc_check
(
struct
task_struct
*
task
,
unsigned
int
cnum
,
unsigned
long
*
val
,
struct
pt_regs
*
regs
);
static
int
pfm_write_ibr_dbr
(
int
mode
,
struct
task_struct
*
task
,
void
*
arg
,
int
count
,
struct
pt_regs
*
regs
);
static
pfm_reg_desc_t
p
mc_desc
[
256
]
=
{
/* pmc0 */
{
PFM_REG_CONTROL
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc1 */
{
PFM_REG_CONTROL
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc2 */
{
PFM_REG_CONTROL
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc3 */
{
PFM_REG_CONTROL
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc4 */
{
PFM_REG_COUNTING
,
6
,
NULL
,
NULL
,
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc5 */
{
PFM_REG_COUNTING
,
6
,
NULL
,
NULL
,
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc6 */
{
PFM_REG_COUNTING
,
6
,
NULL
,
NULL
,
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc7 */
{
PFM_REG_COUNTING
,
6
,
NULL
,
NULL
,
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc8 */
{
PFM_REG_CONFIG
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc9 */
{
PFM_REG_CONFIG
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc10 */
{
PFM_REG_MONITOR
,
6
,
NULL
,
NULL
,
{
RDEP
(
0
)
|
RDEP
(
1
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc11 */
{
PFM_REG_MONITOR
,
6
,
NULL
,
pfm_ita_pmc_check
,
{
RDEP
(
2
)
|
RDEP
(
3
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc12 */
{
PFM_REG_MONITOR
,
6
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc13 */
{
PFM_REG_CONFIG
,
0
,
NULL
,
pfm_ita_pmc_check
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
{
PFM_REG_
NONE
,
0
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
static
pfm_reg_desc_t
p
fm_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
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc5 */
{
PFM_REG_COUNTING
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc6 */
{
PFM_REG_COUNTING
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc7 */
{
PFM_REG_COUNTING
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc8 */
{
PFM_REG_CONFIG
,
0
,
0xf00000003ffffff8UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc9 */
{
PFM_REG_CONFIG
,
0
,
0xf00000003ffffff8UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc10 */
{
PFM_REG_MONITOR
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
0
)
|
RDEP
(
1
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc11 */
{
PFM_REG_MONITOR
,
6
,
0x0000000010000000UL
,
-
1UL
,
NULL
,
pfm_ita_pmc_check
,
{
RDEP
(
2
)
|
RDEP
(
3
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc12 */
{
PFM_REG_MONITOR
,
6
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
/* pmc13 */
{
PFM_REG_CONFIG
,
0
,
0x0003ffff00000001UL
,
-
1UL
,
NULL
,
pfm_ita_pmc_check
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
0UL
,
0UL
,
0UL
,
0UL
}},
{
PFM_REG_
END
,
0
,
0x0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
static
pfm_reg_desc_t
p
md_desc
[
256
]
=
{
/* pmd0 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
1
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
}},
/* pmd1 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
0
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
}},
/* pmd2 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
3
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
/* pmd3 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
2
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
/* pmd4 */
{
PFM_REG_COUNTING
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
}},
/* pmd5 */
{
PFM_REG_COUNTING
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
}},
/* pmd6 */
{
PFM_REG_COUNTING
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
}},
/* pmd7 */
{
PFM_REG_COUNTING
,
0
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
}},
/* pmd8 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd9 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd10 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd11 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd12 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd13 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd14 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd15 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd16 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd17 */
{
PFM_REG_BUFFER
,
0
,
NULL
,
NULL
,
{
RDEP
(
2
)
|
RDEP
(
3
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
{
PFM_REG_
NONE
,
0
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
static
pfm_reg_desc_t
p
fm_pmd_desc
[
PMU_MAX_PMDS
]
=
{
/* pmd0 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
1
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
}},
/* pmd1 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
0
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
10
),
0UL
,
0UL
,
0UL
}},
/* pmd2 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
3
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
/* pmd3 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
2
)
|
RDEP
(
17
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
/* pmd4 */
{
PFM_REG_COUNTING
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
4
),
0UL
,
0UL
,
0UL
}},
/* pmd5 */
{
PFM_REG_COUNTING
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
5
),
0UL
,
0UL
,
0UL
}},
/* pmd6 */
{
PFM_REG_COUNTING
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
6
),
0UL
,
0UL
,
0UL
}},
/* pmd7 */
{
PFM_REG_COUNTING
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0UL
,
0UL
,
0UL
,
0UL
},
{
RDEP
(
7
),
0UL
,
0UL
,
0UL
}},
/* pmd8 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd9 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd10 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd11 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd12 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd13 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
14
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd14 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
15
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd15 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
16
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd16 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
8
)
|
RDEP
(
9
)
|
RDEP
(
10
)
|
RDEP
(
11
)
|
RDEP
(
12
)
|
RDEP
(
13
)
|
RDEP
(
14
)
|
RDEP
(
15
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
12
),
0UL
,
0UL
,
0UL
}},
/* pmd17 */
{
PFM_REG_BUFFER
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
RDEP
(
2
)
|
RDEP
(
3
),
0UL
,
0UL
,
0UL
},
{
RDEP
(
11
),
0UL
,
0UL
,
0UL
}},
{
PFM_REG_
END
,
0
,
0UL
,
-
1UL
,
NULL
,
NULL
,
{
0
,},
{
0
,}},
/* end marker */
};
static
int
...
...
arch/ia64/kernel/perfmon_mckinley.h
View file @
ac6e91af
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/process.c
View file @
ac6e91af
...
...
@@ -199,10 +199,8 @@ ia64_save_extra (struct task_struct *task)
if
((
task
->
thread
.
flags
&
IA64_THREAD_PM_VALID
)
!=
0
)
pfm_save_regs
(
task
);
# ifdef CONFIG_SMP
if
(
__get_cpu_var
(
pfm_syst_wide
))
pfm_syst_wide_update_task
(
task
,
0
);
# endif
#endif
#ifdef CONFIG_IA32_SUPPORT
...
...
@@ -221,9 +219,8 @@ ia64_load_extra (struct task_struct *task)
if
((
task
->
thread
.
flags
&
IA64_THREAD_PM_VALID
)
!=
0
)
pfm_load_regs
(
task
);
# ifdef CONFIG_SMP
if
(
__get_cpu_var
(
pfm_syst_wide
))
pfm_syst_wide_update_task
(
task
,
1
);
# endif
if
(
__get_cpu_var
(
pfm_syst_wide
))
pfm_syst_wide_update_task
(
task
,
1
);
#endif
#ifdef CONFIG_IA32_SUPPORT
...
...
arch/ia64/mm/init.c
View file @
ac6e91af
...
...
@@ -78,7 +78,7 @@ ia64_init_addr_space (void)
vma
->
vm_mm
=
current
->
mm
;
vma
->
vm_start
=
IA64_RBS_BOT
;
vma
->
vm_end
=
vma
->
vm_start
+
PAGE_SIZE
;
vma
->
vm_page_prot
=
protection_map
[
VM_
READ
|
VM_WRITE
];
vma
->
vm_page_prot
=
protection_map
[
VM_
DATA_DEFAULT_FLAGS
&
0x7
];
vma
->
vm_flags
=
VM_READ
|
VM_WRITE
|
VM_MAYREAD
|
VM_MAYWRITE
|
VM_GROWSUP
;
vma
->
vm_ops
=
NULL
;
vma
->
vm_pgoff
=
0
;
...
...
include/asm-ia64/iosapic.h
View file @
ac6e91af
...
...
@@ -55,6 +55,8 @@ extern void __devinit iosapic_init (unsigned long address,
unsigned
int
gsi_base
,
int
pcat_compat
);
extern
int
gsi_to_vector
(
unsigned
int
gsi
);
extern
int
gsi_to_irq
(
unsigned
int
gsi
);
extern
void
iosapic_parse_prt
(
void
);
extern
int
iosapic_register_intr
(
unsigned
int
gsi
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
gsi_base
,
char
*
iosapic_address
);
...
...
include/asm-ia64/perfmon.h
View file @
ac6e91af
...
...
@@ -123,7 +123,7 @@ typedef struct {
* Define the version numbers for both perfmon as a whole and the sampling buffer format.
*/
#define PFM_VERSION_MAJ 1U
#define PFM_VERSION_MIN
0
U
#define PFM_VERSION_MIN
1
U
#define PFM_VERSION (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff))
#define PFM_SMPL_VERSION_MAJ 1U
...
...
include/asm-ia64/siginfo.h
View file @
ac6e91af
...
...
@@ -148,8 +148,8 @@ copy_siginfo (siginfo_t *to, siginfo_t *from)
if
(
from
->
si_code
<
0
)
memcpy
(
to
,
from
,
sizeof
(
siginfo_t
));
else
/* _sig
chld
is currently the largest know union member */
memcpy
(
to
,
from
,
4
*
sizeof
(
int
)
+
sizeof
(
from
->
_sifields
.
_sig
chld
));
/* _sig
prof
is currently the largest know union member */
memcpy
(
to
,
from
,
4
*
sizeof
(
int
)
+
sizeof
(
from
->
_sifields
.
_sig
prof
));
}
extern
int
copy_siginfo_from_user
(
siginfo_t
*
to
,
siginfo_t
*
from
);
...
...
include/asm-ia64/sn/bte_copy.h
View file @
ac6e91af
...
...
@@ -250,7 +250,7 @@ bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
* status register into the notification area.
* This fakes the shub performing the copy.
*/
if
(
jiffies
>
bte
->
idealTransferTimeout
)
{
if
(
time_after
(
jiffies
,
bte
->
idealTransferTimeout
)
)
{
bte
->
notify
=
HUB_L
(
bte
->
bte_base_addr
);
bte
->
idealTransferTimeoutReached
++
;
bte
->
idealTransferTimeout
=
jiffies
+
...
...
include/asm-ia64/tlb.h
View file @
ac6e91af
...
...
@@ -53,9 +53,10 @@
typedef
struct
{
struct
mm_struct
*
mm
;
unsigned
int
nr
;
/* == ~0U => fast mode */
unsigned
int
fullmm
;
/* non-zero means full mm flush */
unsigned
long
freed
;
/* number of pages freed */
unsigned
int
nr
;
/* == ~0U => fast mode */
unsigned
char
fullmm
;
/* non-zero means full mm flush */
unsigned
char
need_flush
;
/* really unmapped some PTEs? */
unsigned
long
freed
;
/* number of pages freed */
unsigned
long
start_addr
;
unsigned
long
end_addr
;
struct
page
*
pages
[
FREE_PTE_NR
];
...
...
@@ -73,6 +74,10 @@ ia64_tlb_flush_mmu (mmu_gather_t *tlb, unsigned long start, unsigned long end)
{
unsigned
int
nr
;
if
(
!
tlb
->
need_flush
)
return
;
tlb
->
need_flush
=
0
;
if
(
tlb
->
fullmm
)
{
/*
* Tearing down the entire address space. This happens both as a result
...
...
@@ -167,18 +172,6 @@ tlb_finish_mmu (mmu_gather_t *tlb, unsigned long start, unsigned long end)
check_pgt_cache
();
}
/*
* Remove TLB entry for PTE mapped at virtual address ADDRESS. This is called for any
* PTE, not just those pointing to (normal) physical memory.
*/
static
inline
void
__tlb_remove_tlb_entry
(
mmu_gather_t
*
tlb
,
pte_t
*
ptep
,
unsigned
long
address
)
{
if
(
tlb
->
start_addr
==
~
0UL
)
tlb
->
start_addr
=
address
;
tlb
->
end_addr
=
address
+
PAGE_SIZE
;
}
/*
* Logically, this routine frees PAGE. On MP machines, the actual freeing of the page
* must be delayed until after the TLB has been flushed (see comments at the beginning of
...
...
@@ -187,6 +180,8 @@ __tlb_remove_tlb_entry (mmu_gather_t *tlb, pte_t *ptep, unsigned long address)
static
inline
void
tlb_remove_page
(
mmu_gather_t
*
tlb
,
struct
page
*
page
)
{
tlb
->
need_flush
=
1
;
if
(
tlb_fast_mode
(
tlb
))
{
free_page_and_swap_cache
(
page
);
return
;
...
...
@@ -196,11 +191,37 @@ tlb_remove_page (mmu_gather_t *tlb, struct page *page)
ia64_tlb_flush_mmu
(
tlb
,
tlb
->
start_addr
,
tlb
->
end_addr
);
}
/*
* Remove TLB entry for PTE mapped at virtual address ADDRESS. This is called for any
* PTE, not just those pointing to (normal) physical memory.
*/
static
inline
void
__tlb_remove_tlb_entry
(
mmu_gather_t
*
tlb
,
pte_t
*
ptep
,
unsigned
long
address
)
{
if
(
tlb
->
start_addr
==
~
0UL
)
tlb
->
start_addr
=
address
;
tlb
->
end_addr
=
address
+
PAGE_SIZE
;
}
#define tlb_start_vma(tlb, vma) do { } while (0)
#define tlb_end_vma(tlb, vma) do { } while (0)
#define tlb_remove_tlb_entry(tlb, ptep, addr) __tlb_remove_tlb_entry(tlb, ptep, addr)
#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep)
#define pmd_free_tlb(tlb, ptep) __pmd_free_tlb(tlb, ptep)
#define tlb_remove_tlb_entry(tlb, ptep, addr) \
do { \
tlb->need_flush = 1; \
__tlb_remove_tlb_entry(tlb, ptep, addr); \
} while (0)
#define pte_free_tlb(tlb, ptep) \
do { \
tlb->need_flush = 1; \
__pte_free_tlb(tlb, ptep); \
} while (0)
#define pmd_free_tlb(tlb, ptep) \
do { \
tlb->need_flush = 1; \
__pmd_free_tlb(tlb, ptep); \
} while (0)
#endif
/* _ASM_IA64_TLB_H */
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