From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.24) id 1AkQfg-0006ZW-VC for qemu-devel@nongnu.org; Sat, 24 Jan 2004 11:30:08 -0500 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.24) id 1AkQf9-0006RN-5N for qemu-devel@nongnu.org; Sat, 24 Jan 2004 11:30:07 -0500 Received: from [193.252.22.27] (helo=mwinf0403.wanadoo.fr) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AkQf8-0006RK-Oh for qemu-devel@nongnu.org; Sat, 24 Jan 2004 11:29:34 -0500 Received: from free.fr (ATuileries-112-1-4-12.w81-53.abo.wanadoo.fr [81.53.133.12]) by mwinf0403.wanadoo.fr (SMTP Server) with ESMTP id 394D75000295 for ; Sat, 24 Jan 2004 17:29:33 +0100 (CET) Message-ID: <40129DB7.1010704@free.fr> Date: Sat, 24 Jan 2004 17:30:47 +0100 From: Fabrice Bellard MIME-Version: 1.0 References: <20040124141301.4C5EE2C016@lists.samba.org> In-Reply-To: <20040124141301.4C5EE2C016@lists.samba.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: qemu 0.5.1 emulation bug? Reply-To: qemu-devel@nongnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Thanx for the report. It should work now (eflags optimisation bug with string operations). Fabrice. Rusty Russell wrote: > Just spent two hours chasing down why recent 2.6.2-rc1 kernels don't > boot. > > It turns out that find_next_bit() returns 0 under "qemu-fast" and > "qemu" where it returns 32 under "qemu-i386" and native x86. > > Bedtime for me, but here's the offending code: > > /** > * find_first_bit - find the first set bit in a memory region > * @addr: The address to start the search at > * @size: The maximum size to search > * > * Returns the bit-number of the first set bit, not the number of the byte > * containing a bit. > */ > static __inline__ int xfind_first_bit(const unsigned long *addr, unsigned size) > { > int d0, d1; > int res; > > /* This looks at memory. Mark it volatile to tell gcc not to move it around */ > __asm__ __volatile__( > "xorl %%eax,%%eax\n\t" > "repe; scasl\n\t" > "jz 1f\n\t" > "leal -4(%%edi),%%edi\n\t" > "bsfl (%%edi),%%eax\n" > "1:\tsubl %%ebx,%%edi\n\t" > "shll $3,%%edi\n\t" > "addl %%edi,%%eax" > :"=a" (res), "=&c" (d0), "=&D" (d1) > :"1" ((size + 31) >> 5), "2" (addr), "b" (addr)); > return res; > } > > /** > * find_next_bit - find the first set bit in a memory region > * @addr: The address to base the search on > * @offset: The bitnumber to start searching at > * @size: The maximum size to search > */ > static __inline__ int xfind_next_bit(const unsigned long *addr, int size, int offset) > { > const unsigned long *p = addr + (offset >> 5); > int set = 0, bit = offset & 31, res; > > if (bit) { > /* > * Look for nonzero in the first 32 bits: > */ > __asm__("bsfl %1,%0\n\t" > "jne 1f\n\t" > "movl $32, %0\n" > "1:" > : "=r" (set) > : "r" (*p >> bit)); > if (set < (32 - bit)) > return set + offset; > set = 32 - bit; > p++; > } > /* > * No set bit yet, search remaining full words for a bit > */ > res = xfind_first_bit (p, size - 32 * (p - addr)); > return (offset + set + res); > } > > int main() > { > unsigned long map = 1; > > printf("find_next_bit of %lu = %i\n", > map, xfind_next_bit(&map, 32, 1)); > return 0; > } > > > -- > Anyone who quotes me in their sig is an idiot. -- Rusty Russell. > >