From owner-p4-projects@FreeBSD.ORG Tue Jul 3 14:56:14 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 070EA106567D; Tue, 3 Jul 2012 14:56:13 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B13831065679 for ; Tue, 3 Jul 2012 14:56:12 +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 96A5D8FC12 for ; Tue, 3 Jul 2012 14:56:12 +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 q63EuCsv039361 for ; Tue, 3 Jul 2012 14:56:12 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q63EuCkX039358 for perforce@freebsd.org; Tue, 3 Jul 2012 14:56:12 GMT (envelope-from jhb@freebsd.org) Date: Tue, 3 Jul 2012 14:56:12 GMT Message-Id: <201207031456.q63EuCkX039358@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 213850 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 14:56:14 -0000 http://p4web.freebsd.org/@@213850?ac=10 Change 213850 by jhb@jhb_ralph on 2012/07/03 14:55:34 More test cases. Affected files ... .. //depot/projects/smpng/sys/modules/x86dis/x86dis.c#2 edit Differences ... ==== //depot/projects/smpng/sys/modules/x86dis/x86dis.c#2 (text+ko) ==== @@ -25,6 +25,28 @@ } static __inline void +xsaveopt(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; + /* xsaveopt (%rdi) */ + __asm __volatile(".byte 0x0f,0xae,0x37" : : + "a" (low), "d" (hi), "D" (addr) : "memory"); +} + +static __inline uint64_t +xgetbv(uint32_t reg) +{ + uint32_t low, high; + + __asm __volatile(".byte 0x0f,0x01,0xd0" : "=a" (low), "=d" (high) : + "c" (reg)); + return (low | ((uint64_t)high << 32)); +} + +static __inline void xsetbv(uint32_t reg, uint64_t val) { uint32_t low, hi; @@ -35,13 +57,54 @@ "c" (reg), "a" (low), "d" (hi)); } +static __inline uint64_t +rdtscp(uint32_t *aux) +{ + uint32_t low, high; + + __asm __volatile("rdtscp" : "=a" (low), "=d" (high), "=c" (*aux)); + return (low | ((uint64_t)high << 32)); +} + +static __inline void +vmcall(void) +{ + + __asm __volatile(".byte 0x0f,0x01,0xc1"); +} + +static __inline void +vmlaunch(void) +{ + + __asm __volatile(".byte 0x0f,0x01,0xc2"); +} + +static __inline void +vmresume(void) +{ + + __asm __volatile(".byte 0x0f,0x01,0xc3"); +} + extern void isn_list(char *addr, uint32_t reg, uint64_t mask, uint64_t val); void isn_list(char *addr, uint32_t reg, uint64_t mask, uint64_t val) { + uint32_t aux; + + /* + * XXX: More to add? + */ + rdtscp(&aux); + xsaveopt(addr, mask); xrstor(addr, mask); xsave(addr, mask); + xgetbv(reg); xsetbv(reg, val); + vmcall(); + vmlaunch(); + vmresume(); }