diff --git a/build/config_headers/kernel_debug_config.h b/build/config_headers/kernel_debug_config.h index 837c8373d2..008818c510 100644 --- a/build/config_headers/kernel_debug_config.h +++ b/build/config_headers/kernel_debug_config.h @@ -133,5 +133,11 @@ // Enables tracking of page allocations. #define VM_PAGE_ALLOCATION_TRACKING 0 +// Enables the (boot) system profiler for use with "profile -r" +#define SYSTEM_PROFILER 0 +#define SYSTEM_PROFILE_SIZE 40 * 1024 * 1024 +#define SYSTEM_PROFILE_STACK_DEPTH 10 +#define SYSTEM_PROFILE_INTERVAL 10000 + #endif // KERNEL_DEBUG_CONFIG_H diff --git a/headers/private/kernel/system_profiler.h b/headers/private/kernel/system_profiler.h index 6b83c7707c..1c2c7dae79 100644 --- a/headers/private/kernel/system_profiler.h +++ b/headers/private/kernel/system_profiler.h @@ -9,15 +9,19 @@ #include +#include "kernel_debug_config.h" + struct system_profiler_parameters; __BEGIN_DECLS +#if SYSTEM_PROFILER status_t start_system_profiler(size_t areaSize, uint32 stackDepth, bigtime_t interval); void stop_system_profiler(); +#endif status_t _user_system_profiler_start( struct system_profiler_parameters* parameters); diff --git a/src/system/kernel/debug/system_profiler.cpp b/src/system/kernel/debug/system_profiler.cpp index afd87e9510..1ad27d276c 100644 --- a/src/system/kernel/debug/system_profiler.cpp +++ b/src/system/kernel/debug/system_profiler.cpp @@ -1435,6 +1435,8 @@ SystemProfiler::_ProfilingEvent(struct timer* timer) // #pragma mark - private kernel API +#if SYSTEM_PROFILER + status_t start_system_profiler(size_t areaSize, uint32 stackDepth, bigtime_t interval) { @@ -1530,6 +1532,8 @@ stop_system_profiler() profiler->ReleaseReference(); } +#endif // SYSTEM_PROFILER + // #pragma mark - syscalls @@ -1644,13 +1648,16 @@ _user_system_profiler_stop() status_t -_user_system_profiler_recorded(struct system_profiler_parameters* userParameters) +_user_system_profiler_recorded(system_profiler_parameters* userParameters) { if (userParameters == NULL || !IS_USER_ADDRESS(userParameters)) return B_BAD_ADDRESS; if (sRecordedParameters == NULL) return B_ERROR; +#if SYSTEM_PROFILER + stop_system_profiler(); + // Transfer the area to the userland process void* address; @@ -1673,4 +1680,7 @@ _user_system_profiler_recorded(struct system_profiler_parameters* userParameters sRecordedParameters = NULL; return status; +#else + return B_NOT_SUPPORTED; +#endif // SYSTEM_PROFILER } diff --git a/src/system/kernel/main.cpp b/src/system/kernel/main.cpp index c62b5bf8a8..e37637feac 100644 --- a/src/system/kernel/main.cpp +++ b/src/system/kernel/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2002-2015, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -273,12 +274,14 @@ _start(kernel_args *bootKernelArgs, int currentCPU) static int32 -main2(void *unused) +main2(void* /*unused*/) { - (void)(unused); - TRACE("start of main2: initializing devices\n"); +#if SYSTEM_PROFILER + start_system_profiler(SYSTEM_PROFILE_SIZE, SYSTEM_PROFILE_STACK_DEPTH, + SYSTEM_PROFILE_INTERVAL); +#endif boot_splash_init(sKernelArgs.boot_splash); commpage_init_post_cpus();