Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
ff74c5a9
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ff74c5a9
编写于
10月 31, 2011
作者:
A
Anthony Liguori
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'riku/linux-user-for-upstream' into staging
上级
8494a397
9e0e2f96
变更
9
展开全部
隐藏空白更改
内联
并排
Showing
9 changed file
with
193 addition
and
175 deletion
+193
-175
linux-user/elfload.c
linux-user/elfload.c
+4
-4
linux-user/main.c
linux-user/main.c
+14
-12
linux-user/qemu-types.h
linux-user/qemu-types.h
+12
-0
linux-user/signal.c
linux-user/signal.c
+11
-11
linux-user/sparc/syscall_nr.h
linux-user/sparc/syscall_nr.h
+3
-0
linux-user/strace.c
linux-user/strace.c
+2
-2
linux-user/syscall.c
linux-user/syscall.c
+134
-138
linux-user/syscall_defs.h
linux-user/syscall_defs.h
+11
-6
linux-user/vm86.c
linux-user/vm86.c
+2
-2
未找到文件。
linux-user/elfload.c
浏览文件 @
ff74c5a9
...
...
@@ -618,8 +618,8 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info *
{
_regs
->
gpr
[
1
]
=
infop
->
start_stack
;
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
_regs
->
gpr
[
2
]
=
ldq_raw
(
infop
->
entry
+
8
)
+
infop
->
load_
addr
;
infop
->
entry
=
ldq_raw
(
infop
->
entry
)
+
infop
->
load_
addr
;
_regs
->
gpr
[
2
]
=
ldq_raw
(
infop
->
entry
+
8
)
+
infop
->
load_
bias
;
infop
->
entry
=
ldq_raw
(
infop
->
entry
)
+
infop
->
load_
bias
;
#endif
_regs
->
nip
=
infop
->
entry
;
}
...
...
@@ -1884,11 +1884,11 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
info
->
start_stack
=
bprm
->
p
;
/* If we have an interpreter, set that as the program's entry point.
Copy the load_
addr
as well, to help PPC64 interpret the entry
Copy the load_
bias
as well, to help PPC64 interpret the entry
point as a function descriptor. Do this after creating elf tables
so that we copy the original program entry point into the AUXV. */
if
(
elf_interpreter
)
{
info
->
load_
addr
=
interp_info
.
load_addr
;
info
->
load_
bias
=
interp_info
.
load_bias
;
info
->
entry
=
interp_info
.
entry
;
free
(
elf_interpreter
);
}
...
...
linux-user/main.c
浏览文件 @
ff74c5a9
...
...
@@ -1148,7 +1148,7 @@ void cpu_loop (CPUSPARCState *env)
case
TT_TFAULT
:
case
TT_DFAULT
:
{
info
.
si_signo
=
SIGSEGV
;
info
.
si_signo
=
TARGET_
SIGSEGV
;
info
.
si_errno
=
0
;
/* XXX: check env->error_code */
info
.
si_code
=
TARGET_SEGV_MAPERR
;
...
...
@@ -1166,7 +1166,7 @@ void cpu_loop (CPUSPARCState *env)
case
TT_TFAULT
:
case
TT_DFAULT
:
{
info
.
si_signo
=
SIGSEGV
;
info
.
si_signo
=
TARGET_
SIGSEGV
;
info
.
si_errno
=
0
;
/* XXX: check env->error_code */
info
.
si_code
=
TARGET_SEGV_MAPERR
;
...
...
@@ -1191,6 +1191,15 @@ void cpu_loop (CPUSPARCState *env)
case
EXCP_INTERRUPT
:
/* just indicate that signals should be handled asap */
break
;
case
TT_ILL_INSN
:
{
info
.
si_signo
=
TARGET_SIGILL
;
info
.
si_errno
=
0
;
info
.
si_code
=
TARGET_ILL_ILLOPC
;
info
.
_sifields
.
_sigfault
.
_addr
=
env
->
pc
;
queue_signal
(
env
,
info
.
si_signo
,
&
info
);
}
break
;
case
EXCP_DEBUG
:
{
int
sig
;
...
...
@@ -1332,7 +1341,7 @@ void cpu_loop(CPUPPCState *env)
{
target_siginfo_t
info
;
int
trapnr
;
uint32_t
ret
;
target_ulong
ret
;
for
(;;)
{
cpu_exec_start
(
env
);
...
...
@@ -1695,27 +1704,20 @@ void cpu_loop(CPUPPCState *env)
* PPC ABI uses overflow flag in cr0 to signal an error
* in syscalls.
*/
#if 0
printf("syscall %d 0x%08x 0x%08x 0x%08x 0x%08x\n", env->gpr[0],
env->gpr[3], env->gpr[4], env->gpr[5], env->gpr[6]);
#endif
env
->
crf
[
0
]
&=
~
0x1
;
ret
=
do_syscall
(
env
,
env
->
gpr
[
0
],
env
->
gpr
[
3
],
env
->
gpr
[
4
],
env
->
gpr
[
5
],
env
->
gpr
[
6
],
env
->
gpr
[
7
],
env
->
gpr
[
8
],
0
,
0
);
if
(
ret
==
(
uint32_t
)(
-
TARGET_QEMU_ESIGRETURN
))
{
if
(
ret
==
(
target_ulong
)(
-
TARGET_QEMU_ESIGRETURN
))
{
/* Returning from a successful sigreturn syscall.
Avoid corrupting register state. */
break
;
}
if
(
ret
>
(
uint32_t
)(
-
515
))
{
if
(
ret
>
(
target_ulong
)(
-
515
))
{
env
->
crf
[
0
]
|=
0x1
;
ret
=
-
ret
;
}
env
->
gpr
[
3
]
=
ret
;
#if 0
printf("syscall returned 0x%08x (%d)\n", ret, ret);
#endif
break
;
case
POWERPC_EXCP_STCX
:
if
(
do_store_exclusive
(
env
))
{
...
...
linux-user/qemu-types.h
浏览文件 @
ff74c5a9
...
...
@@ -9,6 +9,12 @@ typedef int32_t abi_long;
#define TARGET_ABI_FMT_ld "%d"
#define TARGET_ABI_FMT_lu "%u"
#define TARGET_ABI_BITS 32
static
inline
abi_ulong
tswapal
(
abi_ulong
v
)
{
return
tswap32
(
v
);
}
#else
typedef
target_ulong
abi_ulong
;
typedef
target_long
abi_long
;
...
...
@@ -20,5 +26,11 @@ typedef target_long abi_long;
#if TARGET_ABI_BITS == 32
#define TARGET_ABI32 1
#endif
static
inline
abi_ulong
tswapal
(
abi_ulong
v
)
{
return
tswapl
(
v
);
}
#endif
#endif
linux-user/signal.c
浏览文件 @
ff74c5a9
...
...
@@ -152,7 +152,7 @@ void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
host_to_target_sigset_internal
(
&
d1
,
s
);
for
(
i
=
0
;
i
<
TARGET_NSIG_WORDS
;
i
++
)
d
->
sig
[
i
]
=
tswapl
(
d1
.
sig
[
i
]);
d
->
sig
[
i
]
=
tswap
a
l
(
d1
.
sig
[
i
]);
}
static
void
target_to_host_sigset_internal
(
sigset_t
*
d
,
...
...
@@ -173,7 +173,7 @@ void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
int
i
;
for
(
i
=
0
;
i
<
TARGET_NSIG_WORDS
;
i
++
)
s1
.
sig
[
i
]
=
tswapl
(
s
->
sig
[
i
]);
s1
.
sig
[
i
]
=
tswap
a
l
(
s
->
sig
[
i
]);
target_to_host_sigset_internal
(
d
,
&
s1
);
}
...
...
@@ -234,14 +234,14 @@ static void tswap_siginfo(target_siginfo_t *tinfo,
if
(
sig
==
SIGILL
||
sig
==
SIGFPE
||
sig
==
SIGSEGV
||
sig
==
SIGBUS
||
sig
==
SIGTRAP
)
{
tinfo
->
_sifields
.
_sigfault
.
_addr
=
tswapl
(
info
->
_sifields
.
_sigfault
.
_addr
);
tswap
a
l
(
info
->
_sifields
.
_sigfault
.
_addr
);
}
else
if
(
sig
==
SIGIO
)
{
tinfo
->
_sifields
.
_sigpoll
.
_fd
=
tswap32
(
info
->
_sifields
.
_sigpoll
.
_fd
);
}
else
if
(
sig
>=
TARGET_SIGRTMIN
)
{
tinfo
->
_sifields
.
_rt
.
_pid
=
tswap32
(
info
->
_sifields
.
_rt
.
_pid
);
tinfo
->
_sifields
.
_rt
.
_uid
=
tswap32
(
info
->
_sifields
.
_rt
.
_uid
);
tinfo
->
_sifields
.
_rt
.
_sigval
.
sival_ptr
=
tswapl
(
info
->
_sifields
.
_rt
.
_sigval
.
sival_ptr
);
tswap
a
l
(
info
->
_sifields
.
_rt
.
_sigval
.
sival_ptr
);
}
}
...
...
@@ -262,7 +262,7 @@ void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
info
->
si_pid
=
tswap32
(
tinfo
->
_sifields
.
_rt
.
_pid
);
info
->
si_uid
=
tswap32
(
tinfo
->
_sifields
.
_rt
.
_uid
);
info
->
si_value
.
sival_ptr
=
(
void
*
)(
long
)
tswapl
(
tinfo
->
_sifields
.
_rt
.
_sigval
.
sival_ptr
);
(
void
*
)(
long
)
tswap
a
l
(
tinfo
->
_sifields
.
_rt
.
_sigval
.
sival_ptr
);
}
static
int
fatal_signal
(
int
sig
)
...
...
@@ -586,19 +586,19 @@ int do_sigaction(int sig, const struct target_sigaction *act,
sig
,
act
,
oact
);
#endif
if
(
oact
)
{
oact
->
_sa_handler
=
tswapl
(
k
->
_sa_handler
);
oact
->
sa_flags
=
tswapl
(
k
->
sa_flags
);
oact
->
_sa_handler
=
tswap
a
l
(
k
->
_sa_handler
);
oact
->
sa_flags
=
tswap
a
l
(
k
->
sa_flags
);
#if !defined(TARGET_MIPS)
oact
->
sa_restorer
=
tswapl
(
k
->
sa_restorer
);
oact
->
sa_restorer
=
tswap
a
l
(
k
->
sa_restorer
);
#endif
oact
->
sa_mask
=
k
->
sa_mask
;
}
if
(
act
)
{
/* FIXME: This is not threadsafe. */
k
->
_sa_handler
=
tswapl
(
act
->
_sa_handler
);
k
->
sa_flags
=
tswapl
(
act
->
sa_flags
);
k
->
_sa_handler
=
tswap
a
l
(
act
->
_sa_handler
);
k
->
sa_flags
=
tswap
a
l
(
act
->
sa_flags
);
#if !defined(TARGET_MIPS)
k
->
sa_restorer
=
tswapl
(
act
->
sa_restorer
);
k
->
sa_restorer
=
tswap
a
l
(
act
->
sa_restorer
);
#endif
k
->
sa_mask
=
act
->
sa_mask
;
...
...
linux-user/sparc/syscall_nr.h
浏览文件 @
ff74c5a9
...
...
@@ -136,6 +136,7 @@
#define TARGET_NR_utimes 138
/* SunOS Specific */
#define TARGET_NR_stat64 139
/* Linux sparc32 Specific */
#define TARGET_NR_getpeername 141
/* Common */
#define TARGET_NR_futex 142
/* gethostid under SunOS */
#define TARGET_NR_gettid 143
/* ENOSYS under SunOS */
#define TARGET_NR_getrlimit 144
/* Common */
#define TARGET_NR_setrlimit 145
/* Common */
...
...
@@ -153,6 +154,7 @@
#define TARGET_NR_getdomainname 162
/* SunOS Specific */
#define TARGET_NR_setdomainname 163
/* Common */
#define TARGET_NR_quotactl 165
/* Common */
#define TARGET_NR_set_tid_address 166
/* Linux specific, exportfs under SunOS */
#define TARGET_NR_mount 167
/* Common */
#define TARGET_NR_ustat 168
/* Common */
#define TARGET_NR_getdents 174
/* Common */
...
...
@@ -177,6 +179,7 @@
#define TARGET_NR_readahead 205
/* Linux Specific */
#define TARGET_NR_socketcall 206
/* Linux Specific */
#define TARGET_NR_syslog 207
/* Linux Specific */
#define TARGET_NR_tgkill 211
/* Linux Specific */
#define TARGET_NR_waitpid 212
/* Linux Specific */
#define TARGET_NR_swapoff 213
/* Linux Specific */
#define TARGET_NR_sysinfo 214
/* Linux Specific */
...
...
linux-user/strace.c
浏览文件 @
ff74c5a9
...
...
@@ -169,7 +169,7 @@ print_fdset(int n, abi_ulong target_fds_addr)
return
;
for
(
i
=
n
;
i
>=
0
;
i
--
)
{
if
((
tswapl
(
target_fds
[
i
/
TARGET_ABI_BITS
])
>>
(
i
&
(
TARGET_ABI_BITS
-
1
)))
&
1
)
if
((
tswap
a
l
(
target_fds
[
i
/
TARGET_ABI_BITS
])
>>
(
i
&
(
TARGET_ABI_BITS
-
1
)))
&
1
)
gemu_log
(
"%d,"
,
i
);
}
unlock_user
(
target_fds
,
target_fds_addr
,
0
);
...
...
@@ -245,7 +245,7 @@ print_execve(const struct syscallname *name,
arg_ptr
=
lock_user
(
VERIFY_READ
,
arg_ptr_addr
,
sizeof
(
abi_ulong
),
1
);
if
(
!
arg_ptr
)
return
;
arg_addr
=
tswap
l
(
*
arg_ptr
);
arg_addr
=
tswapa
l
(
*
arg_ptr
);
unlock_user
(
arg_ptr
,
arg_ptr_addr
,
0
);
if
(
!
arg_addr
)
break
;
...
...
linux-user/syscall.c
浏览文件 @
ff74c5a9
此差异已折叠。
点击以展开。
linux-user/syscall_defs.h
浏览文件 @
ff74c5a9
...
...
@@ -209,9 +209,9 @@ __target_cmsg_nxthdr (struct target_msghdr *__mhdr, struct target_cmsghdr *__cms
struct
target_cmsghdr
*
__ptr
;
__ptr
=
(
struct
target_cmsghdr
*
)((
unsigned
char
*
)
__cmsg
+
TARGET_CMSG_ALIGN
(
tswapl
(
__cmsg
->
cmsg_len
)));
if
((
unsigned
long
)((
char
*
)(
__ptr
+
1
)
-
(
char
*
)(
size_t
)
tswapl
(
__mhdr
->
msg_control
))
>
tswapl
(
__mhdr
->
msg_controllen
))
+
TARGET_CMSG_ALIGN
(
tswap
a
l
(
__cmsg
->
cmsg_len
)));
if
((
unsigned
long
)((
char
*
)(
__ptr
+
1
)
-
(
char
*
)(
size_t
)
tswap
a
l
(
__mhdr
->
msg_control
))
>
tswap
a
l
(
__mhdr
->
msg_controllen
))
/* No more entries. */
return
(
struct
target_cmsghdr
*
)
0
;
return
__cmsg
;
...
...
@@ -292,7 +292,7 @@ static inline void tswap_sigset(target_sigset_t *d, const target_sigset_t *s)
{
int
i
;
for
(
i
=
0
;
i
<
TARGET_NSIG_WORDS
;
i
++
)
d
->
sig
[
i
]
=
tswapl
(
s
->
sig
[
i
]);
d
->
sig
[
i
]
=
tswap
a
l
(
s
->
sig
[
i
]);
}
#else
static
inline
void
tswap_sigset
(
target_sigset_t
*
d
,
const
target_sigset_t
*
s
)
...
...
@@ -687,10 +687,10 @@ struct target_rlimit {
#if defined(TARGET_ALPHA)
#define TARGET_RLIM_INFINITY 0x7fffffffffffffffull
#elif defined(TARGET_MIPS) ||
defined(TARGET_SPARC
)
#elif defined(TARGET_MIPS) ||
(defined(TARGET_SPARC) && TARGET_ABI_BITS == 32
)
#define TARGET_RLIM_INFINITY 0x7fffffffUL
#else
#define TARGET_RLIM_INFINITY ((
target_ulong)~0UL
)
#define TARGET_RLIM_INFINITY ((
abi_ulong)-1
)
#endif
#if defined(TARGET_MIPS)
...
...
@@ -716,8 +716,13 @@ struct target_rlimit {
#define TARGET_RLIMIT_STACK 3
#define TARGET_RLIMIT_CORE 4
#define TARGET_RLIMIT_RSS 5
#if defined(TARGET_SPARC)
#define TARGET_RLIMIT_NOFILE 6
#define TARGET_RLIMIT_NPROC 7
#else
#define TARGET_RLIMIT_NPROC 6
#define TARGET_RLIMIT_NOFILE 7
#endif
#define TARGET_RLIMIT_MEMLOCK 8
#define TARGET_RLIMIT_AS 9
#define TARGET_RLIMIT_LOCKS 10
...
...
linux-user/vm86.c
浏览文件 @
ff74c5a9
...
...
@@ -432,7 +432,7 @@ int do_vm86(CPUX86State *env, long subfunction, abi_ulong vm86_addr)
env
->
eflags
=
(
env
->
eflags
&
~
SAFE_MASK
)
|
(
tswap32
(
target_v86
->
regs
.
eflags
)
&
SAFE_MASK
)
|
VM_MASK
;
ts
->
vm86plus
.
cpu_type
=
tswapl
(
target_v86
->
cpu_type
);
ts
->
vm86plus
.
cpu_type
=
tswap
a
l
(
target_v86
->
cpu_type
);
switch
(
ts
->
vm86plus
.
cpu_type
)
{
case
TARGET_CPU_286
:
ts
->
v86mask
=
0
;
...
...
@@ -468,7 +468,7 @@ int do_vm86(CPUX86State *env, long subfunction, abi_ulong vm86_addr)
&
target_v86
->
int_revectored
,
32
);
memcpy
(
&
ts
->
vm86plus
.
int21_revectored
,
&
target_v86
->
int21_revectored
,
32
);
ts
->
vm86plus
.
vm86plus
.
flags
=
tswapl
(
target_v86
->
vm86plus
.
flags
);
ts
->
vm86plus
.
vm86plus
.
flags
=
tswap
a
l
(
target_v86
->
vm86plus
.
flags
);
memcpy
(
&
ts
->
vm86plus
.
vm86plus
.
vm86dbg_intxxtab
,
target_v86
->
vm86plus
.
vm86dbg_intxxtab
,
32
);
unlock_user_struct
(
target_v86
,
vm86_addr
,
0
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录