[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 20/24] linux-user: Allow targets to specify a min
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v6 20/24] linux-user: Allow targets to specify a minimum uname release |
Date: |
Tue, 3 Sep 2013 20:12:20 +0100 |
For newer target architectures, glibc can be picky about the kernel
version: for example, it will not run on an aarch64 system unless
the kernel reports itself as at least 3.8.0. Accommodate this by
enhancing the existing support for faking the kernel version so
that each target can optionally specify a minimum version: if
the user doesn't force a specific fake version then we will override
with the minimum required version only if the real host kernel
version is insufficient.
Use this facility to let aarch64 report a minimum of 3.8.0.
Signed-off-by: Peter Maydell <address@hidden>
---
linux-user/main.c | 2 ++
linux-user/qemu.h | 1 +
linux-user/syscall.c | 62 ++++++++++++++++++++++++++++++++++++++------------
3 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index 28cc58a..d530f01 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -3672,6 +3672,8 @@ int main(int argc, char **argv, char **envp)
/* Scan interp_prefix dir for replacement files. */
init_paths(interp_prefix);
+ init_qemu_uname_release();
+
if (cpu_model == NULL) {
#if defined(TARGET_I386)
#ifdef TARGET_X86_64
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index 4df4fcb..6ffe5a2 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -197,6 +197,7 @@ extern THREAD CPUState *thread_cpu;
void cpu_loop(CPUArchState *env);
char *target_strerror(int err);
int get_osversion(void);
+void init_qemu_uname_release(void);
void fork_start(void);
void fork_end(int child);
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 73046b0..180463d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -4863,12 +4863,35 @@ int host_to_target_waitstatus(int status)
return status;
}
+static int relstr_to_int(const char *s)
+{
+ /* Convert a uname release string like "2.6.18" to an integer
+ * of the form 0x020612. (Beware that 0x020612 is *not* 2.6.12.)
+ */
+ int i, n, tmp;
+
+ tmp = 0;
+ for (i = 0; i < 3; i++) {
+ n = 0;
+ while (*s >= '0' && *s <= '9') {
+ n *= 10;
+ n += *s - '0';
+ s++;
+ }
+ tmp = (tmp << 8) + n;
+ if (*s == '.') {
+ s++;
+ }
+ }
+ return tmp;
+}
+
int get_osversion(void)
{
static int osversion;
struct new_utsname buf;
const char *s;
- int i, n, tmp;
+
if (osversion)
return osversion;
if (qemu_uname_release && *qemu_uname_release) {
@@ -4878,22 +4901,33 @@ int get_osversion(void)
return 0;
s = buf.release;
}
- tmp = 0;
- for (i = 0; i < 3; i++) {
- n = 0;
- while (*s >= '0' && *s <= '9') {
- n *= 10;
- n += *s - '0';
- s++;
- }
- tmp = (tmp << 8) + n;
- if (*s == '.')
- s++;
- }
- osversion = tmp;
+ osversion = relstr_to_int(s);
return osversion;
}
+void init_qemu_uname_release(void)
+{
+ /* Initialize qemu_uname_release for later use.
+ * If the host kernel is too old and the user hasn't asked for
+ * a specific fake version number, we might want to fake a minimum
+ * target kernel version.
+ */
+#ifdef UNAME_MINIMUM_RELEASE
+ struct new_utsname buf;
+
+ if (qemu_uname_release && *qemu_uname_release) {
+ return;
+ }
+
+ if (sys_uname(&buf)) {
+ return;
+ }
+
+ if (relstr_to_int(buf.release) < relstr_to_int(UNAME_MINIMUM_RELEASE)) {
+ qemu_uname_release = UNAME_MINIMUM_RELEASE;
+ }
+#endif
+}
static int open_self_maps(void *cpu_env, int fd)
{
--
1.7.9.5
- [Qemu-devel] [PATCH v6 08/24] target-arm: Disable 32 bit CPUs in 64 bit linux-user builds, (continued)
- [Qemu-devel] [PATCH v6 08/24] target-arm: Disable 32 bit CPUs in 64 bit linux-user builds, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 17/24] linux-user: Make sure NWFPE code is 32 bit ARM only, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 12/24] linux-user: Don't treat AArch64 cpu names specially, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 22/24] configure: Add handling code for AArch64 targets, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 04/24] target-arm: Export cpu_env, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 03/24] target-arm: Extract the disas struct to a header file, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 18/24] linux-user: Implement cpu_set_tls() and cpu_clone_regs() for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 13/24] linux-user: Add cpu loop for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 07/24] target-arm: Add new AArch64CPUInfo base class and subclasses, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 21/24] linux-user: Add AArch64 support, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 20/24] linux-user: Allow targets to specify a minimum uname release,
Peter Maydell <=
- [Qemu-devel] [PATCH v6 06/24] target-arm: Pass DisasContext* to gen_set_pc_im(), Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 19/24] linux-user: Add AArch64 termbits.h definitions, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 11/24] target-arm: Add AArch64 gdbstub support, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 16/24] linux-user: Add signal handling for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 10/24] target-arm: Add AArch64 translation stub, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 14/24] linux-user: Add syscall number definitions for AArch64, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 09/24] target-arm: Prepare translation for AArch64 code, Peter Maydell, 2013/09/03
- [Qemu-devel] [PATCH v6 02/24] target-arm: Abstract out load/store from a vaddr in AArch32, Peter Maydell, 2013/09/03