Hi Mihai,

The pointers in Solaris are 8 bytes so you need to use 8. For cpu_id, t_id etc 
you only need 4 bytes.

Did you assign the new value to KernelVaddr_cpu_list variable ?

Currently you have,

// boost::tie( paddr, ignored1, ignored2) = 
cpu->translateTSB_SimicsImpl(VirtualMemoryAddress(cpu_ptr + 0x10), 4 
/*NUCLEUS*/ );
// cpu_ptr = VirtualMemoryAddress(cpu->readVAddr(VirtualMemoryAddress(cpu_ptr + 
0x48), 4 /*NUCLEUS*/, 8)); //next CPU pointer at offset 0x48 - solaris8

The first line reads the thread id from the cpu struct (current thread field) 
and the second line reads the pointer in the next cpu (cpu_next field). 
You need to come up with the values that are valid for Solaris 10.

Cheers,
-Stavros
________________________________________
From: mihai pricopi [[email protected]]
Sent: Friday, August 20, 2010 10:23 AM
To: Volos Stavros
Cc: [email protected]
Subject: Re: Get values per thread

Hello,

  I tried to do as you suggested with the cpu_list pointer but I have troubles 
understand why :
  cpuX->readVAddr(VirtualMemoryAddress(addr), 4, 4);

  is not working. So first I took the cpuvar.h from the Solaris10 operating 
system. There there is this set of variables:

extern struct cpu    *cpu[];        /* indexed by CPU number */
extern cpu_t        *cpu_list;    /* list of CPUs */
extern int        ncpus;        /* number of CPUs present */
extern int        ncpus_online;    /* number of CPUs not quiesced */
extern int        max_ncpus;    /* max present before ncpus is known */
extern int        boot_max_ncpus;    /* like max_ncpus but for real */
extern processorid_t    max_cpuid;    /* maximum CPU number */
extern struct cpu    *cpu_inmotion;    /* offline or partition move target */

 While OS running I debugged it using mdb -K and looking for the addresses of 
the symbols. I took the addresses for the ncpus and cpu_list and cpu[]. If I do 
this:

VirtualMemoryAddress kernel_ncpus(ncpus_add);
uint64_t kernelCpus = cpuX->readVAddr(VirtualMemoryAddress(kernel_ncpus), 4, 4);

The value is correct in this case. Then I tried to see the structure of the 
struct cpu which is:

/*
 * Per-CPU data.
 */
typedef struct cpu {
    processorid_t    cpu_id;            /* CPU number */
    processorid_t    cpu_seqid;    /* sequential CPU id (0..ncpus-1) */
    volatile cpu_flag_t cpu_flags;        /* flags indicating CPU state */
    struct cpu    *cpu_self;        /* pointer to itself */
    kthread_t    *cpu_thread;        /* current thread */
    kthread_t    *cpu_idle_thread;    /* idle thread for this CPU */
    kthread_t    *cpu_pause_thread;    /* pause thread for this CPU */
    klwp_id_t    cpu_lwp;        /* current lwp (if any) */
    klwp_id_t    cpu_fpowner;        /* currently loaded fpu owner */
    struct cpupart    *cpu_part;        /* partition with this CPU */
    struct lgrp_ld    *cpu_lpl;        /* pointer to this cpu's load */
    struct chip    *cpu_chip;        /* cpu's chip data */
    int        cpu_rechoose;        /* cpu's rechoose_interval */
    int        cpu_cache_offset;    /* see kmem.c for details */
   
..............................................................................................

So theoretically if I red the cpu_id should be the cpuid of the current cpu. I 
tried this:

VirtualMemoryAddress kernel_cpuid(cpu_list_add);
VirtualMemoryAddress cpuIdAddr = 
VirtualMemoryAddress(cpu1->readVAddr(VirtualMemoryAddress(kernel_cpuid), 4,8));
uint64_t mycpuId = cpu1->readVAddr(VirtualMemoryAddress(cpuIdAddr), 4,4);

if I execute this in WhiteBox constructor and run it everytime the value is 0 
regardless of the processor.

May I also ask why the last argument for the VirtualMemoryAddress is 8 when I 
read a pointer and 4 when I read data ?


On Thu, Jul 29, 2010 at 1:00 AM, Volos Stavros 
<[email protected]<mailto:[email protected]>> wrote:
In the WhiteBoxImpl.cpp there is a function get_thread_t(aCPU). This function
returns the thread_t pointer of the cpu struct. Actually there is a cpu list in 
the
kernel. There is an offset to find the next cpu in the list. Then inside the 
cpu struct
there is a pointer in a thread_t struct where you can find the thread id.

The numbers 0x10, 0x48 are hardcoded for Solaris 8.

You can look in Open solaris source code to see what is true for Solaris 10

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/cpuvar.h#cpu_t

You will also need to find the virtual address of the cpu_list in the kernel. 
You can use
the kernel debugger (kdb).

Regards,
-Stavros

________________________________
From: mihai pricopi [[email protected]<mailto:[email protected]>]
Sent: Wednesday, July 28, 2010 12:44 PM
To: Volos Stavros
Cc: [email protected]<mailto:[email protected]>

Subject: Re: Get values per thread

Hello,

 I`m trying to understand how the white box is working. I see this code where I 
suppose I have to find the answer:

struct WhiteBoxImpl : WhiteBox {
  API::symtable_interface_t * theSymTable;

  std::vector< PhysicalMemoryAddress > theThreadTs;
  std::vector< PhysicalMemoryAddress > theIdleThreadTs;

  WhiteBoxImpl() {
   #if FLEXUS_TARGET_IS(v9)
    API::SIM_load_module("symtable");
    API::conf_class_t * symtable_class = API::SIM_get_class("symtable");
    API::conf_object_t * symtable_obj = API::SIM_new_object(symtable_class, 
"flexus_symtable");
    theSymTable = reinterpret_cast<API::symtable_interface_t 
*>(API::SIM_get_class_interface(symtable_class, "symtable"));

    for (int32_t i = 0; i < API::SIM_number_processors(); ++i) {
      API::conf_object_t * ctx = 
API::SIM_get_attribute(Simics::APIFwd::SIM_get_processor(i), 
"current_context").u.object;
      API::attr_value_t val;
      val.kind = API::Sim_Val_Object;
      val.u.object = symtable_obj;
      API::SIM_set_attribute(ctx, "symtable", &val);
    }
    API::attr_value_t arch = API::SIM_get_attribute( 
Simics::APIFwd::SIM_get_processor(0), "architecture");
    API::SIM_set_attribute( symtable_obj, "arch", &arch);

    DBG_(Dev, ( << "symtable loaded" ) );
   #endif


  }

  The problem is that I don't know which thread is being executed because I 
suspect Solaris10 is doing the thread migration meanwhile and I can't rely on 
the values until I see per thread. Does the ctx hold the information about the 
current thread that the timing simulation is executing per core ?

Thanks
Mihai

On Wed, Jul 28, 2010 at 4:22 AM, Volos Stavros 
<[email protected]<mailto:[email protected]>> wrote:
Actually, the component WhiteBox is responsible to give the thread id of the 
thread
that is being executed in a particular CPU. However, this component is hardcoded
for Solaris 8. I worked on this component to support Solaris 10, but I didn't 
have time
to check whether it works properly or not.

Assuming that you know which thread is being executed, it should be easy to get
measured values per software thread.

Regards,
-Stavros

________________________________
From: mihai pricopi [[email protected]<mailto:[email protected]>]
Sent: Tuesday, July 27, 2010 6:07 PM
To: Volos Stavros
Subject: Re: Get values per thread

Per software thread. I discovered that Solaris modifies a register when it does 
the context switch but I`m not sure where exactly in flexus i can read that 
register and if flexus already gives me this information ?

Thanks

On Tue, Jul 27, 2010 at 11:55 PM, Volos Stavros 
<[email protected]<mailto:[email protected]>> wrote:
Hi Mihai,

What do you mean by the term "thread"? Do you mean software thread or hardware 
thread (multithreaded
processor) ?

Regards,
-Stavros

________________________________
From: mihai pricopi [[email protected]<mailto:[email protected]>]
Sent: Tuesday, July 27, 2010 12:57 PM
To: [email protected]<mailto:[email protected]>
Subject: Get values per thread

Hi,

  Is it possible that Flexus can give measured values per thread not per core ?

Thanks



Reply via email to