]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/profiling/i386/profile-md.c
xnu-517.tar.gz
[apple/xnu.git] / osfmk / profiling / i386 / profile-md.c
index 4bb803fd9aad9921bb4a94a4e5762201ca651526..6ecbcbe8934183ee7a8aa2e03cd208dbd0c98a1b 100644 (file)
  */
 
 #include <profiling/profile-internal.h>
+#include <vm/vm_kern.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define DEBUG_PROFILE 1
 #endif
 
-extern int printf(const char *, ...);
-extern void panic(const char *);
 #else
 #include <assert.h>
 #define panic(str) exit(1)
@@ -238,6 +237,59 @@ static void _profile_reset_alloc(struct profile_vars *,
                                 acontext_type_t);
 
 extern void _bogus_function(void);
+\f
+
+#if NCPUS > 1
+struct profile_vars *_profile_vars_cpus[NCPUS] = { &_profile_vars };
+struct profile_vars _profile_vars_aux[NCPUS-1];
+#define PROFILE_VARS(cpu) (_profile_vars_cpus[(cpu)])
+#else
+#define PROFILE_VARS(cpu) (&_profile_vars)
+#endif
+
+void *
+_profile_alloc_pages (size_t size)
+{
+       vm_offset_t addr;
+
+       /*
+        * For the MK, we can't support allocating pages at runtime, because we
+        * might be at interrupt level, so abort if we didn't size the table
+        * properly.
+        */
+
+       if (PROFILE_VARS(0)->active) {
+               panic("Call to _profile_alloc_pages while profiling is running.");
+       }
+
+       if (kmem_alloc(kernel_map, &addr, size)) {
+               panic("Could not allocate memory for profiling");
+       }
+
+       memset((void *)addr, '\0', size);
+       if (PROFILE_VARS(0)->debug) {
+               printf("Allocated %d bytes for profiling, address 0x%x\n", (int)size, (int)addr);
+       }
+
+       return((caddr_t)addr);
+}
+
+void
+_profile_free_pages(void *addr, size_t size)
+{
+       if (PROFILE_VARS(0)->debug) {
+               printf("Freed %d bytes for profiling, address 0x%x\n", (int)size, (int)addr);
+       }
+
+       kmem_free(kernel_map, (vm_offset_t)addr, size);
+       return;
+}
+
+void _profile_error(struct profile_vars *pv)
+{
+       panic("Fatal error in profiling");
+}
+
 \f
 /*
  * Function to set up the initial allocation for a context block.