From owner-p4-projects@FreeBSD.ORG Tue Jul 3 20:01:25 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 520841065670; Tue, 3 Jul 2012 20:01:25 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 145DD106566B for ; Tue, 3 Jul 2012 20:01:25 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id D99D88FC0C for ; Tue, 3 Jul 2012 20:01:24 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q63K1Oaa056233 for ; Tue, 3 Jul 2012 20:01:24 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q63K1OJP056230 for perforce@freebsd.org; Tue, 3 Jul 2012 20:01:24 GMT (envelope-from jhb@freebsd.org) Date: Tue, 3 Jul 2012 20:01:24 GMT Message-Id: <201207032001.q63K1OJP056230@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 213866 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Jul 2012 20:01:25 -0000 http://p4web.freebsd.org/@@213866?ac=10 Change 213866 by jhb@jhb_ralph on 2012/07/03 20:00:43 Let the assembler see xsave/xrstor/xsaveopt/xgetbv/xsetbv instructions if NEW_AS is defined. (I'm have some patches to add those to binutils.) Affected files ... .. //depot/projects/smpng/sys/modules/x86dis/x86dis.c#3 edit Differences ... ==== //depot/projects/smpng/sys/modules/x86dis/x86dis.c#3 (text+ko) ==== @@ -1,5 +1,7 @@ #include +//#define NEW_AS + static __inline void xrstor(char *addr, uint64_t mask) { @@ -7,9 +9,13 @@ low = mask; hi = mask >> 32; +#ifdef NEW_AS + __asm __volatile("xrstor %0" : : "m" (addr), "a" (low), "d" (hi)); +#else /* xrstor (%rdi) */ __asm __volatile(".byte 0x0f,0xae,0x2f" : : "a" (low), "d" (hi), "D" (addr)); +#endif } static __inline void @@ -19,9 +25,14 @@ low = mask; hi = mask >> 32; +#ifdef NEW_AS + __asm __volatile("xsave %0" : "=m" (addr) : "a" (low), "d" (hi) : + "memory"); +#else /* xsave (%rdi) */ __asm __volatile(".byte 0x0f,0xae,0x27" : : "a" (low), "d" (hi), "D" (addr) : "memory"); +#endif } static __inline void @@ -31,9 +42,14 @@ low = mask; hi = mask >> 32; +#ifdef NEW_AS + __asm __volatile("xsaveopt %0" : "=m" (addr) : "a" (low), "d" (hi) : + "memory"); +#else /* xsaveopt (%rdi) */ __asm __volatile(".byte 0x0f,0xae,0x37" : : "a" (low), "d" (hi), "D" (addr) : "memory"); +#endif } static __inline uint64_t @@ -41,8 +57,12 @@ { uint32_t low, high; +#ifdef NEW_AS + __asm __volatile("xgetbv" : "=a" (low), "=d" (high) : "c" (reg)); +#else __asm __volatile(".byte 0x0f,0x01,0xd0" : "=a" (low), "=d" (high) : "c" (reg)); +#endif return (low | ((uint64_t)high << 32)); } @@ -53,8 +73,12 @@ low = val; hi = val >> 32; +#ifdef NEW_AS + __asm __volatile("xsetbv" : : "c" (reg), "a" (low), "d" (hi)); +#else __asm __volatile(".byte 0x0f,0x01,0xd1" : : "c" (reg), "a" (low), "d" (hi)); +#endif } static __inline uint64_t