From patchwork Mon Feb 16 13:52:28 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chen Gang X-Patchwork-Id: 440128 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 591ED140213 for ; Tue, 17 Feb 2015 00:45:22 +1100 (AEDT) Received: from localhost ([::1]:39564 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNLzD-0008GS-7J for incoming@patchwork.ozlabs.org; Mon, 16 Feb 2015 08:45:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52157) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNLyl-0007bK-ES for qemu-devel@nongnu.org; Mon, 16 Feb 2015 08:44:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YNLyf-0003gx-Oe for qemu-devel@nongnu.org; Mon, 16 Feb 2015 08:44:51 -0500 Received: from out11.biz.mail.alibaba.com ([205.204.114.131]:43397) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNLyf-0003g6-Aq for qemu-devel@nongnu.org; Mon, 16 Feb 2015 08:44:45 -0500 X-Alimail-AntiSpam: AC=CONTINUE; BC=0.07423284|-1; FP=0|0|0|0|0|-1|-1|-1; HT=r41g03020; MF=gang.chen@sunrus.com.cn; PH=DS; RN=6; RT=6; SR=0; Received: from ShengShiZhuChengdeMacBook-Pro.local(mailfrom:gang.chen@sunrus.com.cn ip:223.72.65.78) by smtp.aliyun-inc.com(10.147.11.246); Mon, 16 Feb 2015 21:44:38 +0800 Message-ID: <54E1F61C.4040803@sunrus.com.cn> Date: Mon, 16 Feb 2015 21:52:28 +0800 From: Chen Gang S User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Peter Maydell , Chris Metcalf , Riku Voipio , "rth@twiddle.net" , "walt@tilera.com" References: <54E1F540.5070900@sunrus.com.cn> In-Reply-To: <54E1F540.5070900@sunrus.com.cn> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 205.204.114.131 Cc: qemu-devel Subject: [Qemu-devel] [PATCH 5/6 v2] linux-user: Support tilegx architecture in linux-user X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Add main working flow feature and loading elf64 tilegx binary feature, based on Linux kernel tilegx 64-bit implementation. After this patch, qemu can successfully load elf64 tilegx binary for linux-user, and the working flow reaches the first correct instruction position "__start". Signed-off-by: Chen Gang --- include/elf.h | 2 ++ linux-user/elfload.c | 23 +++++++++++++++++ linux-user/main.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/include/elf.h b/include/elf.h index a516584..e70512c 100644 --- a/include/elf.h +++ b/include/elf.h @@ -133,6 +133,8 @@ typedef int64_t Elf64_Sxword; #define EM_AARCH64 183 +#define EM_TILEGX 191 /* Tilegx */ + /* This is the info that is needed to parse the dynamic section of the file */ #define DT_NULL 0 #define DT_NEEDED 1 diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 399c021..12e3ab8 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1189,6 +1189,29 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i #endif /* TARGET_S390X */ +#ifdef TARGET_TILEGX + +/* 42 bits real used address, a half for user mode */ +#define ELF_START_MMAP (0x00000020000000000ULL) + +#define elf_check_arch(x) ((x) == EM_TILEGX) + +#define ELF_CLASS ELFCLASS64 +#define ELF_DATA ELFDATA2LSB +#define ELF_ARCH EM_TILEGX + +static inline void init_thread(struct target_pt_regs *regs, + struct image_info *infop) +{ + regs->lr = infop->entry; + regs->sp = infop->start_stack; + +} + +#define ELF_EXEC_PAGESIZE 65536 /* Tilegx page size is 64KB */ + +#endif /* TARGET_TILEGX */ + #ifndef ELF_PLATFORM #define ELF_PLATFORM (NULL) #endif diff --git a/linux-user/main.c b/linux-user/main.c index d92702a..9703715 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -3418,6 +3418,20 @@ void cpu_loop(CPUS390XState *env) #endif /* TARGET_S390X */ +#ifdef TARGET_TILEGX +void cpu_loop(CPUTLState *env) +{ + CPUState *cs = CPU(tilegx_env_get_cpu(env)); + + while (1) { + cpu_exec_start(cs); + cpu_tilegx_exec(env); + cpu_exec_end(cs); + process_pending_signals(env); + } +} +#endif + THREAD CPUState *thread_cpu; void task_settid(TaskState *ts) @@ -4392,6 +4406,65 @@ int main(int argc, char **argv, char **envp) env->psw.mask = regs->psw.mask; env->psw.addr = regs->psw.addr; } +#elif defined(TARGET_TILEGX) + { + env->regs[0] = regs->r0; + env->regs[1] = regs->r1; + env->regs[2] = regs->r2; + env->regs[3] = regs->r3; + env->regs[4] = regs->r4; + env->regs[5] = regs->r5; + env->regs[6] = regs->r6; + env->regs[7] = regs->r7; + env->regs[8] = regs->r8; + env->regs[9] = regs->r9; + env->regs[10] = regs->r10; + env->regs[11] = regs->r11; + env->regs[12] = regs->r12; + env->regs[13] = regs->r13; + env->regs[14] = regs->r14; + env->regs[15] = regs->r15; + env->regs[16] = regs->r16; + env->regs[17] = regs->r17; + env->regs[18] = regs->r18; + env->regs[19] = regs->r19; + env->regs[20] = regs->r20; + env->regs[21] = regs->r21; + env->regs[22] = regs->r22; + env->regs[23] = regs->r23; + env->regs[24] = regs->r24; + env->regs[25] = regs->r25; + env->regs[26] = regs->r26; + env->regs[27] = regs->r27; + env->regs[28] = regs->r28; + env->regs[29] = regs->r29; + env->regs[30] = regs->r30; + env->regs[31] = regs->r31; + env->regs[32] = regs->r32; + env->regs[33] = regs->r33; + env->regs[34] = regs->r34; + env->regs[35] = regs->r35; + env->regs[36] = regs->r36; + env->regs[37] = regs->r37; + env->regs[38] = regs->r38; + env->regs[39] = regs->r39; + env->regs[40] = regs->r40; + env->regs[41] = regs->r41; + env->regs[42] = regs->r42; + env->regs[43] = regs->r43; + env->regs[44] = regs->r44; + env->regs[45] = regs->r45; + env->regs[46] = regs->r46; + env->regs[47] = regs->r47; + env->regs[48] = regs->r48; + env->regs[49] = regs->r49; + env->regs[50] = regs->r50; + env->regs[51] = regs->r51; + env->regs[52] = regs->r52; /* TILEGX_R_BP */ + env->regs[53] = regs->tp; /* TILEGX_R_TP */ + env->regs[54] = regs->sp; /* TILEGX_R_SP */ + env->regs[55] = regs->lr; /* TILEGX_R_PC */ + } #else #error unsupported target CPU #endif