inout.h revision 221828
1221828Sgrehan/*- 2221828Sgrehan * Copyright (c) 2011 NetApp, Inc. 3221828Sgrehan * All rights reserved. 4221828Sgrehan * 5221828Sgrehan * Redistribution and use in source and binary forms, with or without 6221828Sgrehan * modification, are permitted provided that the following conditions 7221828Sgrehan * are met: 8221828Sgrehan * 1. Redistributions of source code must retain the above copyright 9221828Sgrehan * notice, this list of conditions and the following disclaimer. 10221828Sgrehan * 2. Redistributions in binary form must reproduce the above copyright 11221828Sgrehan * notice, this list of conditions and the following disclaimer in the 12221828Sgrehan * documentation and/or other materials provided with the distribution. 13221828Sgrehan * 14221828Sgrehan * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 15221828Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16221828Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17221828Sgrehan * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 18221828Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19221828Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20221828Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21221828Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22221828Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23221828Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24221828Sgrehan * SUCH DAMAGE. 25221828Sgrehan * 26221828Sgrehan * $FreeBSD$ 27221828Sgrehan */ 28221828Sgrehan 29221828Sgrehan#ifndef _INOUT_H_ 30221828Sgrehan#define _INOUT_H_ 31221828Sgrehan 32221828Sgrehan#include <sys/linker_set.h> 33221828Sgrehan 34221828Sgrehanstruct vmctx; 35221828Sgrehan 36221828Sgrehantypedef int (*inout_func_t)(struct vmctx *ctx, int vcpu, int in, int port, 37221828Sgrehan int bytes, uint32_t *eax, void *arg); 38221828Sgrehan 39221828Sgrehanstruct inout_port { 40221828Sgrehan const char *name; 41221828Sgrehan int port; 42221828Sgrehan int flags; 43221828Sgrehan inout_func_t handler; 44221828Sgrehan void *arg; 45221828Sgrehan}; 46221828Sgrehan#define IOPORT_F_IN 0x1 47221828Sgrehan#define IOPORT_F_OUT 0x2 48221828Sgrehan#define IOPORT_F_INOUT 0x3 49221828Sgrehan 50221828Sgrehan#define INOUT_PORT(name, port, flags, handler) \ 51221828Sgrehan static struct inout_port __CONCAT(__inout_port, __LINE__) = { \ 52221828Sgrehan #name, \ 53221828Sgrehan (port), \ 54221828Sgrehan (flags), \ 55221828Sgrehan (handler) \ 56221828Sgrehan }; \ 57221828Sgrehan DATA_SET(inout_port_set, __CONCAT(__inout_port, __LINE__)) 58221828Sgrehan 59221828Sgrehanvoid init_inout(void); 60221828Sgrehanint emulate_inout(struct vmctx *, int vcpu, int in, int port, int bytes, 61221828Sgrehan uint32_t *eax); 62221828Sgrehanint register_inout(struct inout_port *iop); 63221828Sgrehan 64221828Sgrehan#endif /* _INOUT_H_ */ 65