head	1.16;
access;
symbols;
locks
	root:1.16; strict;
comment	@# @;


1.16
date	2009.11.29.22.05.30;	author root;	state Exp;
branches;
next	1.15;

1.15
date	2009.11.29.22.05.18;	author root;	state Exp;
branches;
next	1.14;

1.14
date	2009.11.29.22.03.06;	author root;	state Exp;
branches;
next	1.13;

1.13
date	2009.11.29.21.57.09;	author root;	state Exp;
branches;
next	1.12;

1.12
date	2009.11.29.21.46.24;	author root;	state Exp;
branches;
next	1.11;

1.11
date	2009.11.29.21.44.48;	author root;	state Exp;
branches;
next	1.10;

1.10
date	2009.11.29.21.44.04;	author root;	state Exp;
branches;
next	1.9;

1.9
date	2009.11.29.21.40.19;	author root;	state Exp;
branches;
next	1.8;

1.8
date	2009.11.29.21.25.52;	author root;	state Exp;
branches;
next	1.7;

1.7
date	2009.11.29.21.00.35;	author root;	state Exp;
branches;
next	1.6;

1.6
date	2009.11.29.20.58.16;	author root;	state Exp;
branches;
next	1.5;

1.5
date	2009.11.29.20.57.11;	author root;	state Exp;
branches;
next	1.4;

1.4
date	2009.11.29.20.55.35;	author root;	state Exp;
branches;
next	1.3;

1.3
date	2009.11.29.20.39.20;	author root;	state Exp;
branches;
next	1.2;

1.2
date	2009.11.29.20.36.51;	author root;	state Exp;
branches;
next	1.1;

1.1
date	2009.11.29.20.34.29;	author root;	state Exp;
branches;
next	;


desc
@/opt/nforge/var/wiki/mimic/data/text/MSR
@


1.16
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@[[FrontPage]]

----

아 머리 아파.. 여기 있는 모든 내용은 ARM Architecture Reference Manual의 내용을 갖다 베낀 것임을 알려둡니다. (근데 그럴 수밖에 없잖아)

MSR(Move to Status Register from ARM Register). 이름 그대로, 범용 레지스터(R0~R15)에서 상태 레지스터(CPSR, SPSR)로 값을 복사한다.

attachment:그림_7.png
ARM Architecture Reference Manual의 비트 도식. 문제가 있을 경우 즉시 삭제함(-_-!)

명령어는 간단한데 동작방식은 무지하게 복잡하다.

 * [[SBO]]
 * [[SBZ]]

== 명령어 예제 ==

0xe129f000 msr CPSR_fc, r0

 * 0xe129f000 이진 코드, 그냥 붙인 것. 없어도 됨(이 아니라 어셈블 할 땐 없는게 정상이지)
 * msr 명령어
 * CPSR 상태 레지스터, CPSR과 SPSR 두 가지가 가능
 * _fc 비트마스크. c, x, s, f 4가지 조합이 가능하다. 자세한 설명은 아래에
 * r0 원본 레지스터

== 명령어 형식 ==

 * MSR{<cond>} CPSR_<fields>, #<immediate> 
 * MSR{<cond>} CPSR_<fields>, <Rm>
 * MSR{<cond>} SPSR_<fields>, #<immediate>
 * MSR{<cond>} SPSR_<fields>, <Rm>

=== cond ===

명령어의 실행 조건. [[ConditionPassed]] 참고

=== fields ===

4가지 요소로 이루어져 있다.

 * c 위 field_mask의 16번 비트(제일 오른쪽)
 * x 17번 비트
 * s 18번 비트
 * f 19번 비트

각 약자의 의미는 아직 모르겠다.

=== immediate ===

이름 그대로 직접값. #2847294 라든가 뭐 그런식으로. 단순히 0~11비트의 3바이트를 갖다 쓰는게 아니고 회전 연산 및 기타 귀찮은 짓들이 들어간다. 아래 설명

=== Rm ===

레지스터. 예제의 명령어가 Register operand를 쓴 명령어다.

== 아키텍처 버전 ==

All

== 예외 ==

없음

== 동작 ==

 * 매뉴얼 p.49의 Types of PSR bits를 읽어볼 것.

MSR 명령의 의사코드는 이렇다.

  if [[ConditionPassed]](cond) then
    if opcode[25] == 1 then
      operand = 8_bit_immediate를 rotate_imm*2 만큼 우측 회전(Rotate Right)
    else
      operand = Rm
    if (operand AND UnallocMask) != 0 then
      UNPREDICTABLE (예외. 엄밀히는 예외는 아니지만-예측할 수 없음이니까- 예외로 처리 안하면 골치아파진다. 근데 예외 없다매)
    byte_mask = (if field_mask[0] == 1 then 0x000000FF else 0x00000000) OR
                (if field_mask[1] == 1 then 0x0000FF00 else 0x00000000) OR
                (if field_mask[2] == 1 then 0x00FF0000 else 0x00000000) OR
                (if field_mask[3] == 1 then 0xFF000000 else 0x00000000)
    if R == 0 then
      if InAPrivilegedMode() then
        if (operand AND StateMask != 0 then
          UNPREDICTABLE (아 예외 없다매...)
        else
          mask = byte_mask AND (UserMask OR PrivMask)
      else
        mask = byte_mask AND UserMask
      CPSR = (CPSR AND NOT mask) OR (operand AND mask)
    else // R == 1
      if [[CurrentModeHasSPSR]]() then
        mask = byte_mask AND (UserMask OR PrivMask OR StateMask)

        SPSR = (SPSR AND NOT mask) OR (operand AND mask)
      else
        UNPREDICTABLE

=== BitMask ===

p.227 MSR 부분을 참고할 것. 프로젝트의 기준인 ARMv5TE에서 마스크값은 아래와 같다.

 * UnallocMask: 0x07FFFF00
 * UserMask: 0xF8000000
 * PrivMask: 0x0000000F
 * StateMask: 0x00000020

=== 예제를 수작업으로 분석해보자 ===

아 너무 복잡해

=== 의심스러운 부분 ===

    else // R == 1, Register operand
      if [[CurrentModeHasSPSR]]() then
        mask = byte_mask AND (UserMask OR PrivMask OR StateMask)

        SPSR = (SPSR AND NOT mask) OR (operand AND mask)

의사코드 마지막쯤에 이 부분이 나오는데, 이 위의 if(R == 0)에서는 CPSR값을 바꿨다. 근데 왜 else에선 뜬금없이 SPSR인가?

예제코드 자체가 좀 이상하다. SPSR이 있으면 SPSR을 업데이트하는 건 사리에 맞지만,

 SPSR = CPSR

 CPSR = (CPSR AND NOT mask) OR (operand AND mask)

대충 이렇게 하는게 더 맞는 것 같다.

== 보충설명 ==

이 명령어에 나오는 R비트는, 다른 명령이라면 레지스터 비트가 맞는데 MSR에서는 아니다. 정확히 어떤 의미인지는 모르겠다.
@


1.15
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@a111 4
=== 결과 ===

CPSR = 0x00000013

@


1.14
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d110 1
a110 1
 0xe129f000 msr CPSR_fc, r0
d112 1
a112 1
 비트로 풀면 1110 0001 0010 1001 1111 0000 0000 0000
d114 1
a114 43
  if [[ConditionPassed]](cond) then
  ''' e는 ALWAYS다. 조건 비교를 할 필요가 없다. 무조건 실행 '''
    if opcode[25] == 1 then
    ''' 보다시피 25번 비트(왼쪽에서 7번째 비트)가 0이다. 그러므로 '''
      ''operand = 8_bit_immediate를 rotate_imm*2 만큼 우측 회전(Rotate Right)''
      ''' 얘 아님(Register operand) '''
    else
      operand = Rm
      ''' operand라는 변수에 레지스터 0(3~0비트 값이 0)을 넣는다. '''
    if (operand AND UnallocMask) != 0 then
    ''' operand가 0이니 뭘 &해도 값은 0일 수밖에 '''
      UNPREDICTABLE (예외. 엄밀히는 예외는 아니지만-예측할 수 없음이니까- 예외로 처리 안하면 골치아파진다. 근데 예외 없다매)
      ''' 그러므로 예측 가능하신 명령어가 된다. 장하다. '''
    byte_mask = (if field_mask[0] == 1 then 0x000000FF else 0x00000000) OR
                (if field_mask[1] == 1 then 0x0000FF00 else 0x00000000) OR
                (if field_mask[2] == 1 then 0x00FF0000 else 0x00000000) OR
                (if field_mask[3] == 1 then 0xFF000000 else 0x00000000)
    ''' 좀 복잡하다. 천천히 살펴보면, field_mask는 0x9, 즉 0b1001이다. field_mask[0]이 오른쪽 끝의 1이고 [3]이 왼쪽 끝의 1이다. '''
    ''' 계산해보면, 0x000000FF OR 0xFF000000 = 0xFF0000FF가 된다. byte_mask = 0xFF0000FF '''
    if R == 0 then
    ''' 이 명령어의 경우 R비트가 0이다. R의 의미는 모르겠지만 '''
      if InAPrivilegedMode() then
      ''' 이 명령어는 사실 부트로더 맨 앞쯤에서 떼온 명령이다. 즉 SUPERVISOR 모드에서 실행되고 있다는 말이지. '''
        if (operand AND StateMask != 0 then
        ''' 0 AND ~~뭘 해도 결과는 0 '''
          UNPREDICTABLE (아 예외 없다매...)
        else
          mask = byte_mask AND (UserMask OR PrivMask)
          ''' mask = 0xFF0000FF AND (0xF800000F) = 0xF800000F '''
      else
        mask = byte_mask AND UserMask
      CPSR = (CPSR AND NOT mask) OR (operand AND mask)
      ''' CPSR = (CPSR AND 0x07FFFFF0) OR (0 AND mask) '''
      ''' = (이 명령어가 왔던 원래 장소에서 CPSR은 013) '''
      ''' = (0x00000013 AND 0x07FFFFF0) OR 0 '''
      ''' = 0x00000010 '''
    else // R == 1
      if [[CurrentModeHasSPSR]]() then
        mask = byte_mask AND (UserMask OR PrivMask OR StateMask)

        SPSR = (SPSR AND NOT mask) OR (operand AND mask)
      else
        UNPREDICTABLE
@


1.13
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d134 16
a149 10
    ''' R비트는 1이다. Register opernad니까 '''
      ''if InAPrivilegedMode() then''
        ''if (operand AND StateMask != 0 then''
          ''UNPREDICTABLE (아 예외 없다매...)''
        ''else''
          ''mask = byte_mask AND (UserMask OR PrivMask)''
      ''else''
        ''mask = byte_mask AND UserMask''
      ''CPSR = (CPSR AND NOT mask) OR (operand AND mask)''
      ''' 고로 얘들 다 생략 '''
a151 2
      ''' 이건 그때그때 상황에 따라 다른데, 저 명령어가 사실은 부트로더 첫머리에 나오는 명령이다. 고로 이 상태는 SUPERVISOR 모드다. '''
      ''' USER모드와 SYSTEM모드에만 SPSR이 없고 나머지는 있다. '''
a152 1
        ''' mask = 0xFF0000FF & 0xF800002F = 0xF800002F '''
d155 2
a156 3
        ''' SPSR = (SPSR & 0x07FFFFD0) OR (0 & mask, 즉 0) = 그냥 SPSR & 0x07FFFFD0, 물론 결과값이 뭔지는 나도 모르지. '''
      ''else''
        ''UNPREDICTABLE''
@


1.12
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d82 1
a82 1
    if R == 0 then // immediate operand
d91 1
a91 1
    else // R == 1, Register operand
d133 1
a133 1
    if R == 0 then // immediate operand
d144 1
a144 1
    else // R == 1, Register operand
d173 4
@


1.11
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d166 1
a166 1
명령어 설명을 보나 뭘로보나 여기도 CPSR 수정이 맞는 것 같은데...
d168 5
@


1.10
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d94 1
d150 1
d161 1
@


1.9
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d114 1
a114 1
''' e는 ALWAYS다. 조건 비교를 할 필요가 없다. 무조건 실행 '''
d116 1
a116 1
''' 보다시피 25번 비트(왼쪽에서 7번째 비트)가 0이다. 그러므로 '''
d118 1
a118 1
''' 얘 아님(Register operand) '''
d121 1
a121 1
''' operand라는 변수에 레지스터 0(3~0비트 값이 0)을 넣는다. '''
d123 1
a123 1
''' operand가 0이니 뭘 &해도 값은 0일 수밖에 '''
d125 1
a125 1
''' 그러므로 예측 가능하신 명령어가 된다. 장하다. '''
d130 2
a131 2
''' 좀 복잡하다. 천천히 살펴보면, field_mask는 0x9, 즉 0b1001이다. field_mask[0]이 오른쪽 끝의 1이고 [3]이 왼쪽 끝의 1이다. '''
''' 계산해보면, 0x000000FF OR 0xFF000000 = 0xFF0000FF가 된다. byte_mask = 0xFF0000FF '''
d133 10
a142 10
''' R비트는 1이다. Register opernad니까 '''
      if InAPrivilegedMode() then
        if (operand AND StateMask != 0 then
          UNPREDICTABLE (아 예외 없다매...)
        else
          mask = byte_mask AND (UserMask OR PrivMask)
      else
        mask = byte_mask AND UserMask
      CPSR = (CPSR AND NOT mask) OR (operand AND mask)
''' 고로 얘들 다 생략 '''
d145 2
a146 2
''' 이건 그때그때 상황에 따라 다른데, 저 명령어가 사실은 부트로더 첫머리에 나오는 명령이다. 고로 이 상태는 SUPERVISOR 모드다. '''
''' USER모드와 SYSTEM모드에만 SPSR이 없고 나머지는 있다. '''
d148 1
a148 1
''' mask = 0xFF0000FF & 0xF800002F = 0xF800002F '''
d150 3
a152 3
''' SPSR = (SPSR & 0x07FFFFD0) OR (0 & mask, 즉 0) = 그냥 SPSR & 0x07FFFFD0, 물론 결과값이 뭔지는 나도 모르지. '''
      else
        UNPREDICTABLE
@


1.8
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d92 1
a92 1
      if CurrentModeHasSPSR() then
d107 1
a107 1
=== 해석 ===
d109 1
a109 1
ㅁ
d111 53
@


1.7
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d36 1
a36 1
명령어의 실행 조건. [[condition bits]] 참고
@


1.6
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d71 1
a71 1
  if ConditionPassed(cond) then
@


1.5
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d14 3
@


1.4
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d95 9
@


1.3
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d5 2
d16 1
a16 1
 0xe129f000 msr CPSR_fc, r0
d18 1
a18 1
 * 0xe129f000 이진 코드, 그냥 붙인 것
d24 76
@


1.2
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d12 10
@


1.1
log
@58.227.230.63;;hoppang 호빵 ;;
@
text
@d7 5
a11 1
명령어는 간단한데 동작방식은 무지하게 복잡하다. 아띠
@
