Hi Brad, 

I think this depends on if the platform expects a TCB or
a DTV at the thread pointer. Different platforms sparc, alpha, x86, ARM
expect different things and an ifdef controls which one should be there
in the code somewhere. 

Thanks, 

Ali 

On Wed, 6 Jul 2011 16:36:32
-0500, "Beckmann, Brad"  wrote:  

Hi All, 

This question is partially
a development question, but since I know that most of the prior
conversations concerning the m5threads package has been on the
gem5-user/m5-user lists, I want to make sure that all folks with
m5threads experience see my question. 

Does anyone have experience
successfully using the OpenMP test in the m5threads package? The
particular ISA doesn't matter. If so, I would be curious to know if you
needed to make changes to pthreads.c, in particular the function
"setup_thread_tls", to make it work. Those of you familiar with that
code know that there is some nasty pointer arithmetic in that function
to copy the TLS from the ELF structure to the main thread's simulated
TLS. The confusing thing is that the pointer to the destination TLS is
aligned twice. First the tlsblock pointer is aligned according to the
tls_align value, then the tlsblock pointer is aligned to some confusing
combination of the tcb_offset and memsz to produce the tls_start_ptr. My
experience using the pthread tests that the second alignment makes no
modifications and essentially copies the tlsblock value to the
tls_start_ptr. However, for the OpenMP test, the second alignment sets
the tls_start_ptr to an illegal value, thus crashing the program. 

I'm
not sure why the second alignment modification is even necessary, and
the OpenMP test seems to work if you simply remove it. See diff below.
However, before I check in the change, I would like to know if others
have a better understanding why the second alignment statement was added
(…Daniel Sanchez?) 

diff --git a/pthread.c b/pthread.c 

---
a/pthread.c 

+++ b/pthread.c 

@@ -151,11 +151,9 @@ 

 void* tlsblock =
(void *) (((uintptr_t) th_block_addr + thread_block_info.tls_align - 1)


 & ~(thread_block_info.tls_align - 1)); 

 /* Initialize the TLS
block. */ 

- char* tls_start_ptr = ((char *) tlsblock + tcb_offset 

-
- roundup (thread_block_info.tls_memsz, thread_block_info.tls_align ?:
1)); 

 //DEBUG("Init TLS: Copying %d bytes from 0x%llx to 0x%llxn",
filesz, (uint64_t) initimage, (uint64_t) tls_start_ptr) 

; 

- memcpy
(tls_start_ptr, thread_block_info.tls_initimage,
thread_block_info.tls_filesz); 

+ memcpy (tlsblock,
thread_block_info.tls_initimage, thread_block_info.tls_filesz); 


//Rest of tls vars are already cleared (mmap returns zeroed memory)


Thanks, 

Brad   

 
_______________________________________________
gem5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to