LCOV - code coverage report
Current view: top level - zephyr/arch/xtensa - gdbstub.h Coverage Total Hit
Test: new.info Lines: 76.0 % 25 19
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2021 Intel Corporation.
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : #include <inttypes.h>
       8              : 
       9              : #ifndef ZEPHYR_INCLUDE_ARCH_XTENSA_GDBSTUB_SYS_H_
      10              : #define ZEPHYR_INCLUDE_ARCH_XTENSA_GDBSTUB_SYS_H_
      11              : 
      12              : #ifdef CONFIG_GDBSTUB
      13              : 
      14            0 : #define XTREG_GRP_MASK                  0x0F00
      15            0 : #define XTREG_GRP_GENERAL               0x0000
      16            0 : #define XTREG_GRP_ADDR                  0x0100
      17            0 : #define XTREG_GRP_SPECIAL               0x0200
      18            0 : #define XTREG_GRP_USER                  0x0300
      19              : 
      20              : /**
      21              :  * @brief Register description for GDB stub.
      22              :  *
      23              :  * Values are based on gdb/gdb/xtensa-config.c in the Xtensa overlay,
      24              :  * where registers are defined using XTREG() macro:
      25              :  *  XTREG(index,ofs,bsz,sz,al,tnum,flg,cp,ty,gr,name,fet,sto,mas,ct,x,y)
      26              :  *
      27              :  * Translation:
      28              :  * idx         : index
      29              :  * regno       : tnum
      30              :  *               0x00xx : General Registers (A0 - A15, PC)
      31              :  *               0x01xx : Address Registers (AR0 - AR31/AR63)
      32              :  *               0x02xx : Special Registers (access via RSR/WSR)
      33              :  *               0x03xx : User Registers (access via RUR/WUR)
      34              :  * byte_size   : sz
      35              :  * gpkt_offset : ofs
      36              :  */
      37            1 : struct xtensa_register {
      38              :         /** Register value */
      39            1 :         uint32_t        val;
      40              : 
      41              :         /** GDB register index (for p/P packets) */
      42            1 :         uint32_t        idx;
      43              : 
      44              :         /** Size of register */
      45            1 :         uint8_t         byte_size;
      46              : 
      47              :         /** Xtensa register number */
      48            1 :         uint16_t        regno;
      49              : 
      50              :         /**
      51              :          * Offset of this register in GDB G-packet.
      52              :          * -1 if register is not in G-packet.
      53              :          */
      54            1 :         int16_t         gpkt_offset;
      55              : 
      56              :         /**
      57              :          * Offset of saved register in stack frame.
      58              :          * 0 if not saved in stack frame.
      59              :          */
      60            1 :         int16_t         stack_offset;
      61              : 
      62              :         /** Sequence number */
      63            1 :         uint8_t         seqno;
      64              : 
      65              :         /**
      66              :          * Set to 1 if register should not be written
      67              :          * to during debugging.
      68              :          */
      69            1 :         uint8_t         is_read_only:1;
      70              : };
      71              : 
      72              : /* Due to Xtensa SoCs being highly configurable,
      73              :  * the register files between SoCs are not identical.
      74              :  *
      75              :  * This means generic registers can, sometimes, have
      76              :  * different offsets from start of register files
      77              :  * needed to communicate with GDB.
      78              :  *
      79              :  * Therefore, it is better to defer to the SoC layer
      80              :  * for proper support for GDB.
      81              :  */
      82              : #include <gdbstub/soc.h>
      83              : 
      84              : /**
      85              :  * @brief Architecture specific GDB context.
      86              :  */
      87              : struct gdb_ctx {
      88              :         /** Exception reason */
      89              :         unsigned int            exception;
      90              : 
      91              :         /** Register descriptions */
      92            1 :         struct xtensa_register  *regs;
      93              : 
      94              :         /** Number of registers */
      95            1 :         uint8_t                 num_regs;
      96              : 
      97              :         /** Sequence number */
      98            1 :         uint8_t                 seqno;
      99              : 
     100              :         /** Index in register descriptions of A0 register */
     101            1 :         uint8_t                 a0_idx;
     102              : 
     103              :         /** Index in register descriptions of AR0 register */
     104            1 :         uint8_t                 ar_idx;
     105              : 
     106              :         /** Index in register descriptions of PS register */
     107            1 :         uint8_t                 ps_idx;
     108              : };
     109              : 
     110              : /**
     111              :  * Test if the register is a logical address register (A0 - A15).
     112              :  *
     113              :  * @retval true  if register is A0 - A15
     114              :  * @retval false if register is not A0 - A15
     115              :  */
     116            1 : static inline bool gdb_xtensa_is_logical_addr_reg(struct xtensa_register *reg)
     117              : {
     118              :         if (reg->regno < 16) {
     119              :                 return true;
     120              :         } else {
     121              :                 return false;
     122              :         }
     123              : }
     124              : 
     125              : /**
     126              :  * Test if the register is a address register (AR0 - AR31/AR63).
     127              :  *
     128              :  * @retval true  if register is AR0 - AR31/AR63
     129              :  * @retval false if not
     130              :  */
     131            1 : static inline bool gdb_xtensa_is_address_reg(struct xtensa_register *reg)
     132              : {
     133              :         if ((reg->regno & XTREG_GRP_MASK) == XTREG_GRP_ADDR) {
     134              :                 return true;
     135              :         } else {
     136              :                 return false;
     137              :         }
     138              : }
     139              : 
     140              : /**
     141              :  * Test if the register is a special register that needs to be
     142              :  * accessed via RSR/WSR.
     143              :  *
     144              :  * @retval true  if special register
     145              :  * @retval false if not
     146              :  */
     147            1 : static inline bool gdb_xtensa_is_special_reg(struct xtensa_register *reg)
     148              : {
     149              :         if ((reg->regno & XTREG_GRP_MASK) == XTREG_GRP_SPECIAL) {
     150              :                 return true;
     151              :         } else {
     152              :                 return false;
     153              :         }
     154              : }
     155              : 
     156              : /**
     157              :  * Test if the register is a user register that needs to be
     158              :  * accessed via RUR/WUR.
     159              :  *
     160              :  * @retval true  if user register
     161              :  * @retval false if not
     162              :  */
     163            1 : static inline bool gdb_xtensa_is_user_reg(struct xtensa_register *reg)
     164              : {
     165              :         if ((reg->regno & XTREG_GRP_MASK) == XTREG_GRP_USER) {
     166              :                 return true;
     167              :         } else {
     168              :                 return false;
     169              :         }
     170              : }
     171              : 
     172              : #endif /* CONFIG_GDBSTUB */
     173              : 
     174              : #endif /* ZEPHYR_INCLUDE_ARCH_XTENSA_GDBSTUB_SYS_H_ */
        

Generated by: LCOV version 2.0-1