*/
#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)
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.