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
69aeca90
Commit
69aeca90
authored
May 09, 2004
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
3dc567d8
84725a0e
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
341 additions
and
316 deletions
+341
-316
arch/ia64/hp/sim/boot/boot_head.S
arch/ia64/hp/sim/boot/boot_head.S
+7
-7
arch/ia64/kernel/efi.c
arch/ia64/kernel/efi.c
+20
-7
arch/ia64/kernel/fsys.S
arch/ia64/kernel/fsys.S
+4
-0
arch/ia64/kernel/head.S
arch/ia64/kernel/head.S
+2
-1
arch/ia64/kernel/ivt.S
arch/ia64/kernel/ivt.S
+35
-0
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+154
-131
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/smp.c
arch/ia64/kernel/smp.c
+0
-1
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+3
-5
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/sn2/ml_SN_intr.c
arch/ia64/sn/io/sn2/ml_SN_intr.c
+21
-5
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
+2
-1
include/asm-ia64/asmmacro.h
include/asm-ia64/asmmacro.h
+8
-0
include/asm-ia64/gcc_intrin.h
include/asm-ia64/gcc_intrin.h
+8
-1
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
+1
-1
include/asm-ia64/sn/nodepda.h
include/asm-ia64/sn/nodepda.h
+0
-7
include/asm-ia64/system.h
include/asm-ia64/system.h
+9
-3
No files found.
arch/ia64/hp/sim/boot/boot_head.S
View file @
69aeca90
...
...
@@ -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/kernel/efi.c
View file @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -574,6 +574,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 @
69aeca90
...
...
@@ -818,7 +818,8 @@ END(ia64_delay_loop)
GLOBAL_ENTRY
(
start_kernel_thread
)
.
prologue
.
save
rp
,
r0
//
this
is
the
end
of
the
call
-
chain
.
save
rp
,
r4
//
this
is
the
end
of
the
call
-
chain
mov
r4
=
r0
.
body
alloc
r2
=
ar
.
pfs
,
0
,
0
,
2
,
0
mov
out0
=
r9
...
...
arch/ia64/kernel/ivt.S
View file @
69aeca90
...
...
@@ -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/perfmon.c
View file @
69aeca90
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/perfmon_generic.h
View file @
69aeca90
...
...
@@ -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 @
3dc567d8
/*
* 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 @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -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/smp.c
View file @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -293,11 +293,6 @@ smp_callin (void)
*/
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
...
...
@@ -338,6 +333,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/mm/init.c
View file @
69aeca90
...
...
@@ -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 @
69aeca90
.
serialize.data
.
serialize.instruction
arch/ia64/scripts/toolchain-flags
View file @
69aeca90
...
...
@@ -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/sn2/ml_SN_intr.c
View file @
69aeca90
...
...
@@ -36,6 +36,25 @@ extern irqpda_t *irqpdaindr;
extern
cnodeid_t
master_node_get
(
vertex_hdl_t
vhdl
);
extern
nasid_t
master_nasid
;
cpuid_t
sn_get_node_first_cpu
(
cnodeid_t
cnode
)
{
int
cpuid
=
-
1
,
slice
;
for
(
slice
=
CPUS_PER_NODE
-
1
;
slice
>=
0
;
slice
--
)
{
cpuid
=
cnode_slice_to_cpuid
(
cnode
,
slice
);
if
(
cpuid
==
NR_CPUS
)
continue
;
if
(
!
cpu_online
(
cpuid
))
continue
;
break
;
}
if
(
slice
<
0
)
{
return
CPU_NONE
;
}
return
cpuid
;
}
/* Initialize some shub registers for interrupts, both IO and error. */
void
intr_init_vecblk
(
cnodeid_t
node
)
{
...
...
@@ -43,7 +62,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 +78,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
=
sn_get_node_first_cpu
(
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
=
sn_get_node_first_cpu
(
node
);
cpu
=
cpu_physical_id
(
cpu
);
}
...
...
arch/ia64/sn/kernel/setup.c
View file @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -500,9 +500,10 @@ sn_sal_connect_interrupt(void)
nasid_t
console_nasid
;
unsigned
int
console_irq
;
int
result
;
extern
cpuid_t
sn_get_node_first_cpu
(
cnodeid_t
cnode
);
console_nasid
=
ia64_sn_get_console_nasid
();
intr_cpuid
=
NODEPDA
(
NASID_TO_COMPACT_NODEID
(
console_nasid
))
->
node_first_cpu
;
intr_cpuid
=
sn_get_node_first_cpu
(
NASID_TO_COMPACT_NODEID
(
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 @
69aeca90
...
...
@@ -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/gcc_intrin.h
View file @
69aeca90
...
...
@@ -377,9 +377,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 @
69aeca90
...
...
@@ -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 @
69aeca90
...
...
@@ -20,7 +20,7 @@ typedef u64 hubreg_t;
typedef
u64
mmr_t
;
typedef
u64
nic_t
;
#define CNODE_TO_CPU_BASE(_cnode) (
NODEPDA(_cnode)->node_first_cpu
)
#define CNODE_TO_CPU_BASE(_cnode) (
sn_get_node_first_cpu(_cnode)
)
#define NASID_TO_COMPACT_NODEID(nasid) (nasid_to_cnodeid(nasid))
#define COMPACT_TO_NASID_NODEID(cnode) (cnodeid_to_nasid(cnode))
...
...
include/asm-ia64/sn/nodepda.h
View file @
69aeca90
...
...
@@ -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/system.h
View file @
69aeca90
...
...
@@ -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() \
({ \
...
...
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