집으로 가는 길에 마지막에 막힌 부분을 휴대폰으로 찾아보다가 이해한 부분을 적었습니다.
잘못된 부분 지적 부탁드립니다.
1. cmp, ***cc
ARM Compiler toolchain
http://infocenter.arm.com/help/topic/com.arm.doc.dui0473c/dui0473c_using_the_arm_assembler.pdf
6.4 절 Updates to the ALU status flags 의 중간정도에 있는 A carry occurs 부분
subtraction 의 결과가 양수 또는 0 (op1 >= op2) 일 경우 C플래그 1
6.5 절 Condition code suffixes 에 CC 접미사에 대한 내용이 있습니다.
C플래그가 0일 경우 (op1 < op2) 수행
2. 안전하게 캐시 사용하는 코드
[원코드]
mov r0, pc
cmp r0, r4
ldrcc r0, LC0+32
addcc r0, r0, pc
cmpcc r4, r0
orrcc r4, r4, #1 @ remember we skipped cache_on
blcs cache_on
[변형코드 및 주석]
// cache_on 을 수행하면 PTE 영역 (r4 - PTE 크기 ~ r4) 이 초기화 된다.
// 그러므로, 현재 수행중인 zImage 영역의 앞으로 수행될 코드와 DTB 영역이 PTE 와 겹칠 경우 cache_on 을 보류한다.
// PC 는 현재 수행중인 zImage 영역 내부에 위치
// PTE 영역은 r4 보다 앞
r0 = pc
if (r0 < r4) {
r0 = LC0 + 32 + pc // LC0 + 32 : _end - restart + 16384 + 1024 * 1024
// = zImage 크기 (_end - restart) + DTB 최대크기 (1MB) + PTE 크기 (16384)
if (r4 < r0) { // zImage 크기 + DTB 최대크기 (1MB) > r4 - PTE 크기 (16384)
r4 |= 1; // zImage + DTB 영역을 침범할 가능성이 있으므로 cache 를 보류, 1비트를 set 하여 cache 유보를 표시
} else { // zImage 와 DTB 영역이 PTE 보다 앞이다.
goto cache_on
}
} else { // 앞으로 수행할 코드와 DTB 이 PTE 보다 뒤이다.
goto cache_on
}
p.s: 금일 마지막에 참조한 링크에서 빨간색 화살표 안의 비교문은
위의 것은 첫번째 비교(cmp) 의 조건, 아래는 두번째 비교(cmpcc) 의 조건입니다.
그림에서 좌측 상단 zImage 그림은 첫 cmp 에서 안전하다고 판단되어
이후 ***cc 명령어는 다 무시하고 cache_on 으로 branch 됩니다. (blcs 는 C플래그가 1 일때 branch)
하단 zImage 는 첫 cmp 에서 C플래그가 0가 되어 이후 ***cc 가 수행이 될 경우중
cmpcc 이후 C플래그가 1 일 경우의 상황입니다.
댓글 0
.