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  )