DragonFly On-Line Manual Pages

Search: Section:  


TLS(2)                   DragonFly System Calls Manual                  TLS(2)

NAME

set_tls_area, get_tls_area -- kernel TLS (thread local storage) support

LIBRARY

Standard C Library (libc, -lc)

SYNOPSIS

#include <sys/tls.h> int set_tls_area(int which, struct tls_info *info, size_t infosize); int get_tls_area(int which, struct tls_info *info, size_t infosize);

DESCRIPTION

The set_tls_area() system call creates an entry for the TLS facility which representing thread local storage as specified by the info structure. A descriptor representing the facility is returned, or -1 if an error occurred. The facility may be cleared by specifying a NULL pointer and an infosize of 0. The get_tls_area() system call retrieves the requested TLS facility. A descriptor representing the facility is returned, or -1 if an error occurred. If you simply want the descriptor you may specify a NULL pointer and an infosize of 0. The returned descriptor and the TLS mechanism is machine-dependent. On IA32 three global segment descriptors are supported (0, 1, and 2) and the %gs load value is returned. The tls_info structure passed to set_tls_area() should first be zerod (to remain compatible with future extensions) and then initialized. struct tls_info { void *base; /* base address of TLS area */ int size; /* size of TLS area in bytes */ }; The actual implementation of the area is machine-dependent. If the kernel is unable to accommodate the supplied size it may create a larger area. If the kernel is unable to accommodate the supplied base address an error will be returned.

RETURN VALUES

A return value of 0 is returned on success, -1 on error.

EXAMPLES

/* * Pseudo example showing how the TLS system calls work on IA32. */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <sys/tls.h> int X; static int getdata(int offset); int main(int ac, char **av) { int i; int gs; struct tls_info info; info.base = &X; info.size = sizeof(X); if ((gs = set_tls_area(0, &info, sizeof(info))) < 0) { perror("setarea"); exit(1); } printf("gs = %04x\n", gs); __asm __volatile("mov %0,%%gs" : : "g" (gs) ); if (get_tls_area(0, &info, sizeof(info)) < 0) { perror("getarea"); exit(1); } printf("%p/%d\n", info.base, info.size); X = 1; printf("should be 1: %d\n", getdata(0)); X = 2; printf("should be 2: %d\n", getdata(0)); printf("this should fault:\n"); fflush(stdout); getdata(4); return(0); } static int getdata(int offset) { int rv; __asm __volatile("movl %%gs:(%0),%%eax; movl %%eax,%1" : "+r" (offset) : "m" (rv) : "ax"); return (rv); }

ERRORS

[ERANGE] The specified facility index, which, is not supported. [EINVAL] An invalid parameter has been specified. [ENOENT] (get_tls_area) The specified facility has not been initialized with sys_set_tls_area().

SEE ALSO

umtx(2)

HISTORY

The set_tls_area(), and get_tls_area() function calls first appeared in DragonFly 1.1. DragonFly 5.5 February 21, 2005 DragonFly 5.5 TLS_CLIENT(3) DragonFly Library Functions Manual TLS_CLIENT(3)

NAME

tls_client, tls_server, tls_configure, tls_reset, tls_free -- configure a TLS connection

SYNOPSIS

#include <tls.h> struct tls * tls_client(void); struct tls * tls_server(void); int tls_configure(struct tls *ctx, struct tls_config *config); void tls_free(struct tls *ctx); void tls_reset(struct tls *ctx);

DESCRIPTION

A TLS connection is represented as a struct tls object called a ``context''. A new context is created by either the tls_client() or tls_server() functions. tls_client() is used in TLS client programs, tls_server() in TLS server programs. The context can then be configured with the function tls_configure(). The same tls_config object can be used to configure multiple contexts. After configuration, tls_connect(3) can be called on objects created with tls_client(), and tls_accept_socket(3) on objects created with tls_server(). After use, a TLS context should be closed with tls_close(3), and then freed by calling tls_free(). If tls_free() is called with an argument of NULL, no action occurs. A TLS context can be reset by calling tls_reset(), allowing for it to be reused. This is essentially equivalent to calling tls_free(), followed by a call to the same function that was used to originally allocate the TLS context.

RETURN VALUES

tls_client() and tls_server() return NULL on error or an out of memory condition. tls_configure() returns 0 on success or -1 on error.

SEE ALSO

tls_accept_socket(3), tls_config_new(3), tls_connect(3), tls_init(3)

HISTORY

These functions appeared in OpenBSD 5.6 and got their final names in OpenBSD 5.7.

AUTHORS

Joel Sing <jsing@openbsd.org> DragonFly 5.5 August 12, 2017 DragonFly 5.5

Search: Section: