2015-09-22 2 views
3

Я работаю над портом некоторого программного обеспечения с встроенной сборкой, потому что мы взяли несколько отчетов об ошибках от поддерживающего Debian под X32. Код отлично подходит как для X86, так и для X64.Ошибка шины при выполнении команды `emms` MMX

Мы ловим ошибку шины на emms инструкции:

... 
    0x005520fd <+3885>: pop %rsp 
    0x005520fe <+3886>: emms 
=> 0x00552100 <+3888>: pop %rbx 
    0x00552101 <+3889>: jmpq 0x5519e3 
    0x00552106 <+3894>: nopw %cs:0x0(%rax,%rax,1) 
    ... 

Согласно инструкции, следующие исключения возбуждаются:

Exceptions: 

    RM PM VM SMM Description 
    #UD #UD #UD #UD If CR0.EM = 1 
    #NM #NM #NM #NM If CR0.TS = 1 
    #MF #MF #MF #MF If pending FPU Exception 

Вот маска, используемая в состоянии MMX зарегистрирован:

mxcsr 0x1f80 [ IM DM ZM OM UM PM ] 

Я не верю, что имею доступ к управлению регистры, чтобы определить, что фактически вызвало исключение, поэтому у меня возникли проблемы с поиском причины ошибки шины.

Каковы некоторые из потенциальных причин ошибки шины? Или как я могу это сделать?


Вот info float:

(gdb) info float 
    R7: Empty 0xffffffffffffffffffff 
    R6: Empty 0xffffa5a5a5a5a5a5a5a5 
    R5: Empty 0xfffffedcba
    R4: Empty 0xffffb182db48cf349120 
    R3: Empty 0xffff926cd0b6a839b535 
    R2: Empty 0xfffff373de2d49584e7a 
    R1: Empty 0xffff16166e76b1bb925f 
=>R0: Empty 0xffff24f0130c63ac9332 

Status Word:   0x0000            
         TOP: 0 
Control Word:  0x037f IM DM ZM OM UM PM 
         PC: Extended Precision (64-bits) 
         RC: Round to nearest 
Tag Word:   0xffff 
Instruction Pointer: 0x00:0x00000000 
Operand Pointer:  0x00:0x00000000 
Opcode:    0x0000 

А вот от info registers:

(gdb) info registers 
rax   0xffffcb58 0xffffcb58 
rbx   0x30 0x30 
rcx   0x14f3 0x14f3 
rdx   0x61d560 0x61d560 
rsi   0xffffcb08 0xffffcb08 
rdi   0x14 0x14 
rbp   0xffffcb58 0xffffcb58 
rsp   0xb62f7cbfffffc8d8 0xb62f7cbfffffc8d8 
r8    0x0 0x0 
r9    0x40 0x40 
r10   0x2e676e696e6e7572 0x2e676e696e6e7572 
r11   0x246 0x246 
r12   0x9028a0 0x9028a0 
r13   0xffffcaf0 0xffffcaf0 
r14   0x8f6120 0x8f6120 
r15   0xffffca6c 0xffffca6c 
rip   0x552100 0x552100 
eflags   0x10246 [ PF ZF IF RF ] 
cs    0x33 0x33 
ss    0x2b 0x2b 
ds    0x2b 0x2b 
es    0x2b 0x2b 
fs    0x63 0x63 
gs    0x0 0x0 

Вот Пробой регистра состояния битов MMX:

IM - Invalid Operation Mask 
    DM - Denormalized Mask 
    ZM - Divide By Zero Mask 
    OM - Overflow Mask 
    UM - Underflow Mask 
    PM - Precision Mask 
+0

Можете ли вы включить раздел исходного кода, соответствующий этому фрагменту сгенерированного кода, чтобы мы могли видеть, какие из них используются и т. Д.? –

ответ

0

EMMS выполняется без проблем, как показано стрелкой и значением rip. Ошибка pop, потому что rsp указывает на неправильную память. Правильное значение rsp - это нечто меньшее, чем 0x100000000.

Смежные вопросы