2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2012, NWU EECS 441 Transactional Memory Team
11 * Copyright (c) 2012, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Maciek Swiech <dotpyfe@u.northwestern.edu>
15 * Marcel Flores <marcel-flores@u.northwestern.edu>
16 * Zachary Bischof <zbischof@u.northwestern.edu>
17 * Kyle C. Hale <kh@u.northwestern.edu>
19 * This is free software. You are permitted to use,
20 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
24 * We claim that we can have a single, shared "cache"-like box
25 * that handles all writes and reads when TM is on on any core. The
26 * idea is that if TM is on on any core, we redirect reads/writes
27 * that we get to the box, and it records them internally for
28 * future playback, and tells us whether an abort condition has
31 * error = handle_start_tx(boxstate,vcorenum);
32 * error = handle_abort(boxstate,vcorenum);
33 * error = handle_commit(boxstate,vcorenum);
35 * should_abort = handle_write(boxstate, vcorenum, physaddr, data, datalen);
36 * should_abort = handle_read(boxstate, vcorenum,physaddr, *data, datalen);
41 * enum {READ,WRITE,BEGIN,ABORT,END} op;
48 * struct cache_model {
49 * void *init(xml spec); // make a cache, return ptr to state
50 * int write(void *priv, physaddr, datalen, int (*change_cb(int core,
51 * physaddrstart, len));
52 * // similiar for read
54 * // Idea is that we pass writes to cache model, it calls us back to say which
55 * lines on which cores have changed
60 * struct cache_model *model; //
61 * lock_t global_lock; // any handle_* func acquires this first
63 * uint64_t numtransactionsactive;
67 * int handle_write(box,vcore,physaddr,data,datalen) {
71 #ifndef __TRANS_MEM_H__
72 #define __TRANS_MEM_H__
74 #include <palacios/vmm_lock.h>
75 #include <palacios/vmcb.h>
76 #include <palacios/vmm_paging.h>
80 #define TM_KICKBACK_CALL 0x1337
82 #define HTABLE_SEARCH(h, k) ({ addr_t ret; v3_lock(h##_lock); ret = v3_htable_search((h), (k)); v3_unlock(h##_lock); ret; })
83 #define HTABLE_INSERT(h, k, v) ({ addr_t ret; v3_lock(h##_lock); ret = v3_htable_insert((h), (k), (addr_t)(v)); v3_unlock(h##_lock); ret; })
85 #define INSTR_INJECT_LEN 10
86 #define INSTR_BUF_SZ 15
87 #define ERR_STORE_MUST_ABORT -2
88 #define ERR_STORE_FAIL -1
89 #define ERR_DECODE_FAIL -1
90 #define ERR_TRANS_FAULT_FAIL 0
91 #define TRANS_FAULT_OK 1
92 #define TRANS_HCALL_FAIL -1
93 #define TRANS_HCALL_OK 0
95 /* conflict checking codes */
96 #define ERR_CHECK_FAIL -1
97 #define CHECK_MUST_ABORT -2
98 #define CHECK_IS_CONFLICT 1
99 #define CHECK_NO_CONFLICT 0
101 /* RTM instruction handling */
102 #define XBEGIN_INSTR_LEN 0x6
103 #define XEND_INSTR_LEN 0x3
104 #define XABORT_INSTR_LEN 0x3
105 #define XTEST_INSTR_LEN 0x3
108 struct v3_tm_access_type {
111 } __attribute__((packed));
113 struct v3_ctxt_tuple {
117 } __attribute__((packed));
119 /* 441-tm: Are we currently in a transaction */
125 /* 441-tm: Current state of the transaction state machine */
133 typedef enum v3_tm_op {
138 struct v3_trans_mem {
139 /* current transaction */
142 /* 441-tm: linked list to store core's reads and writes */
143 struct list_head trans_r_list;
144 struct list_head trans_w_list;
146 /* 441-tm: hash tables of addresses */
147 struct hashtable * addr_ctxt; // records the core transaction context at time of address use
148 v3_lock_t addr_ctxt_lock;
149 uint64_t addr_ctxt_entries;
151 struct hashtable * access_type; // hashes addr:corenum:t_num for each address use
152 v3_lock_t access_type_lock;
153 uint64_t access_type_entries;
155 /* 441-tm: lets remember things about the next instruction */
156 uint8_t dirty_instr_flag;
159 uchar_t dirty_instr[15];
162 enum TM_MODE_E TM_MODE;
163 enum TM_STATE_E TM_STATE;
166 struct shadow_page_data * staging_page;
168 /* 441-tm: Remember the failsafe addr */
171 /* 441-tm: Save the rax we are about to ruin */
172 v3_reg_t clobbered_rax;
181 uint64_t entry_exits;
184 struct cache_box * box;
186 struct guest_info * ginfo;
193 enum TM_MODE_E TM_MODE;
194 uint64_t cores_active;
196 uint64_t * last_trans;
202 struct list_head lt_node;
205 // called from #PF handler, stages entries, catches reads / writes
206 addr_t v3_handle_trans_mem_fault(struct guest_info *core,
210 // restores instruction after core->rip
211 int v3_restore_dirty_instr(struct guest_info *core);
213 // restores instruction after core->rip
214 int v3_restore_abort_instr(struct guest_info *core);
216 // handles abort cleanup, called from INT/EXCP or XABORT
217 int v3_handle_trans_abort(struct guest_info *core);
219 // record a memory access in hashes
220 int tm_record_access (struct v3_trans_mem * tm,
224 // garbage collect hash recordings
225 int tm_hash_gc (struct v3_trans_mem * tm);
227 // check address for conflicts
228 int tm_check_conflict(struct v3_vm_info * vm_info,
234 // increment transaction number
235 int v3_tm_inc_tnum(struct v3_trans_mem * tm);
238 /* exception-related functions */
239 int v3_tm_handle_exception(struct guest_info * info, addr_t exit_code);
241 void v3_tm_set_excp_intercepts(vmcb_ctrl_t * ctrl_area);
243 void v3_tm_check_intr_state(struct guest_info * info,
244 vmcb_ctrl_t * guest_ctrl,
245 vmcb_saved_state_t * guest_state);
248 /* paging-related functions */
249 int v3_tm_handle_pf_64 (struct guest_info * info,
250 pf_error_t error_code,
252 addr_t * page_to_use);
254 void v3_tm_handle_usr_tlb_miss(struct guest_info * info,
255 pf_error_t error_code,
259 void v3_tm_handle_read_fault(struct guest_info * info,
260 pf_error_t error_code,
261 pte64_t * shadow_pte);
263 #include <palacios/vmm_decoder.h>
265 /* decoding-related functions */
266 int v3_tm_decode_rtm_instrs(struct guest_info * info,
268 struct x86_instr * instr);