mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 10:22:45 +00:00 
			
		
		
		
	 f9a4f4f7e6
			
		
	
	
		f9a4f4f7e6
		
	
	
	
	
		
			
			In QtCreator (and under weird configurations with gcc), this used to fail with the error messages like: "error: member of anonymous union redeclares '___'". This patch gives each member a unique name.
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Types.h>
 | |
| 
 | |
| #define RREGISTER(num)                         \
 | |
|     union {                                    \
 | |
|         u64 r##num;                            \
 | |
|         struct {                               \
 | |
|             u32 _unused##num;                  \
 | |
|             union {                            \
 | |
|                 u32 r##num##d;                 \
 | |
|                 struct {                       \
 | |
|                     u16 __unused##num;         \
 | |
|                     union {                    \
 | |
|                         u16 r##num##w;         \
 | |
|                         struct {               \
 | |
|                             u8 ___unused##num; \
 | |
|                             u8 r##num##b;      \
 | |
|                         };                     \
 | |
|                     };                         \
 | |
|                 };                             \
 | |
|             };                                 \
 | |
|         };                                     \
 | |
|     }
 | |
| 
 | |
| #define GPREGISTER(letter)                \
 | |
|     union {                               \
 | |
|         u64 r##letter##x;                 \
 | |
|         struct                            \
 | |
|         {                                 \
 | |
|             u32 _unused##letter;          \
 | |
|             union {                       \
 | |
|                 u32 e##letter##x;         \
 | |
|                 struct                    \
 | |
|                 {                         \
 | |
|                     u16 __unused##letter; \
 | |
|                     union {               \
 | |
|                         u16 letter##x;    \
 | |
|                         struct {          \
 | |
|                             u8 letter##h; \
 | |
|                             u8 letter##l; \
 | |
|                         };                \
 | |
|                     };                    \
 | |
|                 };                        \
 | |
|             };                            \
 | |
|         };                                \
 | |
|     }
 | |
| 
 | |
| #define SPREGISTER(name)                        \
 | |
|     union {                                     \
 | |
|         u64 r##name;                            \
 | |
|         struct                                  \
 | |
|         {                                       \
 | |
|             u32 _unused##name;                  \
 | |
|             union {                             \
 | |
|                 u32 e##name;                    \
 | |
|                 struct                          \
 | |
|                 {                               \
 | |
|                     u16 __unused##name;         \
 | |
|                     union {                     \
 | |
|                         u16 name;               \
 | |
|                         struct {                \
 | |
|                             u8 ___unused##name; \
 | |
|                             u8 name##l;         \
 | |
|                         };                      \
 | |
|                     };                          \
 | |
|                 };                              \
 | |
|             };                                  \
 | |
|         };                                      \
 | |
|     }
 | |
| 
 | |
| struct [[gnu::packed]] PtraceRegisters {
 | |
|     GPREGISTER(a);
 | |
|     GPREGISTER(b);
 | |
|     GPREGISTER(c);
 | |
|     GPREGISTER(d);
 | |
| 
 | |
|     SPREGISTER(sp);
 | |
|     SPREGISTER(bp);
 | |
|     SPREGISTER(si);
 | |
|     SPREGISTER(di);
 | |
|     SPREGISTER(ip); // technically there is no ipl, but what ever
 | |
| 
 | |
|     RREGISTER(8);
 | |
|     RREGISTER(9);
 | |
|     RREGISTER(10);
 | |
|     RREGISTER(11);
 | |
|     RREGISTER(12);
 | |
|     RREGISTER(13);
 | |
|     RREGISTER(14);
 | |
|     RREGISTER(15);
 | |
|     // flags
 | |
|     union {
 | |
|         u64 rflags;
 | |
|         struct {
 | |
|             u32 _;
 | |
|             union {
 | |
|                 u32 eflags;
 | |
|                 struct {
 | |
|                     u16 __;
 | |
|                     u16 flags;
 | |
|                 };
 | |
|             };
 | |
|         };
 | |
|     };
 | |
| 
 | |
|     // These may not be used, unless we go back into compatibility mode
 | |
|     u32 cs;
 | |
|     u32 ss;
 | |
|     u32 ds;
 | |
|     u32 es;
 | |
|     u32 fs;
 | |
|     u32 gs;
 | |
| 
 | |
|     // FIXME: Add FPU registers and Flags
 | |
|     // FIXME: Add Ymm Xmm etc.
 | |
| };
 |