부트로드에서 arch_s3c2440startstart.S 파일내에서

중간쯤에 보시면 아래와 같이 CPWAIT 매크로를  아래 코드에 중간 중간에 사용하고 있는 부분이 있습니다.


  //-------------------------------------------
  // Active I-Chache
  //-------------------------------------------

  // I-Cache 비활성화
  mcr  p15, 0, r1, c7, c5, 0
  CPWAIT

  // I-Cache 활성화
  mrc  p15, 0, r0, c1, c0, 0
  orr  r0, r0, #0x1000
  mcr  p15, 0, r0, c1, c0, 0
  CPWAIT



그리고,  57째 줄에 보시면 아래와 같은 매크로 정의가 있습니다.

//------------------------------------------------------------------------------------------------
//
//  캐쉬에 관련된 코프로세스 명령을 적용할때의 지연
//
//------------------------------------------------------------------------------------------------
.macro          CPWAIT
                mrc     p15, 0, r0, c2, c0, 0
                mov     r0, r0
                sub     pc, pc, #4
.endm


이와 같이 매크로가 정의되어 있었습니다.

제가 질문을 드리고자 하는 내용은 크게 2가지 입니다.

첫째는 왜 캐쉬에 관련된 코프로세스 명령을 적용할때의 지연을 하는데 하필    mrc     p15, 0, r0, c2, c0, 0   을 사용했는지가
 
첫번째 의문입니다.  다른 방식으로 nop 같은 것을 여러번 사용해도 될것 같은데, 왜 이런식으로 했는지 의문이 갔습니다.

둘째는    sub     pc, pc, #4   를 왜 실행하는가 입니다. 여기서 프로그램 카운터를 4바이트 만큼 빼야 되는 이유가 정확히 왜 그렇게

 매크로가 종료되는 부분에서 pc 의 위치가 어떤 영향을 주는지 의문이 가서 이렇게 질문을 드립니다.

여기에 대해 자세히 알려주시면 정말 감사하겠습니다.