github.com/tencent/goom@v1.0.1/internal/bytecode/memory/icache_arm64_18.go (about) 1 //go:build go1.18 2 // +build go1.18 3 4 package memory 5 6 // icache 清理指令内容 7 var ( 8 insPadding = []byte{ 9 0xEB, 0x03, 0x00, 0xAA, // # mov x11, x0 10 0x2B, 0x75, 0x0b, 0xd5, // # ic ivau, x11 11 0x6B, 0x01, 0x01, 0x91, // # add x11, x11, #1<<6 12 0x2B, 0x75, 0x0b, 0xd5, // # ic ivau, x11 13 0x6B, 0x01, 0x01, 0x91, // # add x11, x11, #1<<6 14 0x2B, 0x75, 0x0b, 0xd5, // # ic ivau, x11 15 0x6B, 0x01, 0x01, 0x91, // # add x11, x11, #1<<6 16 0x2B, 0x75, 0x0b, 0xd5, // # ic ivau, x11 17 } 18 19 // clearICacheIns 清除指令缓存指令 20 // 新版mac使用 AARCH64 (arm64v8), 指令缓存命中率较高, 会出现patch成功但是使用缓存中原来的指令来执行,导致 mock 失败 21 clearICacheIns = []byte{ 22 //0x60, 0x00, 0xa0, 0xd2,//# mov x1, [size] // 8个指令 $ 1-4 23 //0xE0, 0x07, 0x40, 0xF9, // # ldr x0, [sp, #8] $ 5 24 0x09, 0xe4, 0x7a, 0x92, // # and x9, x0, #~((1<<6)-1) $ 6 cacheline align address 25 0x0a, 0x14, 0x40, 0x92, // # and x10, x0, #((1<<6)-1) $ 7 extend length by alignment 26 0x2a, 0x00, 0x0a, 0x8b, // # add x10, x1, x10 $ 8 27 0x4a, 0x05, 0x00, 0xd1, // # sub x10, x10, #1 $ 9 28 0x0b, 0x00, 0x80, 0x92, // # mov x11, #-1 $ 10 29 0x6a, 0x19, 0x4a, 0xca, // # eor x10, x11, x10, lsr #6 $ 11 compute cacheline counter 30 0x9f, 0x3b, 0x03, 0xd5, // # dsb ish $ 12 31 } 32 33 clearICacheIns1 = []byte{ 34 // 循环 35 0x29, 0x75, 0x0b, 0xd5, // # ic ivau, x9 $ 13 36 0x29, 0x01, 0x01, 0x91, // # add x9, x9, #1<<6 $ 14 37 0x4a, 0x05, 0x00, 0xb1, // # adds x10, x10, #1 $ 15 38 0xa1, 0xff, 0xff, 0x54, // # b.ne #0xfffffffffffffff4 $ 16 39 } 40 41 clearICacheIns2 = []byte{ 42 0x9f, 0x3b, 0x03, 0xd5, // # dsb ish $ 20 43 0xdf, 0x3f, 0x03, 0xd5, // # isb # 21 44 0xc0, 0x03, 0x5f, 0xd6, // # ret # 22 45 } 46 )