2764 __ ret(0); |
2764 __ ret(0); |
2765 |
2765 |
2766 return start; |
2766 return start; |
2767 } |
2767 } |
2768 |
2768 |
|
2769 // Safefetch stubs. |
|
2770 void generate_safefetch(const char* name, int size, address* entry, |
|
2771 address* fault_pc, address* continuation_pc) { |
|
2772 // safefetch signatures: |
|
2773 // int SafeFetch32(int* adr, int errValue); |
|
2774 // intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue); |
|
2775 |
|
2776 StubCodeMark mark(this, "StubRoutines", name); |
|
2777 |
|
2778 // Entry point, pc or function descriptor. |
|
2779 *entry = __ pc(); |
|
2780 |
|
2781 __ movl(rax, Address(rsp, 0x8)); |
|
2782 __ movl(rcx, Address(rsp, 0x4)); |
|
2783 // Load *adr into eax, may fault. |
|
2784 *fault_pc = __ pc(); |
|
2785 switch (size) { |
|
2786 case 4: |
|
2787 // int32_t |
|
2788 __ movl(rax, Address(rcx, 0)); |
|
2789 break; |
|
2790 case 8: |
|
2791 // int64_t |
|
2792 Unimplemented(); |
|
2793 break; |
|
2794 default: |
|
2795 ShouldNotReachHere(); |
|
2796 } |
|
2797 |
|
2798 // Return errValue or *adr. |
|
2799 *continuation_pc = __ pc(); |
|
2800 __ ret(0); |
|
2801 } |
2769 |
2802 |
2770 public: |
2803 public: |
2771 // Information about frame layout at time of blocking runtime call. |
2804 // Information about frame layout at time of blocking runtime call. |
2772 // Note that we only have to preserve callee-saved registers since |
2805 // Note that we only have to preserve callee-saved registers since |
2773 // the compilers are responsible for supplying a continuation point |
2806 // the compilers are responsible for supplying a continuation point |
2976 StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); |
3009 StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); |
2977 StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); |
3010 StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); |
2978 StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); |
3011 StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); |
2979 StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt(); |
3012 StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt(); |
2980 } |
3013 } |
|
3014 |
|
3015 // Safefetch stubs. |
|
3016 generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry, |
|
3017 &StubRoutines::_safefetch32_fault_pc, |
|
3018 &StubRoutines::_safefetch32_continuation_pc); |
|
3019 StubRoutines::_safefetchN_entry = StubRoutines::_safefetch32_entry; |
|
3020 StubRoutines::_safefetchN_fault_pc = StubRoutines::_safefetch32_fault_pc; |
|
3021 StubRoutines::_safefetchN_continuation_pc = StubRoutines::_safefetch32_continuation_pc; |
2981 } |
3022 } |
2982 |
3023 |
2983 |
3024 |
2984 public: |
3025 public: |
2985 StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) { |
3026 StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) { |