Hi

2007/4/17, Atif Hashmi <[EMAIL PROTECTED]>:


But this prints "Transaction restart" once and then the program finishes.
This means that commit transaction is not called the second time. Could you
please tell me what am I doing wrong?


Helper functions are outside the translated opcode stream and are invoked by
call/ret:

.------.
|      |
|   ---+-->  helper_StartTransaction()
|   <--+-------------------/
|      |
|      |
|   ---+-->  helper_CommitTransaction()
|   <--+-------------------/
|      |
'------'

When you longjmp from helper_CommitTransaction to helper_StartTransaction
it's probable that you return back to the point where
helper_CommitTransaction should have returned to, as it is the last address
stored in the stack.

Anyway, guest code between the start and the end of the transaction should
not be rerun without updating guest machine state (eip, flags, etc.).

You should better forget about using setjmp/longjmp. Maybe something like
this could do the trick:

when translating mov %al,%al:
{
 ...
 ...
 store the address (eip) of mov %al,%al instruction somewhere
 gen_op_start_transaction();
}

when translating mov %bl, %bl:
{
 ...
 ...
 gen_op_commit_transaction(stored_eip);
 gen_eob(s);  // Stop translation to force guest state updating
}

op_commit_transaction should look like:
{
 if ( helper_CommitTransaction() ) // helper should return !=0 on error
    EIP = PARAM1;
}

Regards,
Eduardo

Reply via email to