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