Вход на сайт
SIGFPE / signal
333 просмотров
Перейти к просмотру всей ветки
в ответ AlexOtt 07.06.12 20:01
Вообщим с огромным трудом - почти всё перепробывал и наконец-то в силу имеющих библиотечных рессурсов вышел ожидаемый результат
Длина инструкции в фортране (=4) и Си(=9) разная. Поэтому в зависимости от языка надо правильно определить длину инструкции.
В аналогичном примере тут получается точно выяснить в каком регистре должен быть отложен результат
На нашей ОС структура ucontext выглядит немного по другому: т. е. полей
fpu_fr и fpu_q она не имеет. Чтобы долго не мучатся можно просто переписать
все возможные значения регистров для резултата данных.
Но тут есть одно НО. Я знаю адрес указателя инструкции, но не его значение. Уже всё перепробывал.
Вопрос публике: Wie kann man anhand des Befehlszeigers auf seinen Inhalt zugreifen?
Т. е.: так было бы правильно, но невозможно из-за отсутствия подструктур fpu*.
В ответ на:
sunf95 -ftrap=%all -D_GNU_SOURCE -g -c fpetest.f
suncc -ftrap=%all -D_GNU_SOURCE -g -c handling.c
"handling.c", line 66: warning: implicit function declaration: swapcontext
"handling.c", line 85: warning: left operand of "->" must be pointer to struct/union
"handling.c", line 86: warning: left operand of "->" must be pointer to struct/union
sunf95 -ftrap=%all -D_GNU_SOURCE -g -o test fpetest.o handling.o
ContextSize: 23; Adresse: 0
Div-by-zero:-0.1E+31 / 0.0E+00 = 0.0E+00
Underflow: 0.1E-29 * 0.1E-09 = 0.0E+00
Overflow: 0.1E+31 * 0.1E+31 = 0.0E+00
Invalid: 0.0E+00 / 0.0E+00 = 0.0E+00
sunf95 -ftrap=%all -D_GNU_SOURCE -g -c fpetest.f
suncc -ftrap=%all -D_GNU_SOURCE -g -c handling.c
"handling.c", line 66: warning: implicit function declaration: swapcontext
"handling.c", line 85: warning: left operand of "->" must be pointer to struct/union
"handling.c", line 86: warning: left operand of "->" must be pointer to struct/union
sunf95 -ftrap=%all -D_GNU_SOURCE -g -o test fpetest.o handling.o
ContextSize: 23; Adresse: 0
Div-by-zero:-0.1E+31 / 0.0E+00 = 0.0E+00
Underflow: 0.1E-29 * 0.1E-09 = 0.0E+00
Overflow: 0.1E+31 * 0.1E+31 = 0.0E+00
Invalid: 0.0E+00 / 0.0E+00 = 0.0E+00
Длина инструкции в фортране (=4) и Си(=9) разная. Поэтому в зависимости от языка надо правильно определить длину инструкции.
В аналогичном примере тут получается точно выяснить в каком регистре должен быть отложен результат
В ответ на:
* find out registers rd, rs1, rs2, and opf
*/
fop = ((uc->fpu_q->FQu.fpq.fpq_instr)>>fopshift) &0x1ff;
frd = ((uc->fpu_q->FQu.fpq.fpq_instr)>>frdshift) &0x1f;
frs1= ((uc->fpu_q->FQu.fpq.fpq_instr)>>frs1shift)&0x1f;
frs2= ((uc->fpu_q->FQu.fpq.fpq_instr)>>frs2shift )&0x1f;
/*
* check if both rs1 and rs2 are zero (0/0 case)
*/
i = (uc->fpu_fr.fpu_regs[frs2]&0x7fffffff)|uc->fpu_fr.fpu_regs[frs2+1];
j = (uc->fpu_fr.fpu_regs[frs1]&0x7fffffff)|uc->fpu_fr.fpu_regs[frs1+1];
switch (fop) {
case 0x4e: /* fdivd */
if((i|j) == 0) { /* 0/0 , set rd to be zero_over_zero_value */
uc->fpu_fr.fpu_regs[frd] = defaultValue[0];
uc->fpu_fr.fpu_regs[frd+1] = defaultValue[1];
}
break;
}
* find out registers rd, rs1, rs2, and opf
*/
fop = ((uc->fpu_q->FQu.fpq.fpq_instr)>>fopshift) &0x1ff;
frd = ((uc->fpu_q->FQu.fpq.fpq_instr)>>frdshift) &0x1f;
frs1= ((uc->fpu_q->FQu.fpq.fpq_instr)>>frs1shift)&0x1f;
frs2= ((uc->fpu_q->FQu.fpq.fpq_instr)>>frs2shift )&0x1f;
/*
* check if both rs1 and rs2 are zero (0/0 case)
*/
i = (uc->fpu_fr.fpu_regs[frs2]&0x7fffffff)|uc->fpu_fr.fpu_regs[frs2+1];
j = (uc->fpu_fr.fpu_regs[frs1]&0x7fffffff)|uc->fpu_fr.fpu_regs[frs1+1];
switch (fop) {
case 0x4e: /* fdivd */
if((i|j) == 0) { /* 0/0 , set rd to be zero_over_zero_value */
uc->fpu_fr.fpu_regs[frd] = defaultValue[0];
uc->fpu_fr.fpu_regs[frd+1] = defaultValue[1];
}
break;
}
На нашей ОС структура ucontext выглядит немного по другому: т. е. полей
fpu_fr и fpu_q она не имеет. Чтобы долго не мучатся можно просто переписать
все возможные значения регистров для резултата данных.
В ответ на:
int *defaultValue = (int *) &zero_over_zero_value;
for(int i =0; i < NPREG; i++)
{
(*uc)->_xmm.element[0] = (int)defaultValue[0];
(*uc)->_xmm.element[1] = (int)defaultValue[1];
}
int *defaultValue = (int *) &zero_over_zero_value;
for(int i =0; i < NPREG; i++)
{
(*uc)->_xmm.element[0] = (int)defaultValue[0];
(*uc)->_xmm.element[1] = (int)defaultValue[1];
}
Но тут есть одно НО. Я знаю адрес указателя инструкции, но не его значение. Уже всё перепробывал.
Вопрос публике: Wie kann man anhand des Befehlszeigers auf seinen Inhalt zugreifen?
Т. е.: так было бы правильно, но невозможно из-за отсутствия подструктур fpu*.
В ответ на:
//uc->fpu_q->FQu.fpq.fpq_instr // instruction
frd = ((uc->fpu_q->FQu.fpq.fpq_instr)>>frdshift) &0x1f; // Ergebnisregister
uc->fpu_fr.fpu_regs[frd] = defaultValue[0]; // redifinition of result register
uc->fpu_fr.fpu_regs[frd+1] = defaultValue[1];
//uc->fpu_q->FQu.fpq.fpq_instr // instruction
frd = ((uc->fpu_q->FQu.fpq.fpq_instr)>>frdshift) &0x1f; // Ergebnisregister
uc->fpu_fr.fpu_regs[frd] = defaultValue[0]; // redifinition of result register
uc->fpu_fr.fpu_regs[frd+1] = defaultValue[1];
В ответ на:
context->uc_mcontext.gregs[REG_RIP] // the current instruction pointer (uint32)
//-----> Wie bekomme ich anhand des Zeigers den Inhalt des Befehls?
context->uc_mcontext.gregs[REG_RIP] // the current instruction pointer (uint32)
//-----> Wie bekomme ich anhand des Zeigers den Inhalt des Befehls?