diff options
Diffstat (limited to 'C/7zDec.c')
-rw-r--r-- | C/7zDec.c | 46 |
1 files changed, 35 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* 7zDec.c -- Decoding from 7z folder | 1 | /* 7zDec.c -- Decoding from 7z folder |
2 | 2023-04-02 : Igor Pavlov : Public domain */ | 2 | 2024-03-01 : Igor Pavlov : Public domain */ |
3 | 3 | ||
4 | #include "Precomp.h" | 4 | #include "Precomp.h" |
5 | 5 | ||
@@ -51,6 +51,7 @@ | |||
51 | 51 | ||
52 | #ifndef Z7_NO_METHODS_FILTERS | 52 | #ifndef Z7_NO_METHODS_FILTERS |
53 | #define k_Delta 3 | 53 | #define k_Delta 3 |
54 | #define k_RISCV 0xb | ||
54 | #define k_BCJ 0x3030103 | 55 | #define k_BCJ 0x3030103 |
55 | #define k_PPC 0x3030205 | 56 | #define k_PPC 0x3030205 |
56 | #define k_IA64 0x3030401 | 57 | #define k_IA64 0x3030401 |
@@ -362,6 +363,7 @@ static SRes CheckSupportedFolder(const CSzFolder *f) | |||
362 | case k_IA64: | 363 | case k_IA64: |
363 | case k_SPARC: | 364 | case k_SPARC: |
364 | case k_ARM: | 365 | case k_ARM: |
366 | case k_RISCV: | ||
365 | #endif | 367 | #endif |
366 | #ifdef Z7_USE_FILTER_ARM64 | 368 | #ifdef Z7_USE_FILTER_ARM64 |
367 | case k_ARM64: | 369 | case k_ARM64: |
@@ -535,10 +537,10 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, | |||
535 | } | 537 | } |
536 | } | 538 | } |
537 | } | 539 | } |
538 | #if defined(Z7_USE_BRANCH_FILTER) | 540 | #if defined(Z7_USE_BRANCH_FILTER) |
539 | else if (ci == 1) | 541 | else if (ci == 1) |
540 | { | 542 | { |
541 | #if !defined(Z7_NO_METHODS_FILTERS) | 543 | #if !defined(Z7_NO_METHODS_FILTERS) |
542 | if (coder->MethodID == k_Delta) | 544 | if (coder->MethodID == k_Delta) |
543 | { | 545 | { |
544 | if (coder->PropsSize != 1) | 546 | if (coder->PropsSize != 1) |
@@ -550,22 +552,43 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, | |||
550 | } | 552 | } |
551 | continue; | 553 | continue; |
552 | } | 554 | } |
553 | #endif | 555 | #endif |
554 | 556 | ||
555 | #ifdef Z7_USE_FILTER_ARM64 | 557 | #ifdef Z7_USE_FILTER_ARM64 |
556 | if (coder->MethodID == k_ARM64) | 558 | if (coder->MethodID == k_ARM64) |
557 | { | 559 | { |
558 | UInt32 pc = 0; | 560 | UInt32 pc = 0; |
559 | if (coder->PropsSize == 4) | 561 | if (coder->PropsSize == 4) |
562 | { | ||
560 | pc = GetUi32(propsData + coder->PropsOffset); | 563 | pc = GetUi32(propsData + coder->PropsOffset); |
564 | if (pc & 3) | ||
565 | return SZ_ERROR_UNSUPPORTED; | ||
566 | } | ||
561 | else if (coder->PropsSize != 0) | 567 | else if (coder->PropsSize != 0) |
562 | return SZ_ERROR_UNSUPPORTED; | 568 | return SZ_ERROR_UNSUPPORTED; |
563 | z7_BranchConv_ARM64_Dec(outBuffer, outSize, pc); | 569 | z7_BranchConv_ARM64_Dec(outBuffer, outSize, pc); |
564 | continue; | 570 | continue; |
565 | } | 571 | } |
566 | #endif | 572 | #endif |
567 | 573 | ||
568 | #if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT) | 574 | #if !defined(Z7_NO_METHODS_FILTERS) |
575 | if (coder->MethodID == k_RISCV) | ||
576 | { | ||
577 | UInt32 pc = 0; | ||
578 | if (coder->PropsSize == 4) | ||
579 | { | ||
580 | pc = GetUi32(propsData + coder->PropsOffset); | ||
581 | if (pc & 1) | ||
582 | return SZ_ERROR_UNSUPPORTED; | ||
583 | } | ||
584 | else if (coder->PropsSize != 0) | ||
585 | return SZ_ERROR_UNSUPPORTED; | ||
586 | z7_BranchConv_RISCV_Dec(outBuffer, outSize, pc); | ||
587 | continue; | ||
588 | } | ||
589 | #endif | ||
590 | |||
591 | #if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT) | ||
569 | { | 592 | { |
570 | if (coder->PropsSize != 0) | 593 | if (coder->PropsSize != 0) |
571 | return SZ_ERROR_UNSUPPORTED; | 594 | return SZ_ERROR_UNSUPPORTED; |
@@ -579,7 +602,8 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, | |||
579 | z7_BranchConvSt_X86_Dec(outBuffer, outSize, 0, &state); // pc = 0 | 602 | z7_BranchConvSt_X86_Dec(outBuffer, outSize, 0, &state); // pc = 0 |
580 | break; | 603 | break; |
581 | } | 604 | } |
582 | CASE_BRA_CONV(PPC) | 605 | case k_PPC: Z7_BRANCH_CONV_DEC_2(BranchConv_PPC)(outBuffer, outSize, 0); break; // pc = 0; |
606 | // CASE_BRA_CONV(PPC) | ||
583 | CASE_BRA_CONV(IA64) | 607 | CASE_BRA_CONV(IA64) |
584 | CASE_BRA_CONV(SPARC) | 608 | CASE_BRA_CONV(SPARC) |
585 | CASE_BRA_CONV(ARM) | 609 | CASE_BRA_CONV(ARM) |
@@ -592,9 +616,9 @@ static SRes SzFolder_Decode2(const CSzFolder *folder, | |||
592 | } | 616 | } |
593 | continue; | 617 | continue; |
594 | } | 618 | } |
595 | #endif | 619 | #endif |
596 | } // (c == 1) | 620 | } // (c == 1) |
597 | #endif | 621 | #endif // Z7_USE_BRANCH_FILTER |
598 | else | 622 | else |
599 | return SZ_ERROR_UNSUPPORTED; | 623 | return SZ_ERROR_UNSUPPORTED; |
600 | } | 624 | } |