2013-03-24 3 views
2

Эмулятор Android, поставляемый с Android SDK, поддерживает эмуляцию инструкций NEON (проверял это сам). И он основан на QEMU.Поддержка ARM NEON в Qemu

Недавно я попытался создать пользовательскую виртуальную машину с QEMU (эмулятором Cortex-A9) и установить некоторый дистрибутив ARMEL Linux.

Однако после установки /proc/cpuinfo не отображается neon в характеристиках процессора. Какой трюк на самом деле эмулятор для Android делает NEON, похоже, доступным внутри их VM?

+0

это либо более новая версия, чем ваша, либо ваша настроена по-разному. – auselen

ответ

2

Эти значения хранятся в elf_hwcap (см. kernel/setup.c). vfp/vfpmodule.c обнаруживает NEON поддерживает и устанавливает бит в elf_hwcap. В частности с помощью этого кода,

  /* 
      * Check for the presence of the Advanced SIMD 
      * load/store instructions, integer and single 
      * precision floating point operations. Only check 
      * for NEON if the hardware has the MVFR registers. 
      */ 
      if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) { 
#ifdef CONFIG_NEON 
        if ((fmrx(MVFR1) & 0x000fff00) == 0x00011100) 
          elf_hwcap |= HWCAP_NEON; 
#endif 
#ifdef CONFIG_VFPv3 
        if ((fmrx(MVFR1) & 0xf0000000) == 0x10000000) 
          elf_hwcap |= HWCAP_VFPv4; 
#endif 
      } 

The read_cpuid_id() макрос для сопроцессора CP15, который получает процессора ID битовую карту а. В fmrx() также используется другой копроцессорный регистр VFP. Таким образом, эмулятор, который вы используете, неправильно отвечает на MRC инструкций из одного из копроцессорных регистров; или, возможно, не поддерживает эмуляцию NEON.

+0

Так что Neon, не внесенный в/proc/cpuinfo, не обязательно означает, что эмуляция не поддерживается, правильно? – NumberFour

+1

@NumberFour Это правильно. Вы должны быть осторожны, Linux может эмулировать Neon с помощью * undefined instructions * exception. Тогда вы будете эмулировать NEON под гипер-козырьком. Я вижу только [alignment.c] (https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/arch/arm/mm/alignment.c), [vfpdouble .c] (https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/arch/arm/vfp/vfpdouble.c) и [vfpsingle.c] (https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/arch/arm/vfp/vfpsingle.c), которые, похоже, подражают инструкциям. –

0

Я столкнулся с той же проблемой. Вы должны эмулировать аппаратное обеспечение, поддерживающее неоновый интерфейс. beaglexm имеет поддержку. проверьте это here