-
Notifications
You must be signed in to change notification settings - Fork 0
/
thread.c
82 lines (72 loc) · 1.99 KB
/
thread.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
*
* This file is part of UEFI fdisk.
*
* UEFI fdisk is a port of util-linux fdisk to UEFI/BIOS.
* UEFI fdisk est un portage de util-linux fdisk vers UEFI/BIOS.
* Ce fichier a été initié par Bernard Burette en janvier 2014.
*
* All this work is copyleft Bernard Burette.
* Gauche d'auteur Bernard Burette.
*
* This program is distributed under the terms of the GNU General Public
* License version 2 or more.
* La diffusion de ce code est faite selon les termes de la licence publique
* générale GNU version 2 ou plus.
*
*/
/** @file
*
* Gestion mulithread.
* La librairie libstdc++ s'attend à un environnement habituel
* dans lequel le multithread est possible, mais en UEFI ce
* n'est pas le cas. Toutefois les fonctions dans ce modules sont
* appelées via le mode @PLT et si elles ne sont définies nulle
* part, le linker laisse la gestion via la GLOBAL_OFFSET_TABLE
* ce qui fera crasher le programme.
* Rechercher GOT / PLT sur Internet pour plus d'explication.
*
*/
#include "uefi.h"
#include "debug.h"
#include <pthread.h>
#if 0
/**
* pthread_once() : appelle une fonction une seule fois.
*/
int pthread_once( control , routine )
pthread_once_t * control ;
void ( * routine )() ;
{
if ( * control == PTHREAD_ONCE_INIT ) {
( * control ) ++ ;
( * routine )() ;
}
return 0 ;
}
#endif
/**
* dl_tls_index : argument passé à __tls_get_addr().
*/
typedef struct dl_tls_index
{
uint64_t ti_module;
uint64_t ti_offset;
} tls_index;
/**
* __tls_get_addr() : retourne l'adresse d'une variable "thread local".
* Cela n'a pas de sens en mode UEFI : un seul thread est possible donc
* la fonction retourne juste l'adresse qui a été ajustée par _relocate
* du module relocate.
*/
void * __tls_get_addr ( tls_index * ti ) ;
void *
__tls_get_addr ( ti )
tls_index * ti ;
{
UEFI_dprintf( D_DEBUG | D_INIT , "__tls_get_addr( mod=%ld , off=%p )\n" , ti-> ti_module , (void *) ti-> ti_offset ) ;
/*
__fortify_fail( "__tls_get_addr()" ) ;
*/
return (void*) ti-> ti_offset ;
}