39 changes: 39 additions & 0 deletions lldb/tools/debugserver/source/MacOSX/MachProcess.mm
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,45 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
inf.min_version_os_version += std::to_string(zz);
}
}
#if defined (LC_BUILD_VERSION)
if (lc.cmd == LC_BUILD_VERSION)
{
struct build_version_command build_vers;
if (ReadMemory(load_cmds_p, sizeof(struct build_version_command),
&build_vers) != sizeof(struct build_version_command)) {
return false;
}
switch (build_vers.platform)
{
case PLATFORM_MACOS:
inf.min_version_os_name = "macosx";
break;
case PLATFORM_IOS:
inf.min_version_os_name = "iphoneos";
break;
case PLATFORM_TVOS:
inf.min_version_os_name = "tvos";
break;
case PLATFORM_WATCHOS:
inf.min_version_os_name = "watchos";
break;
case PLATFORM_BRIDGEOS:
inf.min_version_os_name = "bridgeos";
break;
}
uint32_t xxxx = build_vers.sdk >> 16;;
uint32_t yy = (build_vers.sdk >> 8) & 0xffu;
uint32_t zz = build_vers.sdk & 0xffu;
inf.min_version_os_version = "";
inf.min_version_os_version += std::to_string(xxxx);
inf.min_version_os_version += ".";
inf.min_version_os_version += std::to_string(yy);
if (zz != 0) {
inf.min_version_os_version += ".";
inf.min_version_os_version += std::to_string(zz);
}
}
#endif
load_cmds_p += lc.cmdsize;
}
return true;
Expand Down
378 changes: 359 additions & 19 deletions lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ class DNBArchImplI386 : public DNBArchProtocol {
static const size_t k_num_all_registers_avx;
static const size_t k_num_register_sets;

typedef __i386_avx512f_state_t AVX512F;
static const DNBRegisterInfo g_fpu_registers_avx512f[];
static const DNBRegisterSetInfo g_reg_sets_avx512f[];
static const size_t k_num_fpu_registers_avx512f;
static const size_t k_num_all_registers_avx512f;

typedef enum RegisterSetTag {
e_regSetALL = REGISTER_SET_ALL,
e_regSetGPR,
Expand All @@ -97,6 +103,7 @@ class DNBArchImplI386 : public DNBArchProtocol {
e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int),
e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
e_regSetWordSizeAVX512f = sizeof(AVX512F) / sizeof(int),
e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
} RegisterSetWordSize;

Expand All @@ -107,6 +114,7 @@ class DNBArchImplI386 : public DNBArchProtocol {
union {
FPU no_avx;
AVX avx;
AVX512F avx512f;
} fpu;
EXC exc;
DBG dbg;
Expand Down
64 changes: 64 additions & 0 deletions lldb/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#define __i386_EXCEPTION_STATE 3
#define __i386_DEBUG_STATE 10
#define __i386_AVX_STATE 16
#define __i386_AVX512F_STATE 19

typedef struct {
uint32_t __eax;
Expand Down Expand Up @@ -158,6 +159,69 @@ typedef struct {
__i386_xmm_reg __fpu_ymmh7;
} __i386_avx_state_t;

typedef struct { uint8_t __ymm_reg[32]; } __i386_ymm_reg;
typedef struct { uint8_t __opmask_reg[8]; } __i386_opmask_reg;

typedef struct {
uint32_t __fpu_reserved[2];
__i386_fp_control_t __fpu_fcw;
__i386_fp_status_t __fpu_fsw;
uint8_t __fpu_ftw;
uint8_t __fpu_rsrv1;
uint16_t __fpu_fop;
uint32_t __fpu_ip;
uint16_t __fpu_cs;
uint16_t __fpu_rsrv2;
uint32_t __fpu_dp;
uint16_t __fpu_ds;
uint16_t __fpu_rsrv3;
uint32_t __fpu_mxcsr;
uint32_t __fpu_mxcsrmask;
__i386_mmst_reg __fpu_stmm0;
__i386_mmst_reg __fpu_stmm1;
__i386_mmst_reg __fpu_stmm2;
__i386_mmst_reg __fpu_stmm3;
__i386_mmst_reg __fpu_stmm4;
__i386_mmst_reg __fpu_stmm5;
__i386_mmst_reg __fpu_stmm6;
__i386_mmst_reg __fpu_stmm7;
__i386_xmm_reg __fpu_xmm0;
__i386_xmm_reg __fpu_xmm1;
__i386_xmm_reg __fpu_xmm2;
__i386_xmm_reg __fpu_xmm3;
__i386_xmm_reg __fpu_xmm4;
__i386_xmm_reg __fpu_xmm5;
__i386_xmm_reg __fpu_xmm6;
__i386_xmm_reg __fpu_xmm7;
uint8_t __fpu_rsrv4[14 * 16];
uint32_t __fpu_reserved1;
uint8_t __avx_reserved1[64];
__i386_xmm_reg __fpu_ymmh0;
__i386_xmm_reg __fpu_ymmh1;
__i386_xmm_reg __fpu_ymmh2;
__i386_xmm_reg __fpu_ymmh3;
__i386_xmm_reg __fpu_ymmh4;
__i386_xmm_reg __fpu_ymmh5;
__i386_xmm_reg __fpu_ymmh6;
__i386_xmm_reg __fpu_ymmh7;
__i386_opmask_reg __fpu_k0;
__i386_opmask_reg __fpu_k1;
__i386_opmask_reg __fpu_k2;
__i386_opmask_reg __fpu_k3;
__i386_opmask_reg __fpu_k4;
__i386_opmask_reg __fpu_k5;
__i386_opmask_reg __fpu_k6;
__i386_opmask_reg __fpu_k7;
__i386_ymm_reg __fpu_zmmh0;
__i386_ymm_reg __fpu_zmmh1;
__i386_ymm_reg __fpu_zmmh2;
__i386_ymm_reg __fpu_zmmh3;
__i386_ymm_reg __fpu_zmmh4;
__i386_ymm_reg __fpu_zmmh5;
__i386_ymm_reg __fpu_zmmh6;
__i386_ymm_reg __fpu_zmmh7;
} __i386_avx512f_state_t;

typedef struct {
uint32_t __trapno;
uint32_t __err;
Expand Down
567 changes: 564 additions & 3 deletions lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ class DNBArchImplX86_64 : public DNBArchProtocol {
static const size_t k_num_all_registers_avx;
static const size_t k_num_register_sets;

typedef __x86_64_avx512f_state_t AVX512F;
static const DNBRegisterInfo g_fpu_registers_avx512f[];
static const DNBRegisterSetInfo g_reg_sets_avx512f[];
static const size_t k_num_fpu_registers_avx512f;
static const size_t k_num_all_registers_avx512f;

typedef enum RegisterSetTag {
e_regSetALL = REGISTER_SET_ALL,
e_regSetGPR,
Expand All @@ -96,6 +102,7 @@ class DNBArchImplX86_64 : public DNBArchProtocol {
e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int),
e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int),
e_regSetWordSizeAVX512f = sizeof(AVX512F) / sizeof(int),
e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int)
} RegisterSetWordSize;

Expand All @@ -106,6 +113,7 @@ class DNBArchImplX86_64 : public DNBArchProtocol {
union {
FPU no_avx;
AVX avx;
AVX512F avx512f;
} fpu;
EXC exc;
DBG dbg;
Expand Down
106 changes: 106 additions & 0 deletions lldb/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#define __x86_64_EXCEPTION_STATE 6
#define __x86_64_DEBUG_STATE 11
#define __x86_64_AVX_STATE 17
#define __x86_64_AVX512F_STATE 20

typedef struct {
uint64_t __rax;
Expand Down Expand Up @@ -188,6 +189,111 @@ typedef struct {
__x86_64_xmm_reg __fpu_ymmh15;
} __x86_64_avx_state_t;

typedef struct { uint8_t __ymm_reg[32]; } __x86_64_ymm_reg;
typedef struct { uint8_t __zmm_reg[64]; } __x86_64_zmm_reg;
typedef struct { uint8_t __opmask_reg[8]; } __x86_64_opmask_reg;

typedef struct {
uint32_t __fpu_reserved[2];
__x86_64_fp_control_t __fpu_fcw;
__x86_64_fp_status_t __fpu_fsw;
uint8_t __fpu_ftw;
uint8_t __fpu_rsrv1;
uint16_t __fpu_fop;
uint32_t __fpu_ip;
uint16_t __fpu_cs;
uint16_t __fpu_rsrv2;
uint32_t __fpu_dp;
uint16_t __fpu_ds;
uint16_t __fpu_rsrv3;
uint32_t __fpu_mxcsr;
uint32_t __fpu_mxcsrmask;
__x86_64_mmst_reg __fpu_stmm0;
__x86_64_mmst_reg __fpu_stmm1;
__x86_64_mmst_reg __fpu_stmm2;
__x86_64_mmst_reg __fpu_stmm3;
__x86_64_mmst_reg __fpu_stmm4;
__x86_64_mmst_reg __fpu_stmm5;
__x86_64_mmst_reg __fpu_stmm6;
__x86_64_mmst_reg __fpu_stmm7;
__x86_64_xmm_reg __fpu_xmm0;
__x86_64_xmm_reg __fpu_xmm1;
__x86_64_xmm_reg __fpu_xmm2;
__x86_64_xmm_reg __fpu_xmm3;
__x86_64_xmm_reg __fpu_xmm4;
__x86_64_xmm_reg __fpu_xmm5;
__x86_64_xmm_reg __fpu_xmm6;
__x86_64_xmm_reg __fpu_xmm7;
__x86_64_xmm_reg __fpu_xmm8;
__x86_64_xmm_reg __fpu_xmm9;
__x86_64_xmm_reg __fpu_xmm10;
__x86_64_xmm_reg __fpu_xmm11;
__x86_64_xmm_reg __fpu_xmm12;
__x86_64_xmm_reg __fpu_xmm13;
__x86_64_xmm_reg __fpu_xmm14;
__x86_64_xmm_reg __fpu_xmm15;
uint8_t __fpu_rsrv4[6 * 16];
uint32_t __fpu_reserved1;
uint8_t __avx_reserved1[64];
__x86_64_xmm_reg __fpu_ymmh0;
__x86_64_xmm_reg __fpu_ymmh1;
__x86_64_xmm_reg __fpu_ymmh2;
__x86_64_xmm_reg __fpu_ymmh3;
__x86_64_xmm_reg __fpu_ymmh4;
__x86_64_xmm_reg __fpu_ymmh5;
__x86_64_xmm_reg __fpu_ymmh6;
__x86_64_xmm_reg __fpu_ymmh7;
__x86_64_xmm_reg __fpu_ymmh8;
__x86_64_xmm_reg __fpu_ymmh9;
__x86_64_xmm_reg __fpu_ymmh10;
__x86_64_xmm_reg __fpu_ymmh11;
__x86_64_xmm_reg __fpu_ymmh12;
__x86_64_xmm_reg __fpu_ymmh13;
__x86_64_xmm_reg __fpu_ymmh14;
__x86_64_xmm_reg __fpu_ymmh15;
__x86_64_opmask_reg __fpu_k0;
__x86_64_opmask_reg __fpu_k1;
__x86_64_opmask_reg __fpu_k2;
__x86_64_opmask_reg __fpu_k3;
__x86_64_opmask_reg __fpu_k4;
__x86_64_opmask_reg __fpu_k5;
__x86_64_opmask_reg __fpu_k6;
__x86_64_opmask_reg __fpu_k7;
__x86_64_ymm_reg __fpu_zmmh0;
__x86_64_ymm_reg __fpu_zmmh1;
__x86_64_ymm_reg __fpu_zmmh2;
__x86_64_ymm_reg __fpu_zmmh3;
__x86_64_ymm_reg __fpu_zmmh4;
__x86_64_ymm_reg __fpu_zmmh5;
__x86_64_ymm_reg __fpu_zmmh6;
__x86_64_ymm_reg __fpu_zmmh7;
__x86_64_ymm_reg __fpu_zmmh8;
__x86_64_ymm_reg __fpu_zmmh9;
__x86_64_ymm_reg __fpu_zmmh10;
__x86_64_ymm_reg __fpu_zmmh11;
__x86_64_ymm_reg __fpu_zmmh12;
__x86_64_ymm_reg __fpu_zmmh13;
__x86_64_ymm_reg __fpu_zmmh14;
__x86_64_ymm_reg __fpu_zmmh15;
__x86_64_zmm_reg __fpu_zmm16;
__x86_64_zmm_reg __fpu_zmm17;
__x86_64_zmm_reg __fpu_zmm18;
__x86_64_zmm_reg __fpu_zmm19;
__x86_64_zmm_reg __fpu_zmm20;
__x86_64_zmm_reg __fpu_zmm21;
__x86_64_zmm_reg __fpu_zmm22;
__x86_64_zmm_reg __fpu_zmm23;
__x86_64_zmm_reg __fpu_zmm24;
__x86_64_zmm_reg __fpu_zmm25;
__x86_64_zmm_reg __fpu_zmm26;
__x86_64_zmm_reg __fpu_zmm27;
__x86_64_zmm_reg __fpu_zmm28;
__x86_64_zmm_reg __fpu_zmm29;
__x86_64_zmm_reg __fpu_zmm30;
__x86_64_zmm_reg __fpu_zmm31;

} __x86_64_avx512f_state_t;

typedef struct {
uint32_t __trapno;
uint32_t __err;
Expand Down
61 changes: 60 additions & 1 deletion lldb/tools/debugserver/source/RNBRemote.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4651,6 +4651,8 @@ rnb_err_t RNBRemote::HandlePacket_qHostInfo(const char *p) {
strm << "ostype:tvos;";
#elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1
strm << "ostype:watchos;";
#elif defined(TARGET_OS_BRIDGE) && TARGET_OS_BRIDGE == 1
strm << "ostype:bridgeos;";
#else
strm << "ostype:ios;";
#endif
Expand Down Expand Up @@ -6130,8 +6132,61 @@ rnb_err_t RNBRemote::HandlePacket_qProcessInfo(const char *p) {
}
load_command_addr = load_command_addr + lc.cmdsize;
}

// Test that the PLATFORM_* defines are available from mach-o/loader.h
#if defined (PLATFORM_MACOS)
for (uint32_t i = 0; i < mh.ncmds && !os_handled; ++i)
{
nub_size_t bytes_read =
DNBProcessMemoryRead(pid, load_command_addr, sizeof(lc), &lc);
uint32_t raw_cmd = lc.cmd & ~LC_REQ_DYLD;
if (bytes_read != sizeof(lc))
break;

if (raw_cmd == LC_BUILD_VERSION)
{
uint32_t platform; // first field of 'struct build_version_command'
bytes_read = DNBProcessMemoryRead(pid, load_command_addr + 8, sizeof(platform), &platform);
if (bytes_read != sizeof (platform))
break;
switch (platform)
{
case PLATFORM_MACOS:
os_handled = true;
rep << "ostype:macosx;";
DNBLogThreadedIf(LOG_RNB_PROC,
"LC_BUILD_VERSION PLATFORM_MACOS -> 'ostype:macosx;'");
break;
case PLATFORM_IOS:
os_handled = true;
rep << "ostype:ios;";
DNBLogThreadedIf(LOG_RNB_PROC,
"LC_BUILD_VERSION PLATFORM_IOS -> 'ostype:ios;'");
break;
case PLATFORM_TVOS:
os_handled = true;
rep << "ostype:tvos;";
DNBLogThreadedIf(LOG_RNB_PROC,
"LC_BUILD_VERSION PLATFORM_TVOS -> 'ostype:tvos;'");
break;
case PLATFORM_WATCHOS:
os_handled = true;
rep << "ostype:watchos;";
DNBLogThreadedIf(LOG_RNB_PROC,
"LC_BUILD_VERSION PLATFORM_WATCHOS -> 'ostype:watchos;'");
break;
case PLATFORM_BRIDGEOS:
os_handled = true;
rep << "ostype:bridgeos;";
DNBLogThreadedIf(LOG_RNB_PROC,
"LC_BUILD_VERSION PLATFORM_BRIDGEOS -> 'ostype:bridgeos;'");
break;
}
}
#endif
}
#endif // PLATFORM_MACOS
}
#endif // when compiling this on x86 targets
}

// If we weren't able to find the OS in a LC_VERSION_MIN load command, try
Expand All @@ -6145,6 +6200,8 @@ rnb_err_t RNBRemote::HandlePacket_qProcessInfo(const char *p) {
rep << "ostype:tvos;";
#elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1
rep << "ostype:watchos;";
#elif defined(TARGET_OS_BRIDGE) && TARGET_OS_BRIDGE == 1
rep << "ostype:bridgeos;";
#else
rep << "ostype:ios;";
#endif
Expand Down Expand Up @@ -6196,6 +6253,8 @@ rnb_err_t RNBRemote::HandlePacket_qProcessInfo(const char *p) {
rep << "ostype:tvos;";
#elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1
rep << "ostype:watchos;";
#elif defined(TARGET_OS_BRIDGE) && TARGET_OS_BRIDGE == 1
rep << "ostype:bridgeos;";
#else
rep << "ostype:ios;";
#endif
Expand Down