Intel-TSX: почему сбой rtm?

#c #x86-64 #intel-tsx

#c #x86-64 #intel-tsx

Вопрос:

Я новичок в использовании Intel-TSX. Поэтому, пожалуйста, поправьте меня на любую терминологическую / концептуальную ошибку.

Я пытаюсь написать пользовательский движок rsa, используя здесь библиотеку polarssl (я знаю, что она старая, но мне было легко понять). У меня есть следующий код,

 result=-1;
unsigned block;

int key_len= 128;

while(result!=1){
    if ((block = _xbegin()) == _XBEGIN_STARTED) {
        if( rsa_pkcs1_decrypt( amp;rsa_polar, amp;myrand, NULL, RSA_PRIVATE, amp;key_len, from, decrypt_plaintext, sizeof(decrypt_plaintext) ) != 0 )
            exit(0);
        rsa_free(amp;rsa_polar);
        result=1;
        _xend();
    }else{
        printf("RTM 2: Transaction failedn");
        printf("status is %ldn", block);
       
    }
    printf("Block 2: Result is %dn", result);
}
  

Код внутри блока rtm не работает. Однако тот же код работает вне блока rtm. После запуска кода я получаю следующий вывод,

 .
.
RTM 2: Transaction failed
status is 0
Block 2: Result is -1
. 
.
  

Любая помощь / предложения о том, как это решить?

Комментарии:

1. Хорошо, это подтверждает, что на вашем компьютере включен используемый RTM, поэтому проблема заключается в деталях этой транзакции. Я бы беспокоился, что вызываемые вами функции могут выполнять слишком много работы. Я забыл, можно ли использовать lock инструкцию ed внутри транзакции; rsa_free может сделать это, если это распределитель, защищенный от ошибок.

2. Что rsa_pkcs1_decrypt делает? Выполняет ли он вообще какой-либо системный вызов? Как долго он работает? Многие вещи могут привести к прерыванию транзакции TSX, включая переключение контекста, инструкции FPU, смешанный доступ к регистрам XMM / YMM, cflush , cpuid и так далее. Если функция достаточно длинная и сложная, существует очень высокая вероятность того, что происходит хотя бы одна из этих вещей. TSX не следует использовать в таких сценариях, но только в критических коротких разделах кода.

3. Согласно разделу 16.3.5 тома 1 Руководства разработчиков программного обеспечения Intel, код состояния прерывания 0 может возникнуть, например, когда команда CPUID встречается в области RTM, поскольку она не удовлетворяет требованиям установки любого из битов EAX.

4. @PeterCordes: Если бы причиной прерывания было «слишком много работы», то я полагаю, что в коде состояния прерывания был бы установлен бит 3. Однако все биты понятны.

5. @ perplex 2 мс — это довольно долгое время, есть большая вероятность, что за этот интервал может произойти переключение контекста. В любом случае, функция слишком тяжелая, чтобы ее можно было запустить в одной транзакции TSX. Это не то, для чего предназначен TSX.