Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e3b1acd4
Commit
e3b1acd4
authored
Jun 16, 2004
by
David Mosberger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ia64: Fix ia32 partial-page-list code to compile cleanly in more configs.
parent
74e4c2e8
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
45 additions
and
27 deletions
+45
-27
arch/ia64/ia32/ia32_support.c
arch/ia64/ia32/ia32_support.c
+10
-6
arch/ia64/ia32/ia32priv.h
arch/ia64/ia32/ia32priv.h
+7
-4
arch/ia64/ia32/sys_ia32.c
arch/ia64/ia32/sys_ia32.c
+8
-5
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+4
-2
arch/ia64/kernel/head.S
arch/ia64/kernel/head.S
+5
-1
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+2
-6
include/asm-ia64/ia32.h
include/asm-ia64/ia32.h
+9
-3
No files found.
arch/ia64/ia32/ia32_support.c
View file @
e3b1acd4
...
@@ -211,8 +211,6 @@ ia32_cpu_init (void)
...
@@ -211,8 +211,6 @@ ia32_cpu_init (void)
static
int
__init
static
int
__init
ia32_init
(
void
)
ia32_init
(
void
)
{
{
extern
kmem_cache_t
*
partial_page_cachep
;
ia32_exec_domain
.
name
=
"Linux/x86"
;
ia32_exec_domain
.
name
=
"Linux/x86"
;
ia32_exec_domain
.
handler
=
NULL
;
ia32_exec_domain
.
handler
=
NULL
;
ia32_exec_domain
.
pers_low
=
PER_LINUX32
;
ia32_exec_domain
.
pers_low
=
PER_LINUX32
;
...
@@ -221,11 +219,17 @@ ia32_init (void)
...
@@ -221,11 +219,17 @@ ia32_init (void)
ia32_exec_domain
.
signal_invmap
=
default_exec_domain
.
signal_invmap
;
ia32_exec_domain
.
signal_invmap
=
default_exec_domain
.
signal_invmap
;
register_exec_domain
(
&
ia32_exec_domain
);
register_exec_domain
(
&
ia32_exec_domain
);
partial_page_cachep
=
kmem_cache_create
(
"partial_page_cache"
,
#if PAGE_SHIFT > IA32_PAGE_SHIFT
sizeof
(
struct
partial_page
),
0
,
0
,
NULL
,
NULL
);
{
if
(
!
partial_page_cachep
)
extern
kmem_cache_t
*
partial_page_cachep
;
panic
(
"Cannot create partial page SLAB cache"
);
partial_page_cachep
=
kmem_cache_create
(
"partial_page_cache"
,
sizeof
(
struct
partial_page
),
0
,
0
,
NULL
,
NULL
);
if
(
!
partial_page_cachep
)
panic
(
"Cannot create partial page SLAB cache"
);
}
#endif
return
0
;
return
0
;
}
}
...
...
arch/ia64/ia32/ia32priv.h
View file @
e3b1acd4
#ifndef _ASM_IA64_IA32_H
#ifndef _ASM_IA64_IA32_
PRIV_
H
#define _ASM_IA64_IA32_H
#define _ASM_IA64_IA32_
PRIV_
H
#include <linux/config.h>
#include <linux/config.h>
...
@@ -17,7 +17,6 @@
...
@@ -17,7 +17,6 @@
* 32 bit structures for IA32 support.
* 32 bit structures for IA32 support.
*/
*/
#define IA32_PAGE_SHIFT 12
/* 4KB pages */
#define IA32_PAGE_SIZE (1UL << IA32_PAGE_SHIFT)
#define IA32_PAGE_SIZE (1UL << IA32_PAGE_SHIFT)
#define IA32_PAGE_MASK (~(IA32_PAGE_SIZE - 1))
#define IA32_PAGE_MASK (~(IA32_PAGE_SIZE - 1))
#define IA32_PAGE_ALIGN(addr) (((addr) + IA32_PAGE_SIZE - 1) & IA32_PAGE_MASK)
#define IA32_PAGE_ALIGN(addr) (((addr) + IA32_PAGE_SIZE - 1) & IA32_PAGE_MASK)
...
@@ -45,7 +44,11 @@ struct partial_page_list {
...
@@ -45,7 +44,11 @@ struct partial_page_list {
atomic_t
pp_count
;
/* reference count */
atomic_t
pp_count
;
/* reference count */
};
};
#if PAGE_SHIFT > IA32_PAGE_SHIFT
struct
partial_page_list
*
ia32_init_pp_list
(
void
);
struct
partial_page_list
*
ia32_init_pp_list
(
void
);
#else
# define ia32_init_pp_list() 0
#endif
/* sigcontext.h */
/* sigcontext.h */
/*
/*
...
@@ -553,4 +556,4 @@ extern int save_ia32_fpxstate (struct task_struct *tsk, struct ia32_user_fxsr_st
...
@@ -553,4 +556,4 @@ extern int save_ia32_fpxstate (struct task_struct *tsk, struct ia32_user_fxsr_st
#endif
/* !CONFIG_IA32_SUPPORT */
#endif
/* !CONFIG_IA32_SUPPORT */
#endif
/* _ASM_IA64_IA32_H */
#endif
/* _ASM_IA64_IA32_
PRIV_
H */
arch/ia64/ia32/sys_ia32.c
View file @
e3b1acd4
...
@@ -563,8 +563,10 @@ ia32_do_drop_pp_list(struct partial_page_list *ppl)
...
@@ -563,8 +563,10 @@ ia32_do_drop_pp_list(struct partial_page_list *ppl)
}
}
void
void
ia32_drop_partial_page_list
(
struct
partial_page_list
*
ppl
)
ia32_drop_partial_page_list
(
struct
task_struct
*
task
)
{
{
struct
partial_page_list
*
ppl
=
task
->
thread
.
ppl
;
if
(
ppl
&&
atomic_dec_and_test
(
&
ppl
->
pp_count
))
if
(
ppl
&&
atomic_dec_and_test
(
&
ppl
->
pp_count
))
ia32_do_drop_pp_list
(
ppl
);
ia32_do_drop_pp_list
(
ppl
);
}
}
...
@@ -855,14 +857,14 @@ sys32_mmap2 (unsigned int addr, unsigned int len, unsigned int prot, unsigned in
...
@@ -855,14 +857,14 @@ sys32_mmap2 (unsigned int addr, unsigned int len, unsigned int prot, unsigned in
asmlinkage
long
asmlinkage
long
sys32_munmap
(
unsigned
int
start
,
unsigned
int
len
)
sys32_munmap
(
unsigned
int
start
,
unsigned
int
len
)
{
{
unsigned
int
end
,
pstart
,
pend
;
unsigned
int
end
=
start
+
len
;
long
ret
;
long
ret
;
end
=
start
+
len
;
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
ret
=
sys_munmap
(
start
,
end
-
start
);
ret
=
sys_munmap
(
start
,
end
-
start
);
#else
#else
unsigned
int
pstart
,
pend
;
if
(
OFFSET4K
(
start
))
if
(
OFFSET4K
(
start
))
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -1034,11 +1036,12 @@ sys32_mremap (unsigned int addr, unsigned int old_len, unsigned int new_len,
...
@@ -1034,11 +1036,12 @@ sys32_mremap (unsigned int addr, unsigned int old_len, unsigned int new_len,
unsigned
int
flags
,
unsigned
int
new_addr
)
unsigned
int
flags
,
unsigned
int
new_addr
)
{
{
long
ret
;
long
ret
;
unsigned
int
old_end
,
new_end
;
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
ret
=
sys_mremap
(
addr
,
old_len
,
new_len
,
flags
,
new_addr
);
ret
=
sys_mremap
(
addr
,
old_len
,
new_len
,
flags
,
new_addr
);
#else
#else
unsigned
int
old_end
,
new_end
;
if
(
OFFSET4K
(
addr
))
if
(
OFFSET4K
(
addr
))
return
-
EINVAL
;
return
-
EINVAL
;
...
...
arch/ia64/kernel/entry.S
View file @
e3b1acd4
...
@@ -179,17 +179,19 @@ GLOBAL_ENTRY(ia64_switch_to)
...
@@ -179,17 +179,19 @@ GLOBAL_ENTRY(ia64_switch_to)
.
body
.
body
adds
r22
=
IA64_TASK_THREAD_KSP_OFFSET
,
r13
adds
r22
=
IA64_TASK_THREAD_KSP_OFFSET
,
r13
movl
r25
=
init_task
mov
r27
=
IA64_KR
(
CURRENT_STACK
)
mov
r27
=
IA64_KR
(
CURRENT_STACK
)
adds
r21
=
IA64_TASK_THREAD_KSP_OFFSET
,
in0
dep
r20
=
0
,
in0
,
61
,
3
//
physical
address
of
"current"
dep
r20
=
0
,
in0
,
61
,
3
//
physical
address
of
"current"
;;
;;
st8
[
r22
]=
sp
//
save
kernel
stack
pointer
of
old
task
st8
[
r22
]=
sp
//
save
kernel
stack
pointer
of
old
task
shr.u
r26
=
r20
,
IA64_GRANULE_SHIFT
shr.u
r26
=
r20
,
IA64_GRANULE_SHIFT
adds
r21
=
IA64_TASK_THREAD_KSP_OFFSET
,
in0
cmp.eq
p7
,
p6
=
r25
,
in0
;;
;;
/
*
/
*
*
If
we
've already mapped this task'
s
page
,
we
can
skip
doing
it
again
.
*
If
we
've already mapped this task'
s
page
,
we
can
skip
doing
it
again
.
*/
*/
cmp.eq
p7
,
p6
=
r26
,
r27
(
p6
)
cmp.eq
p7
,
p6
=
r26
,
r27
(
p6
)
br.cond.dpnt
.
map
(
p6
)
br.cond.dpnt
.
map
;;
;;
.
done
:
.
done
:
...
...
arch/ia64/kernel/head.S
View file @
e3b1acd4
...
@@ -154,6 +154,10 @@ start_ap:
...
@@ -154,6 +154,10 @@ start_ap:
#endif
#endif
;;
;;
tpa
r3
=
r2
//
r3
==
phys
addr
of
task
struct
tpa
r3
=
r2
//
r3
==
phys
addr
of
task
struct
;;
shr.u
r16
=
r3
,
IA64_GRANULE_SHIFT
(
isBP
)
br.cond.dpnt
.
load_current
//
BP
stack
is
on
region
5
---
no
need
to
map
it
//
load
mapping
for
stack
(
virtaddr
in
r2
,
physaddr
in
r3
)
//
load
mapping
for
stack
(
virtaddr
in
r2
,
physaddr
in
r3
)
rsm
psr
.
ic
rsm
psr
.
ic
movl
r17
=
PAGE_KERNEL
movl
r17
=
PAGE_KERNEL
...
@@ -165,7 +169,6 @@ start_ap:
...
@@ -165,7 +169,6 @@ start_ap:
dep
r2
=-
1
,
r3
,
61
,
3
//
IMVA
of
task
dep
r2
=-
1
,
r3
,
61
,
3
//
IMVA
of
task
;;
;;
mov
r17
=
rr
[
r2
]
mov
r17
=
rr
[
r2
]
shr.u
r16
=
r3
,
IA64_GRANULE_SHIFT
;;
;;
dep
r17
=
0
,
r17
,
8
,
24
dep
r17
=
0
,
r17
,
8
,
24
;;
;;
...
@@ -180,6 +183,7 @@ start_ap:
...
@@ -180,6 +183,7 @@ start_ap:
srlz.d
srlz.d
;;
;;
.
load_current
:
//
load
the
"current"
pointer
(
r13
)
and
ar
.
k6
with
the
current
task
//
load
the
"current"
pointer
(
r13
)
and
ar
.
k6
with
the
current
task
mov
IA64_KR
(
CURRENT
)=
r2
//
virtual
address
mov
IA64_KR
(
CURRENT
)=
r2
//
virtual
address
mov
IA64_KR
(
CURRENT_STACK
)=
r16
mov
IA64_KR
(
CURRENT_STACK
)=
r16
...
...
arch/ia64/kernel/process.c
View file @
e3b1acd4
...
@@ -676,10 +676,8 @@ flush_thread (void)
...
@@ -676,10 +676,8 @@ flush_thread (void)
/* drop floating-point and debug-register state if it exists: */
/* drop floating-point and debug-register state if it exists: */
current
->
thread
.
flags
&=
~
(
IA64_THREAD_FPH_VALID
|
IA64_THREAD_DBG_VALID
);
current
->
thread
.
flags
&=
~
(
IA64_THREAD_FPH_VALID
|
IA64_THREAD_DBG_VALID
);
ia64_drop_fpu
(
current
);
ia64_drop_fpu
(
current
);
#ifdef CONFIG_IA32_SUPPORT
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
ia32_drop_partial_page_list
(
current
->
thread
.
ppl
);
ia32_drop_partial_page_list
(
current
);
#endif
}
}
/*
/*
...
@@ -699,10 +697,8 @@ exit_thread (void)
...
@@ -699,10 +697,8 @@ exit_thread (void)
if
(
current
->
thread
.
flags
&
IA64_THREAD_DBG_VALID
)
if
(
current
->
thread
.
flags
&
IA64_THREAD_DBG_VALID
)
pfm_release_debug_registers
(
current
);
pfm_release_debug_registers
(
current
);
#endif
#endif
#ifdef CONFIG_IA32_SUPPORT
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
ia32_drop_partial_page_list
(
current
->
thread
.
ppl
);
ia32_drop_partial_page_list
(
current
);
#endif
}
}
unsigned
long
unsigned
long
...
...
include/asm-ia64/ia32.h
View file @
e3b1acd4
...
@@ -6,7 +6,8 @@
...
@@ -6,7 +6,8 @@
#include <asm/ptrace.h>
#include <asm/ptrace.h>
#include <asm/signal.h>
#include <asm/signal.h>
#define IA32_NR_syscalls 283
/* length of syscall table */
#define IA32_NR_syscalls 283
/* length of syscall table */
#define IA32_PAGE_SHIFT 12
/* 4KB pages */
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
...
@@ -18,14 +19,19 @@ extern void ia32_gdt_init (void);
...
@@ -18,14 +19,19 @@ extern void ia32_gdt_init (void);
extern
int
ia32_exception
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
extern
int
ia32_exception
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
extern
int
ia32_intercept
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
extern
int
ia32_intercept
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
extern
int
ia32_clone_tls
(
struct
task_struct
*
child
,
struct
pt_regs
*
childregs
);
extern
int
ia32_clone_tls
(
struct
task_struct
*
child
,
struct
pt_regs
*
childregs
);
extern
int
ia32_copy_partial_page_list
(
struct
task_struct
*
,
unsigned
long
);
extern
void
ia32_drop_partial_page_list
(
struct
partial_page_list
*
);
# endif
/* !CONFIG_IA32_SUPPORT */
# endif
/* !CONFIG_IA32_SUPPORT */
/* Declare this unconditionally, so we don't get warnings for unreachable code. */
/* Declare this unconditionally, so we don't get warnings for unreachable code. */
extern
int
ia32_setup_frame1
(
int
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
extern
int
ia32_setup_frame1
(
int
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
set
,
struct
pt_regs
*
regs
);
sigset_t
*
set
,
struct
pt_regs
*
regs
);
#if PAGE_SHIFT > IA32_PAGE_SHIFT
extern
int
ia32_copy_partial_page_list
(
struct
task_struct
*
,
unsigned
long
);
extern
void
ia32_drop_partial_page_list
(
struct
task_struct
*
);
#else
# define ia32_copy_partial_page_list(a1, a2) 0
# define ia32_drop_partial_page_list(a1) do { ; } while (0)
#endif
#endif
/* !__ASSEMBLY__ */
#endif
/* !__ASSEMBLY__ */
...
...
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