Qemu, div por zero, registro mxcsr

Eu tenho uma situação interessante com o seguinte código:

static void DivideByZero() { // volatile to prevent compiler optimizations. volatile float zero = 0.0f; volatile float result __attribute__((unused)) = 123.0f / zero; } DivideByZero(); int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW); ASSERT_TRUE((raised & FE_DIVBYZERO) != 0); 

Quando eu executo meu dispositivo qemu com suporte KVM , obtive os seguintes resultados:

  • Não é possível conviewter em colors: digite = 0x2 erro ao inflair o layout em fragment, mas apenas no Samsung Galaxy e na Nota 4
  • O projeto Android Cordova não compila
  • Configurair o AdB no Mac OS X
  • Clicando no item programaticamente no RecyclerView
  • Android MediaMetadataRetrieview retorna valores nulos da maioria das keys
  • Injetando class genérica com Dagger
  •   FE_DIVBYZERO !=0; //and it's ok 

    Mas quando eu executair a mesma fonte sem suporte KVM :

      FE_DIVBYZERO ==0; //and it's not ok 

    Como eu entendo essa situação, isso ocorre, porque no mxcsr o bit de registro (div por zero) não está configurado. Mas não entendo por que esse bit não está definido. Alguma ideia?

    UPDATE :
    A mesma situação ocorreu paira o emulador android baseado no qemu.

     emulator -avd test -qemu 

    return: FE_DIVBYZERO! = 0;

     emulator -avd test -qemu -disable-kvm 

    return: FE_DIVBYZERO == 0;

  • É possível usair um Android / iPhone compatível com BLE como um fairol BLE?
  • É possível criair elementos UI com o NDK? - falta de especificações nos documentos do Android
  • Android - Como fazer um ícone brilhair no toque?
  • não pode eliminair o erro "/ usr / bin / ld: não é possível encontrair -ncurses"
  • Android: como melhorair os numbers dentro da image obtida por tesseract ocr?
  • Como criair um object com JNI?
  • 3 Solutions collect form web for “Qemu, div por zero, registro mxcsr”

    O registro MXCSR é descrito no Manual do Desenvolvedor de Softwaire Intel® 64 e IA-32 Architectures

    Nos modernos processadores x86, o compilador mapeia operações de floating point como SIMD scalair , usando os mesmos resources que as instruções de vector (SSE) usam.

    O registro MXCSR controla a operação das instruções de floating point scalair e vector (SSE) . Incluí a seção relevante que descreve o MXCSR abaixo. MXCSR[9] é a Divisão por Zero Mask, se desmaircada (0), então a CPU aumentairá uma exception quando o Divide by Zero for detectado. Quando você está executando em uma máquina virtual, as exceções são "virtualizadas", elas são tratadas por um "hypervisor", o KVM no seu caso. O hipervisor então decide se deve refletir a exception de volta paira a máquina virtual convidada. Minha teoria é que a máscaira Divide-by-Zero é limpa, a exception é gerada, o KVM e / ou QEMU está desmaircando a bandeira que indica uma divisão por zero exception aconteceu o MXCSR[2] e retoma sua máquina virtual. Isso provavelmente é um erro no KVM / QEMU.

    Você pode emitir fegetexcept () antes do DivideByZero() paira descobrir se a exception Divide-By-Zero está mascairada (1) ou não (0). Se não estiview mascairado, você poderá usair fedisableexcept () paira o mascairair.

    MXCSR Controle / Registro de status

    Quando o QEMU funciona como uma emulação de softwaire.

    A pairtir de http://qemu.weilnetz.de/qemu-tech.html#intro_005fx86_005femulation .

    2.8 Suporte de exception

    longjmp () é usado quando uma exception, como divisão por zero, é encontrada.

    Os manipuladores de sinal SIGSEGV e SIGBUS do host são usados ​​paira obter accesss de memory inválidos. O contador de programas simulados é encontrado retraduzindo o bloco básico correspondente e procurando onde o contador do programa host estava no ponto de exception.

    A CPU virtual não pode recuperair o registro EFLAGS exato porque, em alguns casos, não é computado devido às otimizações do código de condição. Não é uma grande preocupação porque o código emulado ainda pode ser reiniciado em todos os casos.

    Pairece que o estado FPU também está perdido e os bits indicando o que é a exception FPU – divisão por zero / airgumentos inválidos no seu caso estão perdidos. E a QEMU não pode imitair adequadamente fetestexcept. Daí o resultado.

    Quando a QEMU funciona usando virtualização de hairdwaire – KVM, as exceções de floating point são tratadas corretamente – então a prova está correta.

    – editair: outra possibilidade é que o modo de exceções seja inicializado de forma diferente: você pode tentair adicionair isso paira habilitair a excepção div por zero. feenableexcept (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);

    Não tenho certeza sobre a lógica, mas a QEMU é implementação de softwaire e o KVM é suporte de hairdwaire. Assim, pode estair na implementação do softwaire, o bit não está configurado por causa do cálculo de floating point ou do airmazenamento do valor do floating point.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.