SHA256
1
0
forked from pool/qemu

Accepting request 86517 from openSUSE:Tools:Unstable

add binfmt misc handler

OBS-URL: https://build.opensuse.org/request/show/86517
OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=20
This commit is contained in:
Dirk Mueller 2011-10-05 15:26:05 +00:00 committed by Git OBS Bridge
parent 57f72b0579
commit 34c3c61638
7 changed files with 479 additions and 150 deletions

View File

@ -8,10 +8,10 @@ No clue why this is necessary or useful, nothing found in any changelogs.
x86_64.ld | 6 ++---- x86_64.ld | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-) 1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/x86_64.ld b/x86_64.ld Index: qemu-0.14.1/x86_64.ld
index 46d8d4d..cce0a17 100644 ===================================================================
--- a/x86_64.ld --- qemu-0.14.1.orig/x86_64.ld
+++ b/x86_64.ld +++ qemu-0.14.1/x86_64.ld
@@ -70,8 +70,6 @@ SECTIONS @@ -70,8 +70,6 @@ SECTIONS
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) } .rodata1 : { *(.rodata1) }
@ -32,6 +32,3 @@ index 46d8d4d..cce0a17 100644
.dynamic : { *(.dynamic) } .dynamic : { *(.dynamic) }
.ctors : .ctors :
{ {
--
1.7.1

View File

@ -39,11 +39,11 @@ Subject: [PATCH 15/17] S/390 support
create mode 100644 s390x.ld create mode 100644 s390x.ld
create mode 100644 target-s390x/helpers.h create mode 100644 target-s390x/helpers.h
diff --git a/configure b/configure Index: qemu-0.14.1/configure
index 95de763..bd1484b 100755 ===================================================================
--- a/configure --- qemu-0.14.1.orig/configure
+++ b/configure +++ qemu-0.14.1/configure
@@ -1018,6 +1018,7 @@ sh4eb-linux-user \ @@ -1020,6 +1020,7 @@ sh4eb-linux-user \
sparc-linux-user \ sparc-linux-user \
sparc64-linux-user \ sparc64-linux-user \
sparc32plus-linux-user \ sparc32plus-linux-user \
@ -51,7 +51,7 @@ index 95de763..bd1484b 100755
" "
fi fi
# the following are Darwin specific # the following are Darwin specific
@@ -3006,6 +3007,7 @@ case "$target_arch2" in @@ -3008,6 +3009,7 @@ case "$target_arch2" in
target_phys_bits=64 target_phys_bits=64
;; ;;
s390x) s390x)
@ -59,10 +59,10 @@ index 95de763..bd1484b 100755
target_phys_bits=64 target_phys_bits=64
;; ;;
*) *)
diff --git a/cpu-all.h b/cpu-all.h Index: qemu-0.14.1/cpu-all.h
index ffbd6a4..3713bce 100644 ===================================================================
--- a/cpu-all.h --- qemu-0.14.1.orig/cpu-all.h
+++ b/cpu-all.h +++ qemu-0.14.1/cpu-all.h
@@ -138,7 +138,7 @@ typedef union { @@ -138,7 +138,7 @@ typedef union {
uint64_t ll; uint64_t ll;
} CPU_DoubleU; } CPU_DoubleU;
@ -72,10 +72,10 @@ index ffbd6a4..3713bce 100644
typedef union { typedef union {
float128 q; float128 q;
#if defined(HOST_WORDS_BIGENDIAN) \ #if defined(HOST_WORDS_BIGENDIAN) \
diff --git a/cpu-defs.h b/cpu-defs.h Index: qemu-0.14.1/cpu-defs.h
index 8d4bf86..1d489c5 100644 ===================================================================
--- a/cpu-defs.h --- qemu-0.14.1.orig/cpu-defs.h
+++ b/cpu-defs.h +++ qemu-0.14.1/cpu-defs.h
@@ -148,6 +148,13 @@ typedef struct CPUWatchpoint { @@ -148,6 +148,13 @@ typedef struct CPUWatchpoint {
} CPUWatchpoint; } CPUWatchpoint;
@ -98,10 +98,10 @@ index 8d4bf86..1d489c5 100644
volatile sig_atomic_t exit_request; \ volatile sig_atomic_t exit_request; \
CPU_COMMON_TLB \ CPU_COMMON_TLB \
struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; \ struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; \
diff --git a/cpu-exec.c b/cpu-exec.c Index: qemu-0.14.1/cpu-exec.c
index 8c9fb8b..38ce4c0 100644 ===================================================================
--- a/cpu-exec.c --- qemu-0.14.1.orig/cpu-exec.c
+++ b/cpu-exec.c +++ qemu-0.14.1/cpu-exec.c
@@ -229,6 +229,9 @@ int cpu_exec(CPUState *env1) @@ -229,6 +229,9 @@ int cpu_exec(CPUState *env1)
TranslationBlock *tb; TranslationBlock *tb;
uint8_t *tc_ptr; uint8_t *tc_ptr;
@ -137,18 +137,17 @@ index 8c9fb8b..38ce4c0 100644
/* cpu_interrupt might be called while translating the /* cpu_interrupt might be called while translating the
TB, but before it is linked into a potentially TB, but before it is linked into a potentially
diff --git a/default-configs/s390x-linux-user.mak b/default-configs/s390x-linux-user.mak Index: qemu-0.14.1/default-configs/s390x-linux-user.mak
new file mode 100644 ===================================================================
index 0000000..a243c99
--- /dev/null --- /dev/null
+++ b/default-configs/s390x-linux-user.mak +++ qemu-0.14.1/default-configs/s390x-linux-user.mak
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+# Default configuration for s390x-linux-user +# Default configuration for s390x-linux-user
diff --git a/disas.c b/disas.c Index: qemu-0.14.1/disas.c
index c76f36f..dbc1d0a 100644 ===================================================================
--- a/disas.c --- qemu-0.14.1.orig/disas.c
+++ b/disas.c +++ qemu-0.14.1/disas.c
@@ -215,6 +215,9 @@ void target_disas(FILE *out, target_ulong code, target_ulong size, int flags) @@ -215,6 +215,9 @@ void target_disas(FILE *out, target_ulon
disasm_info.mach = bfd_mach_cris_v32; disasm_info.mach = bfd_mach_cris_v32;
print_insn = print_insn_crisv32; print_insn = print_insn_crisv32;
} }
@ -158,11 +157,11 @@ index c76f36f..dbc1d0a 100644
#elif defined(TARGET_MICROBLAZE) #elif defined(TARGET_MICROBLAZE)
disasm_info.mach = bfd_arch_microblaze; disasm_info.mach = bfd_arch_microblaze;
print_insn = print_insn_microblaze; print_insn = print_insn_microblaze;
diff --git a/linux-user/elfload.c b/linux-user/elfload.c Index: qemu-0.14.1/linux-user/elfload.c
index 33d776d..8554a04 100644 ===================================================================
--- a/linux-user/elfload.c --- qemu-0.14.1.orig/linux-user/elfload.c
+++ b/linux-user/elfload.c +++ qemu-0.14.1/linux-user/elfload.c
@@ -793,6 +793,24 @@ static inline void init_thread(struct target_pt_regs *regs, @@ -793,6 +793,24 @@ static inline void init_thread(struct ta
#endif /* TARGET_ALPHA */ #endif /* TARGET_ALPHA */
@ -187,10 +186,10 @@ index 33d776d..8554a04 100644
#ifndef ELF_PLATFORM #ifndef ELF_PLATFORM
#define ELF_PLATFORM (NULL) #define ELF_PLATFORM (NULL)
#endif #endif
diff --git a/linux-user/main.c b/linux-user/main.c Index: qemu-0.14.1/linux-user/main.c
index 0d627d6..812efda 100644 ===================================================================
--- a/linux-user/main.c --- qemu-0.14.1.orig/linux-user/main.c
+++ b/linux-user/main.c +++ qemu-0.14.1/linux-user/main.c
@@ -2624,6 +2624,86 @@ void cpu_loop (CPUState *env) @@ -2624,6 +2624,86 @@ void cpu_loop (CPUState *env)
} }
#endif /* TARGET_ALPHA */ #endif /* TARGET_ALPHA */
@ -278,7 +277,7 @@ index 0d627d6..812efda 100644
static void usage(void) static void usage(void)
{ {
printf("qemu-" TARGET_ARCH " version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n" printf("qemu-" TARGET_ARCH " version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
@@ -3354,6 +3434,15 @@ int main(int argc, char **argv, char **envp) @@ -3354,6 +3434,15 @@ int main(int argc, char **argv, char **e
env->regs[15] = regs->acr; env->regs[15] = regs->acr;
env->pc = regs->erp; env->pc = regs->erp;
} }
@ -294,11 +293,10 @@ index 0d627d6..812efda 100644
#else #else
#error unsupported target CPU #error unsupported target CPU
#endif #endif
diff --git a/linux-user/s390x/syscall.h b/linux-user/s390x/syscall.h Index: qemu-0.14.1/linux-user/s390x/syscall.h
new file mode 100644 ===================================================================
index 0000000..a3812a8
--- /dev/null --- /dev/null
+++ b/linux-user/s390x/syscall.h +++ qemu-0.14.1/linux-user/s390x/syscall.h
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
+/* this typedef defines how a Program Status Word looks like */ +/* this typedef defines how a Program Status Word looks like */
+typedef struct +typedef struct
@ -325,11 +323,10 @@ index 0000000..a3812a8
+}; +};
+ +
+#define UNAME_MACHINE "s390x" +#define UNAME_MACHINE "s390x"
diff --git a/linux-user/s390x/syscall_nr.h b/linux-user/s390x/syscall_nr.h Index: qemu-0.14.1/linux-user/s390x/syscall_nr.h
new file mode 100644 ===================================================================
index 0000000..4a60b9a
--- /dev/null --- /dev/null
+++ b/linux-user/s390x/syscall_nr.h +++ qemu-0.14.1/linux-user/s390x/syscall_nr.h
@@ -0,0 +1,348 @@ @@ -0,0 +1,348 @@
+/* +/*
+ * This file contains the system call numbers. + * This file contains the system call numbers.
@ -679,11 +676,10 @@ index 0000000..4a60b9a
+ +
+#endif +#endif
+ +
diff --git a/linux-user/s390x/target_signal.h b/linux-user/s390x/target_signal.h Index: qemu-0.14.1/linux-user/s390x/target_signal.h
new file mode 100644 ===================================================================
index 0000000..b4816b0
--- /dev/null --- /dev/null
+++ b/linux-user/s390x/target_signal.h +++ qemu-0.14.1/linux-user/s390x/target_signal.h
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
+#ifndef TARGET_SIGNAL_H +#ifndef TARGET_SIGNAL_H
+#define TARGET_SIGNAL_H +#define TARGET_SIGNAL_H
@ -711,11 +707,10 @@ index 0000000..b4816b0
+} +}
+ +
+#endif /* TARGET_SIGNAL_H */ +#endif /* TARGET_SIGNAL_H */
diff --git a/linux-user/s390x/termbits.h b/linux-user/s390x/termbits.h Index: qemu-0.14.1/linux-user/s390x/termbits.h
new file mode 100644 ===================================================================
index 0000000..2a78a05
--- /dev/null --- /dev/null
+++ b/linux-user/s390x/termbits.h +++ qemu-0.14.1/linux-user/s390x/termbits.h
@@ -0,0 +1,283 @@ @@ -0,0 +1,283 @@
+/* +/*
+ * include/asm-s390/termbits.h + * include/asm-s390/termbits.h
@ -1000,10 +995,10 @@ index 0000000..2a78a05
+ +
+#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ +#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */
+ +
diff --git a/linux-user/signal.c b/linux-user/signal.c Index: qemu-0.14.1/linux-user/signal.c
index b01bd64..8b02b32 100644 ===================================================================
--- a/linux-user/signal.c --- qemu-0.14.1.orig/linux-user/signal.c
+++ b/linux-user/signal.c +++ qemu-0.14.1/linux-user/signal.c
@@ -3614,6 +3614,320 @@ long do_rt_sigreturn(CPUState *env) @@ -3614,6 +3614,320 @@ long do_rt_sigreturn(CPUState *env)
return -TARGET_ENOSYS; return -TARGET_ENOSYS;
} }
@ -1325,11 +1320,11 @@ index b01bd64..8b02b32 100644
#elif defined(TARGET_PPC) && !defined(TARGET_PPC64) #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
/* FIXME: Many of the structures are defined for both PPC and PPC64, but /* FIXME: Many of the structures are defined for both PPC and PPC64, but
diff --git a/linux-user/syscall.c b/linux-user/syscall.c Index: qemu-0.14.1/linux-user/syscall.c
index 1a98433..fe8fb1e 100644 ===================================================================
--- a/linux-user/syscall.c --- qemu-0.14.1.orig/linux-user/syscall.c
+++ b/linux-user/syscall.c +++ qemu-0.14.1/linux-user/syscall.c
@@ -194,7 +194,7 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \ @@ -194,7 +194,7 @@ static type name (type1 arg1,type2 arg2,
#define __NR_sys_inotify_add_watch __NR_inotify_add_watch #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
#define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
@ -1338,7 +1333,7 @@ index 1a98433..fe8fb1e 100644
#define __NR__llseek __NR_lseek #define __NR__llseek __NR_lseek
#endif #endif
@@ -321,7 +321,7 @@ static int sys_fchmodat(int dirfd, const char *pathname, mode_t mode) @@ -323,7 +323,7 @@ static int sys_fchmodat(int dirfd, const
return (fchmodat(dirfd, pathname, mode, 0)); return (fchmodat(dirfd, pathname, mode, 0));
} }
#endif #endif
@ -1347,7 +1342,7 @@ index 1a98433..fe8fb1e 100644
static int sys_fchownat(int dirfd, const char *pathname, uid_t owner, static int sys_fchownat(int dirfd, const char *pathname, uid_t owner,
gid_t group, int flags) gid_t group, int flags)
{ {
@@ -430,7 +430,7 @@ _syscall3(int,sys_faccessat,int,dirfd,const char *,pathname,int,mode) @@ -420,7 +420,7 @@ _syscall3(int,sys_faccessat,int,dirfd,co
#if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat) #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
_syscall3(int,sys_fchmodat,int,dirfd,const char *,pathname, mode_t,mode) _syscall3(int,sys_fchmodat,int,dirfd,const char *,pathname, mode_t,mode)
#endif #endif
@ -1356,7 +1351,7 @@ index 1a98433..fe8fb1e 100644
_syscall5(int,sys_fchownat,int,dirfd,const char *,pathname, _syscall5(int,sys_fchownat,int,dirfd,const char *,pathname,
uid_t,owner,gid_t,group,int,flags) uid_t,owner,gid_t,group,int,flags)
#endif #endif
@@ -3774,6 +3774,7 @@ static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp, @@ -3779,6 +3779,7 @@ static int do_fork(CPUState *env, unsign
#endif #endif
ts = qemu_mallocz(sizeof(TaskState)); ts = qemu_mallocz(sizeof(TaskState));
init_task_state(ts); init_task_state(ts);
@ -1364,7 +1359,7 @@ index 1a98433..fe8fb1e 100644
/* we create a new CPU instance. */ /* we create a new CPU instance. */
new_env = cpu_copy(env); new_env = cpu_copy(env);
#if defined(TARGET_I386) || defined(TARGET_SPARC) || defined(TARGET_PPC) #if defined(TARGET_I386) || defined(TARGET_SPARC) || defined(TARGET_PPC)
@@ -5443,7 +5444,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -5448,7 +5449,7 @@ abi_long do_syscall(void *cpu_env, int n
ret = get_errno(settimeofday(&tv, NULL)); ret = get_errno(settimeofday(&tv, NULL));
} }
break; break;
@ -1373,7 +1368,7 @@ index 1a98433..fe8fb1e 100644
case TARGET_NR_select: case TARGET_NR_select:
{ {
struct target_sel_arg_struct *sel; struct target_sel_arg_struct *sel;
@@ -5554,7 +5555,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -5563,7 +5564,9 @@ abi_long do_syscall(void *cpu_env, int n
#endif #endif
#ifdef TARGET_NR_mmap #ifdef TARGET_NR_mmap
case TARGET_NR_mmap: case TARGET_NR_mmap:
@ -1384,7 +1379,7 @@ index 1a98433..fe8fb1e 100644
{ {
abi_ulong *v; abi_ulong *v;
abi_ulong v1, v2, v3, v4, v5, v6; abi_ulong v1, v2, v3, v4, v5, v6;
@@ -6050,6 +6053,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6059,6 +6062,8 @@ abi_long do_syscall(void *cpu_env, int n
ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4)); ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
#elif defined(TARGET_CRIS) #elif defined(TARGET_CRIS)
ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg4, arg5)); ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg4, arg5));
@ -1393,7 +1388,7 @@ index 1a98433..fe8fb1e 100644
#else #else
ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5)); ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
#endif #endif
@@ -6254,8 +6259,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6263,8 +6268,12 @@ abi_long do_syscall(void *cpu_env, int n
} }
break; break;
#endif /* TARGET_NR_getdents64 */ #endif /* TARGET_NR_getdents64 */
@ -1407,7 +1402,7 @@ index 1a98433..fe8fb1e 100644
ret = do_select(arg1, arg2, arg3, arg4, arg5); ret = do_select(arg1, arg2, arg3, arg4, arg5);
break; break;
#endif #endif
@@ -6480,7 +6489,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6489,7 +6498,7 @@ abi_long do_syscall(void *cpu_env, int n
case TARGET_NR_sigaltstack: case TARGET_NR_sigaltstack:
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \ #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA) || \ defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA) || \
@ -1416,7 +1411,7 @@ index 1a98433..fe8fb1e 100644
ret = do_sigaltstack(arg1, arg2, get_sp_from_cpustate((CPUState *)cpu_env)); ret = do_sigaltstack(arg1, arg2, get_sp_from_cpustate((CPUState *)cpu_env));
break; break;
#else #else
@@ -6713,18 +6722,35 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6722,18 +6731,35 @@ abi_long do_syscall(void *cpu_env, int n
case TARGET_NR_setfsgid: case TARGET_NR_setfsgid:
ret = get_errno(setfsgid(arg1)); ret = get_errno(setfsgid(arg1));
break; break;
@ -1454,7 +1449,7 @@ index 1a98433..fe8fb1e 100644
ret = get_errno(getuid()); ret = get_errno(getuid());
break; break;
#endif #endif
@@ -6869,33 +6895,57 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6878,33 +6904,57 @@ abi_long do_syscall(void *cpu_env, int n
break; break;
#endif #endif
@ -1518,7 +1513,7 @@ index 1a98433..fe8fb1e 100644
{ {
int gidsetsize = arg1; int gidsetsize = arg1;
uint32_t *target_grouplist; uint32_t *target_grouplist;
@@ -6919,8 +6969,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6928,8 +6978,12 @@ abi_long do_syscall(void *cpu_env, int n
} }
break; break;
#endif #endif
@ -1532,7 +1527,7 @@ index 1a98433..fe8fb1e 100644
{ {
int gidsetsize = arg1; int gidsetsize = arg1;
uint32_t *target_grouplist; uint32_t *target_grouplist;
@@ -6940,18 +6994,30 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6949,18 +7003,30 @@ abi_long do_syscall(void *cpu_env, int n
} }
break; break;
#endif #endif
@ -1566,7 +1561,7 @@ index 1a98433..fe8fb1e 100644
{ {
uid_t ruid, euid, suid; uid_t ruid, euid, suid;
ret = get_errno(getresuid(&ruid, &euid, &suid)); ret = get_errno(getresuid(&ruid, &euid, &suid));
@@ -6964,13 +7030,21 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6973,13 +7039,21 @@ abi_long do_syscall(void *cpu_env, int n
} }
break; break;
#endif #endif
@ -1589,7 +1584,7 @@ index 1a98433..fe8fb1e 100644
{ {
gid_t rgid, egid, sgid; gid_t rgid, egid, sgid;
ret = get_errno(getresgid(&rgid, &egid, &sgid)); ret = get_errno(getresgid(&rgid, &egid, &sgid));
@@ -6983,31 +7057,51 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, @@ -6992,31 +7066,51 @@ abi_long do_syscall(void *cpu_env, int n
} }
break; break;
#endif #endif
@ -1646,10 +1641,10 @@ index 1a98433..fe8fb1e 100644
ret = get_errno(setfsgid(arg1)); ret = get_errno(setfsgid(arg1));
break; break;
#endif #endif
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h Index: qemu-0.14.1/linux-user/syscall_defs.h
index be612ce..c17bfc9 100644 ===================================================================
--- a/linux-user/syscall_defs.h --- qemu-0.14.1.orig/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h +++ qemu-0.14.1/linux-user/syscall_defs.h
@@ -55,7 +55,7 @@ @@ -55,7 +55,7 @@
#endif #endif
@ -1734,11 +1729,10 @@ index be612ce..c17bfc9 100644
#else #else
struct target_statfs { struct target_statfs {
uint32_t f_type; uint32_t f_type;
diff --git a/s390x.ld b/s390x.ld Index: qemu-0.14.1/s390x.ld
new file mode 100644 ===================================================================
index 0000000..7d1f2b7
--- /dev/null --- /dev/null
+++ b/s390x.ld +++ qemu-0.14.1/s390x.ld
@@ -0,0 +1,194 @@ @@ -0,0 +1,194 @@
+/* Default linker script, for normal executables */ +/* Default linker script, for normal executables */
+OUTPUT_FORMAT("elf64-s390", "elf64-s390", +OUTPUT_FORMAT("elf64-s390", "elf64-s390",
@ -1934,10 +1928,10 @@ index 0000000..7d1f2b7
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+ /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
+} +}
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh Index: qemu-0.14.1/scripts/qemu-binfmt-conf.sh
index 335ab05..7aa4a4a 100644 ===================================================================
--- a/scripts/qemu-binfmt-conf.sh --- qemu-0.14.1.orig/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh +++ qemu-0.14.1/scripts/qemu-binfmt-conf.sh
@@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
-# enable automatic i386/ARM/M68K/MIPS/SPARC/PPC program execution by the kernel -# enable automatic i386/ARM/M68K/MIPS/SPARC/PPC program execution by the kernel
@ -1946,16 +1940,16 @@ index 335ab05..7aa4a4a 100644
# load the binfmt_misc module # load the binfmt_misc module
if [ ! -d /proc/sys/fs/binfmt_misc ]; then if [ ! -d /proc/sys/fs/binfmt_misc ]; then
@@ -67,3 +67,6 @@ if [ $cpu != "sh" ] ; then @@ -67,3 +67,6 @@ if [ $cpu != "sh" ] ; then
echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4:' > /proc/sys/fs/binfmt_misc/register echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P' > /proc/sys/fs/binfmt_misc/register
echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb:' > /proc/sys/fs/binfmt_misc/register echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi fi
+if [ $cpu != "s390x" ] ; then +if [ $cpu != "s390x" ] ; then
+ echo ':s390x:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-s390x:' > /proc/sys/fs/binfmt_misc/register + echo ':s390x:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-s390x-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+fi +fi
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h Index: qemu-0.14.1/target-s390x/cpu.h
index e47c372..49a919e 100644 ===================================================================
--- a/target-s390x/cpu.h --- qemu-0.14.1.orig/target-s390x/cpu.h
+++ b/target-s390x/cpu.h +++ qemu-0.14.1/target-s390x/cpu.h
@@ -26,6 +26,14 @@ @@ -26,6 +26,14 @@
#define CPUState struct CPUS390XState #define CPUState struct CPUS390XState
@ -1980,7 +1974,7 @@ index e47c372..49a919e 100644
float_status fpu_status; /* passed to softfloat lib */ float_status fpu_status; /* passed to softfloat lib */
struct { struct {
@@ -85,8 +93,10 @@ static inline int cpu_mmu_index (CPUState *env) @@ -85,8 +93,10 @@ static inline int cpu_mmu_index (CPUStat
} }
CPUS390XState *cpu_s390x_init(const char *cpu_model); CPUS390XState *cpu_s390x_init(const char *cpu_model);
@ -1991,7 +1985,7 @@ index e47c372..49a919e 100644
/* you can call this signal handler from your SIGBUS and SIGSEGV /* you can call this signal handler from your SIGBUS and SIGSEGV
signal handlers to inform the virtual CPU of exceptions. non zero signal handlers to inform the virtual CPU of exceptions. non zero
@@ -97,29 +107,32 @@ int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw @@ -97,29 +107,32 @@ int cpu_s390x_handle_mmu_fault (CPUS390X
int mmu_idx, int is_softmuu); int mmu_idx, int is_softmuu);
#define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault #define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault
@ -2031,11 +2025,11 @@ index e47c372..49a919e 100644
#define EXCP_EXECUTE_SVC 0xff00000 /* supervisor call via execute insn */ #define EXCP_EXECUTE_SVC 0xff00000 /* supervisor call via execute insn */
static inline void cpu_get_tb_cpu_state(CPUState* env, target_ulong *pc, static inline void cpu_get_tb_cpu_state(CPUState* env, target_ulong *pc,
diff --git a/target-s390x/exec.h b/target-s390x/exec.h Index: qemu-0.14.1/target-s390x/exec.h
index bf3f264..6fe64a6 100644 ===================================================================
--- a/target-s390x/exec.h --- qemu-0.14.1.orig/target-s390x/exec.h
+++ b/target-s390x/exec.h +++ qemu-0.14.1/target-s390x/exec.h
@@ -34,6 +34,14 @@ static inline int cpu_has_work(CPUState *env) @@ -34,6 +34,14 @@ static inline int cpu_has_work(CPUState
return env->interrupt_request & CPU_INTERRUPT_HARD; // guess return env->interrupt_request & CPU_INTERRUPT_HARD; // guess
} }
@ -2050,10 +2044,10 @@ index bf3f264..6fe64a6 100644
static inline int cpu_halted(CPUState *env) static inline int cpu_halted(CPUState *env)
{ {
if (!env->halted) { if (!env->halted) {
diff --git a/target-s390x/helper.c b/target-s390x/helper.c Index: qemu-0.14.1/target-s390x/helper.c
index 4a5297b..6085e58 100644 ===================================================================
--- a/target-s390x/helper.c --- qemu-0.14.1.orig/target-s390x/helper.c
+++ b/target-s390x/helper.c +++ qemu-0.14.1/target-s390x/helper.c
@@ -26,8 +26,10 @@ @@ -26,8 +26,10 @@
#include "gdbstub.h" #include "gdbstub.h"
#include "qemu-common.h" #include "qemu-common.h"
@ -2065,7 +2059,7 @@ index 4a5297b..6085e58 100644
CPUS390XState *cpu_s390x_init(const char *cpu_model) CPUS390XState *cpu_s390x_init(const char *cpu_model)
{ {
@@ -38,6 +40,7 @@ CPUS390XState *cpu_s390x_init(const char *cpu_model) @@ -38,6 +40,7 @@ CPUS390XState *cpu_s390x_init(const char
cpu_exec_init(env); cpu_exec_init(env);
if (!inited) { if (!inited) {
inited = 1; inited = 1;
@ -2073,7 +2067,7 @@ index 4a5297b..6085e58 100644
} }
env->cpu_model_str = cpu_model; env->cpu_model_str = cpu_model;
@@ -46,6 +49,24 @@ CPUS390XState *cpu_s390x_init(const char *cpu_model) @@ -46,6 +49,24 @@ CPUS390XState *cpu_s390x_init(const char
return env; return env;
} }
@ -2114,11 +2108,10 @@ index 4a5297b..6085e58 100644
int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong address, int rw, int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
int mmu_idx, int is_softmmu) int mmu_idx, int is_softmmu)
{ {
diff --git a/target-s390x/helpers.h b/target-s390x/helpers.h Index: qemu-0.14.1/target-s390x/helpers.h
new file mode 100644 ===================================================================
index 0000000..6009312
--- /dev/null --- /dev/null
+++ b/target-s390x/helpers.h +++ qemu-0.14.1/target-s390x/helpers.h
@@ -0,0 +1,127 @@ @@ -0,0 +1,127 @@
+#include "def-helper.h" +#include "def-helper.h"
+ +
@ -2247,10 +2240,10 @@ index 0000000..6009312
+DEF_HELPER_2(sqdbr, void, i32, i32) +DEF_HELPER_2(sqdbr, void, i32, i32)
+ +
+#include "def-helper.h" +#include "def-helper.h"
diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c Index: qemu-0.14.1/target-s390x/op_helper.c
index 402df2d..20c83c5 100644 ===================================================================
--- a/target-s390x/op_helper.c --- qemu-0.14.1.orig/target-s390x/op_helper.c
+++ b/target-s390x/op_helper.c +++ qemu-0.14.1/target-s390x/op_helper.c
@@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
/* /*
* S/390 helper routines * S/390 helper routines
@ -2268,7 +2261,7 @@ index 402df2d..20c83c5 100644
/*****************************************************************************/ /*****************************************************************************/
/* Softmmu support */ /* Softmmu support */
@@ -71,3 +74,1607 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) @@ -71,3 +74,1607 @@ void tlb_fill (target_ulong addr, int is
} }
#endif #endif
@ -3876,10 +3869,10 @@ index 402df2d..20c83c5 100644
+{ +{
+ env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status); + env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status);
+} +}
diff --git a/target-s390x/translate.c b/target-s390x/translate.c Index: qemu-0.14.1/target-s390x/translate.c
index d33bfb1..e08dcf4 100644 ===================================================================
--- a/target-s390x/translate.c --- qemu-0.14.1.orig/target-s390x/translate.c
+++ b/target-s390x/translate.c +++ qemu-0.14.1/target-s390x/translate.c
@@ -16,6 +16,18 @@ @@ -16,6 +16,18 @@
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
@ -3925,7 +3918,7 @@ index d33bfb1..e08dcf4 100644
void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf, void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
int flags) int flags)
{ {
@@ -46,12 +77,2776 @@ void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf, @@ -46,12 +77,2776 @@ void cpu_dump_state(CPUState *env, FILE
cpu_fprintf(f, "PSW=mask %016lx addr %016lx cc %02x\n", env->psw.mask, env->psw.addr, env->cc); cpu_fprintf(f, "PSW=mask %016lx addr %016lx cc %02x\n", env->psw.mask, env->psw.addr, env->cc);
} }
@ -6702,10 +6695,10 @@ index d33bfb1..e08dcf4 100644
} }
void gen_pc_load(CPUState *env, TranslationBlock *tb, void gen_pc_load(CPUState *env, TranslationBlock *tb,
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h Index: qemu-0.14.1/tcg/tcg-op.h
index 207a89f..f5de104 100644 ===================================================================
--- a/tcg/tcg-op.h --- qemu-0.14.1.orig/tcg/tcg-op.h
+++ b/tcg/tcg-op.h +++ qemu-0.14.1/tcg/tcg-op.h
@@ -366,6 +366,18 @@ static inline void tcg_gen_br(int label) @@ -366,6 +366,18 @@ static inline void tcg_gen_br(int label)
tcg_gen_op1i(INDEX_op_br, label); tcg_gen_op1i(INDEX_op_br, label);
} }
@ -6725,11 +6718,11 @@ index 207a89f..f5de104 100644
static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
{ {
if (!TCGV_EQUAL_I32(ret, arg)) if (!TCGV_EQUAL_I32(ret, arg))
diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h Index: qemu-0.14.1/tcg/tcg-opc.h
index 2c7ca1a..938b1a0 100644 ===================================================================
--- a/tcg/tcg-opc.h --- qemu-0.14.1.orig/tcg/tcg-opc.h
+++ b/tcg/tcg-opc.h +++ qemu-0.14.1/tcg/tcg-opc.h
@@ -41,6 +41,7 @@ DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS) /* variable number of parameters */ @@ -41,6 +41,7 @@ DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS)
DEF(jmp, 0, 1, 0, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) DEF(jmp, 0, 1, 0, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
@ -6745,11 +6738,11 @@ index 2c7ca1a..938b1a0 100644
DEF(mov_i64, 1, 1, 0, 0) DEF(mov_i64, 1, 1, 0, 0)
DEF(movi_i64, 1, 0, 1, 0) DEF(movi_i64, 1, 0, 1, 0)
DEF(setcond_i64, 1, 2, 1, 0) DEF(setcond_i64, 1, 2, 1, 0)
diff --git a/tcg/tcg.c b/tcg/tcg.c Index: qemu-0.14.1/tcg/tcg.c
index 5dd6a2c..a75772a 100644 ===================================================================
--- a/tcg/tcg.c --- qemu-0.14.1.orig/tcg/tcg.c
+++ b/tcg/tcg.c +++ qemu-0.14.1/tcg/tcg.c
@@ -2022,6 +2022,12 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, @@ -2022,6 +2022,12 @@ static inline int tcg_gen_code_common(TC
// dump_regs(s); // dump_regs(s);
#endif #endif
switch(opc) { switch(opc) {
@ -6762,6 +6755,3 @@ index 5dd6a2c..a75772a 100644
case INDEX_op_mov_i32: case INDEX_op_mov_i32:
#if TCG_TARGET_REG_BITS == 64 #if TCG_TARGET_REG_BITS == 64
case INDEX_op_mov_i64: case INDEX_op_mov_i64:
--
1.7.1

View File

@ -0,0 +1,117 @@
From agraf@suse.de Thu, 29 Sep 2011 11:00:25 +0200
Return-Path: <agraf@suse.de>
Received: from imap.suse.de ([unix socket])
by imap-int (Cyrus v2.2.12) with LMTPA;
Thu, 29 Sep 2011 11:07:10 +0200
X-Sieve: CMU Sieve 2.2
Received: from relay2.suse.de (relay2.suse.de [149.44.160.134])
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(Client CN "relay.suse.de", Issuer "CAcert Class 3 Root" (verified OK))
by imap.suse.de (Postfix) with ESMTPS id AF8563C539A9
for <adrian@imap.suse.de>; Thu, 29 Sep 2011 11:07:10 +0200 (CEST)
Received: by relay2.suse.de (Postfix)
id A639118552E6; Thu, 29 Sep 2011 11:07:10 +0200 (CEST)
Received: from imap.suse.de (loadbalancer1.suse.de [149.44.160.248])
(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
(No client certificate requested)
by relay2.suse.de (Postfix) with ESMTPS id A573518552E1;
Thu, 29 Sep 2011 11:07:10 +0200 (CEST)
Received: from localhost.localdomain (charybdis-ext.suse.de [195.135.221.2])
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(Client did not present a certificate)
by imap.suse.de (Postfix) with ESMTPSA id 7AD993C539A9;
Thu, 29 Sep 2011 11:07:10 +0200 (CEST)
From: Alexander Graf <agraf@suse.de>
To: adrian@suse.de
Cc: Peter Maydell <peter.maydell@linaro.org>, Riku Voipio <riku.voipio@linaro.org>
Subject: [PATCH] linux-user: Implement prlimit64 syscall
Date: Thu, 29 Sep 2011 11:00:25 +0200
Message-Id: <1317286825-2033-1-git-send-email-agraf@suse.de>
X-Mailer: git-send-email 1.6.0.2
From: Peter Maydell <peter.maydell@linaro.org>
Implement the prlimit64 syscall.
Slightly modified to apply upstream -Riku
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Index: qemu-0.14.1/linux-user/syscall.c
===================================================================
--- qemu-0.14.1.orig/linux-user/syscall.c
+++ qemu-0.14.1/linux-user/syscall.c
@@ -524,6 +524,21 @@ static int sys_inotify_init1(int flags)
#endif /* CONFIG_INOTIFY */
+#if defined(TARGET_NR_prlimit64)
+#ifndef __NR_prlimit64
+# define __NR_prlimit64 -1
+#endif
+#define __NR_sys_prlimit64 __NR_prlimit64
+/* The glibc rlimit structure may not be that used by the underlying syscall */
+struct host_rlimit64 {
+ uint64_t rlim_cur;
+ uint64_t rlim_max;
+};
+_syscall4(int, sys_prlimit64, pid_t, pid, int, resource,
+ const struct host_rlimit64 *, new_limit,
+ struct host_rlimit64 *, old_limit)
+#endif
+
extern int personality(int);
extern int flock(int, int);
extern int setfsuid(int);
@@ -7620,6 +7635,34 @@ abi_long do_syscall(void *cpu_env, int n
break;
}
#endif
+#ifdef TARGET_NR_prlimit64
+ case TARGET_NR_prlimit64:
+ {
+ /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
+ struct target_rlimit64 *target_rnew, *target_rold;
+ struct host_rlimit64 rnew, rold, *rnewp = 0;
+ if (arg3) {
+ if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
+ goto efault;
+ }
+ rnew.rlim_cur = tswap64(target_rnew->rlim_cur);
+ rnew.rlim_max = tswap64(target_rnew->rlim_max);
+ unlock_user_struct(target_rnew, arg3, 0);
+ rnewp = &rnew;
+ }
+
+ ret = get_errno(sys_prlimit64(arg1, arg2, rnewp, arg4 ? &rold : 0));
+ if (!is_error(ret) && arg4) {
+ if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) {
+ goto efault;
+ }
+ target_rold->rlim_cur = tswap64(rold.rlim_cur);
+ target_rold->rlim_max = tswap64(rold.rlim_max);
+ unlock_user_struct(target_rold, arg4, 1);
+ }
+ break;
+ }
+#endif
default:
unimplemented:
Index: qemu-0.14.1/linux-user/syscall_defs.h
===================================================================
--- qemu-0.14.1.orig/linux-user/syscall_defs.h
+++ qemu-0.14.1/linux-user/syscall_defs.h
@@ -2237,6 +2237,11 @@ struct target_mq_attr {
abi_long mq_curmsgs;
};
+struct target_rlimit64 {
+ uint64_t rlim_cur;
+ uint64_t rlim_max;
+};
+
#include "socket.h"
#include "errno_defs.h"

View File

@ -0,0 +1,34 @@
From: Alexander Graf <agraf@suse.de>
fixes some SMP races
---
cpu-all.h | 2 +-
exec.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Index: qemu-0.14.1/cpu-all.h
===================================================================
--- qemu-0.14.1.orig/cpu-all.h
+++ qemu-0.14.1/cpu-all.h
@@ -775,7 +775,7 @@ void cpu_dump_statistics(CPUState *env,
void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
GCC_FMT_ATTR(2, 3);
extern CPUState *first_cpu;
-extern CPUState *cpu_single_env;
+extern __thread CPUState *cpu_single_env;
#define CPU_INTERRUPT_HARD 0x02 /* hardware interrupt pending */
#define CPU_INTERRUPT_EXITTB 0x04 /* exit the current TB (use for x86 a20 case) */
Index: qemu-0.14.1/exec.c
===================================================================
--- qemu-0.14.1.orig/exec.c
+++ qemu-0.14.1/exec.c
@@ -112,7 +112,7 @@ RAMList ram_list = { .blocks = QLIST_HEA
CPUState *first_cpu;
/* current CPU in the current thread. It is only valid inside
cpu_exec() */
-CPUState *cpu_single_env;
+__thread CPUState *cpu_single_env;
/* 0 = Do not count executed instructions.
1 = Precise instruction counting.
2 = Adaptive rate instruction counting. */

View File

@ -0,0 +1,167 @@
From 864b2c7da05bc29a94b3e792b100dd5189576942 Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Date: Fri, 30 Sep 2011 19:40:36 +0200
Subject: [PATCH] linux-user: add binfmt wrapper for argv[0] handling
When using qemu's linux-user binaries through binfmt, argv[0] gets lost
along the execution because qemu only gets passed in the full file name
to the executable while argv[0] can be something completely different.
This breaks in some subtile situations, such as the grep and make test
suites.
This patch adds a wrapper binary called qemu-$TARGET-binfmt that can be
used with binfmt's P flag which passes the full path _and_ argv[0] to
the binfmt handler.
The binary would be smart enough to be versatile and only exist in the
system once, creating the qemu binary path names from its own argv[0].
However, this seemed like it didn't fit the make system too well, so
we're currently creating a new binary for each target archictecture.
CC: Reinhard Max <max@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
Makefile.target | 8 ++++++++
linux-user/binfmt.c | 42 ++++++++++++++++++++++++++++++++++++++++++
scripts/qemu-binfmt-conf.sh | 34 +++++++++++++++++-----------------
3 files changed, 67 insertions(+), 17 deletions(-)
create mode 100644 linux-user/binfmt.c
Index: qemu-0.14.1/Makefile.target
===================================================================
--- qemu-0.14.1.orig/Makefile.target
+++ qemu-0.14.1/Makefile.target
@@ -33,6 +33,10 @@ endif
PROGS=$(QEMU_PROG)
STPFILES=
+ifdef CONFIG_LINUX_USER
+PROGS+=$(QEMU_PROG)-binfmt
+endif
+
ifndef CONFIG_HAIKU
LIBS+=-lm
endif
@@ -131,6 +135,8 @@ obj-y += $(addprefix ../libuser/, $(user
obj-y += $(addprefix ../libdis-user/, $(libdis-y))
obj-y += $(libobj-y)
+obj-binfmt-y += binfmt.o
+
endif #CONFIG_LINUX_USER
#########################################################
@@ -346,6 +352,8 @@ obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml
$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
$(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y))
+$(QEMU_PROG)-binfmt: $(obj-binfmt-y)
+ $(call LINK,$^)
gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh
$(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES)," GEN $(TARGET_DIR)$@")
Index: qemu-0.14.1/linux-user/binfmt.c
===================================================================
--- /dev/null
+++ qemu-0.14.1/linux-user/binfmt.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+int main(int argc, char **argv, char **envp)
+{
+ char *binfmt;
+ char **new_argv;
+
+ /*
+ * Check if our file name ends with -binfmt
+ */
+ binfmt = argv[0] + strlen(argv[0]) - strlen("-binfmt");
+ if (strcmp(binfmt, "-binfmt")) {
+ fprintf(stderr, "%s: Invalid executable name\n", argv[0]);
+ exit(1);
+ }
+ if (argc < 3) {
+ fprintf(stderr, "%s: Please use me through binfmt with P flag\n",
+ argv[0]);
+ exit(1);
+ }
+
+ binfmt[0] = '\0';
+ /* Now argv[0] is the real qemu binary name */
+
+ new_argv = (char **)malloc((argc + 2) * sizeof(*new_argv));
+ if (argc > 3) {
+ memcpy(&new_argv[4], &argv[3], (argc - 3) * sizeof(*new_argv));
+ }
+ new_argv[0] = argv[0];
+ new_argv[1] = (char *)"-0";
+ new_argv[2] = argv[2];
+ new_argv[3] = argv[1];
+ new_argv[argc + 1] = NULL;
+
+ return execve(new_argv[0], new_argv, envp);
+}
Index: qemu-0.14.1/scripts/qemu-binfmt-conf.sh
===================================================================
--- qemu-0.14.1.orig/scripts/qemu-binfmt-conf.sh
+++ qemu-0.14.1/scripts/qemu-binfmt-conf.sh
@@ -34,36 +34,36 @@ esac
# register the interpreter for each cpu except for the native one
if [ $cpu != "i386" ] ; then
- echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
- echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:' > /proc/sys/fs/binfmt_misc/register
+ echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "alpha" ] ; then
- echo ':alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-alpha:' > /proc/sys/fs/binfmt_misc/register
+ echo ':alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-alpha-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "arm" ] ; then
- echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register
- echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register
+ echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "sparc" ] ; then
- echo ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc:' > /proc/sys/fs/binfmt_misc/register
+ echo ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "ppc" ] ; then
- echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc:' > /proc/sys/fs/binfmt_misc/register
+ echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "m68k" ] ; then
echo 'Please check cpu value and header information for m68k!'
- echo ':m68k:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-m68k:' > /proc/sys/fs/binfmt_misc/register
+ echo ':m68k:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-m68k-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "mips" ] ; then
# FIXME: We could use the other endianness on a MIPS host.
- echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips:' > /proc/sys/fs/binfmt_misc/register
- echo ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:' > /proc/sys/fs/binfmt_misc/register
- echo ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32:' > /proc/sys/fs/binfmt_misc/register
- echo ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsn32el:' > /proc/sys/fs/binfmt_misc/register
- echo ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64:' > /proc/sys/fs/binfmt_misc/register
- echo ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el:' > /proc/sys/fs/binfmt_misc/register
+ echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsn32el-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi
if [ $cpu != "sh" ] ; then
- echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4:' > /proc/sys/fs/binfmt_misc/register
- echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb:' > /proc/sys/fs/binfmt_misc/register
+ echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P' > /proc/sys/fs/binfmt_misc/register
+ echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P' > /proc/sys/fs/binfmt_misc/register
fi

View File

@ -1,3 +1,20 @@
-------------------------------------------------------------------
Tue Oct 4 08:09:57 UTC 2011 - adrian@suse.de
- add binfmt misc handler binary patch from alex. This is a handler
which calls qemu with -0 argument and right parameters to avoid
broken runs due to different set $0 as on real hardware
- move arch specific patches at the end to avoid arch dep conflicts
with other patches
- enable linux-user build to get binfmt handler
-------------------------------------------------------------------
Thu Sep 29 09:21:17 UTC 2011 - adrian@suse.de
- add 0021-implement-prlimit64-syscall.patch from upstream to avoid
output and confused configure scripts when testing gcc on armv7hl
- add 0022-fixing-smp-races.patch from alex to fix some SMP races
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Sep 27 09:57:34 UTC 2011 - adrian@suse.de Tue Sep 27 09:57:34 UTC 2011 - adrian@suse.de

View File

@ -45,6 +45,9 @@ Patch17: 0017-S-390-build-fix.patch
Patch18: 0018-qemu-0.14.1-mcast-udp.patch Patch18: 0018-qemu-0.14.1-mcast-udp.patch
Patch19: 0019-linux-user-fix-openat.patch Patch19: 0019-linux-user-fix-openat.patch
Patch20: 0020-linux-user-implement-reboot-syscall.patch Patch20: 0020-linux-user-implement-reboot-syscall.patch
Patch21: 0021-implement-prlimit64-syscall.patch
Patch22: 0022-fixing-smp-races.patch
Patch23: 0023-linux-user-add-binfmt-wrapper-for-argv-0-handling.patch
# this is to make lint happy # this is to make lint happy
Source300: rpmlintrc Source300: rpmlintrc
BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build
@ -57,6 +60,7 @@ BuildRequires: cyrus-sasl-devel
BuildRequires: e2fsprogs-devel BuildRequires: e2fsprogs-devel
BuildRequires: libaio BuildRequires: libaio
BuildRequires: libaio-devel BuildRequires: libaio-devel
BuildRequires: libattr-devel
BuildRequires: libgnutls-devel BuildRequires: libgnutls-devel
BuildRequires: libpcap-devel BuildRequires: libpcap-devel
BuildRequires: ncurses-devel BuildRequires: ncurses-devel
@ -99,15 +103,18 @@ Authors:
%patch11 -p1 %patch11 -p1
%patch12 -p1 %patch12 -p1
%patch13 -p1 %patch13 -p1
%patch16 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%ifarch s390x ppc64 x86_64 %ifarch s390x ppc64 x86_64
# s390 target only builds on 64-bit machines # s390 target only builds on 64-bit machines
%patch15 -p1 %patch15 -p1
%patch17 -p1 %patch17 -p1
%endif %endif
%patch16 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%build %build
# build QEMU # build QEMU