Function prepareArea [src]
Initializes all the fields of the static TLS area and returns the computed architecture-specific
value of the TP register.
Prototype
pub fn prepareArea(area: []u8) usize
Parameters
area: []u8
Source
pub fn prepareArea(area: []u8) usize {
@setRuntimeSafety(false);
@disableInstrumentation();
// Clear the area we're going to use, just to be safe.
@memset(area, 0);
// Prepare the ABI TCB.
const abi_tcb = alignPtrCast(AbiTcb, area.ptr + area_desc.abi_tcb.offset);
switch (current_variant) {
.I_original, .I_modified => abi_tcb.dtv = @intFromPtr(area.ptr + area_desc.dtv.offset),
.II => abi_tcb.self = abi_tcb,
}
// Prepare the DTV.
const dtv = alignPtrCast(Dtv, area.ptr + area_desc.dtv.offset);
dtv.len = 1;
dtv.tls_block = area.ptr + current_dtv_offset + area_desc.block.offset;
// Copy the initial data.
@memcpy(area[area_desc.block.offset..][0..area_desc.block.init.len], area_desc.block.init);
// Return the corrected value (if needed) for the TP register. Overflow here is not a problem;
// the pointer arithmetic involving the TP is done with wrapping semantics.
return @intFromPtr(area.ptr) +% switch (current_variant) {
.I_original, .II => area_desc.abi_tcb.offset,
.I_modified => area_desc.block.offset +% current_tp_offset,
};
}