[[FrontPage]]

----

[[MRC]] 참고

attachment:그림_8.png

Move to Coprocessor from ARM Register.

이름 그대로 ARM 범용 레지스터를 코프로세서 레지스터에 복사한다는 뜻이지만 단순히 복사만 하고 끝나는 게 아니다. 어떤 레지스터에 어떤 값을 채우고 추가 인자로 어떤 opcode를 전달하느냐에 따라서 결과가 달라진다 - 사실상 코프로세서 실행 명령이라고 보는 게 좋다.

이 프로젝트의 기준인 [[SA-1100]]에는 코프로세서 15(CP15)밖에 없기 때문에 다른 코프로세서 번호를 지정하면 무슨 일이 벌어질진 나도 모른다.

== 문법 등 ==

mcr<cond> <coprocessor>, <opcode1>, <rd>, <crn>, <crm> {, <opcode2> }

 * cond 조건 비트
 * coprocessor 코프로세서 번호(거의 15)
 * opcode1 밑에 참고
 * rd 코프로세서에 전송할 본체(?) cpu 레지스터의 번호
 * crn 코프로세서 목적 레지스터
 * crm 추가 코프로세서 레지스터
 * opcode2 밑에 참고

== SA-1100 코프로세서 명령 ==

{i} SA-1100 Developer's Manual p.46 5.2 Coprocessor 15 Definition

||<rowbgcolor="#FFFFE0"> '''CP 레지스터 번호''' || '''쓰기''' || '''읽기''' ||
|| 0 || ID ||<bgcolor="#E0FFE0"> 예약됨 ||
|| 1 || Control || Control ||
|| 2 || Translation table base || Translation table base ||
|| 3 || Domain access control || Domain access control ||
|| 4 ||<bgcolor="#E0FFE0"> 예약됨 ||<bgcolor="#E0FFE0"> 예약됨 ||
|| 5 || Fault status || Fault status ||
|| 6 || Fault address || Fault address ||
|| 7 ||<bgcolor="#E0FFE0"> 예약됨 || [[Cache operations]] ||
|| 8 ||<bgcolor="#E0FFE0"> 예약됨 || TLB operations ||
|| 9 ||<bgcolor="#E0FFE0"> 예약됨 || 읽기 버퍼 동작 ||
|| 10 ||<bgcolor="#E0FFE0"> 예약됨 ||<bgcolor="#E0FFE0"> 예약됨 ||
|| 11 ||<bgcolor="#E0FFE0"> 예약됨 ||<bgcolor="#E0FFE0"> 예약됨 ||
|| 12 ||<bgcolor="#E0FFE0"> 예약됨 ||<bgcolor="#E0FFE0"> 예약됨 ||
|| 13 || 프로세스 ID(PID) 읽기 || 프로세스 ID(PID) 쓰기 ||
|| 14 || 브레이크포인트 읽기 || 브레이크포인트 쓰기 ||
|| 15 ||<bgcolor="#E0FFE0"> 예약됨 || Test, clock, and idle ||


== Register 7: Cache operations ==

{i} 다시 말하지만 SA-1100 기준

||<rowbgcolor="#FFFFE0"> '''Function''' || '''OPC_2''' || '''CRm''' || '''Data''' ||
|| Flush I+D || 0b000 || 0b0111 || Ignored ||
|| Flush I || 0b000 || 0b0101 || Ignored ||
|| Flush D || 0b000 || 0b0110 || Ignored ||
|| Flush D single entry || 0b001 || 0b0110 || Virtual address ||
|| Clean Dcache entry || 0b001 || 0b1010 || Virtual address ||
|| Drain write buffer || 0b100 || 0b1010 || Ignored ||

