1806bf111SMatthew Dillon.\" Copyright (c) 2003,2004 The DragonFly Project. All rights reserved. 2806bf111SMatthew Dillon.\" 3806bf111SMatthew Dillon.\" This code is derived from software contributed to The DragonFly Project 4806bf111SMatthew Dillon.\" by David Xu <davidxu@freebsd.org> and Matthew Dillon <dillon@backplane.com> 5806bf111SMatthew Dillon.\" 6806bf111SMatthew Dillon.\" Redistribution and use in source and binary forms, with or without 7806bf111SMatthew Dillon.\" modification, are permitted provided that the following conditions 8806bf111SMatthew Dillon.\" are met: 9806bf111SMatthew Dillon.\" 10806bf111SMatthew Dillon.\" 1. Redistributions of source code must retain the above copyright 11806bf111SMatthew Dillon.\" notice, this list of conditions and the following disclaimer. 12806bf111SMatthew Dillon.\" 2. Redistributions in binary form must reproduce the above copyright 13806bf111SMatthew Dillon.\" notice, this list of conditions and the following disclaimer in 14806bf111SMatthew Dillon.\" the documentation and/or other materials provided with the 15806bf111SMatthew Dillon.\" distribution. 16806bf111SMatthew Dillon.\" 3. Neither the name of The DragonFly Project nor the names of its 17806bf111SMatthew Dillon.\" contributors may be used to endorse or promote products derived 18806bf111SMatthew Dillon.\" from this software without specific, prior written permission. 19806bf111SMatthew Dillon.\" 20806bf111SMatthew Dillon.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21806bf111SMatthew Dillon.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22806bf111SMatthew Dillon.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23806bf111SMatthew Dillon.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24806bf111SMatthew Dillon.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25806bf111SMatthew Dillon.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 26806bf111SMatthew Dillon.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27806bf111SMatthew Dillon.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28806bf111SMatthew Dillon.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29806bf111SMatthew Dillon.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 30806bf111SMatthew Dillon.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31806bf111SMatthew Dillon.\" SUCH DAMAGE. 32806bf111SMatthew Dillon.\" 33806bf111SMatthew Dillon.Dd February 21, 2005 34806bf111SMatthew Dillon.Dt TLS 2 35806bf111SMatthew Dillon.Os 36806bf111SMatthew Dillon.Sh NAME 37ba491dfbSMatthew Dillon.Nm set_tls_area , 38ba491dfbSMatthew Dillon.Nm get_tls_area 394041d919SSascha Wildner.Nd kernel TLS (thread local storage) support 40806bf111SMatthew Dillon.Sh LIBRARY 41806bf111SMatthew Dillon.Lb libc 42806bf111SMatthew Dillon.Sh SYNOPSIS 43806bf111SMatthew Dillon.In sys/tls.h 44806bf111SMatthew Dillon.Ft int 45ba491dfbSMatthew Dillon.Fn set_tls_area "int which" "struct tls_info *info" "size_t infosize" 46806bf111SMatthew Dillon.Ft int 47ba491dfbSMatthew Dillon.Fn get_tls_area "int which" "struct tls_info *info" "size_t infosize" 48806bf111SMatthew Dillon.Sh DESCRIPTION 49806bf111SMatthew DillonThe 50ba491dfbSMatthew Dillon.Fn set_tls_area 51806bf111SMatthew Dillonsystem call creates an entry for the TLS facility 52806bf111SMatthew Dillon.Fa which 53806bf111SMatthew Dillonrepresenting thread local storage as specified by the 54806bf111SMatthew Dillon.Fa info 55*4a5f69f6SSascha Wildnerstructure. 56*4a5f69f6SSascha WildnerA descriptor representing the facility is returned, or -1 if an error occurred. 57*4a5f69f6SSascha WildnerThe facility may be cleared by specifying a NULL pointer and an infosize of 0. 58806bf111SMatthew DillonThe 59ba491dfbSMatthew Dillon.Fn get_tls_area 60*4a5f69f6SSascha Wildnersystem call retrieves the requested TLS facility. 61*4a5f69f6SSascha WildnerA descriptor representing the facility is returned, or -1 if an error occurred. 62*4a5f69f6SSascha WildnerIf you simply want the 63806bf111SMatthew Dillondescriptor you may specify a NULL pointer and an infosize of 0. 64806bf111SMatthew Dillon.Pp 65*4a5f69f6SSascha WildnerThe returned descriptor and the TLS mechanism is machine-dependent. 66*4a5f69f6SSascha WildnerOn IA32 67806bf111SMatthew Dillonthree global segment descriptors are supported (0, 1, and 2) and the %gs 68806bf111SMatthew Dillonload value is returned. 69806bf111SMatthew Dillon.Pp 70806bf111SMatthew DillonThe 71806bf111SMatthew Dillon.Fa tls_info 72806bf111SMatthew Dillonstructure passed to 73ba491dfbSMatthew Dillon.Fn set_tls_area 74806bf111SMatthew Dillonshould first be zerod (to remain compatible with future extensions) 75806bf111SMatthew Dillonand then initialized. 76806bf111SMatthew Dillon.Bd -literal 77806bf111SMatthew Dillonstruct tls_info { 78806bf111SMatthew Dillon void *base; /* base address of TLS area */ 79806bf111SMatthew Dillon int size; /* size of TLS area in bytes */ 80806bf111SMatthew Dillon}; 81806bf111SMatthew Dillon.Ed 82806bf111SMatthew Dillon.Pp 83*4a5f69f6SSascha WildnerThe actual implementation of the area is machine-dependent. 84*4a5f69f6SSascha WildnerIf the kernel 853f625015SSascha Wildneris unable to accommodate the supplied size it may create a larger area. 863f625015SSascha WildnerIf the kernel is unable to accommodate the supplied base address an error 87806bf111SMatthew Dillonwill be returned. 88806bf111SMatthew Dillon.Sh RETURN VALUES 89806bf111SMatthew DillonA return value of 0 is returned on success, -1 on error. 90*4a5f69f6SSascha Wildner.Sh EXAMPLES 91806bf111SMatthew Dillon.Bd -literal -compact 92806bf111SMatthew Dillon 93806bf111SMatthew Dillon/* 94806bf111SMatthew Dillon * Pseudo example showing how the TLS system calls work on IA32. 95806bf111SMatthew Dillon */ 96806bf111SMatthew Dillon#include <stdio.h> 97806bf111SMatthew Dillon#include <unistd.h> 98806bf111SMatthew Dillon#include <stdlib.h> 99806bf111SMatthew Dillon#include <errno.h> 100806bf111SMatthew Dillon#include <sys/tls.h> 101806bf111SMatthew Dillon 102806bf111SMatthew Dillonint X; 103806bf111SMatthew Dillon 104806bf111SMatthew Dillonstatic int getdata(int offset); 105806bf111SMatthew Dillon 106806bf111SMatthew Dillonint 107806bf111SMatthew Dillonmain(int ac, char **av) 108806bf111SMatthew Dillon{ 109806bf111SMatthew Dillon int i; 110806bf111SMatthew Dillon int gs; 111806bf111SMatthew Dillon struct tls_info info; 112806bf111SMatthew Dillon 113806bf111SMatthew Dillon info.base = &X; 114806bf111SMatthew Dillon info.size = sizeof(X); 115ba491dfbSMatthew Dillon if ((gs = set_tls_area(0, &info, sizeof(info))) < 0) { 116806bf111SMatthew Dillon perror("setarea"); 117806bf111SMatthew Dillon exit(1); 118806bf111SMatthew Dillon } 119a3220ac5SSascha Wildner printf("gs = %04x\en", gs); 120e96f55deSSimon Schubert __asm __volatile("mov %0,%%gs" : : "g" (gs) ); 121806bf111SMatthew Dillon 122ba491dfbSMatthew Dillon if (get_tls_area(0, &info, sizeof(info)) < 0) { 123806bf111SMatthew Dillon perror("getarea"); 124806bf111SMatthew Dillon exit(1); 125806bf111SMatthew Dillon } 126a3220ac5SSascha Wildner printf("%p/%d\en", info.base, info.size); 127806bf111SMatthew Dillon 128806bf111SMatthew Dillon X = 1; 129a3220ac5SSascha Wildner printf("should be 1: %d\en", getdata(0)); 130806bf111SMatthew Dillon X = 2; 131a3220ac5SSascha Wildner printf("should be 2: %d\en", getdata(0)); 132806bf111SMatthew Dillon 133a3220ac5SSascha Wildner printf("this should fault:\en"); 134806bf111SMatthew Dillon fflush(stdout); 135806bf111SMatthew Dillon getdata(4); 136806bf111SMatthew Dillon 137806bf111SMatthew Dillon return(0); 138806bf111SMatthew Dillon} 139806bf111SMatthew Dillon 140806bf111SMatthew Dillonstatic int 141806bf111SMatthew Dillongetdata(int offset) 142806bf111SMatthew Dillon{ 143806bf111SMatthew Dillon int rv; 144806bf111SMatthew Dillon __asm __volatile("movl %%gs:(%0),%%eax; movl %%eax,%1" : "+r" (offset) : "m" 145806bf111SMatthew Dillon (rv) : "ax"); 146806bf111SMatthew Dillon return (rv); 147806bf111SMatthew Dillon} 148806bf111SMatthew Dillon 149806bf111SMatthew Dillon.Ed 1500b84df5cSSascha Wildner.Sh ERRORS 1510b84df5cSSascha Wildner.Bl -tag -width Er 1520b84df5cSSascha Wildner.It Bq Er ERANGE 1530b84df5cSSascha WildnerThe specified facility index, 1540b84df5cSSascha Wildner.Fa which , 1550b84df5cSSascha Wildneris not supported. 1560b84df5cSSascha Wildner.It Bq Er EINVAL 1570b84df5cSSascha WildnerAn invalid parameter has been specified. 1580b84df5cSSascha Wildner.It Bq Er ENOENT 159ba491dfbSMatthew Dillon(get_tls_area) The specified facility has not been initialized with 1600b84df5cSSascha Wildner.Fn sys_set_tls_area . 1610b84df5cSSascha Wildner.El 162806bf111SMatthew Dillon.Sh SEE ALSO 163806bf111SMatthew Dillon.Xr umtx 2 164806bf111SMatthew Dillon.Sh HISTORY 165806bf111SMatthew DillonThe 166ba491dfbSMatthew Dillon.Fn set_tls_area , 167806bf111SMatthew Dillonand 168ba491dfbSMatthew Dillon.Fn get_tls_area 169a3220ac5SSascha Wildnerfunction calls first appeared in 170a3220ac5SSascha Wildner.Dx 1.1 . 171