From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JlP5R-00053J-AF for qemu-devel@nongnu.org; Mon, 14 Apr 2008 09:51:09 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JlP5P-00050I-Jh for qemu-devel@nongnu.org; Mon, 14 Apr 2008 09:51:08 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JlP5P-00050D-At for qemu-devel@nongnu.org; Mon, 14 Apr 2008 09:51:07 -0400 Received: from mtaout02-winn.ispmail.ntl.com ([81.103.221.48]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JlP5O-0002CF-FZ for qemu-devel@nongnu.org; Mon, 14 Apr 2008 09:51:06 -0400 Received: from aamtaout02-winn.ispmail.ntl.com ([81.103.221.35]) by mtaout02-winn.ispmail.ntl.com with ESMTP id <20080414135416.ONHL6359.mtaout02-winn.ispmail.ntl.com@aamtaout02-winn.ispmail.ntl.com> for ; Mon, 14 Apr 2008 14:54:16 +0100 Received: from miranda.arrow ([213.107.26.151]) by aamtaout02-winn.ispmail.ntl.com with ESMTP id <20080414135317.QUJH17393.aamtaout02-winn.ispmail.ntl.com@miranda.arrow> for ; Mon, 14 Apr 2008 14:53:17 +0100 Received: from sdb by miranda.arrow with local (Exim 4.63) (envelope-from ) id 1JlP5K-0001BP-Qn for qemu-devel@nongnu.org; Mon, 14 Apr 2008 14:51:02 +0100 Date: Mon, 14 Apr 2008 14:51:02 +0100 From: Stuart Brady Message-ID: <20080414135102.GA4510@miranda.arrow> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH] fix dyngen on HPPA hosts Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Hi, The attached patch fixes an HPPA dyngen bug, whereby an incorrect op size would be given in dyngen-opc.h for certain ops, causing parts of those ops to be overwritten. With this, mips-softmmu running the mips-test-0.2 image now works, and i386-softmmu running the linux-0.2 test image now boots successfully (although there is a panic upon shutdown). I've also successfully booted Win98 and Win3.1. diff -urpN qemu-orig/dyngen.c qemu-new/dyngen.c --- qemu-orig/dyngen.c 2008-04-14 04:18:35.000000000 +0100 +++ qemu-new/dyngen.c 2008-04-14 04:30:15.000000000 +0100 @@ -1759,7 +1759,36 @@ void gen_code(const char *name, host_ulo } if (gen_switch == 2) { - fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, copy_size); + +#if defined(HOST_HPPA) + int op_size = copy_size; + int has_stubs = 0; + char relname[256]; + int type, is_label; + + for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) { + if (rel->r_offset >= start_offset && + rel->r_offset < start_offset + copy_size) { + sym_name = get_rel_sym_name(rel); + sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name; + is_label = get_reloc_expr(relname, sizeof(relname), sym_name); + type = ELF32_R_TYPE(rel->r_info); + + if (!is_label && type == R_PARISC_PCREL17F) { + has_stubs = 1; + op_size += 8; /* ldil and be,n instructions */ + } + } + } + + if (has_stubs) + op_size += 4; /* b,l,n instruction, to skip past the stubs */ + + fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, op_size); +#else + fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, copy_size); +#endif + } else if (gen_switch == 1) { /* output C code */ Cheers, -- Stuart Brady