/* * Copyright 2015, Michael Neuling, IBM Corp. * Licensed under GPLv2. * * Original: Michael Neuling 4/12/2013 * Edited: Rashmica Gupta 4/12/2015 * * See if the altivec state is leaked out of an aborted transaction due to * kernel vmx copy loops. * * When the transaction aborts, VSR values should rollback to the values * they held before the transaction commenced. Using VSRs while transaction * is suspended should not affect the checkpointed values. * * (1) write A to a VSR * (2) start transaction * (3) suspend transaction * (4) change the VSR to B * (5) trigger kernel vmx copy loop * (6) abort transaction * (7) check that the VSR value is A */ #include <inttypes.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <assert.h> #include "tm.h" #include "utils.h" int test_vmxcopy() { long double vecin = 1.3; long double vecout; unsigned long pgsize = getpagesize(); int i; int fd; int size = pgsize*16; char tmpfile[] = "/tmp/page_faultXXXXXX"; char buf[pgsize]; char *a; uint64_t aborted = 0; SKIP_IF(!have_htm()); fd = mkstemp(tmpfile); assert(fd >= 0); memset(buf, 0, pgsize); for (i = 0; i < size; i += pgsize) assert(write(fd, buf, pgsize) == pgsize); unlink(tmpfile); a = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); assert(a != MAP_FAILED); asm __volatile__( "lxvd2x 40,0,%[vecinptr];" /* set 40 to initial value*/ "tbegin.;" "beq 3f;" "tsuspend.;" "xxlxor 40,40,40;" /* set 40 to 0 */ "std 5, 0(%[map]);" /* cause kernel vmx copy page */ "tabort. 0;" "tresume.;" "tend.;" "li %[res], 0;" "b 5f;" /* Abort handler */ "3:;" "li %[res], 1;" "5:;" "stxvd2x 40,0,%[vecoutptr];" : [res]"=r"(aborted) : [vecinptr]"r"(&vecin), [vecoutptr]"r"(&vecout), [map]"r"(a) : "memory", "r0", "r3", "r4", "r5", "r6", "r7"); if (aborted && (vecin != vecout)){ printf("FAILED: vector state leaked on abort %f != %f\n", (double)vecin, (double)vecout); return 1; } munmap(a, size); close(fd); return 0; } int main(void) { return test_harness(test_vmxcopy, "tm_vmxcopy"); } lass='right' method='get' action='/cgit.cgi/linux/net-next.git/log/include/net/caif/cfsrvl.h'> <input type='hidden' name='id' value='238d1d0f79f619d75c2cc741d6770fb0986aef24'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/commit/?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>root</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>include</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include/net?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>net</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include/net/caif?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>caif</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>cfsrvl.h</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='238d1d0f79f619d75c2cc741d6770fb0986aef24'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'> <tr><th>author</th><td>Linus Torvalds <torvalds@linux-foundation.org></td><td class='right'>2016-12-30 09:32:26 -0800</td></tr> <tr><th>committer</th><td>Linus Torvalds <torvalds@linux-foundation.org></td><td class='right'>2016-12-30 09:32:26 -0800</td></tr> <tr><th>commit</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>238d1d0f79f619d75c2cc741d6770fb0986aef24</a> (<a href='/cgit.cgi/linux/net-next.git/patch/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>patch</a>)</td></tr> <tr><th>tree</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/tree/?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>ed11bb89c3c61cba7aff3ebc90647f83758a982d</a> /<a href='/cgit.cgi/linux/net-next.git/tree/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>include/net/caif/cfsrvl.h</a></td></tr> <tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/net/caif/cfsrvl.h?id=f3de082c12e5e9ff43c58a7561f6ec3272d03a48'>f3de082c12e5e9ff43c58a7561f6ec3272d03a48</a> (<a href='/cgit.cgi/linux/net-next.git/diff/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24&id2=f3de082c12e5e9ff43c58a7561f6ec3272d03a48'>diff</a>)</td></tr><tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/net/caif/cfsrvl.h?id=36f671be1db1b17d3d4ab0c8b47f81ccb1efcb75'>36f671be1db1b17d3d4ab0c8b47f81ccb1efcb75</a> (<a href='/cgit.cgi/linux/net-next.git/diff/include/net/caif/cfsrvl.h?id=238d1d0f79f619d75c2cc741d6770fb0986aef24&id2=36f671be1db1b17d3d4ab0c8b47f81ccb1efcb75'>diff</a>)</td></tr></table> <div class='commit-subject'>Merge tag 'docs-4.10-rc1-fix' of git://git.lwn.net/linux</div><div class='commit-msg'>Pull documentation fixes from Jonathan Corbet: "Two small fixes: - A merge error on my part broke the DocBook build. I've requisitioned one of tglx's frozen sharks for appropriate disciplinary action and resolved to be more careful about testing the DocBook stuff as long as it's still around. - Fix an error in unaligned-memory-access.txt" * tag 'docs-4.10-rc1-fix' of git://git.lwn.net/linux: Documentation/unaligned-memory-access.txt: fix incorrect comparison operator docs: Fix build failure </div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=238d1d0f79f619d75c2cc741d6770fb0986aef24'>Diffstat</a> (limited to 'include/net/caif/cfsrvl.h')</div><table summary='diffstat' class='diffstat'>