From owner-svn-src-head@FreeBSD.ORG Sat Jan 3 21:06:08 2015 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D39685B3; Sat, 3 Jan 2015 21:06:08 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B4D8F2E7A; Sat, 3 Jan 2015 21:06:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t03L6884070488; Sat, 3 Jan 2015 21:06:08 GMT (envelope-from jhibbits@FreeBSD.org) Received: (from jhibbits@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t03L67SG070483; Sat, 3 Jan 2015 21:06:07 GMT (envelope-from jhibbits@FreeBSD.org) Message-Id: <201501032106.t03L67SG070483@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: jhibbits set sender to jhibbits@FreeBSD.org using -f From: Justin Hibbits Date: Sat, 3 Jan 2015 21:06:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r276634 - in head/sys/powerpc: include powerpc X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Jan 2015 21:06:09 -0000 Author: jhibbits Date: Sat Jan 3 21:06:06 2015 New Revision: 276634 URL: https://svnweb.freebsd.org/changeset/base/276634 Log: Dump VMX registers into the userland coredump. Reviewed by: nwhitehorn MFC after: 2 weeks Modified: head/sys/powerpc/include/altivec.h head/sys/powerpc/powerpc/altivec.c head/sys/powerpc/powerpc/elf32_machdep.c head/sys/powerpc/powerpc/elf64_machdep.c Modified: head/sys/powerpc/include/altivec.h ============================================================================== --- head/sys/powerpc/include/altivec.h Sat Jan 3 20:29:47 2015 (r276633) +++ head/sys/powerpc/include/altivec.h Sat Jan 3 21:06:06 2015 (r276634) @@ -34,6 +34,7 @@ void enable_vec(struct thread *); void save_vec(struct thread *); +void save_vec_nodrop(struct thread *); #endif /* _MACHINE_ALTIVEC_H_ */ Modified: head/sys/powerpc/powerpc/altivec.c ============================================================================== --- head/sys/powerpc/powerpc/altivec.c Sat Jan 3 20:29:47 2015 (r276633) +++ head/sys/powerpc/powerpc/altivec.c Sat Jan 3 21:06:06 2015 (r276634) @@ -43,6 +43,46 @@ __FBSDID("$FreeBSD$"); #include #include +static void +save_vec_int(struct thread *td) +{ + int msr; + struct pcb *pcb; + + pcb = td->td_pcb; + + /* + * Temporarily re-enable the vector unit during the save + */ + msr = mfmsr(); + mtmsr(msr | PSL_VEC); + isync(); + + /* + * Save the vector registers and VSCR to the PCB + */ +#define STVX(n) __asm ("stvx %1,0,%0" \ + :: "b"(pcb->pcb_vec.vr[n]), "n"(n)); + STVX(0); STVX(1); STVX(2); STVX(3); + STVX(4); STVX(5); STVX(6); STVX(7); + STVX(8); STVX(9); STVX(10); STVX(11); + STVX(12); STVX(13); STVX(14); STVX(15); + STVX(16); STVX(17); STVX(18); STVX(19); + STVX(20); STVX(21); STVX(22); STVX(23); + STVX(24); STVX(25); STVX(26); STVX(27); + STVX(28); STVX(29); STVX(30); STVX(31); +#undef STVX + + __asm __volatile("mfvscr 0; stvewx 0,0,%0" :: "b"(&pcb->pcb_vec.vscr)); + + /* + * Disable vector unit again + */ + isync(); + mtmsr(msr); + +} + void enable_vec(struct thread *td) { @@ -107,40 +147,11 @@ enable_vec(struct thread *td) void save_vec(struct thread *td) { - int msr; - struct pcb *pcb; + struct pcb *pcb; pcb = td->td_pcb; - /* - * Temporarily re-enable the vector unit during the save - */ - msr = mfmsr(); - mtmsr(msr | PSL_VEC); - isync(); - - /* - * Save the vector registers and VSCR to the PCB - */ -#define STVX(n) __asm ("stvx %1,0,%0" \ - :: "b"(pcb->pcb_vec.vr[n]), "n"(n)); - STVX(0); STVX(1); STVX(2); STVX(3); - STVX(4); STVX(5); STVX(6); STVX(7); - STVX(8); STVX(9); STVX(10); STVX(11); - STVX(12); STVX(13); STVX(14); STVX(15); - STVX(16); STVX(17); STVX(18); STVX(19); - STVX(20); STVX(21); STVX(22); STVX(23); - STVX(24); STVX(25); STVX(26); STVX(27); - STVX(28); STVX(29); STVX(30); STVX(31); -#undef STVX - - __asm __volatile("mfvscr 0; stvewx 0,0,%0" :: "b"(&pcb->pcb_vec.vscr)); - - /* - * Disable vector unit again - */ - isync(); - mtmsr(msr); + save_vec_int(td); /* * Clear the current vec thread and pcb's CPU id @@ -150,3 +161,19 @@ save_vec(struct thread *td) PCPU_SET(vecthread, NULL); } +/* + * Save altivec state without dropping ownership. This will only save state if + * the current vector-thread is `td'. + */ +void +save_vec_nodrop(struct thread *td) +{ + struct thread *vtd; + + vtd = PCPU_GET(vecthread); + if (td != vtd) { + return; + } + + save_vec_int(td); +} Modified: head/sys/powerpc/powerpc/elf32_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf32_machdep.c Sat Jan 3 20:29:47 2015 (r276633) +++ head/sys/powerpc/powerpc/elf32_machdep.c Sat Jan 3 21:06:06 2015 (r276634) @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -147,9 +148,24 @@ SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_AN &freebsd_brand_oinfo); void -elf32_dump_thread(struct thread *td __unused, void *dst __unused, - size_t *off __unused) +elf32_dump_thread(struct thread *td, void *dst, size_t *off) { + size_t len; + struct pcb *pcb; + + len = 0; + pcb = td->td_pcb; + if (pcb->pcb_flags & PCB_VEC) { + save_vec_nodrop(td); + if (dst != NULL) { + len += elf32_populate_note(NT_PPC_VMX, + &pcb->pcb_vec, dst, + sizeof(pcb->pcb_vec), NULL); + } else + len += elf32_populate_note(NT_PPC_VMX, NULL, NULL, + sizeof(pcb->pcb_vec), NULL); + } + *off = len; } #ifndef __powerpc64__ Modified: head/sys/powerpc/powerpc/elf64_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf64_machdep.c Sat Jan 3 20:29:47 2015 (r276633) +++ head/sys/powerpc/powerpc/elf64_machdep.c Sat Jan 3 21:06:06 2015 (r276634) @@ -44,6 +44,7 @@ #include #include +#include #include #include #include @@ -119,9 +120,24 @@ SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_AN &freebsd_brand_oinfo); void -elf64_dump_thread(struct thread *td __unused, void *dst __unused, - size_t *off __unused) +elf64_dump_thread(struct thread *td, void *dst, size_t *off) { + size_t len; + struct pcb *pcb; + + len = 0; + pcb = td->td_pcb; + if (pcb->pcb_flags & PCB_VEC) { + save_vec_nodrop(td); + if (dst != NULL) { + len += elf64_populate_note(NT_PPC_VMX, + &pcb->pcb_vec, dst, + sizeof(pcb->pcb_vec), NULL); + } else + len += elf64_populate_note(NT_PPC_VMX, NULL, NULL, + sizeof(pcb->pcb_vec), NULL); + } + *off = len; }