Merge branch 'master' of ssh://code.systems.ethz.ch:8006/diffusion/BFI/barrelfish
[barrelfish] / include / barrelfish_kpi / dispatcher_shared.h
1 /**
2  * \file
3  * \brief Generic dispatcher struct shared between kernel and user
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2011, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef BARRELFISH_KPI_DISPATCHER_SHARED_H
16 #define BARRELFISH_KPI_DISPATCHER_SHARED_H
17
18 #ifndef __ASSEMBLER__
19
20 #include <barrelfish_kpi/dispatcher_handle.h>
21
22 /**
23  * \brief Amount of space required for the dispatcher frame.
24  * This should be at least greater than the memory required for
25  * struct disp_priv.
26  * Keeping it as a power of 2 allows using a single cap for dispatcher frame
27  *
28  * \bug Make this arch specific
29  */
30 #define DISPATCHER_FRAME_BITS 18
31 #define DISP_NAME_LEN   16
32
33 enum task_type {
34     TASK_TYPE_BEST_EFFORT,
35     TASK_TYPE_SOFT_REALTIME,
36     TASK_TYPE_HARD_REALTIME
37 };
38
39 ///< Architecture generic kernel/user shared dispatcher struct
40 struct dispatcher_shared_generic {
41     uint32_t   disabled;                        ///< Disabled flag (Must be able to change atomically)
42     uint32_t   haswork;                         ///< Has work (ie. is runnable) (Must be able to change atomically)
43
44     lvaddr_t    udisp;                          ///< User-mode pointer to dispatcher
45     uint32_t    lmp_delivered, lmp_seen;        ///< # LMP words delivered and seen
46     lvaddr_t    lmp_hint;                       ///< Hint for location of LMP
47     lvaddr_t    dispatcher_run;                 ///< Run entry
48     lvaddr_t    dispatcher_lrpc;                ///< LRPC entry
49     lvaddr_t    dispatcher_pagefault;           ///< Pagefault entry
50     lvaddr_t    dispatcher_pagefault_disabled;  ///< Disabled pagefault entry
51     lvaddr_t    dispatcher_trap;                ///< Trap entry
52
53     systime_t   systime;                        ///< System time when last dispatched/resumed (W/O to kernel)
54     systime_t   wakeup;                         ///< System time at which to wake dispatcher from sleep (R/O by kernel, on yield)
55
56     char        name[DISP_NAME_LEN];            ///< Name of domain, for debugging purposes
57     uint32_t    fpu_used;                       ///< Was FPU used while disabled?
58     uint32_t    fpu_trap;                       ///< State of FPU trap
59
60     coreid_t    curr_core_id;                   ///< Core id of current core, in this part so kernel can update
61 #ifdef __k1om__
62     uint8_t     xeon_phi_id;
63 #endif
64 };
65
66 static inline struct dispatcher_shared_generic*
67 get_dispatcher_shared_generic(dispatcher_handle_t handle)
68 {
69     return (struct dispatcher_shared_generic*)handle;
70 }
71
72 static inline lvaddr_t get_dispatcher_vaddr(dispatcher_handle_t handle)
73 {
74     return (lvaddr_t)handle;
75 }
76
77 #include <stdio.h>
78 static inline void dump_dispatcher(struct dispatcher_shared_generic *disp)
79 {
80     printf("Dump of dispatcher at address %p:\n", disp);
81     printf("  disabled      = %d (%s)\n", disp->disabled, disp->disabled ? "RESUME" : "UPCALL" );
82     printf("  haswork       = %d\n", disp->haswork );
83     printf("  udisp         = 0x%"PRIxLVADDR"\n", disp->udisp );
84     printf("  lmp_delivered = %d\n", disp->lmp_delivered );
85     printf("  lmp_seen      = %d\n", disp->lmp_seen );
86     printf("  lpm_hint      = 0x%"PRIxLVADDR"\n", disp->lmp_hint );
87     printf("  dispatcher_run                = 0x%"PRIxLVADDR"\n", disp->dispatcher_run );
88     printf("  dispatcher_pagefault          = 0x%"PRIxLVADDR"\n", disp->dispatcher_pagefault );
89     printf("  dispatcher_pagefault_disabled = 0x%"PRIxLVADDR"\n", disp->dispatcher_pagefault_disabled );
90     printf("  dispatcher_trap               = 0x%"PRIxLVADDR"\n", disp->dispatcher_trap );
91     printf("  systime      = 0x%" PRIuSYSTIME "\n", disp->systime );
92     printf("  wakeup       = 0x%" PRIuSYSTIME "\n", disp->wakeup );
93     printf("  name         = %.*s\n", DISP_NAME_LEN, disp->name );
94     printf("  fpu_used     = %d\n", disp->fpu_used );
95     printf("  fpu_trap     = %d\n", disp->fpu_trap );
96     printf("  curr_core_id = 0x%" PRIxCOREID "\n", disp->curr_core_id );
97 }
98
99
100 #endif //__ASSEMBLER__
101 #endif // BARRELFISH_KPI_DISPATCHER_SHARED_H