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, }; }