| /* |
| * HND Run Time Environment debug info area |
| * |
| * Copyright (C) 2020, Broadcom. |
| * |
| * Unless you and Broadcom execute a separate written software license |
| * agreement governing use of this software, this software is licensed to you |
| * under the terms of the GNU General Public License version 2 (the "GPL"), |
| * available at http://www.broadcom.com/licenses/GPLv2.php, with the |
| * following added to such license: |
| * |
| * As a special exception, the copyright holders of this software give you |
| * permission to link this software with independent modules, and to copy and |
| * distribute the resulting executable under terms of your choice, provided that |
| * you also meet, for each linked independent module, the terms and conditions of |
| * the license of that module. An independent module is a module which is not |
| * derived from this software. The special exception does not apply to any |
| * modifications of the software. |
| * |
| * |
| * <<Broadcom-WL-IPTag/Dual:>> |
| */ |
| |
| #ifndef _HND_DEBUG_H |
| #define _HND_DEBUG_H |
| |
| /* Magic number at a magic location to find HND_DEBUG pointers */ |
| #define HND_DEBUG_PTR_PTR_MAGIC 0x50504244u /* DBPP */ |
| |
| #ifndef _LANGUAGE_ASSEMBLY |
| |
| #include <typedefs.h> |
| |
| /* Includes only when building dongle code */ |
| #ifdef _RTE_ |
| #include <event_log.h> |
| #include <hnd_trap.h> |
| #include <hnd_cons.h> |
| #endif |
| |
| /* We use explicit sizes here since this gets included from different |
| * systems. The sizes must be the size of the creating system |
| * (currently 32 bit ARM) since this is gleaned from dump. |
| */ |
| |
| #ifdef FWID |
| extern uint32 gFWID; |
| #endif |
| |
| enum hnd_debug_reloc_entry_type { |
| HND_DEBUG_RELOC_ENTRY_TYPE_ROM = 0u, |
| HND_DEBUG_RELOC_ENTRY_TYPE_RAM = 1u, |
| HND_DEBUG_RELOC_ENTRY_TYPE_MTH_STACK = 2u, /* main thread stack */ |
| }; |
| typedef uint32 hnd_debug_reloc_entry_type_t; |
| |
| typedef struct hnd_debug_reloc_entry { |
| /* Identifies the type(hnd_debug_reloc_entry_type) of the data */ |
| hnd_debug_reloc_entry_type_t type; |
| uint32 phys_addr; /* Physical address */ |
| uint32 virt_addr; /* Virtual address */ |
| uint32 size; /* Specifies the size of the segment */ |
| } hnd_debug_reloc_entry_t; |
| |
| #ifdef _RTE_ |
| /* Define pointers for normal ARM use */ |
| #define _HD_EVLOG_P event_log_top_t * |
| #define _HD_CONS_P hnd_cons_t * |
| #define _HD_TRAP_P trap_t * |
| #define _HD_DEBUG_RELOC_ENTRY_P hnd_debug_reloc_entry_t * |
| #define _HD_DEBUG_RELOC_P hnd_debug_reloc_t * |
| |
| #else |
| /* Define pointers for use on other systems */ |
| #define _HD_EVLOG_P uint32 |
| #define _HD_CONS_P uint32 |
| #define _HD_TRAP_P uint32 |
| #define _HD_DEBUG_RELOC_ENTRY_P uint32 |
| #define _HD_DEBUG_RELOC_P uint32 |
| |
| #endif /* _RTE_ */ |
| |
| /* MMU relocation info in the debug area */ |
| typedef struct hnd_debug_reloc { |
| _HD_DEBUG_RELOC_ENTRY_P hnd_reloc_ptr; /* contains the pointer to the MMU reloc table */ |
| uint32 hnd_reloc_ptr_size; /* Specifies the size of the MMU reloc table */ |
| } hnd_debug_reloc_t; |
| |
| /* Number of MMU relocation entries supported in v2 */ |
| #define RELOC_NUM_ENTRIES 4u |
| |
| /* Total MMU relocation table size for v2 */ |
| #define HND_DEBUG_RELOC_PTR_SIZE (RELOC_NUM_ENTRIES * sizeof(hnd_debug_reloc_entry_t)) |
| |
| #define HND_DEBUG_VERSION_1 1u /* Legacy, version 1 */ |
| #define HND_DEBUG_VERSION_2 2u /* Version 2 contains the MMU information |
| * used for stack virtualization, etc. |
| */ |
| |
| /* Legacy debug version for older branches. */ |
| #define HND_DEBUG_VERSION HND_DEBUG_VERSION_1 |
| |
| /* This struct is placed at a well-defined location, and contains a pointer to hnd_debug. */ |
| typedef struct hnd_debug_ptr { |
| uint32 magic; |
| |
| /* RAM address of 'hnd_debug'. For legacy versions of this struct, it is a 0-indexed |
| * offset instead. |
| */ |
| uint32 hnd_debug_addr; |
| |
| /* Base address of RAM. This field does not exist for legacy versions of this struct. */ |
| uint32 ram_base_addr; |
| |
| } hnd_debug_ptr_t; |
| extern hnd_debug_ptr_t debug_info_ptr; |
| |
| #define HND_DEBUG_EPIVERS_MAX_STR_LEN 32u |
| |
| /* chip id string is 8 bytes long with null terminator. Example 43452a3 */ |
| #define HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN 13u |
| |
| #define HND_DEBUG_BUILD_SIGNATURE_FWID_LEN 17u |
| |
| /* ver=abc.abc.abc.abcdefgh size = 24bytes. 6 bytes extra for expansion */ |
| #define HND_DEBUG_BUILD_SIGNATURE_VER_LEN 30u |
| |
| typedef struct hnd_debug { |
| uint32 magic; |
| #define HND_DEBUG_MAGIC 0x47424544u /* 'DEBG' */ |
| |
| #ifndef HND_DEBUG_USE_V2 |
| uint32 version; /* Legacy, debug struct version */ |
| #else |
| /* Note: The original uint32 version is split into two fields: |
| * uint16 version and uint16 length to accomidate future expansion |
| * of the strucutre. |
| * |
| * The length field is not populated for the version 1 of the structure. |
| */ |
| uint16 version; /* Debug struct version */ |
| uint16 length; /* Size of the whole structure in bytes */ |
| #endif /* HND_DEBUG_USE_V2 */ |
| |
| uint32 fwid; /* 4 bytes of fw info */ |
| char epivers[HND_DEBUG_EPIVERS_MAX_STR_LEN]; |
| |
| _HD_TRAP_P PHYS_ADDR_N(trap_ptr); /* trap_t data struct physical address. */ |
| _HD_CONS_P PHYS_ADDR_N(console); /* Console physical address. */ |
| |
| uint32 ram_base; |
| uint32 ram_size; |
| |
| uint32 rom_base; |
| uint32 rom_size; |
| |
| _HD_EVLOG_P event_log_top; /* EVENT_LOG address. */ |
| |
| /* To populated fields below, |
| * INCLUDE_BUILD_SIGNATURE_IN_SOCRAM needs to be enabled |
| */ |
| char fwid_signature[HND_DEBUG_BUILD_SIGNATURE_FWID_LEN]; /* fwid=<FWID> */ |
| /* ver=abc.abc.abc.abcdefgh size = 24bytes. 6 bytes extra for expansion */ |
| char ver_signature[HND_DEBUG_BUILD_SIGNATURE_VER_LEN]; |
| char chipid_signature[HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN]; /* chip=12345a3 */ |
| |
| #ifdef HND_DEBUG_USE_V2 |
| /* Version 2 fields */ |
| /* Specifies the hnd debug MMU info */ |
| _HD_DEBUG_RELOC_P hnd_debug_reloc_ptr; |
| #endif /* HND_DEBUG_USE_V2 */ |
| } hnd_debug_t; |
| |
| #ifdef HND_DEBUG_USE_V2 |
| #define HND_DEBUG_V1_SIZE (OFFSETOF(hnd_debug_t, chipid_signature) + \ |
| sizeof(((hnd_debug_t *)0)->chipid_signature)) |
| |
| #define HND_DEBUG_V2_BASE_SIZE (OFFSETOF(hnd_debug_t, hnd_debug_reloc_ptr) + \ |
| sizeof(((hnd_debug_t *)0)->hnd_debug_reloc_ptr)) |
| #endif /* HND_DEBUG_USE_V2 */ |
| |
| /* The following structure is used in populating build information */ |
| typedef struct hnd_build_info { |
| uint8 version; /* Same as HND_DEBUG_VERSION */ |
| uint8 rsvd[3]; /* Reserved fields for padding purposes */ |
| /* To populated fields below, |
| * INCLUDE_BUILD_SIGNATURE_IN_SOCRAM needs to be enabled |
| */ |
| uint32 fwid; |
| uint32 ver[4]; |
| char chipid_signature[HND_DEBUG_BUILD_SIGNATURE_CHIPID_LEN]; /* chip=12345a3 */ |
| } hnd_build_info_t; |
| |
| /* |
| * timeval_t and prstatus_t are copies of the Linux structures. |
| * Included here because we need the definitions for the target processor |
| * (32 bits) and not the definition on the host this is running on |
| * (which could be 64 bits). |
| */ |
| |
| typedef struct { /* Time value with microsecond resolution */ |
| uint32 tv_sec; /* Seconds */ |
| uint32 tv_usec; /* Microseconds */ |
| } timeval_t; |
| |
| /* Linux/ARM 32 prstatus for notes section */ |
| typedef struct prstatus { |
| int32 si_signo; /* Signal number */ |
| int32 si_code; /* Extra code */ |
| int32 si_errno; /* Errno */ |
| uint16 pr_cursig; /* Current signal. */ |
| uint16 unused; |
| uint32 pr_sigpend; /* Set of pending signals. */ |
| uint32 pr_sighold; /* Set of held signals. */ |
| uint32 pr_pid; |
| uint32 pr_ppid; |
| uint32 pr_pgrp; |
| uint32 pr_sid; |
| timeval_t pr_utime; /* User time. */ |
| timeval_t pr_stime; /* System time. */ |
| timeval_t pr_cutime; /* Cumulative user time. */ |
| timeval_t pr_cstime; /* Cumulative system time. */ |
| uint32 uregs[18]; |
| int32 pr_fpvalid; /* True if math copro being used. */ |
| } prstatus_t; |
| |
| /* for mkcore and other utilities use */ |
| #define DUMP_INFO_PTR_PTR_0 0x74 |
| #define DUMP_INFO_PTR_PTR_1 0x78 |
| #define DUMP_INFO_PTR_PTR_2 0xf0 |
| #define DUMP_INFO_PTR_PTR_3 0xf8 |
| #define DUMP_INFO_PTR_PTR_4 0x874 |
| #define DUMP_INFO_PTR_PTR_5 0x878 |
| #define DUMP_INFO_PTR_PTR_END 0xffffffff |
| #define DUMP_INFO_PTR_PTR_LIST DUMP_INFO_PTR_PTR_0, \ |
| DUMP_INFO_PTR_PTR_1, \ |
| DUMP_INFO_PTR_PTR_2, \ |
| DUMP_INFO_PTR_PTR_3, \ |
| DUMP_INFO_PTR_PTR_4, \ |
| DUMP_INFO_PTR_PTR_5, \ |
| DUMP_INFO_PTR_PTR_END |
| |
| extern bool hnd_debug_info_in_trap_context(void); |
| |
| /* Get build information. */ |
| extern int hnd_build_info_get(void *ctx, void *arg2, uint32 *buf, uint16 *len); |
| |
| #endif /* !LANGUAGE_ASSEMBLY */ |
| |
| #endif /* _HND_DEBUG_H */ |