| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 900 CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. | 900 CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. |
| 901 } | 901 } |
| 902 } | 902 } |
| 903 | 903 |
| 904 | 904 |
| 905 Semaphore* OS::CreateSemaphore(int count) { | 905 Semaphore* OS::CreateSemaphore(int count) { |
| 906 return new LinuxSemaphore(count); | 906 return new LinuxSemaphore(count); |
| 907 } | 907 } |
| 908 | 908 |
| 909 | 909 |
| 910 #if !defined(__GLIBC__) && (defined(__arm__) || defined(__thumb__)) | 910 #if defined(__ANDROID__) && !defined(__BIONIC_HAVE_UCONTEXT_T) |
| 911 // Android runs a fairly new Linux kernel, so signal info is there, | |
| 912 // but the C library doesn't have the structs defined. | |
| 913 | 911 |
| 914 struct sigcontext { | 912 // Not all versions of Android's C library provide ucontext_t. |
| 915 uint32_t trap_no; | 913 // Detect this and provide custom but compatible definitions. Note that these |
| 916 uint32_t error_code; | 914 // follow the GLibc naming convention to access register values from |
| 917 uint32_t oldmask; | 915 // mcontext_t. |
| 918 uint32_t gregs[16]; | 916 // |
| 919 uint32_t arm_cpsr; | 917 // See http://code.google.com/p/android/issues/detail?id=34784 |
| 920 uint32_t fault_address; | 918 |
| 921 }; | 919 #if defined(__arm__) |
| 922 typedef uint32_t __sigset_t; | 920 |
| 921 // GLibc on ARM defines mcontext_t has a typedef for 'struct sigcontext'. |
| 922 // Old versions of the C library <signal.h> didn't define the type. |
| 923 #if !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT) |
| 924 #include <asm/sigcontext.h> |
| 925 #endif |
| 926 |
| 923 typedef struct sigcontext mcontext_t; | 927 typedef struct sigcontext mcontext_t; |
| 928 |
| 924 typedef struct ucontext { | 929 typedef struct ucontext { |
| 925 uint32_t uc_flags; | 930 uint32_t uc_flags; |
| 926 struct ucontext* uc_link; | 931 struct ucontext* uc_link; |
| 927 stack_t uc_stack; | 932 stack_t uc_stack; |
| 928 mcontext_t uc_mcontext; | 933 mcontext_t uc_mcontext; |
| 929 __sigset_t uc_sigmask; | 934 // Other fields are not used by V8, don't define them here. |
| 930 } ucontext_t; | 935 } ucontext_t; |
| 931 enum ArmRegisters {R15 = 15, R13 = 13, R11 = 11}; | |
| 932 | 936 |
| 933 #elif !defined(__GLIBC__) && defined(__mips__) | 937 #elif defined(__mips__) |
| 934 // MIPS version of sigcontext, for Android bionic. | 938 // MIPS version of sigcontext, for Android bionic. |
| 935 struct sigcontext { | 939 typedef struct { |
| 936 uint32_t regmask; | 940 uint32_t regmask; |
| 937 uint32_t status; | 941 uint32_t status; |
| 938 uint64_t pc; | 942 uint64_t pc; |
| 939 uint64_t gregs[32]; | 943 uint64_t gregs[32]; |
| 940 uint64_t fpregs[32]; | 944 uint64_t fpregs[32]; |
| 941 uint32_t acx; | 945 uint32_t acx; |
| 942 uint32_t fpc_csr; | 946 uint32_t fpc_csr; |
| 943 uint32_t fpc_eir; | 947 uint32_t fpc_eir; |
| 944 uint32_t used_math; | 948 uint32_t used_math; |
| 945 uint32_t dsp; | 949 uint32_t dsp; |
| 946 uint64_t mdhi; | 950 uint64_t mdhi; |
| 947 uint64_t mdlo; | 951 uint64_t mdlo; |
| 948 uint32_t hi1; | 952 uint32_t hi1; |
| 949 uint32_t lo1; | 953 uint32_t lo1; |
| 950 uint32_t hi2; | 954 uint32_t hi2; |
| 951 uint32_t lo2; | 955 uint32_t lo2; |
| 952 uint32_t hi3; | 956 uint32_t hi3; |
| 953 uint32_t lo3; | 957 uint32_t lo3; |
| 954 }; | 958 } mcontext_t; |
| 955 typedef uint32_t __sigset_t; | 959 |
| 956 typedef struct sigcontext mcontext_t; | |
| 957 typedef struct ucontext { | 960 typedef struct ucontext { |
| 958 uint32_t uc_flags; | 961 uint32_t uc_flags; |
| 959 struct ucontext* uc_link; | 962 struct ucontext* uc_link; |
| 960 stack_t uc_stack; | 963 stack_t uc_stack; |
| 961 mcontext_t uc_mcontext; | 964 mcontext_t uc_mcontext; |
| 962 __sigset_t uc_sigmask; | 965 // Other fields are not used by V8, don't define them here. |
| 963 } ucontext_t; | 966 } ucontext_t; |
| 964 | 967 |
| 965 #elif !defined(__GLIBC__) && defined(__i386__) | 968 #elif defined(__i386__) |
| 966 // x86 version for Android. | 969 // x86 version for Android. |
| 967 struct sigcontext { | 970 typedef struct { |
| 968 uint32_t gregs[19]; | 971 uint32_t gregs[19]; |
| 969 void* fpregs; | 972 void* fpregs; |
| 970 uint32_t oldmask; | 973 uint32_t oldmask; |
| 971 uint32_t cr2; | 974 uint32_t cr2; |
| 972 }; | 975 } mcontext_t; |
| 973 | 976 |
| 974 typedef uint32_t __sigset_t; | 977 typedef uint32_t kernel_sigset_t[2]; // x86 kernel uses 64-bit signal masks |
| 975 typedef struct sigcontext mcontext_t; | |
| 976 typedef struct ucontext { | 978 typedef struct ucontext { |
| 977 uint32_t uc_flags; | 979 uint32_t uc_flags; |
| 978 struct ucontext* uc_link; | 980 struct ucontext* uc_link; |
| 979 stack_t uc_stack; | 981 stack_t uc_stack; |
| 980 mcontext_t uc_mcontext; | 982 mcontext_t uc_mcontext; |
| 981 __sigset_t uc_sigmask; | 983 // Other fields are not used by V8, don't define them here. |
| 982 } ucontext_t; | 984 } ucontext_t; |
| 983 enum { REG_EBP = 6, REG_ESP = 7, REG_EIP = 14 }; | 985 enum { REG_EBP = 6, REG_ESP = 7, REG_EIP = 14 }; |
| 984 #endif | 986 #endif |
| 985 | 987 |
| 988 #endif // __ANDROID__ && !defined(__BIONIC_HAVE_UCONTEXT_T) |
| 986 | 989 |
| 987 static int GetThreadID() { | 990 static int GetThreadID() { |
| 991 #if defined(__ANDROID__) |
| 992 // Android's C library provides gettid(2). |
| 993 return gettid(); |
| 994 #else |
| 988 // Glibc doesn't provide a wrapper for gettid(2). | 995 // Glibc doesn't provide a wrapper for gettid(2). |
| 989 #if defined(ANDROID) | |
| 990 return syscall(__NR_gettid); | |
| 991 #else | |
| 992 return syscall(SYS_gettid); | 996 return syscall(SYS_gettid); |
| 993 #endif | 997 #endif |
| 994 } | 998 } |
| 995 | 999 |
| 996 | 1000 |
| 997 static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { | 1001 static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
| 998 USE(info); | 1002 USE(info); |
| 999 if (signal != SIGPROF) return; | 1003 if (signal != SIGPROF) return; |
| 1000 Isolate* isolate = Isolate::UncheckedCurrent(); | 1004 Isolate* isolate = Isolate::UncheckedCurrent(); |
| 1001 if (isolate == NULL || !isolate->IsInitialized() || !isolate->IsInUse()) { | 1005 if (isolate == NULL || !isolate->IsInitialized() || !isolate->IsInUse()) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1020 sample->state = isolate->current_vm_state(); | 1024 sample->state = isolate->current_vm_state(); |
| 1021 #if V8_HOST_ARCH_IA32 | 1025 #if V8_HOST_ARCH_IA32 |
| 1022 sample->pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]); | 1026 sample->pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]); |
| 1023 sample->sp = reinterpret_cast<Address>(mcontext.gregs[REG_ESP]); | 1027 sample->sp = reinterpret_cast<Address>(mcontext.gregs[REG_ESP]); |
| 1024 sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_EBP]); | 1028 sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_EBP]); |
| 1025 #elif V8_HOST_ARCH_X64 | 1029 #elif V8_HOST_ARCH_X64 |
| 1026 sample->pc = reinterpret_cast<Address>(mcontext.gregs[REG_RIP]); | 1030 sample->pc = reinterpret_cast<Address>(mcontext.gregs[REG_RIP]); |
| 1027 sample->sp = reinterpret_cast<Address>(mcontext.gregs[REG_RSP]); | 1031 sample->sp = reinterpret_cast<Address>(mcontext.gregs[REG_RSP]); |
| 1028 sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]); | 1032 sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]); |
| 1029 #elif V8_HOST_ARCH_ARM | 1033 #elif V8_HOST_ARCH_ARM |
| 1030 // An undefined macro evaluates to 0, so this applies to Android's Bionic also. | 1034 #if defined(__GLIBC__) && !defined(__UCLIBC__) && \ |
| 1031 #if (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3) && \ | 1035 (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3)) |
| 1032 !defined(__UCLIBC__)) | 1036 // Old GLibc ARM versions used a gregs[] array to access the register |
| 1037 // values from mcontext_t. |
| 1033 sample->pc = reinterpret_cast<Address>(mcontext.gregs[R15]); | 1038 sample->pc = reinterpret_cast<Address>(mcontext.gregs[R15]); |
| 1034 sample->sp = reinterpret_cast<Address>(mcontext.gregs[R13]); | 1039 sample->sp = reinterpret_cast<Address>(mcontext.gregs[R13]); |
| 1035 sample->fp = reinterpret_cast<Address>(mcontext.gregs[R11]); | 1040 sample->fp = reinterpret_cast<Address>(mcontext.gregs[R11]); |
| 1036 #else | 1041 #else |
| 1037 sample->pc = reinterpret_cast<Address>(mcontext.arm_pc); | 1042 sample->pc = reinterpret_cast<Address>(mcontext.arm_pc); |
| 1038 sample->sp = reinterpret_cast<Address>(mcontext.arm_sp); | 1043 sample->sp = reinterpret_cast<Address>(mcontext.arm_sp); |
| 1039 sample->fp = reinterpret_cast<Address>(mcontext.arm_fp); | 1044 sample->fp = reinterpret_cast<Address>(mcontext.arm_fp); |
| 1040 #endif // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3) && | 1045 #endif // defined(__GLIBC__) && !defined(__UCLIBC__) && \ |
| 1041 // !defined(__UCLIBC__)) | 1046 // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3)) |
| 1042 #elif V8_HOST_ARCH_MIPS | 1047 #elif V8_HOST_ARCH_MIPS |
| 1043 sample->pc = reinterpret_cast<Address>(mcontext.pc); | 1048 sample->pc = reinterpret_cast<Address>(mcontext.pc); |
| 1044 sample->sp = reinterpret_cast<Address>(mcontext.gregs[29]); | 1049 sample->sp = reinterpret_cast<Address>(mcontext.gregs[29]); |
| 1045 sample->fp = reinterpret_cast<Address>(mcontext.gregs[30]); | 1050 sample->fp = reinterpret_cast<Address>(mcontext.gregs[30]); |
| 1046 #endif // V8_HOST_ARCH_* | 1051 #endif // V8_HOST_ARCH_* |
| 1047 sampler->SampleStack(sample); | 1052 sampler->SampleStack(sample); |
| 1048 sampler->Tick(sample); | 1053 sampler->Tick(sample); |
| 1049 } | 1054 } |
| 1050 | 1055 |
| 1051 | 1056 |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 | 1289 |
| 1285 | 1290 |
| 1286 void Sampler::Stop() { | 1291 void Sampler::Stop() { |
| 1287 ASSERT(IsActive()); | 1292 ASSERT(IsActive()); |
| 1288 SignalSender::RemoveActiveSampler(this); | 1293 SignalSender::RemoveActiveSampler(this); |
| 1289 SetActive(false); | 1294 SetActive(false); |
| 1290 } | 1295 } |
| 1291 | 1296 |
| 1292 | 1297 |
| 1293 } } // namespace v8::internal | 1298 } } // namespace v8::internal |
| OLD | NEW |