[fpc-devel] Problem with thread local storage for xtensa-freertos

Christo Crause christo.crause at gmail.com
Fri Jul 3 09:47:23 CEST 2020


Busy working on threading and TLS, started with a stand-alone unit along
the lines of cthreads and using OS memory allocation for storing the TLS
blocks. After initializing (calling SysInitMultithreading) a block of
memory is allocated and threadvars copied.  However there appears to be a
two byte offset in the location of the threadvars after relocating them,
see test and output below.

program testTLS;
uses fthreads;

threadvar
  x, y, z: uint32;

begin
  x := $11ABCDEF;
  y := $99887766;
  z := $55443322;
  writeln('Initial x location: ', HexStr(@x), '. Value = ',
HexStr(pointer(x)));
  writeln('Initial y location: ', HexStr(@y), '. Value = ',
HexStr(pointer(y)));
  writeln('Initial z location: ', HexStr(@z), '. Value = ',
HexStr(pointer(z)));

  writeln('Initializing threads...');
  fthreads.SysInitMultithreading;

  writeln('Current x location: ', HexStr(@x), '. Value = ',
HexStr(pointer(x)));
  writeln('Current y location: ', HexStr(@y), '. Value = ',
HexStr(pointer(y)));
  writeln('Current z location: ', HexStr(@z), '. Value = ',
HexStr(pointer(z)));

  repeat  until false;
end.

Output:
Initial x location: 3FFB268C. Value = 11ABCDEF
Initial y location: 3FFB2694. Value = 99887766
Initial z location: 3FFB269C. Value = 55443322
Initializing threads...
Current x location: 3FFB7E12. Value = CDEF0000
Current y location: 3FFB7E16. Value = 776611AB
Current z location: 3FFB7E1A. Value = 33229988

This is a little endian system so the output can be explained by shifting
the pointer references back (before the actual location) by two bytes.

Somewhere between how FPC presents the pointers to the thread vars, how the
RTL access the pointers and how the new implementation allocates and
presents the storage pointer there appears to be a mismatch.  One thing I
would like to investigate is how the compiler packs the thread vars and how
the relocated data is interpreted by the RTL.

Any hints on what to look for?

Attached the fthreads unit for reference.

Best regards,
Christo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20200703/12823d11/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fthreads.pas
Type: application/octet-stream
Size: 16481 bytes
Desc: not available
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20200703/12823d11/attachment.obj>


More information about the fpc-devel mailing list