2016-09-26 3 views
0

신뢰 영역 에뮬레이션을 사용하여 qemu를 실행했습니다. 64 비트 Linux는 NWD (Normal world) EL1에서 실행되며 일부 독점 코드는 EL3 및 Secure World (SWD) EL1에서 실행됩니다. 또한 내가 같은 인터럽트 구성 : 1) FIQ는 SWD에 할당됩니다; 2) NWD에 IRQ가 할당되었습니다. 1 NWD가 NWD 64 비트 사용자 모드에서 실행 된 2) 커널 모드 (64 비트 Linux)에서 실행되었다) 3) NWD 실행 하였다 NWD가 FIQ가 중단 될 때FI3이 발생할 때 el3에서 nwd로 32 비트 프로세스가 반환 될 때 세그먼트 오류가 발생합니다.

또한 세 경우가있다 32 비트 사용자 모드에서

FIQ가 발생하면 EL3에 의해 트랩됩니다. 그런 다음 NWD 컨텍스트가 EL3의 코드에 저장되고 FIQ의 핸들러가 실행되기 시작합니다. el3에서 NWD로 돌아와서 1), 2)의 경우 모두 제대로 작동합니다. 중단 된 프로세스가 계속 작동합니다. 사례 3의 경우 el3에서 NWD로 돌아간 후 중단 된 프로세스에 대해 세그먼트 오류가 발생했습니다. 또한 이것은 el3에서 NWD EL0으로 되돌아 가기 전에 spsr_el3 레지스터의 값입니다 - 0x600f0010 - 괜찮아 보입니다. 또한 저는 이미 EL3에서 저장된 상황과 복원 된 상황을 사례 3으로 비교했으며 괜찮아 보입니다. 이것은 qemu의 버그입니다. 어떤 사람이 그 문제가 무엇인지 압니까?

+0

여기에서 문제를 진단하기에 충분한 정보가 없습니다. 오류 코드는 무엇입니까? 레지스터 손상, 스택 손상 또는 그 밖의 다른 것으로 보입니까? 인터럽트 전후의 레지스터/스택 상태는 어떻게됩니까? QEMU 버그라고 확신하면 QEMU 메일 링리스트는 아마도 그것을 제기하는 훨씬 더 적절한 장소가 될 것입니다. – Notlikethat

+0

@Notlikethat Linux 32 비트 애플리케이션이 'busybox'또는 'gdb server'와 같은 오류가 발생했습니다. 그것은 레지스터 손상과 같습니다. 앞서 언급했듯이 FIQ가 발생했을 때 사례 3에 대한 EL3의 저장된 컨텍스트와 복원 된 컨텍스트를 비교했으며 NWD EL0에 들어가기 전에 복원 된 컨텍스트와 동일한 컨텍스트를 저장했습니다. – scopichmu

답변

0

사실 나는 이미 그것을 고쳤습니다. 문제는 'eret'명령의 구현에서 'op_helper.c'파일에 있습니다 : 'env-> regs [15] = env-> elr_el [1] & ~ 0x1;'. '1'은 'cur_el'으로 변경해야합니다. 또한이 버그는 최신 qemu에서 수정되었으므로 업데이트해야합니다.

관련 문제