1*63d1fd59SEnji Cooper /* $NetBSD: h_common.h,v 1.2 2016/11/19 02:30:54 kamil Exp $ */ 2*63d1fd59SEnji Cooper 3*63d1fd59SEnji Cooper /*- 4*63d1fd59SEnji Cooper * Copyright (c) 2016 The NetBSD Foundation, Inc. 5*63d1fd59SEnji Cooper * All rights reserved. 6*63d1fd59SEnji Cooper * 7*63d1fd59SEnji Cooper * Redistribution and use in source and binary forms, with or without 8*63d1fd59SEnji Cooper * modification, are permitted provided that the following conditions 9*63d1fd59SEnji Cooper * are met: 10*63d1fd59SEnji Cooper * 1. Redistributions of source code must retain the above copyright 11*63d1fd59SEnji Cooper * notice, this list of conditions and the following disclaimer. 12*63d1fd59SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 13*63d1fd59SEnji Cooper * notice, this list of conditions and the following disclaimer in the 14*63d1fd59SEnji Cooper * documentation and/or other materials provided with the distribution. 15*63d1fd59SEnji Cooper * 16*63d1fd59SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17*63d1fd59SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18*63d1fd59SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19*63d1fd59SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20*63d1fd59SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*63d1fd59SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*63d1fd59SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*63d1fd59SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*63d1fd59SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*63d1fd59SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*63d1fd59SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 27*63d1fd59SEnji Cooper */ 28*63d1fd59SEnji Cooper 29*63d1fd59SEnji Cooper 30*63d1fd59SEnji Cooper #ifndef H_COMMON_H 31*63d1fd59SEnji Cooper #define H_COMMON_H 32*63d1fd59SEnji Cooper 33*63d1fd59SEnji Cooper #include <sys/cdefs.h> 34*63d1fd59SEnji Cooper #include <dlfcn.h> 35*63d1fd59SEnji Cooper #include <pthread_dbg.h> 36*63d1fd59SEnji Cooper #include <string.h> 37*63d1fd59SEnji Cooper 38*63d1fd59SEnji Cooper #include <atf-c.h> 39*63d1fd59SEnji Cooper 40*63d1fd59SEnji Cooper #define PTHREAD_REQUIRE(x) \ 41*63d1fd59SEnji Cooper do { \ 42*63d1fd59SEnji Cooper int ret = (x); \ 43*63d1fd59SEnji Cooper ATF_REQUIRE_MSG(ret == 0, "%s: %s", #x, strerror(ret)); \ 44*63d1fd59SEnji Cooper } while (0) 45*63d1fd59SEnji Cooper 46*63d1fd59SEnji Cooper #define PTHREAD_REQUIRE_STATUS(x, v) \ 47*63d1fd59SEnji Cooper do { \ 48*63d1fd59SEnji Cooper int ret = (x); \ 49*63d1fd59SEnji Cooper ATF_REQUIRE_MSG(ret == (v), "%s: %s", #x, strerror(ret)); \ 50*63d1fd59SEnji Cooper } while (0) 51*63d1fd59SEnji Cooper 52*63d1fd59SEnji Cooper static int __used 53*63d1fd59SEnji Cooper dummy_proc_read(void *arg, caddr_t addr, void *buf, size_t size) 54*63d1fd59SEnji Cooper { 55*63d1fd59SEnji Cooper return TD_ERR_ERR; 56*63d1fd59SEnji Cooper } 57*63d1fd59SEnji Cooper 58*63d1fd59SEnji Cooper static int __used 59*63d1fd59SEnji Cooper dummy_proc_write(void *arg, caddr_t addr, void *buf, size_t size) 60*63d1fd59SEnji Cooper { 61*63d1fd59SEnji Cooper return TD_ERR_ERR; 62*63d1fd59SEnji Cooper } 63*63d1fd59SEnji Cooper 64*63d1fd59SEnji Cooper static int __used 65*63d1fd59SEnji Cooper dummy_proc_lookup(void *arg, const char *sym, caddr_t *addr) 66*63d1fd59SEnji Cooper { 67*63d1fd59SEnji Cooper return TD_ERR_ERR; 68*63d1fd59SEnji Cooper } 69*63d1fd59SEnji Cooper 70*63d1fd59SEnji Cooper static int __used 71*63d1fd59SEnji Cooper dummy_proc_regsize(void *arg, int regset, size_t *size) 72*63d1fd59SEnji Cooper { 73*63d1fd59SEnji Cooper return TD_ERR_ERR; 74*63d1fd59SEnji Cooper } 75*63d1fd59SEnji Cooper 76*63d1fd59SEnji Cooper static int __used 77*63d1fd59SEnji Cooper dummy_proc_getregs(void *arg, int regset, int lwp, void *buf) 78*63d1fd59SEnji Cooper { 79*63d1fd59SEnji Cooper return TD_ERR_ERR; 80*63d1fd59SEnji Cooper } 81*63d1fd59SEnji Cooper 82*63d1fd59SEnji Cooper static int __used 83*63d1fd59SEnji Cooper dummy_proc_setregs(void *arg, int regset, int lwp, void *buf) 84*63d1fd59SEnji Cooper { 85*63d1fd59SEnji Cooper return TD_ERR_ERR; 86*63d1fd59SEnji Cooper } 87*63d1fd59SEnji Cooper 88*63d1fd59SEnji Cooper /* Minimalistic basic implementation */ 89*63d1fd59SEnji Cooper 90*63d1fd59SEnji Cooper static int __used 91*63d1fd59SEnji Cooper basic_proc_read(void *arg, caddr_t addr, void *buf, size_t size) 92*63d1fd59SEnji Cooper { 93*63d1fd59SEnji Cooper memcpy(buf, addr, size); 94*63d1fd59SEnji Cooper 95*63d1fd59SEnji Cooper return TD_ERR_OK; 96*63d1fd59SEnji Cooper } 97*63d1fd59SEnji Cooper 98*63d1fd59SEnji Cooper static int __used 99*63d1fd59SEnji Cooper basic_proc_write(void *arg, caddr_t addr, void *buf, size_t size) 100*63d1fd59SEnji Cooper { 101*63d1fd59SEnji Cooper memcpy(addr, buf, size); 102*63d1fd59SEnji Cooper 103*63d1fd59SEnji Cooper return TD_ERR_OK; 104*63d1fd59SEnji Cooper } 105*63d1fd59SEnji Cooper 106*63d1fd59SEnji Cooper static int __used 107*63d1fd59SEnji Cooper basic_proc_lookup(void *arg, const char *sym, caddr_t *addr) 108*63d1fd59SEnji Cooper { 109*63d1fd59SEnji Cooper void *handle; 110*63d1fd59SEnji Cooper void *symbol; 111*63d1fd59SEnji Cooper 112*63d1fd59SEnji Cooper ATF_REQUIRE_MSG((handle = dlopen(NULL, RTLD_LOCAL | RTLD_LAZY)) 113*63d1fd59SEnji Cooper != NULL, "dlopen(3) failed: %s", dlerror()); 114*63d1fd59SEnji Cooper 115*63d1fd59SEnji Cooper symbol = dlsym(handle, sym); 116*63d1fd59SEnji Cooper 117*63d1fd59SEnji Cooper ATF_REQUIRE_MSG(dlclose(handle) == 0, "dlclose(3) failed: %s", 118*63d1fd59SEnji Cooper dlerror()); 119*63d1fd59SEnji Cooper 120*63d1fd59SEnji Cooper if (!symbol) 121*63d1fd59SEnji Cooper return TD_ERR_NOSYM; 122*63d1fd59SEnji Cooper 123*63d1fd59SEnji Cooper *addr = (caddr_t)(uintptr_t)symbol; 124*63d1fd59SEnji Cooper 125*63d1fd59SEnji Cooper return TD_ERR_OK; 126*63d1fd59SEnji Cooper } 127*63d1fd59SEnji Cooper 128*63d1fd59SEnji Cooper #endif // H_COMMON_H 129