Lines Matching +full:s390x +full:- +full:softmmu
24 #include "s390x-internal.h"
26 #include "exec/helper-proto.h"
27 #include "exec/exec-all.h"
28 #include "exec/page-protection.h"
30 #include "hw/core/tcg-cpu-ops.h"
35 #include "hw/s390x/storage-keys.h"
46 /* Softmmu support */
57 uint16_t pkm = env->cregs[3] >> 16; in psw_key_valid()
59 if (env->psw.mask & PSW_MASK_PSTATE) { in psw_key_valid()
73 if (unlikely(wrap_address(env, src + len - 1) < src)) { in is_destructive_overlap()
74 return dest > src || dest <= wrap_address(env, src + len - 1); in is_destructive_overlap()
76 return dest > src && dest <= src + len - 1; in is_destructive_overlap()
141 * For !CONFIG_USER_ONLY, the TEC is stored stored to env->tlb_fill_tec.
142 * For CONFIG_USER_ONLY, the faulting address is stored to env->__excp_addr.
155 env->__excp_addr = addr & TARGET_PAGE_MASK; in s390_probe_access()
159 return env->tlb_fill_exc; in s390_probe_access()
185 size1 = MIN(size, -(vaddr1 | TARGET_PAGE_MASK)), in access_prepare_nf()
186 size2 = size - size1; in access_prepare_nf()
189 access->vaddr1 = vaddr1; in access_prepare_nf()
190 access->size1 = size1; in access_prepare_nf()
191 access->size2 = size2; in access_prepare_nf()
192 access->mmu_idx = mmu_idx; in access_prepare_nf()
195 &access->haddr1, ra); in access_prepare_nf()
203 access->vaddr2 = vaddr2; in access_prepare_nf()
205 nonfault, &access->haddr2, ra); in access_prepare_nf()
242 do_access_memset(env, desta->vaddr1, desta->haddr1, byte, desta->size1, in access_memset()
243 desta->mmu_idx, ra); in access_memset()
244 if (unlikely(desta->size2)) { in access_memset()
245 do_access_memset(env, desta->vaddr2, desta->haddr2, byte, in access_memset()
246 desta->size2, desta->mmu_idx, ra); in access_memset()
254 target_ulong vaddr = access->vaddr1; in access_get_byte()
255 void *haddr = access->haddr1; in access_get_byte()
257 if (unlikely(offset >= access->size1)) { in access_get_byte()
258 offset -= access->size1; in access_get_byte()
259 vaddr = access->vaddr2; in access_get_byte()
260 haddr = access->haddr2; in access_get_byte()
266 MemOpIdx oi = make_memop_idx(MO_UB, access->mmu_idx); in access_get_byte()
274 target_ulong vaddr = access->vaddr1; in access_set_byte()
275 void *haddr = access->haddr1; in access_set_byte()
277 if (unlikely(offset >= access->size1)) { in access_set_byte()
278 offset -= access->size1; in access_set_byte()
279 vaddr = access->vaddr2; in access_set_byte()
280 haddr = access->haddr2; in access_set_byte()
286 MemOpIdx oi = make_memop_idx(MO_UB, access->mmu_idx); in access_set_byte()
298 int len = desta->size1 + desta->size2; in access_memmove()
300 assert(len == srca->size1 + srca->size2); in access_memmove()
303 if (user_or_likely(desta->haddr1 && in access_memmove()
304 srca->haddr1 && in access_memmove()
305 (!desta->size2 || desta->haddr2) && in access_memmove()
306 (!srca->size2 || srca->haddr2))) { in access_memmove()
307 int diff = desta->size1 - srca->size1; in access_memmove()
310 memmove(desta->haddr1, srca->haddr1, srca->size1); in access_memmove()
311 if (unlikely(srca->size2)) { in access_memmove()
312 memmove(desta->haddr2, srca->haddr2, srca->size2); in access_memmove()
315 memmove(desta->haddr1, srca->haddr1, srca->size1); in access_memmove()
316 memmove(desta->haddr1 + srca->size1, srca->haddr2, diff); in access_memmove()
317 if (likely(desta->size2)) { in access_memmove()
318 memmove(desta->haddr2, srca->haddr2 + diff, desta->size2); in access_memmove()
321 diff = -diff; in access_memmove()
322 memmove(desta->haddr1, srca->haddr1, desta->size1); in access_memmove()
323 memmove(desta->haddr2, srca->haddr1 + desta->size1, diff); in access_memmove()
324 if (likely(srca->size2)) { in access_memmove()
325 memmove(desta->haddr2 + diff, srca->haddr2, srca->size2); in access_memmove()
363 /* NC always processes one more byte than specified - maximum is 256 */ in do_helper_nc()
401 /* XC always processes one more byte than specified - maximum is 256 */ in do_helper_xc()
444 /* OC always processes one more byte than specified - maximum is 256 */ in do_helper_oc()
481 /* MVC always copies one more byte than specified - maximum is 256 */ in do_helper_mvc()
489 * were processed one byte at a time". Only non-destructive overlaps in do_helper_mvc()
506 return env->cc_op; in do_helper_mvc()
522 /* MVCRL always copies one more byte than specified - maximum is 256 */ in HELPER()
530 for (i = l - 1; i >= 0; i--) { in HELPER()
545 /* MVCIN always copies one more byte than specified - maximum is 256 */ in HELPER()
548 src = wrap_address(env, src - l + 1); in HELPER()
554 const uint8_t x = access_get_byte(env, &srca, l - i - 1, ra); in HELPER()
568 /* MVN always copies one more byte than specified - maximum is 256 */ in HELPER()
589 /* MVO always processes one more byte than specified - maximum is 16 */ in HELPER()
601 byte_dest = cpu_ldub_data_ra(env, dest + len_dest - 1, ra); in HELPER()
604 byte_src = access_get_byte(env, &srca, len_src - 1, ra); in HELPER()
606 access_set_byte(env, &desta, len_dest - 1, byte_dest, ra); in HELPER()
609 for (i = len_dest - 2, j = len_src - 2; i >= 0; i--, j--) { in HELPER()
630 /* MVZ always copies one more byte than specified - maximum is 256 */ in HELPER()
719 return wrap_address(env, env->regs[reg]); in get_address()
724 * bits in bit positions 32-63 (24-bit and 31-bit mode only).
729 if (env->psw.mask & PSW_MASK_64) { in set_address_zero()
730 env->regs[reg] = address; in set_address_zero()
732 if (!(env->psw.mask & PSW_MASK_32)) { in set_address_zero()
737 env->regs[reg] = deposit64(env->regs[reg], 0, 32, address); in set_address_zero()
743 if (env->psw.mask & PSW_MASK_64) { in set_address()
744 /* 64-Bit mode */ in set_address()
745 env->regs[reg] = address; in set_address()
747 if (!(env->psw.mask & PSW_MASK_32)) { in set_address()
748 /* 24-Bit mode. According to the PoO it is implementation in set_address()
749 dependent if bits 32-39 remain unchanged or are set to in set_address()
752 env->regs[reg] = deposit64(env->regs[reg], 0, 24, address); in set_address()
754 /* 31-Bit mode. According to the PoO it is implementation in set_address()
759 env->regs[reg] = deposit64(env->regs[reg], 0, 32, address); in set_address()
766 if (!(env->psw.mask & PSW_MASK_64)) { in wrap_length32()
774 if (!(env->psw.mask & PSW_MASK_64)) { in wrap_length31()
775 /* 24-Bit and 31-Bit mode */ in wrap_length31()
783 return wrap_length31(env, env->regs[reg]); in get_length()
788 if (env->psw.mask & PSW_MASK_64) { in set_length()
789 /* 64-Bit mode */ in set_length()
790 env->regs[reg] = length; in set_length()
792 /* 24-Bit and 31-Bit mode */ in set_length()
793 env->regs[reg] = deposit64(env->regs[reg], 0, 32, length); in set_length()
803 uint8_t v, c = env->regs[0]; in HELPER()
805 /* Bits 32-55 must contain all 0. */ in HELPER()
806 if (env->regs[0] & 0xffffff00u) { in HELPER()
818 env->cc_op = 2; in HELPER()
824 env->cc_op = 1; in HELPER()
830 /* CPU-determined bytes processed. Advance R2 to next byte to process. */ in HELPER()
831 env->cc_op = 3; in HELPER()
839 uint16_t v, c = env->regs[0]; in HELPER()
842 /* Bits 32-47 of R0 must be zero. */ in HELPER()
843 if (env->regs[0] & 0xffff0000u) { in HELPER()
858 env->cc_op = 2; in HELPER()
864 env->cc_op = 1; in HELPER()
870 /* CPU-determined bytes processed. Advance R2 to next byte to process. */ in HELPER()
871 env->cc_op = 3; in HELPER()
893 env->cc_op = 0; in HELPER()
900 env->cc_op = (v1 == c ? 1 : v2 == c ? 2 : v1 < v2 ? 1 : 2); in HELPER()
905 /* CPU-determined bytes equal; advance the registers. */ in HELPER()
906 env->cc_op = 3; in HELPER()
929 * r1/r2 to the lowcore on page-translation exceptions. in HELPER()
954 stq_phys(env_cpu(env)->as, env->psa + offsetof(LowCore, trans_exc_code), in HELPER()
955 env->tlb_fill_tec); in HELPER()
958 stb_phys(env_cpu(env)->as, env->psa + offsetof(LowCore, op_access_id), in HELPER()
971 const uint8_t c = env->regs[0]; in HELPER()
972 const int len = MIN(-(d | TARGET_PAGE_MASK), -(s | TARGET_PAGE_MASK)); in HELPER()
977 if (env->regs[0] & 0xffffff00ull) { in HELPER()
984 * this point). We might over-indicate watchpoints within the pages in HELPER()
1018 env->aregs[i] = cpu_ldl_data_ra(env, a2, ra); in HELPER()
1038 cpu_stl_data_ra(env, a2, env->aregs[i], ra); in HELPER()
1054 int len = MIN(*destlen, -(*dest | TARGET_PAGE_MASK)); in do_mvcl()
1076 len = MIN(MIN(*srclen, -(*src | TARGET_PAGE_MASK)), len); in do_mvcl()
1077 *destlen -= len; in do_mvcl()
1078 *srclen -= len; in do_mvcl()
1086 *destlen -= len; in do_mvcl()
1095 for (i = 0; i < len; (*destlen)--, i++) { in do_mvcl()
1114 uint64_t destlen = env->regs[r1 + 1] & 0xffffff; in HELPER()
1116 uint64_t srclen = env->regs[r2 + 1] & 0xffffff; in HELPER()
1118 uint8_t pad = env->regs[r2 + 1] >> 24; in HELPER()
1133 /* We might have to zero-out some bits even if there was no action. */ in HELPER()
1147 cur_len = MIN(destlen, -(dest | TARGET_PAGE_MASK)); in HELPER()
1153 cur_len = MIN(MIN(srclen, -(src | TARGET_PAGE_MASK)), cur_len); in HELPER()
1161 srclen -= cur_len; in HELPER()
1162 env->regs[r2 + 1] = deposit64(env->regs[r2 + 1], 0, 24, srclen); in HELPER()
1166 destlen -= cur_len; in HELPER()
1167 env->regs[r1 + 1] = deposit64(env->regs[r1 + 1], 0, 24, destlen); in HELPER()
1250 for (; len; len -= wordsize) { in do_clcl()
1268 *src1len -= wordsize; in do_clcl()
1272 *src3len -= wordsize; in do_clcl()
1284 uint64_t src1len = extract64(env->regs[r1 + 1], 0, 24); in HELPER()
1286 uint64_t src3len = extract64(env->regs[r2 + 1], 0, 24); in HELPER()
1288 uint8_t pad = env->regs[r2 + 1] >> 24; in HELPER()
1291 cc = do_clcl(env, &src1, &src1len, &src3, &src3len, pad, -1, 1, ra); in HELPER()
1293 env->regs[r1 + 1] = deposit64(env->regs[r1 + 1], 0, 24, src1len); in HELPER()
1294 env->regs[r2 + 1] = deposit64(env->regs[r2 + 1], 0, 24, src3len); in HELPER()
1362 switch (max_len - len) { in HELPER()
1378 /* Fold the carry from the checksum. Note that we can see carry-out in HELPER()
1385 env->cc_op = (len == src_len ? 0 : 3); in HELPER()
1404 src--; in HELPER()
1405 len_src--; in HELPER()
1413 src--; in HELPER()
1414 len_src--; in HELPER()
1418 src--; in HELPER()
1419 len_src--; in HELPER()
1422 len_dest--; in HELPER()
1423 dest--; in HELPER()
1436 src += srclen - 1; in do_pkau()
1437 dest += destlen - 1; in do_pkau()
1447 src -= ssize; in do_pkau()
1448 srclen -= ssize; in do_pkau()
1453 src -= ssize; in do_pkau()
1454 srclen -= ssize; in do_pkau()
1458 dest--; in do_pkau()
1490 src--; in HELPER()
1491 len_src--; in HELPER()
1502 len_dest--; in HELPER()
1503 dest--; in HELPER()
1508 len_src--; in HELPER()
1509 src--; in HELPER()
1533 src += srclen - 1; in do_unpkau()
1534 dest += destlen - dsize; in do_unpkau()
1538 src--; in do_unpkau()
1562 src--; in do_unpkau()
1567 dest -= dsize; in do_unpkau()
1596 if (i == (destlen - 1)) { in HELPER()
1619 return env->cc_op; in do_helper_tr()
1632 uint8_t end = env->regs[0] & 0xff; in HELPER()
1637 if (!(env->psw.mask & PSW_MASK_64)) { in HELPER()
1663 env->cc_op = cc; in HELPER()
1664 return int128_make128(len - i, array + i); in HELPER()
1679 env->regs[2] = deposit64(env->regs[2], 0, 8, sbyte); in do_helper_trt()
1704 return do_helper_trt(env, len, array, trans, -1, ra); in do_helper_trt_bkwd()
1710 return do_helper_trt(env, len, array, trans, -1, GETPC()); in HELPER()
1728 the low 3 bits (double-word aligned). For TRTO, TRTT, it's either in HELPER()
1729 the low 12 bits (4K, without ETF2-ENH) or 3 bits (with ETF2-ENH). */ in HELPER()
1731 tbl &= -4096; in HELPER()
1733 tbl &= -8; in HELPER()
1750 len -= ssize; in HELPER()
1777 uint32_t fc = extract32(env->regs[0], 0, 8); in do_csst()
1778 uint32_t sc = extract32(env->regs[0], 8, 8); in do_csst()
1779 uint64_t pl = get_address(env, 1) & -16; in do_csst()
1802 * Note that the compare-and-swap is atomic, and the store is atomic, in do_csst()
1830 uint32_t cv = env->regs[r3]; in do_csst()
1840 env->regs[r3] = deposit64(env->regs[r3], 32, 32, ov); in do_csst()
1847 uint64_t cv = env->regs[r3]; in do_csst()
1862 env->regs[r3] = ov; in do_csst()
1869 Int128 cv = int128_make128(env->regs[r3 + 1], env->regs[r3]); in do_csst()
1887 env->regs[r3 + 0] = int128_gethi(ov); in do_csst()
1888 env->regs[r3 + 1] = int128_getlo(ov); in do_csst()
1897 of 64-bit big-endian loads, so for sc < 3 we must extract the value in do_csst()
1898 from the most-significant bits of svh. */ in do_csst()
1952 if (env->cregs[i] != val && i >= 9 && i <= 11) { in HELPER()
1955 env->cregs[i] = val; in HELPER()
1965 if (PERchanged && env->psw.mask & PSW_MASK_PER) { in HELPER()
1985 if ((uint32_t)env->cregs[i] != val && i >= 9 && i <= 11) { in HELPER()
1988 env->cregs[i] = deposit64(env->cregs[i], 0, 32, val); in HELPER()
1997 if (PERchanged && env->psw.mask & PSW_MASK_PER) { in HELPER()
2015 cpu_stq_data_ra(env, dest, env->cregs[i], ra); in HELPER()
2035 cpu_stl_data_ra(env, dest, env->cregs[i], ra); in HELPER()
2065 * (including access-list and key-controlled) as well as AR mode. in HELPER()
2072 if (env->int_pgm_code == PGM_PROTECTION) { in HELPER()
2074 cs->exception_index = -1; in HELPER()
2081 switch (env->int_pgm_code) { in HELPER()
2084 cs->exception_index = -1; in HELPER()
2094 cs->exception_index = -1; in HELPER()
2115 if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { in HELPER()
2143 if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { in HELPER()
2174 if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { in HELPER()
2212 const uint8_t psw_as = (env->psw.mask & PSW_MASK_ASC) >> PSW_SHIFT_ASC; in HELPER()
2220 if (!(env->psw.mask & PSW_MASK_DAT) || !(env->cregs[0] & CR0_SECONDARY) || in HELPER()
2247 const uint8_t psw_as = (env->psw.mask & PSW_MASK_ASC) >> PSW_SHIFT_ASC; in HELPER()
2255 if (!(env->psw.mask & PSW_MASK_DAT) || !(env->cregs[0] & CR0_SECONDARY) || in HELPER()
2290 /* invalidation-and-clearing operation */ in HELPER()
2347 address here - it's not obliged to! */ in HELPER()
2351 /* XXX 31-bit hack */ in HELPER()
2360 /* XXX 31-bit hack */ in HELPER()
2384 uint64_t asc = env->psw.mask & PSW_MASK_ASC; in HELPER()
2388 /* XXX incomplete - has more corner cases */ in HELPER()
2389 if (!(env->psw.mask & PSW_MASK_64) && (addr >> 32)) { in HELPER()
2402 env->cc_op = cc; in HELPER()
2411 Perform this by recording the modified instruction in env->ex_value.
2467 uint64_t a1 = wrap_address(env, (b1 ? env->regs[b1] : 0) + d1); in HELPER()
2468 uint64_t a2 = wrap_address(env, (b2 ? env->regs[b2] : 0) + d2); in HELPER()
2470 env->cc_op = helper(env, l, a1, a2, 0); in HELPER()
2471 env->psw.addr += ilen; in HELPER()
2475 env->int_svc_code = extract64(insn, 48, 8); in HELPER()
2476 env->int_svc_ilen = ilen; in HELPER()
2483 that ex_value is non-zero, which flags that we are in a state in HELPER()
2485 env->ex_value = insn | ilen; in HELPER()
2486 env->ex_target = addr; in HELPER()
2492 const uint8_t psw_key = (env->psw.mask & PSW_MASK_KEY) >> PSW_SHIFT_KEY; in HELPER()
2493 const uint8_t psw_as = (env->psw.mask & PSW_MASK_ASC) >> PSW_SHIFT_ASC; in HELPER()
2494 const uint64_t r0 = env->regs[0]; in HELPER()
2504 if (!(env->psw.mask & PSW_MASK_DAT)) { in HELPER()
2508 /* OAC (operand access control) for the first operand -> dest */ in HELPER()
2515 /* OAC (operand access control) for the second operand -> src */ in HELPER()
2535 if (dest_a && dest_as == AS_HOME && (env->psw.mask & PSW_MASK_PSTATE)) { in HELPER()
2538 if (!(env->cregs[0] & CR0_SECONDARY) && in HELPER()
2552 /* FIXME: AR-mode and proper problem state mode (using PSW keys) missing */ in HELPER()
2554 (env->psw.mask & PSW_MASK_PSTATE)) { in HELPER()
2555 qemu_log_mask(LOG_UNIMP, "%s: AR-mode and PSTATE support missing\n", in HELPER()
2560 /* FIXME: Access using correct keys and AR-mode */ in HELPER()
2576 the UTF-32 result into OCHAR and the input length into OLEN. A return
2630 /* Fold the byte-by-byte range descriptions in the PoO into in decode_utf8()
2632 that could be smaller, and the UTF-16 surrogates. */ in decode_utf8()
2669 return -1; in decode_utf8()
2705 return -1; in decode_utf16()
2725 return -1; in decode_utf32()
2766 return -1; in encode_utf8()
2788 d0 = deposit32(d0, 6, 4, extract32(c, 16, 5) - 1); in encode_utf16()
2794 return -1; in encode_utf16()
2805 return -1; in encode_utf32()
2835 slen -= ilen; in convert_unicode()
2837 dlen -= olen; in convert_unicode()
2892 const uint64_t pagelen = -(addr | TARGET_PAGE_MASK); in probe_write_access()
2897 len -= curlen; in probe_write_access()