Revision 6f27aba6 target-sparc/op_helper.c
b/target-sparc/op_helper.c | ||
---|---|---|
789 | 789 |
{ |
790 | 790 |
uint64_t ret = 0; |
791 | 791 |
|
792 |
if (asi < 0x80 && (env->pstate & PS_PRIV) == 0) |
|
792 |
if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) |
|
793 |
|| (asi >= 0x30 && asi < 0x80) && !(env->hpstate & HS_PRIV)) |
|
793 | 794 |
raise_exception(TT_PRIV_ACT); |
794 | 795 |
|
795 | 796 |
switch (asi) { |
... | ... | |
800 | 801 |
case 0x88: // Primary LE |
801 | 802 |
case 0x8a: // Primary no-fault LE |
802 | 803 |
if ((asi & 0x80) && (env->pstate & PS_PRIV)) { |
803 |
switch(size) { |
|
804 |
case 1: |
|
805 |
ret = ldub_kernel(T0); |
|
806 |
break; |
|
807 |
case 2: |
|
808 |
ret = lduw_kernel(T0 & ~1); |
|
809 |
break; |
|
810 |
case 4: |
|
811 |
ret = ldl_kernel(T0 & ~3); |
|
812 |
break; |
|
813 |
default: |
|
814 |
case 8: |
|
815 |
ret = ldq_kernel(T0 & ~7); |
|
816 |
break; |
|
804 |
if (env->hpstate & HS_PRIV) { |
|
805 |
switch(size) { |
|
806 |
case 1: |
|
807 |
ret = ldub_hypv(T0); |
|
808 |
break; |
|
809 |
case 2: |
|
810 |
ret = lduw_hypv(T0 & ~1); |
|
811 |
break; |
|
812 |
case 4: |
|
813 |
ret = ldl_hypv(T0 & ~3); |
|
814 |
break; |
|
815 |
default: |
|
816 |
case 8: |
|
817 |
ret = ldq_hypv(T0 & ~7); |
|
818 |
break; |
|
819 |
} |
|
820 |
} else { |
|
821 |
switch(size) { |
|
822 |
case 1: |
|
823 |
ret = ldub_kernel(T0); |
|
824 |
break; |
|
825 |
case 2: |
|
826 |
ret = lduw_kernel(T0 & ~1); |
|
827 |
break; |
|
828 |
case 4: |
|
829 |
ret = ldl_kernel(T0 & ~3); |
|
830 |
break; |
|
831 |
default: |
|
832 |
case 8: |
|
833 |
ret = ldq_kernel(T0 & ~7); |
|
834 |
break; |
|
835 |
} |
|
817 | 836 |
} |
818 | 837 |
} else { |
819 | 838 |
switch(size) { |
... | ... | |
987 | 1006 |
|
988 | 1007 |
void helper_st_asi(int asi, int size) |
989 | 1008 |
{ |
990 |
if (asi < 0x80 && (env->pstate & PS_PRIV) == 0) |
|
1009 |
if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) |
|
1010 |
|| (asi >= 0x30 && asi < 0x80) && !(env->hpstate & HS_PRIV)) |
|
991 | 1011 |
raise_exception(TT_PRIV_ACT); |
992 | 1012 |
|
993 | 1013 |
/* Convert to little endian */ |
... | ... | |
1022 | 1042 |
case 0x80: // Primary |
1023 | 1043 |
case 0x88: // Primary LE |
1024 | 1044 |
if ((asi & 0x80) && (env->pstate & PS_PRIV)) { |
1025 |
switch(size) { |
|
1026 |
case 1: |
|
1027 |
stb_kernel(T0, T1); |
|
1028 |
break; |
|
1029 |
case 2: |
|
1030 |
stw_kernel(T0 & ~1, T1); |
|
1031 |
break; |
|
1032 |
case 4: |
|
1033 |
stl_kernel(T0 & ~3, T1); |
|
1034 |
break; |
|
1035 |
case 8: |
|
1036 |
default: |
|
1037 |
stq_kernel(T0 & ~7, T1); |
|
1038 |
break; |
|
1045 |
if (env->hpstate & HS_PRIV) { |
|
1046 |
switch(size) { |
|
1047 |
case 1: |
|
1048 |
stb_hypv(T0, T1); |
|
1049 |
break; |
|
1050 |
case 2: |
|
1051 |
stw_hypv(T0 & ~1, T1); |
|
1052 |
break; |
|
1053 |
case 4: |
|
1054 |
stl_hypv(T0 & ~3, T1); |
|
1055 |
break; |
|
1056 |
case 8: |
|
1057 |
default: |
|
1058 |
stq_hypv(T0 & ~7, T1); |
|
1059 |
break; |
|
1060 |
} |
|
1061 |
} else { |
|
1062 |
switch(size) { |
|
1063 |
case 1: |
|
1064 |
stb_kernel(T0, T1); |
|
1065 |
break; |
|
1066 |
case 2: |
|
1067 |
stw_kernel(T0 & ~1, T1); |
|
1068 |
break; |
|
1069 |
case 4: |
|
1070 |
stl_kernel(T0 & ~3, T1); |
|
1071 |
break; |
|
1072 |
case 8: |
|
1073 |
default: |
|
1074 |
stq_kernel(T0 & ~7, T1); |
|
1075 |
break; |
|
1076 |
} |
|
1039 | 1077 |
} |
1040 | 1078 |
} else { |
1041 | 1079 |
switch(size) { |
Also available in: Unified diff