71
71
72
72
#if !defined(X86 ) && !defined(X86_64 ) && !defined(ALPHA ) && !defined(PPC ) && \
73
73
!defined(IA64 ) && !defined(PPC64 ) && !defined(S390 ) && !defined(S390X ) && \
74
- !defined(ARM ) && !defined(ARM64 ) && !defined(MIPS )
74
+ !defined(ARM ) && !defined(ARM64 ) && !defined(MIPS ) && !defined( SPARC64 )
75
75
#ifdef __alpha__
76
76
#define ALPHA
77
77
#endif
106
106
#ifdef __mipsel__
107
107
#define MIPS
108
108
#endif
109
+ #ifdef __sparc_v9__
110
+ #define SPARC64
111
+ #endif
109
112
#endif
110
113
111
114
#ifdef X86
141
144
#ifdef MIPS
142
145
#define NR_CPUS (32)
143
146
#endif
147
+ #ifdef SPARC64
148
+ #define NR_CPUS (4096)
149
+ #endif
150
+
151
+ /* Some architectures require memory accesses to be aligned. */
152
+ #if defined(SPARC64 )
153
+ #define NEED_ALIGNED_MEM_ACCESS
154
+ #endif
144
155
145
156
#define BUFSIZE (1500)
146
157
#define NULLCHAR ('\0')
@@ -2187,6 +2198,45 @@ struct builtin_debug_table {
2187
2198
* Facilitators for pulling correctly-sized data out of a buffer at a
2188
2199
* known address.
2189
2200
*/
2201
+
2202
+ #ifdef NEED_ALIGNED_MEM_ACCESS
2203
+
2204
+ #define DEF_LOADER (TYPE ) \
2205
+ static inline TYPE \
2206
+ load_##TYPE (char *addr) \
2207
+ { \
2208
+ TYPE ret; \
2209
+ size_t i = sizeof(TYPE); \
2210
+ while (i--) \
2211
+ ((char *)&ret)[i] = addr[i]; \
2212
+ return ret; \
2213
+ }
2214
+
2215
+ DEF_LOADER (int );
2216
+ DEF_LOADER (uint );
2217
+ DEF_LOADER (long );
2218
+ DEF_LOADER (ulong );
2219
+ DEF_LOADER (ulonglong );
2220
+ DEF_LOADER (ushort );
2221
+ DEF_LOADER (short );
2222
+ typedef void * pointer_t ;
2223
+ DEF_LOADER (pointer_t );
2224
+
2225
+ #define LOADER (TYPE ) load_##TYPE
2226
+
2227
+ #define INT (ADDR ) LOADER(int) ((char *)(ADDR))
2228
+ #define UINT (ADDR ) LOADER(uint) ((char *)(ADDR))
2229
+ #define LONG (ADDR ) LOADER(long) ((char *)(ADDR))
2230
+ #define ULONG (ADDR ) LOADER(ulong) ((char *)(ADDR))
2231
+ #define ULONGLONG (ADDR ) LOADER(ulonglong) ((char *)(ADDR))
2232
+ #define ULONG_PTR (ADDR ) ((ulong *) (LOADER(pointer_t) ((char *)(ADDR))))
2233
+ #define USHORT (ADDR ) LOADER(ushort) ((char *)(ADDR))
2234
+ #define SHORT (ADDR ) LOADER(short) ((char *)(ADDR))
2235
+ #define UCHAR (ADDR ) *((unsigned char *)((char *)(ADDR)))
2236
+ #define VOID_PTR (ADDR ) ((void *) (LOADER(pointer_t) ((char *)(ADDR))))
2237
+
2238
+ #else
2239
+
2190
2240
#define INT (ADDR ) *((int *)((char *)(ADDR)))
2191
2241
#define UINT (ADDR ) *((uint *)((char *)(ADDR)))
2192
2242
#define LONG (ADDR ) *((long *)((char *)(ADDR)))
@@ -2198,6 +2248,8 @@ struct builtin_debug_table {
2198
2248
#define UCHAR (ADDR ) *((unsigned char *)((char *)(ADDR)))
2199
2249
#define VOID_PTR (ADDR ) *((void **)((char *)(ADDR)))
2200
2250
2251
+ #endif /* NEED_ALIGNED_MEM_ACCESS */
2252
+
2201
2253
struct node_table {
2202
2254
int node_id ;
2203
2255
ulong pgdat ;
@@ -3816,6 +3868,110 @@ struct efi_memory_desc_t {
3816
3868
3817
3869
#endif /* S390X */
3818
3870
3871
+ #ifdef SPARC64
3872
+ #define _64BIT_
3873
+ #define MACHINE_TYPE "SPARC64"
3874
+
3875
+ #define PTOV (X ) \
3876
+ ((unsigned long)(X) + machdep->machspec->page_offset)
3877
+ #define VTOP (X ) \
3878
+ ((unsigned long)(X) - machdep->machspec->page_offset)
3879
+
3880
+ #define PAGE_OFFSET (machdep->machspec->page_offset)
3881
+
3882
+ extern int sparc64_IS_VMALLOC_ADDR (ulong vaddr );
3883
+ #define IS_VMALLOC_ADDR (X ) sparc64_IS_VMALLOC_ADDR((ulong)(X))
3884
+ #define PAGE_SHIFT (13)
3885
+ #define PAGE_SIZE (1UL << PAGE_SHIFT)
3886
+ #define PAGE_MASK (~(PAGE_SIZE - 1))
3887
+ #define PAGEBASE (X ) (((ulong)(X)) & (ulong)machdep->pagemask)
3888
+ #define THREAD_SIZE (2 * PAGE_SIZE)
3889
+
3890
+ /* S3 Core
3891
+ * Core 48-bit physical address supported.
3892
+ * Bit 47 distinguishes memory or I/O. When set to "1" it is I/O.
3893
+ */
3894
+ #define PHYS_MASK_SHIFT (47)
3895
+ #define PHYS_MASK (((1UL) << PHYS_MASK_SHIFT) - 1)
3896
+
3897
+ typedef signed int s32 ;
3898
+
3899
+ /*
3900
+ * This next two defines are convenience defines for normal page table.
3901
+ */
3902
+ #define PTES_PER_PAGE (1UL << (PAGE_SHIFT - 3))
3903
+ #define PTES_PER_PAGE_MASK (PTES_PER_PAGE - 1)
3904
+
3905
+ /* 4-level page table */
3906
+ #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3))
3907
+ #define PMD_SIZE (1UL << PMD_SHIFT)
3908
+ #define PMD_MASK (~(PMD_SIZE - 1))
3909
+ #define PMD_BITS (PAGE_SHIFT - 3)
3910
+
3911
+ #define PUD_SHIFT (PMD_SHIFT + PMD_BITS)
3912
+ #define PUD_SIZE (1UL << PUD_SHIFT)
3913
+ #define PUD_MASK (~(PUD_SIZE - 1))
3914
+ #define PUD_BITS (PAGE_SHIFT - 3)
3915
+
3916
+ #define PGDIR_SHIFT (PUD_SHIFT + PUD_BITS)
3917
+ #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
3918
+ #define PGDIR_MASK (~(PGDIR_SIZE - 1))
3919
+ #define PGDIR_BITS (PAGE_SHIFT - 3)
3920
+
3921
+ #define PTRS_PER_PTE (1UL << (PAGE_SHIFT - 3))
3922
+ #define PTRS_PER_PMD (1UL << PMD_BITS)
3923
+ #define PTRS_PER_PUD (1UL << PUD_BITS)
3924
+ #define PTRS_PER_PGD (1UL << PGDIR_BITS)
3925
+
3926
+ #define HPAGE_SHIFT (23)
3927
+ /* Down one huge page */
3928
+ #define SPARC64_USERSPACE_TOP (-(1UL << HPAGE_SHIFT))
3929
+ #define PAGE_PMD_HUGE (0x0100000000000000UL)
3930
+
3931
+ /* These are for SUN4V. */
3932
+ #define _PAGE_VALID (0x8000000000000000UL)
3933
+ #define _PAGE_NFO_4V (0x4000000000000000UL)
3934
+ #define _PAGE_MODIFIED_4V (0x2000000000000000UL)
3935
+ #define _PAGE_ACCESSED_4V (0x1000000000000000UL)
3936
+ #define _PAGE_READ_4V (0x0800000000000000UL)
3937
+ #define _PAGE_WRITE_4V (0x0400000000000000UL)
3938
+ #define _PAGE_PADDR_4V (0x00FFFFFFFFFFE000UL)
3939
+ #define _PAGE_PFN_MASK (_PAGE_PADDR_4V)
3940
+ #define _PAGE_P_4V (0x0000000000000100UL)
3941
+ #define _PAGE_EXEC_4V (0x0000000000000080UL)
3942
+ #define _PAGE_W_4V (0x0000000000000040UL)
3943
+ #define _PAGE_PRESENT_4V (0x0000000000000010UL)
3944
+ #define _PAGE_SZALL_4V (0x0000000000000007UL)
3945
+ /* There are other page sizes. Some supported. */
3946
+ #define _PAGE_SZ4MB_4V (0x0000000000000003UL)
3947
+ #define _PAGE_SZ512K_4V (0x0000000000000002UL)
3948
+ #define _PAGE_SZ64K_4V (0x0000000000000001UL)
3949
+ #define _PAGE_SZ8K_4V (0x0000000000000000UL)
3950
+
3951
+ #define SPARC64_MODULES_VADDR (0x0000000010000000UL)
3952
+ #define SPARC64_MODULES_END (0x00000000f0000000UL)
3953
+ #define SPARC64_VMALLOC_START (0x0000000100000000UL)
3954
+
3955
+ #define SPARC64_STACK_SIZE 0x4000
3956
+
3957
+ /* sparsemem */
3958
+ #define _SECTION_SIZE_BITS 30
3959
+ #define _MAX_PHYSMEM_BITS 53
3960
+
3961
+ #define STACK_BIAS 2047
3962
+
3963
+ struct machine_specific {
3964
+ ulong page_offset ;
3965
+ ulong vmalloc_end ;
3966
+ };
3967
+
3968
+ #define TIF_SIGPENDING (2)
3969
+ #define SWP_OFFSET (E ) ((E) >> (PAGE_SHIFT + 8UL))
3970
+ #define SWP_TYPE (E ) (((E) >> PAGE_SHIFT) & 0xffUL)
3971
+ #define __swp_type (E ) SWP_TYPE(E)
3972
+ #define __swp_offset (E ) SWP_OFFSET(E)
3973
+ #endif /* SPARC64 */
3974
+
3819
3975
#ifdef PLATFORM
3820
3976
3821
3977
#define SWP_TYPE (entry ) (error("PLATFORM_SWP_TYPE: TBD\n"))
@@ -3880,6 +4036,10 @@ struct efi_memory_desc_t {
3880
4036
#define MAX_HEXADDR_STRLEN (8)
3881
4037
#define UVADDR_PRLEN (8)
3882
4038
#endif
4039
+ #ifdef SPARC64
4040
+ #define MAX_HEXADDR_STRLEN (16)
4041
+ #define UVADDR_PRLEN (16)
4042
+ #endif
3883
4043
3884
4044
#define BADADDR ((ulong)(-1))
3885
4045
#define BADVAL ((ulong)(-1))
@@ -4430,6 +4590,9 @@ void dump_build_data(void);
4430
4590
#ifdef MIPS
4431
4591
#define machdep_init (X ) mips_init(X)
4432
4592
#endif
4593
+ #ifdef SPARC64
4594
+ #define machdep_init (X ) sparc64_init(X)
4595
+ #endif
4433
4596
int clean_exit (int );
4434
4597
int untrusted_file (FILE * , char * );
4435
4598
char * readmem_function_name (void );
@@ -4864,6 +5027,9 @@ void display_help_screen(char *);
4864
5027
#ifdef MIPS
4865
5028
#define dump_machdep_table (X ) mips_dump_machdep_table(X)
4866
5029
#endif
5030
+ #ifdef SPARC64
5031
+ #define dump_machdep_table (X ) sparc64_dump_machdep_table(X)
5032
+ #endif
4867
5033
extern char * help_pointer [];
4868
5034
extern char * help_alias [];
4869
5035
extern char * help_ascii [];
@@ -5715,6 +5881,17 @@ struct machine_specific {
5715
5881
};
5716
5882
#endif /* MIPS */
5717
5883
5884
+ /*
5885
+ * sparc64.c
5886
+ */
5887
+ #ifdef SPARC64
5888
+ void sparc64_init (int );
5889
+ void sparc64_dump_machdep_table (ulong );
5890
+ int sparc64_vmalloc_addr (ulong );
5891
+ #define display_idt_table () \
5892
+ error(FATAL, "The -d option is not applicable to sparc64.\n")
5893
+ #endif
5894
+
5718
5895
/*
5719
5896
* netdump.c
5720
5897
*/
0 commit comments