| 
														
															@@ -200,16 +200,16 @@ void syscall_wrapper_after_syscalldb(void); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 void check_stack_hook (void); 
														 | 
														
														 | 
														
															 void check_stack_hook (void); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-static inline uint64_t get_cur_preempt (void) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+static inline int64_t get_cur_preempt (void) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     shim_tcb_t* tcb = shim_get_tls(); 
														 | 
														
														 | 
														
															     shim_tcb_t* tcb = shim_get_tls(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     assert(tcb); 
														 | 
														
														 | 
														
															     assert(tcb); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    return tcb->context.preempt; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    return atomic_read(&tcb->context.preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 #define BEGIN_SHIM(name, args ...)                          \ 
														 | 
														
														 | 
														
															 #define BEGIN_SHIM(name, args ...)                          \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     SHIM_ARG_TYPE __shim_##name(args) {                     \ 
														 | 
														
														 | 
														
															     SHIM_ARG_TYPE __shim_##name(args) {                     \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         SHIM_ARG_TYPE ret = 0;                              \ 
														 | 
														
														 | 
														
															         SHIM_ARG_TYPE ret = 0;                              \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        uint64_t preempt = get_cur_preempt();               \ 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        int64_t preempt = get_cur_preempt();                \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         /* handle_signal(); */                              \ 
														 | 
														
														 | 
														
															         /* handle_signal(); */                              \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         /* check_stack_hook(); */                           \ 
														 | 
														
														 | 
														
															         /* check_stack_hook(); */                           \ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         BEGIN_SYSCALL_PROFILE(); 
														 | 
														
														 | 
														
															         BEGIN_SYSCALL_PROFILE(); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -467,13 +467,14 @@ static inline PAL_HANDLE thread_create (void * func, void * arg) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return DkThreadCreate(func, arg); 
														 | 
														
														 | 
														
															     return DkThreadCreate(func, arg); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-static inline void __disable_preempt (shim_tcb_t * tcb) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+static inline int64_t __disable_preempt (shim_tcb_t * tcb) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     //tcb->context.syscall_nr += SYSCALL_NR_PREEMPT_INC; 
														 | 
														
														 | 
														
															     //tcb->context.syscall_nr += SYSCALL_NR_PREEMPT_INC; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    tcb->context.preempt++; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    int64_t preempt = atomic_inc_return(&tcb->context.preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     /* Assert if this counter overflows */ 
														 | 
														
														 | 
														
															     /* Assert if this counter overflows */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    assert(tcb->context.preempt != 0); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    //debug("disable preempt: %d\n", tcb->context.preempt); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    assert(preempt != 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    //debug("disable preempt: %d\n", preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    return preempt; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 static inline void disable_preempt (shim_tcb_t * tcb) 
														 | 
														
														 | 
														
															 static inline void disable_preempt (shim_tcb_t * tcb) 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -486,11 +487,10 @@ static inline void disable_preempt (shim_tcb_t * tcb) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 static inline void __enable_preempt (shim_tcb_t * tcb) 
														 | 
														
														 | 
														
															 static inline void __enable_preempt (shim_tcb_t * tcb) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    //tcb->context.syscall_nr -= SYSCALL_NR_PREEMPT_INC; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    int64_t preempt = atomic_add_return(-1, &tcb->context.preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     /* Assert if this counter underflows */ 
														 | 
														
														 | 
														
															     /* Assert if this counter underflows */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    assert(tcb->context.preempt > 0); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    tcb->context.preempt--; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    //debug("enable preempt: %d\n", tcb->context.preempt); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    assert(preempt >= 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    //debug("enable preempt: %d\n", preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 void __handle_signal (shim_tcb_t * tcb, int sig); 
														 | 
														
														 | 
														
															 void __handle_signal (shim_tcb_t * tcb, int sig); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -500,10 +500,11 @@ static inline void enable_preempt (shim_tcb_t * tcb) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (!tcb && !(tcb = shim_get_tls())) 
														 | 
														
														 | 
														
															     if (!tcb && !(tcb = shim_get_tls())) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return; 
														 | 
														
														 | 
														
															         return; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    if (!tcb->context.preempt) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    int64_t preempt = atomic_read(&tcb->context.preempt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (!preempt) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return; 
														 | 
														
														 | 
														
															         return; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    if (tcb->context.preempt == 1) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (preempt == 1) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         __handle_signal(tcb, 0); 
														 | 
														
														 | 
														
															         __handle_signal(tcb, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     __enable_preempt(tcb); 
														 | 
														
														 | 
														
															     __enable_preempt(tcb); 
														 |