brand.h revision 11970:9c3f3660b754
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _SYS_BRAND_H 28#define _SYS_BRAND_H 29 30#ifdef __cplusplus 31extern "C" { 32#endif 33 34#include <sys/proc.h> 35#include <sys/exec.h> 36 37/* 38 * All Brands supported by this kernel must use BRAND_VER_1. 39 */ 40#define BRAND_VER_1 1 41 42/* 43 * sub-commands to brandsys. 44 * 1 - 128 are for common commands 45 * 128+ are available for brand-specific commands. 46 */ 47#define B_REGISTER 1 48#define B_TTYMODES 2 49#define B_ELFDATA 3 50#define B_EXEC_NATIVE 4 51#define B_EXEC_BRAND 5 52 53/* 54 * Structure used by zoneadmd to communicate the name of a brand and the 55 * supporting brand module into the kernel. 56 */ 57struct brand_attr { 58 char ba_brandname[MAXNAMELEN]; 59 char ba_modname[MAXPATHLEN]; 60}; 61 62/* What we call the native brand. */ 63#define NATIVE_BRAND_NAME "native" 64 65/* What we call the labeled brand. */ 66#define LABELED_BRAND_NAME "labeled" 67 68#ifdef _KERNEL 69 70/* Root for branded zone's native binaries */ 71#define NATIVE_ROOT "/native/" 72 73struct proc; 74struct uarg; 75struct brand_mach_ops; 76struct intpdata; 77struct execa; 78 79struct brand_ops { 80 void (*b_init_brand_data)(zone_t *); 81 void (*b_free_brand_data)(zone_t *); 82 int (*b_brandsys)(int, int64_t *, uintptr_t, uintptr_t, uintptr_t, 83 uintptr_t, uintptr_t, uintptr_t); 84 void (*b_setbrand)(struct proc *); 85 int (*b_getattr)(zone_t *, int, void *, size_t *); 86 int (*b_setattr)(zone_t *, int, void *, size_t); 87 void (*b_copy_procdata)(struct proc *, struct proc *); 88 void (*b_proc_exit)(struct proc *, klwp_t *); 89 void (*b_exec)(); 90 void (*b_lwp_setrval)(klwp_t *, int, int); 91 int (*b_initlwp)(klwp_t *); 92 void (*b_forklwp)(klwp_t *, klwp_t *); 93 void (*b_freelwp)(klwp_t *); 94 void (*b_lwpexit)(klwp_t *); 95 int (*b_elfexec)(struct vnode *vp, struct execa *uap, 96 struct uarg *args, struct intpdata *idata, int level, 97 long *execsz, int setid, caddr_t exec_file, 98 struct cred *cred, int brand_action); 99 void (*b_sigset_native_to_brand)(sigset_t *); 100 void (*b_sigset_brand_to_native)(sigset_t *); 101 int b_nsig; 102}; 103 104/* 105 * The b_version field must always be the first entry in this struct. 106 */ 107typedef struct brand { 108 int b_version; 109 char *b_name; 110 struct brand_ops *b_ops; 111 struct brand_mach_ops *b_machops; 112} brand_t; 113 114extern brand_t native_brand; 115 116/* 117 * Convenience macros 118 */ 119#define lwptolwpbrand(l) ((l)->lwp_brand) 120#define ttolwpbrand(t) (lwptolwpbrand(ttolwp(t))) 121#define PROC_IS_BRANDED(p) ((p)->p_brand != &native_brand) 122#define ZONE_IS_BRANDED(z) ((z)->zone_brand != &native_brand) 123#define BROP(p) ((p)->p_brand->b_ops) 124#define ZBROP(z) ((z)->zone_brand->b_ops) 125#define BRMOP(p) ((p)->p_brand->b_machops) 126#define SIGSET_NATIVE_TO_BRAND(sigset) \ 127 if (PROC_IS_BRANDED(curproc) && \ 128 BROP(curproc)->b_sigset_native_to_brand) \ 129 BROP(curproc)->b_sigset_native_to_brand(sigset) 130#define SIGSET_BRAND_TO_NATIVE(sigset) \ 131 if (PROC_IS_BRANDED(curproc) && \ 132 BROP(curproc)->b_sigset_brand_to_native) \ 133 BROP(curproc)->b_sigset_brand_to_native(sigset) 134 135extern void brand_init(); 136extern int brand_register(brand_t *); 137extern int brand_unregister(brand_t *); 138extern brand_t *brand_register_zone(struct brand_attr *); 139extern brand_t *brand_find_name(char *); 140extern void brand_unregister_zone(brand_t *); 141extern int brand_zone_count(brand_t *); 142extern void brand_setbrand(proc_t *); 143extern void brand_clearbrand(proc_t *); 144#endif /* _KERNEL */ 145 146#ifdef __cplusplus 147} 148#endif 149 150#endif /* _SYS_BRAND_H */ 151