/* * Copyright 2016, Cyril Bur, IBM Corp. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Sending one self a signal should always get delivered. */ #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <unistd.h> #include <altivec.h> #include "utils.h" #include "../tm/tm.h" #define MAX_ATTEMPT 500000 #define TIMEOUT 10 extern long tm_signal_self(pid_t pid, int sig, long *ret); static sig_atomic_t signaled; static sig_atomic_t fail; static void signal_handler(int sig) { if (tcheck_active()) { fail = 2; return; } if (sig == SIGUSR1) signaled = 1; else fail = 1; } static int test_signal_tm() { int i; struct sigaction act; act.sa_handler = signal_handler; act.sa_flags = 0; sigemptyset(&act.sa_mask); if (sigaction(SIGUSR1, &act, NULL) < 0) { perror("sigaction SIGUSR1"); exit(1); } if (sigaction(SIGALRM, &act, NULL) < 0) { perror("sigaction SIGALRM"); exit(1); } SKIP_IF(!have_htm()); for (i = 0; i < MAX_ATTEMPT; i++) { /* * If anything bad happens in ASM and we fail to set ret * because *handwave* TM this will cause failure */ long ret = 0xdead; long rc = 0xbeef; alarm(0); /* Disable any pending */ signaled = 0; alarm(TIMEOUT); FAIL_IF(tcheck_transactional()); rc = tm_signal_self(getpid(), SIGUSR1, &ret); if (ret == 0xdead) /* * This basically means the transaction aborted before we * even got to the suspend... this is crazy but it * happens. * Yes this also means we might never make forward * progress... the alarm() will trip eventually... */ continue; if (rc || ret) { /* Ret is actually an errno */ printf("TEXASR 0x%016lx, TFIAR 0x%016lx\n", __builtin_get_texasr(), __builtin_get_tfiar()); fprintf(stderr, "(%d) Fail reason: %d rc=0x%lx ret=0x%lx\n", i, fail, rc, ret); FAIL_IF(ret); } while(!signaled && !fail) asm volatile("": : :"memory"); if (!signaled) { fprintf(stderr, "(%d) Fail reason: %d rc=0x%lx ret=0x%lx\n", i, fail, rc, ret); FAIL_IF(fail); /* For the line number */ } } return 0; } int main(void) { return test_harness(test_signal_tm, "signal_tm"); } ' name='id' value='3f67790d2b7e322bcf363ec717085dd78c3ea7cd'/><input type='hidden' name='id2' value='206c4720092d2a24bfefc041b377e889a220ffbf'/><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/diff/?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>root</a>/<a href='/cgit.cgi/linux/net-next.git/diff/sound?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>sound</a>/<a href='/cgit.cgi/linux/net-next.git/diff/sound/soc?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>soc</a>/<a href='/cgit.cgi/linux/net-next.git/diff/sound/soc/codecs?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>codecs</a>/<a href='/cgit.cgi/linux/net-next.git/diff/sound/soc/codecs/sgtl5000.c?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>sgtl5000.c</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='3f67790d2b7e322bcf363ec717085dd78c3ea7cd'/><input type='hidden' name='id2' value='206c4720092d2a24bfefc041b377e889a220ffbf'/><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><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=3f67790d2b7e322bcf363ec717085dd78c3ea7cd&id2=206c4720092d2a24bfefc041b377e889a220ffbf'>Diffstat</a> (limited to 'sound/soc/codecs/sgtl5000.c')</div><table summary='diffstat' class='diffstat'>