18b615593SMarko Zec /*- 2eddfbb76SRobert Watson * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org> 3eddfbb76SRobert Watson * Copyright (c) 2009 Robert N. M. Watson 48b615593SMarko Zec * 58b615593SMarko Zec * Redistribution and use in source and binary forms, with or without 68b615593SMarko Zec * modification, are permitted provided that the following conditions 78b615593SMarko Zec * are met: 88b615593SMarko Zec * 1. Redistributions of source code must retain the above copyright 98b615593SMarko Zec * notice, this list of conditions and the following disclaimer. 108b615593SMarko Zec * 2. Redistributions in binary form must reproduce the above copyright 118b615593SMarko Zec * notice, this list of conditions and the following disclaimer in the 128b615593SMarko Zec * documentation and/or other materials provided with the distribution. 138b615593SMarko Zec * 148b615593SMarko Zec * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 158b615593SMarko Zec * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168b615593SMarko Zec * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 178b615593SMarko Zec * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 188b615593SMarko Zec * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 198b615593SMarko Zec * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 208b615593SMarko Zec * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 218b615593SMarko Zec * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 228b615593SMarko Zec * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 238b615593SMarko Zec * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 248b615593SMarko Zec * SUCH DAMAGE. 258b615593SMarko Zec * 268b615593SMarko Zec * $FreeBSD$ 278b615593SMarko Zec */ 288b615593SMarko Zec 29eddfbb76SRobert Watson /* 30eddfbb76SRobert Watson * This is the virtual network stack memory allocator, which provides support 31eddfbb76SRobert Watson * for virtualized global variables via a special linker set, set_vnet. When 32eddfbb76SRobert Watson * "options VIMAGE" isn't defined, virtualized global variables are compiled 33eddfbb76SRobert Watson * as normal globals. 34eddfbb76SRobert Watson */ 35eddfbb76SRobert Watson 368b615593SMarko Zec #ifndef _NET_VNET_H_ 378b615593SMarko Zec #define _NET_VNET_H_ 388b615593SMarko Zec 39eddfbb76SRobert Watson #ifdef _KERNEL 40eddfbb76SRobert Watson #ifdef VIMAGE 418b615593SMarko Zec 42eddfbb76SRobert Watson #if defined(__arm__) 43eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", %progbits"); 44eddfbb76SRobert Watson #else 45eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", @progbits"); 46385195c0SMarko Zec #endif 47eddfbb76SRobert Watson __asm__(".previous"); 48eddfbb76SRobert Watson 49eddfbb76SRobert Watson #define VNET_NAME(n) vnet_entry_##n 50eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t VNET_NAME(n) 51eddfbb76SRobert Watson #define VNET_DEFINE(t, n) t VNET_NAME(n) __section("set_vnet") __used 52eddfbb76SRobert Watson #define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 53eddfbb76SRobert Watson ((b) + (uintptr_t)&VNET_NAME(n)) 54eddfbb76SRobert Watson 55eddfbb76SRobert Watson #define _VNET_GET(b, n) (*_VNET_PTR(b, n)) 56eddfbb76SRobert Watson #define _VNET_SET(b, n, v) (*_VNET_PTR(b, n) = v) 57385195c0SMarko Zec 588b615593SMarko Zec /* 59eddfbb76SRobert Watson * Virtualized global variable accessor macros. 608b615593SMarko Zec */ 61eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 62eddfbb76SRobert Watson #define VNET_VNET_GET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 63eddfbb76SRobert Watson #define VNET_VNET_SET(vnet, n, v) ((*VNET_VNET_PTR((vnet), n)) = v) 648b615593SMarko Zec 65eddfbb76SRobert Watson #define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 66eddfbb76SRobert Watson #define VNET_GET(n) VNET_VNET_GET(curvnet, n) 67eddfbb76SRobert Watson #define VNET_SET(n, v) VNET_VNET_SET(curvnet, n, v) 688b615593SMarko Zec 69eddfbb76SRobert Watson /* 70eddfbb76SRobert Watson * Sysctl variants for vnet-virtualized global variables. Include 71eddfbb76SRobert Watson * <sys/sysctl.h> to expose these definitions. 72eddfbb76SRobert Watson * 73eddfbb76SRobert Watson * Note: SYSCTL_PROC() handler functions will need to resolve pointer 74eddfbb76SRobert Watson * arguments themselves, if required. 75eddfbb76SRobert Watson */ 76eddfbb76SRobert Watson #ifdef SYSCTL_OID 77eddfbb76SRobert Watson int vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS); 78eddfbb76SRobert Watson int vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS); 79eddfbb76SRobert Watson int vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS); 80eddfbb76SRobert Watson int vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS); 81eddfbb76SRobert Watson 82eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 83eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \ 84eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_int, "I", descr) 85eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 86eddfbb76SRobert Watson fmt, descr) \ 87eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt, \ 88eddfbb76SRobert Watson descr) 89eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 90eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg, \ 91eddfbb76SRobert Watson len, vnet_sysctl_handle_string, "A", descr) 92eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 93eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr, \ 94eddfbb76SRobert Watson sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type, \ 95eddfbb76SRobert Watson descr) 96eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 97eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \ 98eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_uint, "IU", descr) 99eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 100eddfbb76SRobert Watson 101eddfbb76SRobert Watson /* 102eddfbb76SRobert Watson * Interfaces from the kernel linker. 103eddfbb76SRobert Watson */ 104eddfbb76SRobert Watson void *vnet_data_alloc(int size); 105eddfbb76SRobert Watson void vnet_data_copy(void *start, int size); 106eddfbb76SRobert Watson void vnet_data_free(void *start_arg, int size); 107eddfbb76SRobert Watson 108eddfbb76SRobert Watson /* 109eddfbb76SRobert Watson * Interfaces for vnet setup/teardown. 110eddfbb76SRobert Watson */ 111eddfbb76SRobert Watson struct vnet; 112eddfbb76SRobert Watson void vnet_data_init(struct vnet *vnet); 113eddfbb76SRobert Watson void vnet_data_destroy(struct vnet *vnet); 114eddfbb76SRobert Watson 115eddfbb76SRobert Watson #else /* !VIMAGE */ 116eddfbb76SRobert Watson 117eddfbb76SRobert Watson /* 118eddfbb76SRobert Watson * Versions of the VNET macros that compile to normal global variables and 119eddfbb76SRobert Watson * standard sysctl definitions. 120eddfbb76SRobert Watson */ 121eddfbb76SRobert Watson #define VNET_NAME(n) n 122eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t n 123eddfbb76SRobert Watson #define VNET_DEFINE(t, n) t n 124eddfbb76SRobert Watson #define _VNET_PTR(b, n) &VNET_NAME(n) 125eddfbb76SRobert Watson 126eddfbb76SRobert Watson #ifdef SYSCTL_OID 127eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 128eddfbb76SRobert Watson SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 129eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 130eddfbb76SRobert Watson fmt, descr) \ 131eddfbb76SRobert Watson SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 132eddfbb76SRobert Watson descr) 133eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 134eddfbb76SRobert Watson SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 135eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 136eddfbb76SRobert Watson SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 137eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 138eddfbb76SRobert Watson SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 139eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 140eddfbb76SRobert Watson 141eddfbb76SRobert Watson /* 142eddfbb76SRobert Watson * Virtualized global variable accessor macros. 143eddfbb76SRobert Watson */ 144eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) (&(n)) 145eddfbb76SRobert Watson #define VNET_VNET_GET(vnet, n) (n) 146eddfbb76SRobert Watson #define VNET_VNET_SET(vnet, n, v) ((n) = (v)) 147eddfbb76SRobert Watson 148eddfbb76SRobert Watson #define VNET_PTR(n) (&(n)) 149eddfbb76SRobert Watson #define VNET_GET(n) (n) 150eddfbb76SRobert Watson #define VNET_SET(n, v) ((n) = (v)) 151eddfbb76SRobert Watson 152eddfbb76SRobert Watson #endif /* VIMAGE */ 153eddfbb76SRobert Watson 154eddfbb76SRobert Watson #endif /* _KERNEL */ 1558b615593SMarko Zec 1568b615593SMarko Zec #endif /* !_NET_VNET_H_ */ 157