|
76 | 76 | #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
|
77 | 77 | !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
|
78 | 78 | !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
|
79 |
| - !defined(RISCV64) && !defined(SPARC64) |
| 79 | + !defined(RISCV64) && !defined(LOONGARCH64) && !defined(SPARC64) |
80 | 80 | #ifdef __alpha__
|
81 | 81 | #define ALPHA
|
82 | 82 | #endif
|
|
121 | 121 | #if defined(__riscv) && (__riscv_xlen == 64)
|
122 | 122 | #define RISCV64
|
123 | 123 | #endif
|
| 124 | +#ifdef __loongarch64 |
| 125 | +#define LOONGARCH64 |
| 126 | +#endif |
124 | 127 | #endif
|
125 | 128 |
|
126 | 129 | #ifdef X86
|
|
165 | 168 | #ifdef RISCV64
|
166 | 169 | #define NR_CPUS (256)
|
167 | 170 | #endif
|
| 171 | +#ifdef LOONGARCH64 |
| 172 | +#define NR_CPUS (256) |
| 173 | +#endif |
168 | 174 |
|
169 | 175 | #define NR_DEVICE_DUMPS (64)
|
170 | 176 |
|
@@ -3723,6 +3729,48 @@ typedef signed int s32;
|
3723 | 3729 |
|
3724 | 3730 | #endif /* RISCV64 */
|
3725 | 3731 |
|
| 3732 | +/* fix compilation errors due to elf.h version. */ |
| 3733 | +#ifndef EM_LOONGARCH |
| 3734 | +#define EM_LOONGARCH 258 |
| 3735 | +#endif |
| 3736 | + |
| 3737 | +#ifdef LOONGARCH64 |
| 3738 | +#define _64BIT_ |
| 3739 | +#define MACHINE_TYPE "LOONGARCH64" |
| 3740 | + |
| 3741 | +#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
| 3742 | + |
| 3743 | +#define IS_XKPRANGE(X) (((X) >= 0x8000000000000000lu) && \ |
| 3744 | + ((X) < 0xc000000000000000lu)) |
| 3745 | + |
| 3746 | +#define PTOV(X) ((ulong)(X) + 0x9000000000000000lu) |
| 3747 | +#define VTOP(X) ((ulong)(X) & 0x0000fffffffffffflu) |
| 3748 | + |
| 3749 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
| 3750 | + |
| 3751 | +#define DEFAULT_MODULES_VADDR 0xffff800000000000lu |
| 3752 | +#define MODULES_VADDR (machdep->machspec->modules_vaddr) |
| 3753 | +#define MODULES_END (machdep->machspec->modules_end) |
| 3754 | +#define VMALLOC_START (machdep->machspec->vmalloc_start_addr) |
| 3755 | +#define VMALLOC_END (machdep->machspec->vmalloc_end) |
| 3756 | + |
| 3757 | +#define __SWP_TYPE_SHIFT 16 |
| 3758 | +#define __SWP_TYPE_BITS 8 |
| 3759 | +#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
| 3760 | +#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
| 3761 | + |
| 3762 | +#define SWP_TYPE(entry) (((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) |
| 3763 | +#define SWP_OFFSET(entry) ((entry) >> __SWP_OFFSET_SHIFT) |
| 3764 | + |
| 3765 | +#define __swp_type(entry) SWP_TYPE(entry) |
| 3766 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
| 3767 | + |
| 3768 | +#define TIF_SIGPENDING (1) |
| 3769 | + |
| 3770 | +#define _SECTION_SIZE_BITS 28 |
| 3771 | +#define _MAX_PHYSMEM_BITS 48 |
| 3772 | +#endif /* LOONGARCH64 */ |
| 3773 | + |
3726 | 3774 | #ifdef X86
|
3727 | 3775 | #define _32BIT_
|
3728 | 3776 | #define MACHINE_TYPE "X86"
|
@@ -4775,6 +4823,10 @@ struct machine_specific {
|
4775 | 4823 | #define MAX_HEXADDR_STRLEN (16)
|
4776 | 4824 | #define UVADDR_PRLEN (16)
|
4777 | 4825 | #endif
|
| 4826 | +#ifdef LOONGARCH64 |
| 4827 | +#define MAX_HEXADDR_STRLEN (16) |
| 4828 | +#define UVADDR_PRLEN (16) |
| 4829 | +#endif |
4778 | 4830 |
|
4779 | 4831 | #define BADADDR ((ulong)(-1))
|
4780 | 4832 | #define BADVAL ((ulong)(-1))
|
@@ -5396,6 +5448,9 @@ void dump_build_data(void);
|
5396 | 5448 | #ifdef SPARC64
|
5397 | 5449 | #define machdep_init(X) sparc64_init(X)
|
5398 | 5450 | #endif
|
| 5451 | +#ifdef LOONGARCH64 |
| 5452 | +#define machdep_init(X) loongarch64_init(X) |
| 5453 | +#endif |
5399 | 5454 | int clean_exit(int);
|
5400 | 5455 | int untrusted_file(FILE *, char *);
|
5401 | 5456 | char *readmem_function_name(void);
|
@@ -5887,6 +5942,10 @@ void display_help_screen(char *);
|
5887 | 5942 | #ifdef RISCV64
|
5888 | 5943 | #define dump_machdep_table(X) riscv64_dump_machdep_table(X)
|
5889 | 5944 | #endif
|
| 5945 | +#ifdef LOONGARCH64 |
| 5946 | +#define dump_machdep_table(X) loongarch64_dump_machdep_table(X) |
| 5947 | +#endif |
| 5948 | + |
5890 | 5949 | extern char *help_pointer[];
|
5891 | 5950 | extern char *help_alias[];
|
5892 | 5951 | extern char *help_ascii[];
|
@@ -7109,6 +7168,107 @@ int sparc64_vmalloc_addr(ulong);
|
7109 | 7168 | error(FATAL, "The -d option is not applicable to sparc64.\n")
|
7110 | 7169 | #endif
|
7111 | 7170 |
|
| 7171 | +/* |
| 7172 | + * loongarch64.c |
| 7173 | + */ |
| 7174 | +void loongarch64_display_regs_from_elf_notes(int, FILE *); |
| 7175 | +#ifdef LOONGARCH64 |
| 7176 | +void loongarch64_init(int); |
| 7177 | +void loongarch64_dump_machdep_table(ulong); |
| 7178 | + |
| 7179 | +#define display_idt_table() \ |
| 7180 | + error(FATAL, "-d option is not applicable to LOONGARCH64 architecture\n") |
| 7181 | + |
| 7182 | + |
| 7183 | +#define KSYMS_START (0x1) |
| 7184 | + |
| 7185 | +struct machine_specific { |
| 7186 | + ulong phys_base; |
| 7187 | + ulong vmalloc_start_addr; |
| 7188 | + ulong modules_vaddr; |
| 7189 | + ulong modules_end; |
| 7190 | + |
| 7191 | + struct loongarch64_pt_regs *crash_task_regs; |
| 7192 | +}; |
| 7193 | + |
| 7194 | +/* |
| 7195 | + * Basic page table format: |
| 7196 | + * |
| 7197 | + * 63 62 61 PALEN-1 12 10 9 8 7 6 5 4 3 2 1 0 |
| 7198 | + * +----+--+--+------+--------------------+----+--+--+-+-+-+---+---+-+-+ |
| 7199 | + * |RPLV|NX|NR| | PA[PALEN-1:12] | |SP|PN|W|P|G|MAT|PLV|D|V| |
| 7200 | + * +----+--+--+------+--------------------+----+--+--+-+-+-+---+---+-+-+ |
| 7201 | + * |
| 7202 | + * |
| 7203 | + * Huge page table format: |
| 7204 | + * |
| 7205 | + * 63 62 61 PALEN-1 12 10 9 8 7 6 5 4 3 2 1 0 |
| 7206 | + * +----+--+--+------+-----------------+--+----+--+--+-+-+-+---+---+-+-+ |
| 7207 | + * |RPLV|NX|NR| | PA[PALEN-1:12] | G| |SP|PN|W|P|H|MAT|PLV|D|V| |
| 7208 | + * +----+--+--+------+-----------------+--+----+--+--+-+-+-+---+---+-+-+ |
| 7209 | + * |
| 7210 | + */ |
| 7211 | +/* from arch/loongarch/include/asm/pgtable-bits.h */ |
| 7212 | + |
| 7213 | +/* Page table bits */ |
| 7214 | +#define _PAGE_VALID_SHIFT 0 |
| 7215 | +#define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */ |
| 7216 | +#define _PAGE_DIRTY_SHIFT 1 |
| 7217 | +#define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */ |
| 7218 | +#define _CACHE_SHIFT 4 /* 4~5, two bits */ |
| 7219 | +#define _PAGE_GLOBAL_SHIFT 6 |
| 7220 | +#define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */ |
| 7221 | +#define _PAGE_PRESENT_SHIFT 7 |
| 7222 | +#define _PAGE_WRITE_SHIFT 8 |
| 7223 | +#define _PAGE_MODIFIED_SHIFT 9 |
| 7224 | +#define _PAGE_PROTNONE_SHIFT 10 |
| 7225 | +#define _PAGE_SPECIAL_SHIFT 11 |
| 7226 | +#define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */ |
| 7227 | +#define _PAGE_PFN_SHIFT 12 |
| 7228 | +#define _PAGE_SWP_EXCLUSIVE_SHIFT 23 |
| 7229 | +#define _PAGE_PFN_END_SHIFT 48 |
| 7230 | +#define _PAGE_PRESENT_INVALID_SHIFT 60 |
| 7231 | +#define _PAGE_NO_READ_SHIFT 61 |
| 7232 | +#define _PAGE_NO_EXEC_SHIFT 62 |
| 7233 | +#define _PAGE_RPLV_SHIFT 63 |
| 7234 | + |
| 7235 | +#ifndef _ULCAST_ |
| 7236 | +#define _ULCAST_ (unsigned long) |
| 7237 | +#endif |
| 7238 | + |
| 7239 | +/* Used by software */ |
| 7240 | +#define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT) |
| 7241 | +#define _PAGE_PRESENT_INVALID (_ULCAST_(1) << _PAGE_PRESENT_INVALID_SHIFT) |
| 7242 | +#define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT) |
| 7243 | +#define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT) |
| 7244 | +#define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT) |
| 7245 | +#define _PAGE_PROTNONE (_ULCAST_(1) << _PAGE_PROTNONE_SHIFT) |
| 7246 | +#define _PAGE_SPECIAL (_ULCAST_(1) << _PAGE_SPECIAL_SHIFT) |
| 7247 | + |
| 7248 | +/* We borrow bit 23 to store the exclusive marker in swap PTEs. */ |
| 7249 | +#define _PAGE_SWP_EXCLUSIVE (_ULCAST_(1) << _PAGE_SWP_EXCLUSIVE_SHIFT) |
| 7250 | + |
| 7251 | +/* Used by TLB hardware (placed in EntryLo*) */ |
| 7252 | +#define _PAGE_VALID (_ULCAST_(1) << _PAGE_VALID_SHIFT) |
| 7253 | +#define _PAGE_DIRTY (_ULCAST_(1) << _PAGE_DIRTY_SHIFT) |
| 7254 | +#define _PAGE_PLV (_ULCAST_(3) << _PAGE_PLV_SHIFT) |
| 7255 | +#define _PAGE_GLOBAL (_ULCAST_(1) << _PAGE_GLOBAL_SHIFT) |
| 7256 | +#define _PAGE_HUGE (_ULCAST_(1) << _PAGE_HUGE_SHIFT) |
| 7257 | +#define _PAGE_HGLOBAL (_ULCAST_(1) << _PAGE_HGLOBAL_SHIFT) |
| 7258 | +#define _PAGE_NO_READ (_ULCAST_(1) << _PAGE_NO_READ_SHIFT) |
| 7259 | +#define _PAGE_NO_EXEC (_ULCAST_(1) << _PAGE_NO_EXEC_SHIFT) |
| 7260 | +#define _PAGE_RPLV (_ULCAST_(1) << _PAGE_RPLV_SHIFT) |
| 7261 | +#define _CACHE_MASK (_ULCAST_(3) << _CACHE_SHIFT) |
| 7262 | +#define _PFN_SHIFT (PAGESHIFT() - 12 + _PAGE_PFN_SHIFT) |
| 7263 | + |
| 7264 | +#define _PAGE_USER (PLV_USER << _PAGE_PLV_SHIFT) |
| 7265 | +#define _PAGE_KERN (PLV_KERN << _PAGE_PLV_SHIFT) |
| 7266 | + |
| 7267 | +#define _PFN_MASK (~((_ULCAST_(1) << (_PFN_SHIFT)) - 1) & \ |
| 7268 | + ((_ULCAST_(1) << (_PAGE_PFN_END_SHIFT)) - 1)) |
| 7269 | + |
| 7270 | +#endif /* LOONGARCH64 */ |
| 7271 | + |
7112 | 7272 | /*
|
7113 | 7273 | * netdump.c
|
7114 | 7274 | */
|
|
0 commit comments