14d2e26a3SMauro Carvalho Chehab====== 24d2e26a3SMauro Carvalho ChehabPtrace 34d2e26a3SMauro Carvalho Chehab====== 44d2e26a3SMauro Carvalho Chehab 54d2e26a3SMauro Carvalho ChehabGDB intends to support the following hardware debug features of BookE 64d2e26a3SMauro Carvalho Chehabprocessors: 74d2e26a3SMauro Carvalho Chehab 84d2e26a3SMauro Carvalho Chehab4 hardware breakpoints (IAC) 94d2e26a3SMauro Carvalho Chehab2 hardware watchpoints (read, write and read-write) (DAC) 104d2e26a3SMauro Carvalho Chehab2 value conditions for the hardware watchpoints (DVC) 114d2e26a3SMauro Carvalho Chehab 124d2e26a3SMauro Carvalho ChehabFor that, we need to extend ptrace so that GDB can query and set these 134d2e26a3SMauro Carvalho Chehabresources. Since we're extending, we're trying to create an interface 144d2e26a3SMauro Carvalho Chehabthat's extendable and that covers both BookE and server processors, so 154d2e26a3SMauro Carvalho Chehabthat GDB doesn't need to special-case each of them. We added the 164d2e26a3SMauro Carvalho Chehabfollowing 3 new ptrace requests. 174d2e26a3SMauro Carvalho Chehab 18*0e216fa5SBenjamin Gray1. PPC_PTRACE_GETHWDBGINFO 194d2e26a3SMauro Carvalho Chehab============================ 204d2e26a3SMauro Carvalho Chehab 214d2e26a3SMauro Carvalho ChehabQuery for GDB to discover the hardware debug features. The main info to 224d2e26a3SMauro Carvalho Chehabbe returned here is the minimum alignment for the hardware watchpoints. 234d2e26a3SMauro Carvalho ChehabBookE processors don't have restrictions here, but server processors have 244d2e26a3SMauro Carvalho Chehaban 8-byte alignment restriction for hardware watchpoints. We'd like to avoid 254d2e26a3SMauro Carvalho Chehabadding special cases to GDB based on what it sees in AUXV. 264d2e26a3SMauro Carvalho Chehab 274d2e26a3SMauro Carvalho ChehabSince we're at it, we added other useful info that the kernel can return to 284d2e26a3SMauro Carvalho ChehabGDB: this query will return the number of hardware breakpoints, hardware 294d2e26a3SMauro Carvalho Chehabwatchpoints and whether it supports a range of addresses and a condition. 304d2e26a3SMauro Carvalho ChehabThe query will fill the following structure provided by the requesting process:: 314d2e26a3SMauro Carvalho Chehab 324d2e26a3SMauro Carvalho Chehab struct ppc_debug_info { 334d2e26a3SMauro Carvalho Chehab unit32_t version; 344d2e26a3SMauro Carvalho Chehab unit32_t num_instruction_bps; 354d2e26a3SMauro Carvalho Chehab unit32_t num_data_bps; 364d2e26a3SMauro Carvalho Chehab unit32_t num_condition_regs; 374d2e26a3SMauro Carvalho Chehab unit32_t data_bp_alignment; 384d2e26a3SMauro Carvalho Chehab unit32_t sizeof_condition; /* size of the DVC register */ 394d2e26a3SMauro Carvalho Chehab uint64_t features; /* bitmask of the individual flags */ 404d2e26a3SMauro Carvalho Chehab }; 414d2e26a3SMauro Carvalho Chehab 424d2e26a3SMauro Carvalho Chehabfeatures will have bits indicating whether there is support for:: 434d2e26a3SMauro Carvalho Chehab 444d2e26a3SMauro Carvalho Chehab #define PPC_DEBUG_FEATURE_INSN_BP_RANGE 0x1 454d2e26a3SMauro Carvalho Chehab #define PPC_DEBUG_FEATURE_INSN_BP_MASK 0x2 464d2e26a3SMauro Carvalho Chehab #define PPC_DEBUG_FEATURE_DATA_BP_RANGE 0x4 474d2e26a3SMauro Carvalho Chehab #define PPC_DEBUG_FEATURE_DATA_BP_MASK 0x8 484d2e26a3SMauro Carvalho Chehab #define PPC_DEBUG_FEATURE_DATA_BP_DAWR 0x10 49fa725cc5SRavi Bangoria #define PPC_DEBUG_FEATURE_DATA_BP_ARCH_31 0x20 504d2e26a3SMauro Carvalho Chehab 51*0e216fa5SBenjamin Gray2. PPC_PTRACE_SETHWDEBUG 524d2e26a3SMauro Carvalho Chehab 534d2e26a3SMauro Carvalho ChehabSets a hardware breakpoint or watchpoint, according to the provided structure:: 544d2e26a3SMauro Carvalho Chehab 554d2e26a3SMauro Carvalho Chehab struct ppc_hw_breakpoint { 564d2e26a3SMauro Carvalho Chehab uint32_t version; 574d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_TRIGGER_EXECUTE 0x1 584d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_TRIGGER_READ 0x2 594d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_TRIGGER_WRITE 0x4 604d2e26a3SMauro Carvalho Chehab uint32_t trigger_type; /* only some combinations allowed */ 614d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_MODE_EXACT 0x0 624d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE 0x1 634d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE 0x2 644d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_MODE_MASK 0x3 654d2e26a3SMauro Carvalho Chehab uint32_t addr_mode; /* address match mode */ 664d2e26a3SMauro Carvalho Chehab 674d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_MODE 0x3 684d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_NONE 0x0 694d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_AND 0x1 704d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_EXACT 0x1 /* different name for the same thing as above */ 714d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_OR 0x2 724d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_AND_OR 0x3 734d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_BE_ALL 0x00ff0000 /* byte enable bits */ 744d2e26a3SMauro Carvalho Chehab #define PPC_BREAKPOINT_CONDITION_BE(n) (1<<((n)+16)) 754d2e26a3SMauro Carvalho Chehab uint32_t condition_mode; /* break/watchpoint condition flags */ 764d2e26a3SMauro Carvalho Chehab 774d2e26a3SMauro Carvalho Chehab uint64_t addr; 784d2e26a3SMauro Carvalho Chehab uint64_t addr2; 794d2e26a3SMauro Carvalho Chehab uint64_t condition_value; 804d2e26a3SMauro Carvalho Chehab }; 814d2e26a3SMauro Carvalho Chehab 824d2e26a3SMauro Carvalho ChehabA request specifies one event, not necessarily just one register to be set. 834d2e26a3SMauro Carvalho ChehabFor instance, if the request is for a watchpoint with a condition, both the 844d2e26a3SMauro Carvalho ChehabDAC and DVC registers will be set in the same request. 854d2e26a3SMauro Carvalho Chehab 864d2e26a3SMauro Carvalho ChehabWith this GDB can ask for all kinds of hardware breakpoints and watchpoints 874d2e26a3SMauro Carvalho Chehabthat the BookE supports. COMEFROM breakpoints available in server processors 884d2e26a3SMauro Carvalho Chehabare not contemplated, but that is out of the scope of this work. 894d2e26a3SMauro Carvalho Chehab 904d2e26a3SMauro Carvalho Chehabptrace will return an integer (handle) uniquely identifying the breakpoint or 91*0e216fa5SBenjamin Graywatchpoint just created. This integer will be used in the PPC_PTRACE_DELHWDEBUG 924d2e26a3SMauro Carvalho Chehabrequest to ask for its removal. Return -ENOSPC if the requested breakpoint 934d2e26a3SMauro Carvalho Chehabcan't be allocated on the registers. 944d2e26a3SMauro Carvalho Chehab 954d2e26a3SMauro Carvalho ChehabSome examples of using the structure to: 964d2e26a3SMauro Carvalho Chehab 974d2e26a3SMauro Carvalho Chehab- set a breakpoint in the first breakpoint register:: 984d2e26a3SMauro Carvalho Chehab 994d2e26a3SMauro Carvalho Chehab p.version = PPC_DEBUG_CURRENT_VERSION; 1004d2e26a3SMauro Carvalho Chehab p.trigger_type = PPC_BREAKPOINT_TRIGGER_EXECUTE; 1014d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_EXACT; 1024d2e26a3SMauro Carvalho Chehab p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE; 1034d2e26a3SMauro Carvalho Chehab p.addr = (uint64_t) address; 1044d2e26a3SMauro Carvalho Chehab p.addr2 = 0; 1054d2e26a3SMauro Carvalho Chehab p.condition_value = 0; 1064d2e26a3SMauro Carvalho Chehab 1074d2e26a3SMauro Carvalho Chehab- set a watchpoint which triggers on reads in the second watchpoint register:: 1084d2e26a3SMauro Carvalho Chehab 1094d2e26a3SMauro Carvalho Chehab p.version = PPC_DEBUG_CURRENT_VERSION; 1104d2e26a3SMauro Carvalho Chehab p.trigger_type = PPC_BREAKPOINT_TRIGGER_READ; 1114d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_EXACT; 1124d2e26a3SMauro Carvalho Chehab p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE; 1134d2e26a3SMauro Carvalho Chehab p.addr = (uint64_t) address; 1144d2e26a3SMauro Carvalho Chehab p.addr2 = 0; 1154d2e26a3SMauro Carvalho Chehab p.condition_value = 0; 1164d2e26a3SMauro Carvalho Chehab 1174d2e26a3SMauro Carvalho Chehab- set a watchpoint which triggers only with a specific value:: 1184d2e26a3SMauro Carvalho Chehab 1194d2e26a3SMauro Carvalho Chehab p.version = PPC_DEBUG_CURRENT_VERSION; 1204d2e26a3SMauro Carvalho Chehab p.trigger_type = PPC_BREAKPOINT_TRIGGER_READ; 1214d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_EXACT; 1224d2e26a3SMauro Carvalho Chehab p.condition_mode = PPC_BREAKPOINT_CONDITION_AND | PPC_BREAKPOINT_CONDITION_BE_ALL; 1234d2e26a3SMauro Carvalho Chehab p.addr = (uint64_t) address; 1244d2e26a3SMauro Carvalho Chehab p.addr2 = 0; 1254d2e26a3SMauro Carvalho Chehab p.condition_value = (uint64_t) condition; 1264d2e26a3SMauro Carvalho Chehab 1274d2e26a3SMauro Carvalho Chehab- set a ranged hardware breakpoint:: 1284d2e26a3SMauro Carvalho Chehab 1294d2e26a3SMauro Carvalho Chehab p.version = PPC_DEBUG_CURRENT_VERSION; 1304d2e26a3SMauro Carvalho Chehab p.trigger_type = PPC_BREAKPOINT_TRIGGER_EXECUTE; 1314d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE; 1324d2e26a3SMauro Carvalho Chehab p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE; 1334d2e26a3SMauro Carvalho Chehab p.addr = (uint64_t) begin_range; 1344d2e26a3SMauro Carvalho Chehab p.addr2 = (uint64_t) end_range; 1354d2e26a3SMauro Carvalho Chehab p.condition_value = 0; 1364d2e26a3SMauro Carvalho Chehab 1374d2e26a3SMauro Carvalho Chehab- set a watchpoint in server processors (BookS):: 1384d2e26a3SMauro Carvalho Chehab 1394d2e26a3SMauro Carvalho Chehab p.version = 1; 1404d2e26a3SMauro Carvalho Chehab p.trigger_type = PPC_BREAKPOINT_TRIGGER_RW; 1414d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE; 1424d2e26a3SMauro Carvalho Chehab or 1434d2e26a3SMauro Carvalho Chehab p.addr_mode = PPC_BREAKPOINT_MODE_EXACT; 1444d2e26a3SMauro Carvalho Chehab 1454d2e26a3SMauro Carvalho Chehab p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE; 1464d2e26a3SMauro Carvalho Chehab p.addr = (uint64_t) begin_range; 1474d2e26a3SMauro Carvalho Chehab /* For PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE addr2 needs to be specified, where 1484d2e26a3SMauro Carvalho Chehab * addr2 - addr <= 8 Bytes. 1494d2e26a3SMauro Carvalho Chehab */ 1504d2e26a3SMauro Carvalho Chehab p.addr2 = (uint64_t) end_range; 1514d2e26a3SMauro Carvalho Chehab p.condition_value = 0; 1524d2e26a3SMauro Carvalho Chehab 153*0e216fa5SBenjamin Gray3. PPC_PTRACE_DELHWDEBUG 1544d2e26a3SMauro Carvalho Chehab 1554d2e26a3SMauro Carvalho ChehabTakes an integer which identifies an existing breakpoint or watchpoint 1564d2e26a3SMauro Carvalho Chehab(i.e., the value returned from PTRACE_SETHWDEBUG), and deletes the 1574d2e26a3SMauro Carvalho Chehabcorresponding breakpoint or watchpoint.. 158