Use fprintf() for printing user TFs
[akaros.git] / user / parlib / include / parlib / vcore.h
index a965591..c0be1de 100644 (file)
@@ -6,6 +6,7 @@
 #include <string.h>
 #include <parlib/timing.h>
 #include <parlib/common.h>
+#include <stdio.h>
 
 __BEGIN_DECLS
 
@@ -21,18 +22,18 @@ extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
 #define exit(status) _exit(status)
 /*****************************************************************************/
 
-#define LOG2_MAX_VCORES 6
-#define MAX_VCORES (1 << LOG2_MAX_VCORES)
-
 #define TRANSITION_STACK_PAGES 2
 #define TRANSITION_STACK_SIZE (TRANSITION_STACK_PAGES*PGSIZE)
 
 /* Defined in vcore.c */
-extern void vcore_entry();
+void __attribute__((noreturn)) vcore_entry(void);
 extern __thread bool __vcore_context;
 extern __thread int __vcoreid;
 extern __thread struct syscall __vcore_one_sysc;       /* see sys_change_vcore */
 
+/* Arch specific entry from the kernel */
+void __attribute__((noreturn)) __kernel_vcore_entry(void);
+
 /* Vcore API functions */
 static inline uint32_t max_vcores(void);
 static inline uint32_t num_vcores(void);
@@ -53,7 +54,8 @@ static inline uint64_t vcore_account_resume_nsec(uint32_t vcoreid);
 static inline uint64_t vcore_account_total_nsec(uint32_t vcoreid);
 void vcore_lib_init(void);
 void vcore_change_to_m(void);
-int vcore_request(long nr_new_vcores);
+void vcore_request_more(long nr_new_vcores);
+void vcore_request_total(long nr_vcores_wanted);
 void vcore_yield(bool preempt_pending);
 void vcore_reenter(void (*entry_func)(void));
 void enable_notifs(uint32_t vcoreid);
@@ -63,8 +65,10 @@ void ensure_vcore_runs(uint32_t vcoreid);
 void cpu_relax_vc(uint32_t vcoreid);
 uint32_t get_vcoreid(void);
 bool check_vcoreid(const char *str, uint32_t vcoreid);
-void print_hw_tf(struct hw_trapframe *tf);
-void print_sw_tf(struct sw_trapframe *sw_tf);
+void __attribute__((noreturn)) vcore_yield_or_restart(void);
+void fprintf_hw_tf(FILE *f, struct hw_trapframe *hw_tf);
+void fprintf_sw_tf(FILE *f, struct sw_trapframe *sw_tf);
+void fprintf_vm_tf(FILE *f, struct vm_trapframe *vm_tf);
 void print_user_context(struct user_context *ctx);
 
 /* This works so long as we don't dlopen parlib (which we never do) */
@@ -78,7 +82,7 @@ void print_user_context(struct user_context *ctx);
 /* Static inlines */
 static inline uint32_t max_vcores(void)
 {
-       return MAX(1, MIN(__procinfo.max_vcores, MAX_VCORES));
+       return MAX(1, __procinfo.max_vcores);
 }
 
 static inline uint32_t num_vcores(void)