github.com/tencent/goom@v1.0.1/internal/bytecode/memory/icache_arm64_17.go (about)

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