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~