Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

Enable FP/ASIMD 관련 질문입니다.

작성자
belldum
작성일
2023-08-27 16:26
조회
104
안녕하세요 문영일님.
head.S의 __cpu_setup을 분석하다가 궁금한게 생겨서 질문드립니다. (6.4.0v)

mov x1, #3<<20
msr cpcar_el1, x1 // Enable FP/ASIMD

해당 부분을 분석해보면 cpcar_el1.fpen을 0b11로 설정해서 arm에서 제공하는 FP/ASIMD 하드웨어 피쳐를 enable한다고 생각했습니다.
cpcar_el1.fpen을 0b11로 설정한다는 것은 "el0 or el1에서 FP/ASIMD와 관련된 어떤 명령어가 실행되었을때 el1의 익셉션 벡터 테이블을 타게 하지 않겠다." 라고 이해를 했습니다.
(This control does not cause execution of any instructions to be trapped.)

그런데 "el1으로 trap되지 않음"과 "FP/ASIMD enable" 사이에 어떤 관계가 있어서 결국에 FP/ASIMD가 enable될 수 있는 것인지 질문드립니다.
감사합니다.
전체 2
  • 2023-09-04 12:53
    안녕하세요? 해외출장으로 인해 답변을 못했던 부분 이해해주시기 바랍니다.

    cpacr_el1 레지스터의 en 필드에 0x11 값을 설정하는 경우 el0 또는 el1에서 FP 및 ASIMD instruction을 사용하도록 작성된 프로그램에서 이의 사용을 허용하도록 내버려둡니다. 즉 커널 레벨로 트랩(exception fault)하지 않도록 지정합니다.

    arm32의 경우 SoC를 제작시 FP 없이 만드는 사례가 많았습니다.
    이러한 경우 부동소수점(Floating Point) 관련한 처리는 다음과 같이 할 수 있습니다.
    1) 컴파일 시 부동소수점 처리를 FP 명령으로 만들지 않고, softfp를 지원하는 툴체인을 사용하여 빌드하면 FP instruction 없이 자체 라이브러리를 통해 처리하도록 합니다.
    2) 간단한 FP 명령들은 속도는 저하되지만 커널에서 trap 받아 emulation 방식으로 처리할 수 있습니다.

    그런데 arm64의 경우 대부분의 SoC 내부엔 거의 100% FP/ASIMD가 내장되어 있습니다. 따라서 softfp 방식이나, 커널에서 emulation하지 않아도 해당 명령들을 집접 사용할 수 있습니다. 따라서 arm64의 경우 default가 FP/ASIMD 명령을 사용하도록 내버려둡니다.

    감사합니다.

    문영일 드림.