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
a52ccf00
Commit
a52ccf00
authored
Jul 16, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/to-linus-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
18a65429
900e7bd2
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
256 additions
and
61 deletions
+256
-61
arch/ia64/Makefile
arch/ia64/Makefile
+1
-2
arch/ia64/kernel/acpi.c
arch/ia64/kernel/acpi.c
+1
-1
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+32
-3
arch/ia64/kernel/fsys.S
arch/ia64/kernel/fsys.S
+2
-2
arch/ia64/kernel/ia64_ksyms.c
arch/ia64/kernel/ia64_ksyms.c
+2
-1
arch/ia64/kernel/init_task.c
arch/ia64/kernel/init_task.c
+2
-2
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+1
-0
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+1
-1
arch/ia64/kernel/ptrace.c
arch/ia64/kernel/ptrace.c
+1
-1
arch/ia64/kernel/setup.c
arch/ia64/kernel/setup.c
+8
-6
arch/ia64/kernel/smp.c
arch/ia64/kernel/smp.c
+2
-2
arch/ia64/kernel/time.c
arch/ia64/kernel/time.c
+1
-2
arch/ia64/pci/pci.c
arch/ia64/pci/pci.c
+6
-6
arch/ia64/scripts/check-model.c
arch/ia64/scripts/check-model.c
+1
-0
arch/ia64/scripts/toolchain-flags
arch/ia64/scripts/toolchain-flags
+9
-1
include/asm-ia64/atomic.h
include/asm-ia64/atomic.h
+75
-2
include/asm-ia64/elf.h
include/asm-ia64/elf.h
+5
-5
include/asm-ia64/local.h
include/asm-ia64/local.h
+50
-0
include/asm-ia64/mmu_context.h
include/asm-ia64/mmu_context.h
+2
-2
include/asm-ia64/percpu.h
include/asm-ia64/percpu.h
+47
-17
include/asm-ia64/processor.h
include/asm-ia64/processor.h
+4
-2
include/asm-ia64/system.h
include/asm-ia64/system.h
+2
-2
include/asm-ia64/tlb.h
include/asm-ia64/tlb.h
+1
-1
No files found.
arch/ia64/Makefile
View file @
a52ccf00
...
...
@@ -66,8 +66,7 @@ core-$(CONFIG_IA64_SGI_SN2) += arch/ia64/sn/
drivers-$(CONFIG_PCI)
+=
arch
/ia64/pci/
drivers-$(CONFIG_IA64_HP_SIM)
+=
arch
/ia64/hp/sim/
drivers-$(CONFIG_IA64_HP_ZX1)
+=
arch
/ia64/hp/common/
arch
/ia64/hp/zx1/
drivers-$(CONFIG_IA64_GENERIC)
+=
arch
/ia64/hp/common/
arch
/ia64/hp/zx1/
arch
/ia64/hp/sim/
\
arch
/ia64/sn/
drivers-$(CONFIG_IA64_GENERIC)
+=
arch
/ia64/hp/common/
arch
/ia64/hp/zx1/
arch
/ia64/hp/sim/
boot
:=
arch
/ia64/boot
...
...
arch/ia64/kernel/acpi.c
View file @
a52ccf00
...
...
@@ -720,7 +720,7 @@ acpi_register_irq (u32 gsi, u32 polarity, u32 trigger)
{
int
vector
=
0
;
if
(
acpi_madt
->
flags
.
pcat_compat
&&
(
gsi
<
16
))
if
(
has_8259
&&
(
gsi
<
16
))
return
isa_irq_to_vector
(
gsi
);
if
(
!
iosapic_register_intr
)
...
...
arch/ia64/kernel/entry.S
View file @
a52ccf00
...
...
@@ -61,7 +61,17 @@ ENTRY(ia64_execve)
mov
out2
=
in2
//
envp
add
out3
=
16
,
sp
//
regs
br.call.sptk.many
rp
=
sys_execve
.
ret0
:
cmp4.ge
p6
,
p7
=
r8
,
r0
.
ret0
:
#ifdef CONFIG_IA32_SUPPORT
/
*
*
Check
if
we
're returning to ia32 mode. If so, we need to restore ia32 registers
*
from
pt_regs
.
*/
adds
r16
=
PT
(
CR_IPSR
)+
16
,
sp
;;
ld8
r16
=[
r16
]
#endif
cmp4.ge
p6
,
p7
=
r8
,
r0
mov
ar
.
pfs
=
loc1
//
restore
ar
.
pfs
sxt4
r8
=
r8
//
return
64
-
bit
result
;;
...
...
@@ -89,6 +99,12 @@ ENTRY(ia64_execve)
ldf.fill
f23
=[
sp
]
; ldf.fill f24=[sp]; mov f25=f0
ldf.fill
f26
=[
sp
]
; ldf.fill f27=[sp]; mov f28=f0
ldf.fill
f29
=[
sp
]
; ldf.fill f30=[sp]; mov f31=f0
#ifdef CONFIG_IA32_SUPPORT
tbit.nz
p6
,
p0
=
r16
,
IA64_PSR_IS_BIT
movl
loc0
=
ia64_ret_from_ia32_execve
;;
(
p6
)
mov
rp
=
loc0
#endif
br.ret.sptk.many
rp
END
(
ia64_execve
)
...
...
@@ -688,7 +704,7 @@ GLOBAL_ENTRY(ia64_leave_syscall)
mov
b7
=
r0
//
clear
b7
;;
(
pUStk
)
st1
[
r14
]=
r3
movl
r17
=
THIS_CPU
(
ia64_phys_stacked_size_p8
)
addl
r17
=
THIS_CPU
(
ia64_phys_stacked_size_p8
),
r0
;;
mov
r16
=
ar
.
bsp
//
get
existing
backing
store
pointer
srlz.i
//
ensure
interruption
collection
is
off
...
...
@@ -701,6 +717,19 @@ GLOBAL_ENTRY(ia64_leave_syscall)
br.cond.sptk.many
rbs_switch
END
(
ia64_leave_syscall
)
#ifdef CONFIG_IA32_SUPPORT
GLOBAL_ENTRY
(
ia64_ret_from_ia32_execve
)
PT_REGS_UNWIND_INFO
(0)
adds
r2
=
PT
(
R8
)+
16
,
sp
//
r2
=
&
pt_regs
.
r8
adds
r3
=
PT
(
R10
)+
16
,
sp
//
r3
=
&
pt_regs
.
r10
;;
.
mem.offset
0
,
0
st8.spill
[
r2
]=
r8
//
store
return
value
in
slot
for
r8
and
set
unat
bit
.
mem.offset
8
,
0
st8.spill
[
r3
]=
r0
//
clear
error
indication
in
slot
for
r10
and
set
unat
bit
END
(
ia64_ret_from_ia32_execve_syscall
)
//
fall
through
#endif /* CONFIG_IA32_SUPPORT */
GLOBAL_ENTRY
(
ia64_leave_kernel
)
PT_REGS_UNWIND_INFO
(0)
/
*
...
...
@@ -841,7 +870,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
shr.u
r18
=
r19
,
16
//
get
byte
size
of
existing
"dirty"
partition
;;
mov
r16
=
ar
.
bsp
//
get
existing
backing
store
pointer
movl
r17
=
THIS_CPU
(
ia64_phys_stacked_size_p8
)
addl
r17
=
THIS_CPU
(
ia64_phys_stacked_size_p8
),
r0
;;
ld4
r17
=[
r17
]
//
r17
=
cpu_data
->
phys_stacked_size_p8
(
pKStk
)
br.cond.dpnt
skip_rbs_switch
...
...
arch/ia64/kernel/fsys.S
View file @
a52ccf00
...
...
@@ -165,7 +165,7 @@ ENTRY(fsys_gettimeofday)
.
altrp
b6
.
body
add
r9
=
TI_FLAGS
+
IA64_TASK_SIZE
,
r16
movl
r3
=
THIS_CPU
(
cpu_info
)
addl
r3
=
THIS_CPU
(
cpu_info
),
r0
mov.m
r31
=
ar
.
itc
//
put
time
stamp
into
r31
(
ITC
)
==
now
(
35
cyc
)
#ifdef CONFIG_SMP
...
...
@@ -177,7 +177,7 @@ ENTRY(fsys_gettimeofday)
movl
r19
=
xtime
//
xtime
is
a
timespec
struct
ld8
r10
=[
r10
]
//
r10
<-
__per_cpu_offset
[
0
]
movl
r21
=
THIS_CPU
(
cpu_info
)
addl
r21
=
THIS_CPU
(
cpu_info
),
r0
;;
add
r10
=
r21
,
r10
//
r10
<-
&c
pu_data
(
time_keeper_id
)
tbit.nz
p8
,
p0
=
r2
,
IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT
...
...
arch/ia64/kernel/ia64_ksyms.c
View file @
a52ccf00
...
...
@@ -64,9 +64,10 @@ EXPORT_SYMBOL(ia64_pfn_valid);
#endif
#include <asm/processor.h>
EXPORT_SYMBOL
(
cpu_info__per_cpu
);
EXPORT_SYMBOL
(
per_cpu__cpu_info
);
#ifdef CONFIG_SMP
EXPORT_SYMBOL
(
__per_cpu_offset
);
EXPORT_SYMBOL
(
per_cpu__local_per_cpu_offset
);
#endif
EXPORT_SYMBOL
(
kernel_thread
);
...
...
arch/ia64/kernel/init_task.c
View file @
a52ccf00
...
...
@@ -2,7 +2,7 @@
* This is where we statically allocate and initialize the initial
* task.
*
* Copyright (C) 1999, 2002 Hewlett-Packard Co
* Copyright (C) 1999, 2002
-2003
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
...
...
@@ -34,7 +34,7 @@ static union {
struct
thread_info
thread_info
;
}
s
;
unsigned
long
stack
[
KERNEL_STACK_SIZE
/
sizeof
(
unsigned
long
)];
}
init_task_mem
__attribute__
((
section
(
".data.init_task"
)))
=
{{
}
init_task_mem
asm
(
"init_task_mem"
)
__attribute__
((
section
(
".data.init_task"
)))
=
{{
.
task
=
INIT_TASK
(
init_task_mem
.
s
.
task
),
.
thread_info
=
INIT_THREAD_INFO
(
init_task_mem
.
s
.
task
)
}};
...
...
arch/ia64/kernel/iosapic.c
View file @
a52ccf00
...
...
@@ -717,6 +717,7 @@ iosapic_parse_prt (void)
register_intr
(
gsi
,
vector
,
IOSAPIC_LOWEST_PRIORITY
,
IOSAPIC_POL_LOW
,
IOSAPIC_LEVEL
);
}
entry
->
irq
=
vector
;
snprintf
(
pci_id
,
sizeof
(
pci_id
),
"%02x:%02x:%02x[%c]"
,
entry
->
id
.
segment
,
entry
->
id
.
bus
,
entry
->
id
.
device
,
'A'
+
entry
->
pin
);
...
...
arch/ia64/kernel/perfmon.c
View file @
a52ccf00
...
...
@@ -566,7 +566,7 @@ static struct vm_operations_struct pfm_vm_ops={
#define pfm_wait_task_inactive(t) wait_task_inactive(t)
#define pfm_get_cpu_var(v) __
get
_cpu_var(v)
#define pfm_get_cpu_var(v) __
ia64_per
_cpu_var(v)
#define pfm_get_cpu_data(a,b) per_cpu(a, b)
typedef
irqreturn_t
pfm_irq_handler_t
;
#define PFM_IRQ_HANDLER_RET(v) do { \
...
...
arch/ia64/kernel/ptrace.c
View file @
a52ccf00
...
...
@@ -42,7 +42,7 @@
(IA64_PSR_UM | IA64_PSR_DB | IA64_PSR_IS | IA64_PSR_ID | IA64_PSR_DD | IA64_PSR_RI)
#define IPSR_READ_MASK IPSR_WRITE_MASK
#define PTRACE_DEBUG
1
#define PTRACE_DEBUG
0
#if PTRACE_DEBUG
# define dprintk(format...) printk(format)
...
...
arch/ia64/kernel/setup.c
View file @
a52ccf00
...
...
@@ -56,6 +56,7 @@ unsigned long __per_cpu_offset[NR_CPUS];
#endif
DEFINE_PER_CPU
(
struct
cpuinfo_ia64
,
cpu_info
);
DEFINE_PER_CPU
(
unsigned
long
,
local_per_cpu_offset
);
DEFINE_PER_CPU
(
unsigned
long
,
ia64_phys_stacked_size_p8
);
unsigned
long
ia64_cycles_per_usec
;
struct
ia64_boot_param
*
ia64_boot_param
;
...
...
@@ -709,6 +710,8 @@ cpu_init (void)
memcpy
(
cpu_data
,
__phys_per_cpu_start
,
__per_cpu_end
-
__per_cpu_start
);
__per_cpu_offset
[
cpu
]
=
(
char
*
)
cpu_data
-
__per_cpu_start
;
cpu_data
+=
PERCPU_PAGE_SIZE
;
per_cpu
(
local_per_cpu_offset
,
cpu
)
=
__per_cpu_offset
[
cpu
];
}
}
cpu_data
=
__per_cpu_start
+
__per_cpu_offset
[
smp_processor_id
()];
...
...
@@ -716,19 +719,18 @@ cpu_init (void)
cpu_data
=
__phys_per_cpu_start
;
#endif
/* !CONFIG_SMP */
cpu_info
=
cpu_data
+
((
char
*
)
&
__get_cpu_var
(
cpu_info
)
-
__per_cpu_start
);
#ifdef CONFIG_NUMA
cpu_info
->
node_data
=
get_node_data_ptr
();
#endif
get_max_cacheline_size
();
/*
* We can't pass "local_cpu_data" to identify_cpu() because we haven't called
* ia64_mmu_init() yet. And we can't call ia64_mmu_init() first because it
* depends on the data returned by identify_cpu(). We break the dependency by
* accessing cpu_data() th
e old way, through identity mapped space
.
* accessing cpu_data() th
rough the canonical per-CPU address
.
*/
cpu_info
=
cpu_data
+
((
char
*
)
&
__ia64_per_cpu_var
(
cpu_info
)
-
__per_cpu_start
);
#ifdef CONFIG_NUMA
cpu_info
->
node_data
=
get_node_data_ptr
();
#endif
identify_cpu
(
cpu_info
);
#ifdef CONFIG_MCKINLEY
...
...
arch/ia64/kernel/smp.c
View file @
a52ccf00
...
...
@@ -72,7 +72,7 @@ static volatile struct call_data_struct *call_data;
#define IPI_CPU_STOP 1
/* This needs to be cacheline aligned because it is written to by *other* CPUs. */
static
DEFINE_PER_CPU
(
__
u64
,
ipi_operation
)
____cacheline_aligned
;
static
DEFINE_PER_CPU
(
u64
,
ipi_operation
)
____cacheline_aligned
;
static
void
stop_this_cpu
(
void
)
...
...
@@ -91,7 +91,7 @@ irqreturn_t
handle_IPI
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
int
this_cpu
=
get_cpu
();
unsigned
long
*
pending_ipis
=
&
__
get
_cpu_var
(
ipi_operation
);
unsigned
long
*
pending_ipis
=
&
__
ia64_per
_cpu_var
(
ipi_operation
);
unsigned
long
ops
;
/* Count this now; we may make a call that never returns. */
...
...
arch/ia64/kernel/time.c
View file @
a52ccf00
...
...
@@ -83,12 +83,11 @@ unsigned long
itc_get_offset
(
void
)
{
unsigned
long
elapsed_cycles
,
lost
=
jiffies
-
wall_jiffies
;
unsigned
long
now
,
last_tick
;
unsigned
long
now
=
ia64_get_itc
()
,
last_tick
;
last_tick
=
(
cpu_data
(
TIME_KEEPER_ID
)
->
itm_next
-
(
lost
+
1
)
*
cpu_data
(
TIME_KEEPER_ID
)
->
itm_delta
);
now
=
ia64_get_itc
();
if
(
unlikely
((
long
)
(
now
-
last_tick
)
<
0
))
{
printk
(
KERN_ERR
"CPU %d: now < last_tick (now=0x%lx,last_tick=0x%lx)!
\n
"
,
smp_processor_id
(),
now
,
last_tick
);
...
...
arch/ia64/pci/pci.c
View file @
a52ccf00
...
...
@@ -124,7 +124,7 @@ subsys_initcall(pci_acpi_init);
/* Called by ACPI when it finds a new root bus. */
static
struct
pci_controller
*
static
struct
pci_controller
*
__devinit
alloc_pci_controller
(
int
seg
)
{
struct
pci_controller
*
controller
;
...
...
@@ -138,7 +138,7 @@ alloc_pci_controller (int seg)
return
controller
;
}
static
int
static
int
__devinit
alloc_resource
(
char
*
name
,
struct
resource
*
root
,
unsigned
long
start
,
unsigned
long
end
,
unsigned
long
flags
)
{
struct
resource
*
res
;
...
...
@@ -159,7 +159,7 @@ alloc_resource (char *name, struct resource *root, unsigned long start, unsigned
return
0
;
}
static
u64
static
u64
__devinit
add_io_space
(
struct
acpi_resource_address64
*
addr
)
{
u64
offset
;
...
...
@@ -190,7 +190,7 @@ add_io_space (struct acpi_resource_address64 *addr)
return
IO_SPACE_BASE
(
i
);
}
static
acpi_status
static
acpi_status
__devinit
count_window
(
struct
acpi_resource
*
resource
,
void
*
data
)
{
unsigned
int
*
windows
=
(
unsigned
int
*
)
data
;
...
...
@@ -211,7 +211,7 @@ struct pci_root_info {
char
*
name
;
};
static
acpi_status
static
acpi_status
__devinit
add_window
(
struct
acpi_resource
*
res
,
void
*
data
)
{
struct
pci_root_info
*
info
=
(
struct
pci_root_info
*
)
data
;
...
...
@@ -252,7 +252,7 @@ add_window (struct acpi_resource *res, void *data)
return
AE_OK
;
}
struct
pci_bus
*
struct
pci_bus
*
__devinit
pci_acpi_scan_root
(
struct
acpi_device
*
device
,
int
domain
,
int
bus
)
{
struct
pci_root_info
info
;
...
...
arch/ia64/scripts/check-model.c
0 → 100644
View file @
a52ccf00
int
__attribute__
((
__model__
(
__small__
)))
x
;
arch/ia64/scripts/toolchain-flags
View file @
a52ccf00
...
...
@@ -2,6 +2,7 @@
#
# Check whether linker can handle cross-segment @segrel():
#
CPPFLAGS
=
""
CC
=
$1
OBJDUMP
=
$2
dir
=
$(
dirname
$0
)
...
...
@@ -11,10 +12,17 @@ $CC -nostdlib -static -Wl,-T$dir/check-segrel.lds $dir/check-segrel.S -o $out
res
=
$(
$OBJDUMP
--full
--section
.rodata
$out
| fgrep 000 |
cut
-f3
-d
' '
)
rm
-f
$out
if
[
$res
!=
00000a00
]
;
then
echo
"
-DHAVE_BUGGY_SEGREL"
CPPFLAGS
=
"
$CPPFLAGS
-DHAVE_BUGGY_SEGREL"
cat
>
&2
<<
EOF
warning: your linker cannot handle cross-segment segment-relative relocations.
please upgrade to a newer version (it is safe to use this linker, but
the kernel will be bigger than strictly necessary).
EOF
fi
if
!
$CC
-c
$dir
/check-model.c
-o
$out
|
grep
-q
'attribute directive ignored'
then
CPPFLAGS
=
"
$CPPFLAGS
-DHAVE_MODEL_SMALL_ATTRIBUTE"
fi
rm
-f
$out
echo
$CPPFLAGS
include/asm-ia64/atomic.h
View file @
a52ccf00
...
...
@@ -9,7 +9,7 @@
* "int" types were carefully placed so as to ensure proper operation
* of the macros.
*
* Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
* Copyright (C) 1998, 1999, 2002
-2003
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <linux/types.h>
...
...
@@ -21,11 +21,16 @@
* memory accesses are ordered.
*/
typedef
struct
{
volatile
__s32
counter
;
}
atomic_t
;
typedef
struct
{
volatile
__s64
counter
;
}
atomic64_t
;
#define ATOMIC_INIT(i) ((atomic_t) { (i) })
#define ATOMIC64_INIT(i) ((atomic64_t) { (i) })
#define atomic_read(v) ((v)->counter)
#define atomic64_read(v) ((v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
#define atomic64_set(v,i) (((v)->counter) = (i))
static
__inline__
int
ia64_atomic_add
(
int
i
,
atomic_t
*
v
)
...
...
@@ -37,7 +42,21 @@ ia64_atomic_add (int i, atomic_t *v)
CMPXCHG_BUGCHECK
(
v
);
old
=
atomic_read
(
v
);
new
=
old
+
i
;
}
while
(
ia64_cmpxchg
(
"acq"
,
v
,
old
,
old
+
i
,
sizeof
(
atomic_t
))
!=
old
);
}
while
(
ia64_cmpxchg
(
"acq"
,
v
,
old
,
new
,
sizeof
(
atomic_t
))
!=
old
);
return
new
;
}
static
__inline__
int
ia64_atomic64_add
(
int
i
,
atomic64_t
*
v
)
{
__s64
old
,
new
;
CMPXCHG_BUGCHECK_DECL
do
{
CMPXCHG_BUGCHECK
(
v
);
old
=
atomic_read
(
v
);
new
=
old
+
i
;
}
while
(
ia64_cmpxchg
(
"acq"
,
v
,
old
,
new
,
sizeof
(
atomic_t
))
!=
old
);
return
new
;
}
...
...
@@ -55,6 +74,20 @@ ia64_atomic_sub (int i, atomic_t *v)
return
new
;
}
static
__inline__
int
ia64_atomic64_sub
(
int
i
,
atomic64_t
*
v
)
{
__s64
old
,
new
;
CMPXCHG_BUGCHECK_DECL
do
{
CMPXCHG_BUGCHECK
(
v
);
old
=
atomic_read
(
v
);
new
=
old
-
i
;
}
while
(
ia64_cmpxchg
(
"acq"
,
v
,
old
,
new
,
sizeof
(
atomic_t
))
!=
old
);
return
new
;
}
#define atomic_add_return(i,v) \
({ \
int __ia64_aar_i = (i); \
...
...
@@ -67,6 +100,18 @@ ia64_atomic_sub (int i, atomic_t *v)
: ia64_atomic_add(__ia64_aar_i, v); \
})
#define atomic64_add_return(i,v) \
({ \
long __ia64_aar_i = (i); \
(__builtin_constant_p(i) \
&& ( (__ia64_aar_i == 1) || (__ia64_aar_i == 4) \
|| (__ia64_aar_i == 8) || (__ia64_aar_i == 16) \
|| (__ia64_aar_i == -1) || (__ia64_aar_i == -4) \
|| (__ia64_aar_i == -8) || (__ia64_aar_i == -16))) \
? ia64_fetch_and_add(__ia64_aar_i, &(v)->counter) \
: ia64_atomic64_add(__ia64_aar_i, v); \
})
/*
* Atomically add I to V and return TRUE if the resulting value is
* negative.
...
...
@@ -77,6 +122,12 @@ atomic_add_negative (int i, atomic_t *v)
return
atomic_add_return
(
i
,
v
)
<
0
;
}
static
__inline__
int
atomic64_add_negative
(
int
i
,
atomic64_t
*
v
)
{
return
atomic64_add_return
(
i
,
v
)
<
0
;
}
#define atomic_sub_return(i,v) \
({ \
int __ia64_asr_i = (i); \
...
...
@@ -89,18 +140,40 @@ atomic_add_negative (int i, atomic_t *v)
: ia64_atomic_sub(__ia64_asr_i, v); \
})
#define atomic64_sub_return(i,v) \
({ \
long __ia64_asr_i = (i); \
(__builtin_constant_p(i) \
&& ( (__ia64_asr_i == 1) || (__ia64_asr_i == 4) \
|| (__ia64_asr_i == 8) || (__ia64_asr_i == 16) \
|| (__ia64_asr_i == -1) || (__ia64_asr_i == -4) \
|| (__ia64_asr_i == -8) || (__ia64_asr_i == -16))) \
? ia64_fetch_and_add(-__ia64_asr_i, &(v)->counter) \
: ia64_atomic64_sub(__ia64_asr_i, v); \
})
#define atomic_dec_return(v) atomic_sub_return(1, (v))
#define atomic_inc_return(v) atomic_add_return(1, (v))
#define atomic64_dec_return(v) atomic64_sub_return(1, (v))
#define atomic64_inc_return(v) atomic64_add_return(1, (v))
#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) != 0)
#define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
#define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
#define atomic64_inc_and_test(v) (atomic64_add_return(1, (v)) != 0)
#define atomic_add(i,v) atomic_add_return((i), (v))
#define atomic_sub(i,v) atomic_sub_return((i), (v))
#define atomic_inc(v) atomic_add(1, (v))
#define atomic_dec(v) atomic_sub(1, (v))
#define atomic64_add(i,v) atomic64_add_return((i), (v))
#define atomic64_sub(i,v) atomic64_sub_return((i), (v))
#define atomic64_inc(v) atomic64_add(1, (v))
#define atomic64_dec(v) atomic64_sub(1, (v))
/* Atomic operations are already serializing */
#define smp_mb__before_atomic_dec() barrier()
#define smp_mb__after_atomic_dec() barrier()
...
...
include/asm-ia64/elf.h
View file @
a52ccf00
...
...
@@ -199,11 +199,11 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *);
#define GATE_EHDR ((const struct elfhdr *) GATE_ADDR)
#define ARCH_DLINFO \
do { \
extern char __kernel_syscall_via_epc[]; \
NEW_AUX_ENT(AT_SYSINFO,
__kernel_syscall_via_epc);
\
NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \
#define ARCH_DLINFO
\
do {
\
extern char __kernel_syscall_via_epc[];
\
NEW_AUX_ENT(AT_SYSINFO,
(unsigned long) __kernel_syscall_via_epc);
\
NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR);
\
} while (0)
/*
...
...
include/asm-ia64/local.h
0 → 100644
View file @
a52ccf00
#ifndef _ASM_IA64_LOCAL_H
#define _ASM_IA64_LOCAL_H
/*
* Copyright (C) 2003 Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <linux/percpu.h>
typedef
struct
{
atomic64_t
val
;
}
local_t
;
#define LOCAL_INIT(i) ((local_t) { { (i) } })
#define local_read(l) atomic64_read(&(l)->val)
#define local_set(l, i) atomic64_set(&(l)->val, i)
#define local_inc(l) atomic64_inc(&(l)->val)
#define local_dec(l) atomic64_dec(&(l)->val)
#define local_add(l) atomic64_add(&(l)->val)
#define local_sub(l) atomic64_sub(&(l)->val)
/* Non-atomic variants, i.e., preemption disabled and won't be touched in interrupt, etc. */
#define __local_inc(l) (++(l)->val.counter)
#define __local_dec(l) (--(l)->val.counter)
#define __local_add(i,l) ((l)->val.counter += (i))
#define __local_sub(i,l) ((l)->val.counter -= (i))
/*
* Use these for per-cpu local_t variables. Note they take a variable (eg. mystruct.foo),
* not an address.
*/
#define cpu_local_read(v) local_read(&__ia64_per_cpu_var(v))
#define cpu_local_set(v, i) local_set(&__ia64_per_cpu_var(v), (i))
#define cpu_local_inc(v) local_inc(&__ia64_per_cpu_var(v))
#define cpu_local_dec(v) local_dec(&__ia64_per_cpu_var(v))
#define cpu_local_add(i, v) local_add((i), &__ia64_per_cpu_var(v))
#define cpu_local_sub(i, v) local_sub((i), &__ia64_per_cpu_var(v))
/*
* Non-atomic increments, i.e., preemption disabled and won't be touched in interrupt,
* etc.
*/
#define __cpu_local_inc(v) __local_inc(&__ia64_per_cpu_var(v))
#define __cpu_local_dec(v) __local_dec(&__ia64_per_cpu_var(v))
#define __cpu_local_add(i, v) __local_add((i), &__ia64_per_cpu_var(v))
#define __cpu_local_sub(i, v) __local_sub((i), &__ia64_per_cpu_var(v))
#endif
/* _ASM_IA64_LOCAL_H */
include/asm-ia64/mmu_context.h
View file @
a52ccf00
...
...
@@ -86,9 +86,9 @@ delayed_tlb_flush (void)
{
extern
void
local_flush_tlb_all
(
void
);
if
(
unlikely
(
__
get
_cpu_var
(
ia64_need_tlb_flush
)))
{
if
(
unlikely
(
__
ia64_per
_cpu_var
(
ia64_need_tlb_flush
)))
{
local_flush_tlb_all
();
__
get
_cpu_var
(
ia64_need_tlb_flush
)
=
0
;
__
ia64_per
_cpu_var
(
ia64_need_tlb_flush
)
=
0
;
}
}
...
...
include/asm-ia64/percpu.h
View file @
a52ccf00
#ifndef _ASM_IA64_PERCPU_H
#define _ASM_IA64_PERCPU_H
#include <linux/config.h>
#include <linux/compiler.h>
/*
* Copyright (C) 2002-2003 Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
#define PERCPU_ENOUGH_ROOM PERCPU_PAGE_SIZE
#ifdef __ASSEMBLY__
#define THIS_CPU(var) (var##__per_cpu)
/* use this to mark accesses to per-CPU variables... */
# define THIS_CPU(var) (per_cpu__##var)
/* use this to mark accesses to per-CPU variables... */
#else
/* !__ASSEMBLY__ */
#include <linux/config.h>
#include <linux/threads.h>
extern
unsigned
long
__per_cpu_offset
[
NR_CPUS
];
#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
# define __SMALL_ADDR_AREA __attribute__((__model__ (__small__)))
#else
# define __SMALL_ADDR_AREA
#endif
#define DEFINE_PER_CPU(type, name) \
__attribute__((__section__(".data.percpu"))) __typeof__(type) name##__per_cpu
#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
#define DECLARE_PER_CPU(type, name) \
extern __SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
#define __get_cpu_var(var) (var##__per_cpu)
/* Separate out the type, so (int[3], foo) works. */
#define DEFINE_PER_CPU(type, name) \
__attribute__((__section__(".data.percpu"))) \
__SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
/*
* Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an
* external routine, to avoid include-hell.
*/
#ifdef CONFIG_SMP
# define per_cpu(var, cpu) (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
extern
unsigned
long
__per_cpu_offset
[
NR_CPUS
];
/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
DECLARE_PER_CPU
(
unsigned
long
,
local_per_cpu_offset
);
#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
extern
void
percpu_modcopy
(
void
*
pcpudst
,
const
void
*
src
,
unsigned
long
size
);
#else
# define per_cpu(var, cpu) ((void)cpu, __get_cpu_var(var))
#endif
#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var##__per_cpu)
#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var##__per_cpu)
#else
/* ! SMP */
#define per_cpu(var, cpu) ((void)cpu, per_cpu__##var)
#define __get_cpu_var(var) per_cpu__##var
#endif
/* SMP */
#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
/* ia64-specific part: */
extern
void
setup_per_cpu_areas
(
void
);
/*
* Be extremely careful when taking the address of this variable! Due to virtual
* remapping, it is different from the canonical address returned by __get_cpu_var(var)!
* On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly
* more efficient.
*/
#define __ia64_per_cpu_var(var) (per_cpu__##var)
#endif
/* !__ASSEMBLY__ */
#endif
/* _ASM_IA64_PERCPU_H */
include/asm-ia64/processor.h
View file @
a52ccf00
...
...
@@ -191,10 +191,12 @@ struct cpuinfo_ia64 {
DECLARE_PER_CPU
(
struct
cpuinfo_ia64
,
cpu_info
);
/*
* The "local" data
pointer. It point
s to the per-CPU data of the currently executing
* The "local" data
variable. It refer
s to the per-CPU data of the currently executing
* CPU, much like "current" points to the per-task data of the currently executing task.
* Do not use the address of local_cpu_data, since it will be different from
* cpu_data(smp_processor_id())!
*/
#define local_cpu_data (&__
get
_cpu_var(cpu_info))
#define local_cpu_data (&__
ia64_per
_cpu_var(cpu_info))
#define cpu_data(cpu) (&per_cpu(cpu_info, cpu))
extern
void
identify_cpu
(
struct
cpuinfo_ia64
*
);
...
...
include/asm-ia64/system.h
View file @
a52ccf00
...
...
@@ -20,9 +20,9 @@
#include <asm/percpu.h>
/* 0xa000000000000000 - 0xa000000000000000+PERCPU_PAGE_SIZE remain unmapped */
#define PERCPU_ADDR (0xa000000000000000 + PERCPU_PAGE_SIZE)
#define GATE_ADDR (0xa000000000000000 + 2*PERCPU_PAGE_SIZE)
#define GATE_ADDR (0xa000000000000000 + PERCPU_PAGE_SIZE)
#define KERNEL_START 0xa000000100000000
#define PERCPU_ADDR (-PERCPU_PAGE_SIZE)
#ifndef __ASSEMBLY__
...
...
include/asm-ia64/tlb.h
View file @
a52ccf00
...
...
@@ -126,7 +126,7 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e
static
inline
struct
mmu_gather
*
tlb_gather_mmu
(
struct
mm_struct
*
mm
,
unsigned
int
full_mm_flush
)
{
struct
mmu_gather
*
tlb
=
&
per_cpu
(
mmu_gathers
,
smp_processor_id
()
);
struct
mmu_gather
*
tlb
=
&
__get_cpu_var
(
mmu_gathers
);
tlb
->
mm
=
mm
;
/*
...
...
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