From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N5THW-0004YL-E1 for qemu-devel@nongnu.org; Tue, 03 Nov 2009 18:59:22 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N5THS-0004Xj-U8 for qemu-devel@nongnu.org; Tue, 03 Nov 2009 18:59:22 -0500 Received: from [199.232.76.173] (port=40049 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N5THS-0004Xg-MB for qemu-devel@nongnu.org; Tue, 03 Nov 2009 18:59:18 -0500 Received: from mail-yx0-f188.google.com ([209.85.210.188]:54418) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N5THS-0002p3-5d for qemu-devel@nongnu.org; Tue, 03 Nov 2009 18:59:18 -0500 Received: by yxe26 with SMTP id 26so5871553yxe.4 for ; Tue, 03 Nov 2009 15:59:17 -0800 (PST) MIME-Version: 1.0 From: Artyom Tarasenko Date: Wed, 4 Nov 2009 00:58:54 +0100 Message-ID: Content-Type: multipart/mixed; boundary=0016362834f8fddf080477804796 Subject: [Qemu-devel] [PATCH] sparc32 fix carry flag handling (Solaris bootblk fix) List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel , Blue Swirl --0016362834f8fddf080477804796 Content-Type: text/plain; charset=ISO-8859-1 The page 108 of the SPARC Version 8 Architecture Manual describes that addcc and addxcc shall compute carry flag the same way. The page 110 claims the same about subcc and subxcc instructions. This patch fixes carry computation in corner cases and removes redundant code. The most visible effect of the patch is enabling Solaris boot when using OBP. Signed-off-by: Artyom Tarasenko --- diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index a1ada8b..818c5f5 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -912,12 +912,16 @@ static uint32_t compute_C_div(void) return 0; } -static inline uint32_t get_C_add_icc(target_ulong dst, target_ulong src1) +/* carry = (src1[31] & src2[31]) | ( ~dst[31] & (src1[31] | src2[31])) */ +static inline uint32_t get_C_add_icc(target_ulong dst, target_ulong src1, + target_ulong src2) { uint32_t ret = 0; - if ((dst & 0xffffffffULL) < (src1 & 0xffffffffULL)) - ret |= PSR_CARRY; + if (((src1 & (1ULL << 31)) & (src2 & (1ULL << 31))) + | ((~(dst & (1ULL << 31))) + & ((src1 & (1ULL << 31)) | (src2 & (1ULL << 31)))) ) + ret |=PSR_CARRY; return ret; } @@ -931,21 +935,6 @@ static inline uint32_t get_V_add_icc(target_ulong dst, target_ulong src1, return ret; } -static uint32_t compute_all_add(void) -{ - uint32_t ret; - - ret = get_NZ_icc(CC_DST); - ret |= get_C_add_icc(CC_DST, CC_SRC); - ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); - return ret; -} - -static uint32_t compute_C_add(void) -{ - return get_C_add_icc(CC_DST, CC_SRC); -} - #ifdef TARGET_SPARC64 static inline uint32_t get_C_add_xcc(target_ulong dst, target_ulong src1) { @@ -982,24 +971,19 @@ static uint32_t compute_C_add_xcc(void) } #endif -static uint32_t compute_all_addx(void) +static uint32_t compute_all_add(void) { uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_add_icc(CC_DST - CC_SRC2, CC_SRC); - ret |= get_C_add_icc(CC_DST, CC_SRC); + ret |= get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); return ret; } -static uint32_t compute_C_addx(void) +static uint32_t compute_C_add(void) { - uint32_t ret; - - ret = get_C_add_icc(CC_DST - CC_SRC2, CC_SRC); - ret |= get_C_add_icc(CC_DST, CC_SRC); - return ret; + return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); } #ifdef TARGET_SPARC64 @@ -1038,7 +1022,7 @@ static uint32_t compute_all_tadd(void) uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_add_icc(CC_DST, CC_SRC); + ret |= get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_tag_icc(CC_SRC, CC_SRC2); return ret; @@ -1046,7 +1030,7 @@ static uint32_t compute_all_tadd(void) static uint32_t compute_C_tadd(void) { - return get_C_add_icc(CC_DST, CC_SRC); + return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); } static uint32_t compute_all_taddtv(void) @@ -1054,21 +1038,25 @@ static uint32_t compute_all_taddtv(void) uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_add_icc(CC_DST, CC_SRC); + ret |= get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); return ret; } static uint32_t compute_C_taddtv(void) { - return get_C_add_icc(CC_DST, CC_SRC); + return get_C_add_icc(CC_DST, CC_SRC, CC_SRC2); } -static inline uint32_t get_C_sub_icc(target_ulong src1, target_ulong src2) +/* carry = (~src1[31] & src2[31]) | ( dst[31] & (~src1[31] | src2[31])) */ +static inline uint32_t get_C_sub_icc(target_ulong dst, target_ulong src1, + target_ulong src2) { uint32_t ret = 0; - if ((src1 & 0xffffffffULL) < (src2 & 0xffffffffULL)) - ret |= PSR_CARRY; + if((( ~(src1 & (1ULL << 31))) & (src2 & (1ULL << 31))) + | ((dst & (1ULL << 31)) & (( ~(src1 & (1ULL << 31))) + | (src2 & (1ULL << 31))))) + ret |=PSR_CARRY; return ret; } @@ -1082,20 +1070,6 @@ static inline uint32_t get_V_sub_icc(target_ulong dst, target_ulong src1, return ret; } -static uint32_t compute_all_sub(void) -{ - uint32_t ret; - - ret = get_NZ_icc(CC_DST); - ret |= get_C_sub_icc(CC_SRC, CC_SRC2); - ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); - return ret; -} - -static uint32_t compute_C_sub(void) -{ - return get_C_sub_icc(CC_SRC, CC_SRC2); -} #ifdef TARGET_SPARC64 static inline uint32_t get_C_sub_xcc(target_ulong src1, target_ulong src2) @@ -1133,24 +1107,19 @@ static uint32_t compute_C_sub_xcc(void) } #endif -static uint32_t compute_all_subx(void) +static uint32_t compute_all_sub(void) { uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_sub_icc(CC_DST - CC_SRC2, CC_SRC); - ret |= get_C_sub_icc(CC_DST, CC_SRC2); + ret |= get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); return ret; } -static uint32_t compute_C_subx(void) +static uint32_t compute_C_sub(void) { - uint32_t ret; - - ret = get_C_sub_icc(CC_DST - CC_SRC2, CC_SRC); - ret |= get_C_sub_icc(CC_DST, CC_SRC2); - return ret; + return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); } #ifdef TARGET_SPARC64 @@ -1180,7 +1149,7 @@ static uint32_t compute_all_tsub(void) uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_sub_icc(CC_DST, CC_SRC); + ret |= get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); ret |= get_V_tag_icc(CC_SRC, CC_SRC2); return ret; @@ -1188,7 +1157,7 @@ static uint32_t compute_all_tsub(void) static uint32_t compute_C_tsub(void) { - return get_C_sub_icc(CC_DST, CC_SRC); + return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); } static uint32_t compute_all_tsubtv(void) @@ -1196,13 +1165,13 @@ static uint32_t compute_all_tsubtv(void) uint32_t ret; ret = get_NZ_icc(CC_DST); - ret |= get_C_sub_icc(CC_DST, CC_SRC); + ret |= get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); return ret; } static uint32_t compute_C_tsubtv(void) { - return get_C_sub_icc(CC_DST, CC_SRC); + return get_C_sub_icc(CC_DST, CC_SRC, CC_SRC2); } static uint32_t compute_all_logic(void) @@ -1232,11 +1201,11 @@ static const CCTable icc_table[CC_OP_NB] = { [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, [CC_OP_DIV] = { compute_all_div, compute_C_div }, [CC_OP_ADD] = { compute_all_add, compute_C_add }, - [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, + [CC_OP_ADDX] = { compute_all_add, compute_C_add }, [CC_OP_TADD] = { compute_all_tadd, compute_C_tadd }, [CC_OP_TADDTV] = { compute_all_taddtv, compute_C_taddtv }, [CC_OP_SUB] = { compute_all_sub, compute_C_sub }, - [CC_OP_SUBX] = { compute_all_subx, compute_C_subx }, + [CC_OP_SUBX] = { compute_all_sub, compute_C_sub }, [CC_OP_TSUB] = { compute_all_tsub, compute_C_tsub }, [CC_OP_TSUBTV] = { compute_all_tsubtv, compute_C_tsubtv }, [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, --0016362834f8fddf080477804796 Content-Type: application/octet-stream; name="0001-op_helper-carry.patch" Content-Disposition: attachment; filename="0001-op_helper-carry.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g1l9zryo0 U2lnbmVkLW9mZi1ieTogQXJ0eW9tIFRhcmFzZW5rbyA8YXRhcjRxZW11QGdtYWlsLmNvbT4KLS0t CmRpZmYgLS1naXQgYS90YXJnZXQtc3BhcmMvb3BfaGVscGVyLmMgYi90YXJnZXQtc3BhcmMvb3Bf aGVscGVyLmMKaW5kZXggYTFhZGE4Yi4uODE4YzVmNSAxMDA2NDQKLS0tIGEvdGFyZ2V0LXNwYXJj L29wX2hlbHBlci5jCisrKyBiL3RhcmdldC1zcGFyYy9vcF9oZWxwZXIuYwpAQCAtOTEyLDEyICs5 MTIsMTYgQEAgc3RhdGljIHVpbnQzMl90IGNvbXB1dGVfQ19kaXYodm9pZCkKICAgICByZXR1cm4g MDsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfQ19hZGRfaWNjKHRhcmdldF91bG9u ZyBkc3QsIHRhcmdldF91bG9uZyBzcmMxKQorLyogY2FycnkgPSAoc3JjMVszMV0gJiBzcmMyWzMx XSkgfCAoIH5kc3RbMzFdICYgKHNyYzFbMzFdIHwgc3JjMlszMV0pKSAqLworc3RhdGljIGlubGlu ZSB1aW50MzJfdCBnZXRfQ19hZGRfaWNjKHRhcmdldF91bG9uZyBkc3QsIHRhcmdldF91bG9uZyBz cmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBz cmMyKQogewogICAgIHVpbnQzMl90IHJldCA9IDA7CiAKLSAgICBpZiAoKGRzdCAmIDB4ZmZmZmZm ZmZVTEwpIDwgKHNyYzEgJiAweGZmZmZmZmZmVUxMKSkKLSAgICAgICAgcmV0IHw9IFBTUl9DQVJS WTsKKyAgICBpZiAoKChzcmMxICYgKDFVTEwgPDwgMzEpKSAmIChzcmMyICYgKDFVTEwgPDwgMzEp KSkgCisgICAgICAgIHwgKCh+KGRzdCAmICgxVUxMIDw8IDMxKSkpIAorICAgICAgICAgICAmICgo c3JjMSAmICgxVUxMIDw8IDMxKSkgfCAoc3JjMiAmICgxVUxMIDw8IDMxKSkpKSApIAorICAgICAg ICByZXQgIHw9UFNSX0NBUlJZOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTkzMSwyMSArOTM1 LDYgQEAgc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfVl9hZGRfaWNjKHRhcmdldF91bG9uZyBk c3QsIHRhcmdldF91bG9uZyBzcmMxLAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1aW50 MzJfdCBjb21wdXRlX2FsbF9hZGQodm9pZCkKLXsKLSAgICB1aW50MzJfdCByZXQ7Ci0KLSAgICBy ZXQgPSBnZXRfTlpfaWNjKENDX0RTVCk7Ci0gICAgcmV0IHw9IGdldF9DX2FkZF9pY2MoQ0NfRFNU LCBDQ19TUkMpOwotICAgIHJldCB8PSBnZXRfVl9hZGRfaWNjKENDX0RTVCwgQ0NfU1JDLCBDQ19T UkMyKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdWludDMyX3QgY29tcHV0ZV9DX2Fk ZCh2b2lkKQotewotICAgIHJldHVybiBnZXRfQ19hZGRfaWNjKENDX0RTVCwgQ0NfU1JDKTsKLX0K LQogI2lmZGVmIFRBUkdFVF9TUEFSQzY0CiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9DX2Fk ZF94Y2ModGFyZ2V0X3Vsb25nIGRzdCwgdGFyZ2V0X3Vsb25nIHNyYzEpCiB7CkBAIC05ODIsMjQg Kzk3MSwxOSBAQCBzdGF0aWMgdWludDMyX3QgY29tcHV0ZV9DX2FkZF94Y2Modm9pZCkKIH0KICNl bmRpZgogCi1zdGF0aWMgdWludDMyX3QgY29tcHV0ZV9hbGxfYWRkeCh2b2lkKQorc3RhdGljIHVp bnQzMl90IGNvbXB1dGVfYWxsX2FkZCh2b2lkKQogewogICAgIHVpbnQzMl90IHJldDsKIAogICAg IHJldCA9IGdldF9OWl9pY2MoQ0NfRFNUKTsKLSAgICByZXQgfD0gZ2V0X0NfYWRkX2ljYyhDQ19E U1QgLSBDQ19TUkMyLCBDQ19TUkMpOwotICAgIHJldCB8PSBnZXRfQ19hZGRfaWNjKENDX0RTVCwg Q0NfU1JDKTsKKyAgICByZXQgfD0gZ2V0X0NfYWRkX2ljYyhDQ19EU1QsIENDX1NSQywgQ0NfU1JD Mik7CiAgICAgcmV0IHw9IGdldF9WX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMsIENDX1NSQzIpOwog ICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBjb21wdXRlX0NfYWRkeCh2b2lk KQorc3RhdGljIHVpbnQzMl90IGNvbXB1dGVfQ19hZGQodm9pZCkKIHsKLSAgICB1aW50MzJfdCBy ZXQ7Ci0KLSAgICByZXQgPSBnZXRfQ19hZGRfaWNjKENDX0RTVCAtIENDX1NSQzIsIENDX1NSQyk7 Ci0gICAgcmV0IHw9IGdldF9DX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMpOwotICAgIHJldHVybiBy ZXQ7CisgICAgcmV0dXJuIGdldF9DX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMsIENDX1NSQzIpOwog fQogCiAjaWZkZWYgVEFSR0VUX1NQQVJDNjQKQEAgLTEwMzgsNyArMTAyMiw3IEBAIHN0YXRpYyB1 aW50MzJfdCBjb21wdXRlX2FsbF90YWRkKHZvaWQpCiAgICAgdWludDMyX3QgcmV0OwogCiAgICAg cmV0ID0gZ2V0X05aX2ljYyhDQ19EU1QpOwotICAgIHJldCB8PSBnZXRfQ19hZGRfaWNjKENDX0RT VCwgQ0NfU1JDKTsKKyAgICByZXQgfD0gZ2V0X0NfYWRkX2ljYyhDQ19EU1QsIENDX1NSQywgQ0Nf U1JDMik7CiAgICAgcmV0IHw9IGdldF9WX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMsIENDX1NSQzIp OwogICAgIHJldCB8PSBnZXRfVl90YWdfaWNjKENDX1NSQywgQ0NfU1JDMik7CiAgICAgcmV0dXJu IHJldDsKQEAgLTEwNDYsNyArMTAzMCw3IEBAIHN0YXRpYyB1aW50MzJfdCBjb21wdXRlX2FsbF90 YWRkKHZvaWQpCiAKIHN0YXRpYyB1aW50MzJfdCBjb21wdXRlX0NfdGFkZCh2b2lkKQogewotICAg IHJldHVybiBnZXRfQ19hZGRfaWNjKENDX0RTVCwgQ0NfU1JDKTsKKyAgICByZXR1cm4gZ2V0X0Nf YWRkX2ljYyhDQ19EU1QsIENDX1NSQywgQ0NfU1JDMik7CiB9CiAKIHN0YXRpYyB1aW50MzJfdCBj b21wdXRlX2FsbF90YWRkdHYodm9pZCkKQEAgLTEwNTQsMjEgKzEwMzgsMjUgQEAgc3RhdGljIHVp bnQzMl90IGNvbXB1dGVfYWxsX3RhZGR0dih2b2lkKQogICAgIHVpbnQzMl90IHJldDsKIAogICAg IHJldCA9IGdldF9OWl9pY2MoQ0NfRFNUKTsKLSAgICByZXQgfD0gZ2V0X0NfYWRkX2ljYyhDQ19E U1QsIENDX1NSQyk7CisgICAgcmV0IHw9IGdldF9DX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMsIEND X1NSQzIpOwogICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1aW50MzJfdCBjb21wdXRlX0Nf dGFkZHR2KHZvaWQpCiB7Ci0gICAgcmV0dXJuIGdldF9DX2FkZF9pY2MoQ0NfRFNULCBDQ19TUkMp OworICAgIHJldHVybiBnZXRfQ19hZGRfaWNjKENDX0RTVCwgQ0NfU1JDLCBDQ19TUkMyKTsKIH0K IAotc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfQ19zdWJfaWNjKHRhcmdldF91bG9uZyBzcmMx LCB0YXJnZXRfdWxvbmcgc3JjMikKKy8qIGNhcnJ5ID0gKH5zcmMxWzMxXSAmIHNyYzJbMzFdKSB8 ICggZHN0WzMxXSAgJiAofnNyYzFbMzFdIHwgc3JjMlszMV0pKSAqLworc3RhdGljIGlubGluZSB1 aW50MzJfdCBnZXRfQ19zdWJfaWNjKHRhcmdldF91bG9uZyBkc3QsIHRhcmdldF91bG9uZyBzcmMx LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBzcmMy KQogewogICAgIHVpbnQzMl90IHJldCA9IDA7CiAKLSAgICBpZiAoKHNyYzEgJiAweGZmZmZmZmZm VUxMKSA8IChzcmMyICYgMHhmZmZmZmZmZlVMTCkpCi0gICAgICAgIHJldCB8PSBQU1JfQ0FSUlk7 CisgICAgaWYoKCggfihzcmMxICYgKDFVTEwgPDwgMzEpKSkgJiAoc3JjMiAmICgxVUxMIDw8IDMx KSkpIAorICAgICAgIHwgKChkc3QgJiAoMVVMTCA8PCAzMSkpICYgKCggfihzcmMxICYgKDFVTEwg PDwgMzEpKSkKKyAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzcmMyICYgKDFV TEwgPDwgMzEpKSkpKQorICAgICAgIHJldCAgfD1QU1JfQ0FSUlk7CiAgICAgcmV0dXJuIHJldDsK IH0KIApAQCAtMTA4MiwyMCArMTA3MCw2IEBAIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0X1Zf c3ViX2ljYyh0YXJnZXRfdWxvbmcgZHN0LCB0YXJnZXRfdWxvbmcgc3JjMSwKICAgICByZXR1cm4g cmV0OwogfQogCi1zdGF0aWMgdWludDMyX3QgY29tcHV0ZV9hbGxfc3ViKHZvaWQpCi17Ci0gICAg dWludDMyX3QgcmV0OwotCi0gICAgcmV0ID0gZ2V0X05aX2ljYyhDQ19EU1QpOwotICAgIHJldCB8 PSBnZXRfQ19zdWJfaWNjKENDX1NSQywgQ0NfU1JDMik7Ci0gICAgcmV0IHw9IGdldF9WX3N1Yl9p Y2MoQ0NfRFNULCBDQ19TUkMsIENDX1NSQzIpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRp YyB1aW50MzJfdCBjb21wdXRlX0Nfc3ViKHZvaWQpCi17Ci0gICAgcmV0dXJuIGdldF9DX3N1Yl9p Y2MoQ0NfU1JDLCBDQ19TUkMyKTsKLX0KIAogI2lmZGVmIFRBUkdFVF9TUEFSQzY0CiBzdGF0aWMg aW5saW5lIHVpbnQzMl90IGdldF9DX3N1Yl94Y2ModGFyZ2V0X3Vsb25nIHNyYzEsIHRhcmdldF91 bG9uZyBzcmMyKQpAQCAtMTEzMywyNCArMTEwNywxOSBAQCBzdGF0aWMgdWludDMyX3QgY29tcHV0 ZV9DX3N1Yl94Y2Modm9pZCkKIH0KICNlbmRpZgogCi1zdGF0aWMgdWludDMyX3QgY29tcHV0ZV9h bGxfc3VieCh2b2lkKQorc3RhdGljIHVpbnQzMl90IGNvbXB1dGVfYWxsX3N1Yih2b2lkKQogewog ICAgIHVpbnQzMl90IHJldDsKIAogICAgIHJldCA9IGdldF9OWl9pY2MoQ0NfRFNUKTsKLSAgICBy ZXQgfD0gZ2V0X0Nfc3ViX2ljYyhDQ19EU1QgLSBDQ19TUkMyLCBDQ19TUkMpOwotICAgIHJldCB8 PSBnZXRfQ19zdWJfaWNjKENDX0RTVCwgQ0NfU1JDMik7CisgICAgcmV0IHw9IGdldF9DX3N1Yl9p Y2MoQ0NfRFNULCBDQ19TUkMsIENDX1NSQzIpOwogICAgIHJldCB8PSBnZXRfVl9zdWJfaWNjKEND X0RTVCwgQ0NfU1JDLCBDQ19TUkMyKTsKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdWlu dDMyX3QgY29tcHV0ZV9DX3N1Yngodm9pZCkKK3N0YXRpYyB1aW50MzJfdCBjb21wdXRlX0Nfc3Vi KHZvaWQpCiB7Ci0gICAgdWludDMyX3QgcmV0OwotCi0gICAgcmV0ID0gZ2V0X0Nfc3ViX2ljYyhD Q19EU1QgLSBDQ19TUkMyLCBDQ19TUkMpOwotICAgIHJldCB8PSBnZXRfQ19zdWJfaWNjKENDX0RT VCwgQ0NfU1JDMik7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gZ2V0X0Nfc3ViX2ljYyhD Q19EU1QsIENDX1NSQywgQ0NfU1JDMik7CiB9CiAKICNpZmRlZiBUQVJHRVRfU1BBUkM2NApAQCAt MTE4MCw3ICsxMTQ5LDcgQEAgc3RhdGljIHVpbnQzMl90IGNvbXB1dGVfYWxsX3RzdWIodm9pZCkK ICAgICB1aW50MzJfdCByZXQ7CiAKICAgICByZXQgPSBnZXRfTlpfaWNjKENDX0RTVCk7Ci0gICAg cmV0IHw9IGdldF9DX3N1Yl9pY2MoQ0NfRFNULCBDQ19TUkMpOworICAgIHJldCB8PSBnZXRfQ19z dWJfaWNjKENDX0RTVCwgQ0NfU1JDLCBDQ19TUkMyKTsKICAgICByZXQgfD0gZ2V0X1Zfc3ViX2lj YyhDQ19EU1QsIENDX1NSQywgQ0NfU1JDMik7CiAgICAgcmV0IHw9IGdldF9WX3RhZ19pY2MoQ0Nf U1JDLCBDQ19TUkMyKTsKICAgICByZXR1cm4gcmV0OwpAQCAtMTE4OCw3ICsxMTU3LDcgQEAgc3Rh dGljIHVpbnQzMl90IGNvbXB1dGVfYWxsX3RzdWIodm9pZCkKIAogc3RhdGljIHVpbnQzMl90IGNv bXB1dGVfQ190c3ViKHZvaWQpCiB7Ci0gICAgcmV0dXJuIGdldF9DX3N1Yl9pY2MoQ0NfRFNULCBD Q19TUkMpOworICAgIHJldHVybiBnZXRfQ19zdWJfaWNjKENDX0RTVCwgQ0NfU1JDLCBDQ19TUkMy KTsKIH0KIAogc3RhdGljIHVpbnQzMl90IGNvbXB1dGVfYWxsX3RzdWJ0dih2b2lkKQpAQCAtMTE5 NiwxMyArMTE2NSwxMyBAQCBzdGF0aWMgdWludDMyX3QgY29tcHV0ZV9hbGxfdHN1YnR2KHZvaWQp CiAgICAgdWludDMyX3QgcmV0OwogCiAgICAgcmV0ID0gZ2V0X05aX2ljYyhDQ19EU1QpOwotICAg IHJldCB8PSBnZXRfQ19zdWJfaWNjKENDX0RTVCwgQ0NfU1JDKTsKKyAgICByZXQgfD0gZ2V0X0Nf c3ViX2ljYyhDQ19EU1QsIENDX1NSQywgQ0NfU1JDMik7CiAgICAgcmV0dXJuIHJldDsKIH0KIAog c3RhdGljIHVpbnQzMl90IGNvbXB1dGVfQ190c3VidHYodm9pZCkKIHsKLSAgICByZXR1cm4gZ2V0 X0Nfc3ViX2ljYyhDQ19EU1QsIENDX1NSQyk7CisgICAgcmV0dXJuIGdldF9DX3N1Yl9pY2MoQ0Nf RFNULCBDQ19TUkMsIENDX1NSQzIpOwogfQogCiBzdGF0aWMgdWludDMyX3QgY29tcHV0ZV9hbGxf bG9naWModm9pZCkKQEAgLTEyMzIsMTEgKzEyMDEsMTEgQEAgc3RhdGljIGNvbnN0IENDVGFibGUg aWNjX3RhYmxlW0NDX09QX05CXSA9IHsKICAgICBbQ0NfT1BfRkxBR1NdID0geyBjb21wdXRlX2Fs bF9mbGFncywgY29tcHV0ZV9DX2ZsYWdzIH0sCiAgICAgW0NDX09QX0RJVl0gPSB7IGNvbXB1dGVf YWxsX2RpdiwgY29tcHV0ZV9DX2RpdiB9LAogICAgIFtDQ19PUF9BRERdID0geyBjb21wdXRlX2Fs bF9hZGQsIGNvbXB1dGVfQ19hZGQgfSwKLSAgICBbQ0NfT1BfQUREWF0gPSB7IGNvbXB1dGVfYWxs X2FkZHgsIGNvbXB1dGVfQ19hZGR4IH0sCisgICAgW0NDX09QX0FERFhdID0geyBjb21wdXRlX2Fs bF9hZGQsIGNvbXB1dGVfQ19hZGQgfSwKICAgICBbQ0NfT1BfVEFERF0gPSB7IGNvbXB1dGVfYWxs X3RhZGQsIGNvbXB1dGVfQ190YWRkIH0sCiAgICAgW0NDX09QX1RBRERUVl0gPSB7IGNvbXB1dGVf YWxsX3RhZGR0diwgY29tcHV0ZV9DX3RhZGR0diB9LAogICAgIFtDQ19PUF9TVUJdID0geyBjb21w dXRlX2FsbF9zdWIsIGNvbXB1dGVfQ19zdWIgfSwKLSAgICBbQ0NfT1BfU1VCWF0gPSB7IGNvbXB1 dGVfYWxsX3N1YngsIGNvbXB1dGVfQ19zdWJ4IH0sCisgICAgW0NDX09QX1NVQlhdID0geyBjb21w dXRlX2FsbF9zdWIsIGNvbXB1dGVfQ19zdWIgfSwKICAgICBbQ0NfT1BfVFNVQl0gPSB7IGNvbXB1 dGVfYWxsX3RzdWIsIGNvbXB1dGVfQ190c3ViIH0sCiAgICAgW0NDX09QX1RTVUJUVl0gPSB7IGNv bXB1dGVfYWxsX3RzdWJ0diwgY29tcHV0ZV9DX3RzdWJ0diB9LAogICAgIFtDQ19PUF9MT0dJQ10g PSB7IGNvbXB1dGVfYWxsX2xvZ2ljLCBjb21wdXRlX0NfbG9naWMgfSwK --0016362834f8fddf080477804796--