On 5/15/24 19:31, Gustavo Romero wrote:
+ /* Remove any non-addressing bits. */ + clean_addr = useronly_clean_ptr(addr); + + /* + * Get pointer to all tags in the page where the address is. Note that tags + * are packed, so there are 2 tags packed in one byte. + */ + tags = page_get_target_data(clean_addr); + + /* + * Tags are per granule (16 bytes). 2 tags (4 bits each) are kept in a + * single byte for compactness, so first a page tag index for 2 packed + * granule tags (1 byte) is found, and then an index for a single granule + * tag (nibble) is found, and finally the address tag is obtained. + */ + granules_index = extract32(clean_addr, LOG2_TAG_GRANULE + 1, + TARGET_PAGE_BITS - LOG2_TAG_GRANULE - 1); + granule_index = extract32(clean_addr, LOG2_TAG_GRANULE, 1); + + addr_tag = *(tags + granules_index); + /* Extract tag from the right nibble. */ + if (granule_index == 0) { + addr_tag &= 0xF; + } else { + addr_tag >>= 4; + } +
I think I would prefer the body of all three of these gdb commands to be split out into separate functions. I think they should use use allocation_tag_mem_probe, load_tag1, store_tag1 from mte_helper.c. I am undecided as to whether the gdb helpers should be placed in mte_helper.c, or if the existing mte_helper.c functions should be exported.
r~