2017-10-18 9 views
1

저는 안드로이드의 커널을 읽고 CPU 코어 (일명 DVFS, DCVS)의 동적 전력 관리가 어떻게 진행되고 있는지 보았습니다. 내가 찾은 코드 here은 다음 함수 (정의 된 here)를 호출하고 SMC 어셈블리 명령어를 호출합니다.ARM의 SMC 호출 해석 방법은 무엇입니까?

ARM에는 SMC calling convention을 설명하는 문서가 있지만 다음 기능을 이해하는 데 사용할 수 없었습니다. 어떻게하면 SMC 명령을 추적하여 입력 피연산자에 따라 실제로 수행되는지 확인할 수 있습니까? 그 여러 업체들이 세계와 하나의 코드를 작성할 수 있도록 SMC calling conventions

s32 scm_call_atomic4_3(u32 svc, u32 cmd, u32 arg1, u32 arg2, 
     u32 arg3, u32 arg4, u32 *ret1, u32 *ret2) 
{ 
    int ret; 
    int context_id; 
    register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4); 
    register u32 r1 asm("r1") = (u32)&context_id; 
    register u32 r2 asm("r2") = arg1; 
    register u32 r3 asm("r3") = arg2; 
    register u32 r4 asm("r4") = arg3; 
    register u32 r5 asm("r5") = arg4; 
    asm volatile(
     __asmeq("%0", "r0") 
     __asmeq("%1", "r1") 
     __asmeq("%2", "r2") 
     __asmeq("%3", "r0") 
     __asmeq("%4", "r1") 
     __asmeq("%5", "r2") 
     __asmeq("%6", "r3") 
#ifdef REQUIRES_SEC 
      ".arch_extension sec\n" 
#endif 
     "smc #0 @ switch to secure world\n" 
     : "=r" (r0), "=r" (r1), "=r" (r2) 
     : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5)); 
    ret = r0; 
    if (ret1) 
     *ret1 = r1; 
    if (ret2) 
     *ret2 = r2; 
    return r0; 
} 
EXPORT_SYMBOL(scm_call_atomic4_3); 
+0

[this] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/Chdfjdgi.html)과 같은 것입니까? –

+0

@DavidWohlferd 링크가 보안 모델을 설명합니다. SMC 호출이 실행 된 후에 실행되는 코드를 알고 싶습니다. – Mahdi

+1

포인트는 SMC 통화가 안전한 세상으로 간다는 것입니다. 여기에는 전혀 다른 ** 실제 ** 메모리 맵이있을 수 있으며 보안 세계에서 소프트웨어가 실행되는 방식에 대한 여러 모델이 있습니다. 분명히 리눅스 일 필요는 없습니다. 이것은 일반적으로 사용자가 이진 이미지에 액세스 할 수 있거나 심지어 어려울 수도있는 폐쇄 소스 소프트웨어입니다. 보안 세계 소프트웨어를 만든 공급 업체와 리버스 엔지니어링 또는 대화를해야 할 수도 있습니다. –

답변

1

크로스 세계 API를 구현하는 방법에 대한 ARM에서 제안이다 호환성 최소한의 공존. 적어도 그것은 의도입니다. 공급 업체 (귀하의 경우에는 Android/Linux)가이를 수행 할 필요가 없으며 보안 세계가이를 따르지 않는 경우이를 수행하지 못할 수도 있습니다.

하지만 난 다음 함수

SMC 명령의 이해하는 데 사용할 수 없었던는 보안 모니터에 정상 세계에서 제어 변화이다. 모니터에는 자체 벡터 테이블이 있으며 svc에 대한 항목은 SMC 호출입니다. 레지스터는 세계간에 '공유 된'정보입니다. 일반적으로 월드 스위치에서 모니터는 모든 등록을 일부 컨텍스트 저장소로 스왑 할 수 있습니다. SMC 경우 레지스터는 매개 변수를 전송하고 결과를 반환 할 수 있습니다. 이것은이 모든 기능이 수행하고있는 것입니다.

register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4); 

는 규칙을 문서를 호출 SMC에서 표 2-1와 같은 비트 필드 입니다. 보통의 리눅스에서 안전한 모니터까지 어떤 기능 (그리고 마샬링/4 개의 유지에 대한 인수의 수)을 알려줍니다.
register u32 r2 asm("r2") = arg1; 
register u32 r3 asm("r3") = arg2; 
register u32 r4 asm("r4") = arg3; 
register u32 r5 asm("r5") = arg4; 

는 ARM ABI는 우연한 경우

이 매개 변수 ARG1 - arg4 이미 이러한 레지스터에있을 것입니다, 그래서 코드가 생성되지 않습니다. 글로벌 context_id (Linux/Android 커널에)도 전달됩니다.

어떻게 SMC 명령을 추적하여 입력 피연산자에 따라 실제로 수행되는지 확인할 수 있습니까?

이렇게하려면 보안 세계에 대한 코드가 필요합니다. 내 추측에 따르면이 휴대 전화와베이스 밴드 등은 안전한 세상에 있으며 코드는 제공되지 않습니다. 안전한 월드 코드를 사용하면 모니터 벡터 테이블에 SMC 항목이 생깁니다. 이 스위치는 r0 또는 'smc'기능을 선택하는 'cmd'값에 따라 달라집니다. 일반 smc 처리기는 보안 세계 레지스터/컨텍스트를 복원 할 수 있지만 r0 비트 필드에 지정된대로 4 개의 인수를 유지할 수 있습니다.

아마도 대답은 입니다.은 무엇을하는지 추적 할 수 없습니다. 공급 업체 문서에 의존하거나 보안 세계에 대한 코드를 보유 할만큼 운이 좋았습니다.

+1

어쩌면 운 좋게도 [PSCI] (http://infocenter.arm.com/help/topic/com.arm.doc.den0022d/Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf) 문서가 적용될 수 있습니다. OpenSource [ARM Trusted Firmware] (https://github.com/ARM-software/arm-trusted-firmware)를 확인하십시오. 나는 MSM SOC를 보지 못했지만 일부 CPU에서는 이것을 사용할 수있다. –

+0

고마워, 나는 그것에 대해 조사 할 것이다. 구현이 비공개 소스라고 가정하면이 소스 트리에서 바이너리를 어디에서 찾을 수 있어야하는지 알 수 있습니까? https://android.googlesource.com/kernel/msm/+/android-5.1.0_r0.6/arch/arm/mach-msm – Mahdi

+1

소스 트리에도 없습니다. BIOS 칩과 같이 장치에 프로그램 될 것입니다. –