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