Skip to content

Commit 6cdefc1

Browse files
committed
Added Jason Conway's Re Ordering patch (upstream PR ish-app#1944. Fixed a bunch of compiler complaints about uncast variables, removed "easter egg" for now.
1 parent 02b6bd0 commit 6cdefc1

6 files changed

Lines changed: 42 additions & 23 deletions

File tree

jit/gadgets-aarch64/gadgets.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ _xaddr .req x3
3131
.endm
3232
.macro gret pop=0
3333
ldr x8, [_ip, \pop*8]!
34+
dmb ishld /* Jason Conway's Re Ordering patch (upstream PR #1944 */
3435
add _ip, _ip, 8 /* TODO get rid of this */
3536
br x8
3637
.endm

kernel/calls.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ syscall_t syscall_table[] = {
272272
[384] = (syscall_t) sys_arch_prctl,
273273
[403] = (syscall_t) syscall_stub, // clock_gettime64
274274
[407] = (syscall_t) syscall_stub, // clock_nanosleep_time64
275+
[412] = (syscall_t) syscall_stub, // utimensat_time64
275276
[436] = (syscall_t) syscall_stub,
276277
[439] = (syscall_t) sys_faccessat, // faccessat2
277278
};

kernel/resource_locking.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ extern unsigned critical_region_count(struct task*);
66
extern void modify_critical_region_counter(struct task*, int, char*, int);
77
extern unsigned locks_held_count(struct task*);
88
extern void modify_locks_held_count(struct task*, int);
9+
extern bool current_is_valid(void);
910

kernel/time.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@ static struct timer_spec timer_spec_to_real(struct itimerspec_ itspec) {
3636

3737
static struct itimerspec_ timer_spec_from_real(struct timer_spec spec) {
3838
struct itimerspec_ itspec = {
39-
.value.sec = spec.value.tv_sec,
40-
.value.nsec = spec.value.tv_nsec,
41-
.interval.sec = spec.interval.tv_sec,
42-
.interval.nsec = spec.interval.tv_nsec,
39+
.value.sec = (dword_t)spec.value.tv_sec,
40+
.value.nsec = (dword_t)spec.value.tv_nsec,
41+
.interval.sec = (dword_t)spec.interval.tv_sec,
42+
.interval.nsec = (dword_t)spec.interval.tv_nsec,
4343
};
4444
return itspec;
4545
};
4646

4747
dword_t sys_time(addr_t time_out) {
48-
dword_t now = time(NULL);
48+
dword_t now = (dword_t)time(NULL);
4949
if (time_out != 0)
5050
if (user_put(time_out, now))
5151
return _EFAULT;
@@ -73,8 +73,9 @@ dword_t sys_clock_gettime(dword_t clock, addr_t tp) {
7373
return errno_map();
7474
}
7575
struct timespec_ t;
76-
t.sec = ts.tv_sec;
77-
t.nsec = ts.tv_nsec;
76+
t.sec = (dword_t)ts.tv_sec;
77+
t.nsec = (dword_t)ts.tv_nsec;
78+
7879
if (user_put(tp, t))
7980
return _EFAULT;
8081
STRACE(" {%lds %ldns}", t.sec, t.nsec);
@@ -91,8 +92,8 @@ dword_t sys_clock_getres(dword_t clock, addr_t res_addr) {
9192
if (err < 0)
9293
return errno_map();
9394
struct timespec_ t;
94-
t.sec = res.tv_sec;
95-
t.nsec = res.tv_nsec;
95+
t.sec = (dword_t)res.tv_sec;
96+
t.nsec = (dword_t)res.tv_nsec;
9697
if (user_put(res_addr, t))
9798
return _EFAULT;
9899
return 0;
@@ -150,10 +151,10 @@ int_t sys_setitimer(int_t which, addr_t new_val_addr, addr_t old_val_addr) {
150151

151152
if (old_val_addr != 0) {
152153
struct itimerval_ old_val;
153-
old_val.interval.sec = old_spec.interval.tv_sec;
154-
old_val.interval.usec = old_spec.interval.tv_nsec / 1000;
155-
old_val.value.sec = old_spec.value.tv_sec;
156-
old_val.value.usec = old_spec.value.tv_nsec / 1000;
154+
old_val.interval.sec = (dword_t)old_spec.interval.tv_sec;
155+
old_val.interval.usec = (dword_t)old_spec.interval.tv_nsec / 1000;
156+
old_val.value.sec = (dword_t)old_spec.value.tv_sec;
157+
old_val.value.usec = (dword_t)old_spec.value.tv_nsec / 1000;
157158
if (user_put(old_val_addr, old_val))
158159
return _EFAULT;
159160
}
@@ -176,7 +177,7 @@ uint_t sys_alarm(uint_t seconds) {
176177
return err;
177178

178179
// Round up, and make sure to not return 0 if old_spec is > 0
179-
seconds = old_spec.value.tv_sec;
180+
seconds = (dword_t)old_spec.value.tv_sec;
180181
if (old_spec.value.tv_nsec >= 500000000)
181182
seconds++;
182183
if (seconds == 0 && !timespec_is_zero(old_spec.value))
@@ -203,8 +204,8 @@ dword_t sys_nanosleep(addr_t req_addr, addr_t rem_addr) {
203204
return errno_map();
204205
if (rem_addr != 0) {
205206
struct timespec_ rem_ts;
206-
rem_ts.sec = rem.tv_sec;
207-
rem_ts.nsec = rem.tv_nsec;
207+
rem_ts.sec = (dword_t)rem.tv_sec;
208+
rem_ts.nsec = (dword_t)rem.tv_nsec;
208209
if (user_put(rem_addr, rem_ts))
209210
return _EFAULT;
210211
}
@@ -235,8 +236,8 @@ dword_t sys_gettimeofday(addr_t tv, addr_t tz) {
235236
}
236237
struct timeval_ tv_;
237238
struct timezone_ tz_;
238-
tv_.sec = timeval.tv_sec;
239-
tv_.usec = timeval.tv_usec;
239+
tv_.sec = (dword_t)timeval.tv_sec;
240+
tv_.usec = (dword_t)timeval.tv_usec;
240241
tz_.minuteswest = timezone.tz_minuteswest;
241242
tz_.dsttime = timezone.tz_dsttime;
242243
if ((tv && user_put(tv, tv_)) || (tz && user_put(tz, tz_))) {

util/sync.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,17 @@ void modify_critical_region_counter(struct task *task, int value, __attribute__(
5252
if(!task->critical_region.count && (value < 0)) { // Prevent our unsigned value attempting to go negative. -mke
5353
//int skipme = strcmp(task->comm, "init");
5454
//if((task->pid > 2) && (skipme != 0)) // Why ask why? -mke
55-
printk("ERROR: Attempt to decrement critical_region count when it is already zero, ignoring(%s:%d) (%s:%d)\n", task->comm, task->pid, file, line);
55+
if(task->pid > 10)
56+
printk("ERROR: Attempt to decrement critical_region count when it is already zero, ignoring(%s:%d) (%s:%d)\n", task->comm, task->pid, file, line);
5657
return;
5758
}
5859

5960

60-
if((strcmp(task->comm, "easter_egg") == 0) && ( !noprintk)) { // Extra logging for the some command
61+
/* if((strcmp(task->comm, "easter_egg") == 0) && ( !noprintk)) { // Extra logging for the some command
6162
noprintk = 1; // Avoid recursive logging -mke
6263
printk("INFO: MCRC(%d(%s):%s:%d:%d:%d)\n", task->pid, task->comm, file, line, value, task->critical_region.count + value);
6364
noprintk = 0;
64-
}
65+
} */
6566

6667
task->critical_region.count = task->critical_region.count + value;
6768

@@ -139,7 +140,8 @@ int wait_for_ignore_signals(cond_t *cond, lock_t *lock, struct timespec *timeout
139140
current->waiting_lock = NULL;
140141
unlock(&current->waiting_cond_lock);
141142
//return _ETIMEDOUT;
142-
printk("ERROR: Locking PID is gone in wait_for_ignore_signals() (%s:%d). Attempting recovery\n", current->comm, current->pid);
143+
if(!strcmp("go", current->comm)) // go causes this a lot. To no particularly positive effect -mke
144+
printk("ERROR: Locking PID is gone in wait_for_ignore_signals() (%s:%d). Attempting recovery\n", current->comm, current->pid);
143145
unlock(lock);
144146
modify_critical_region_counter(current, -1,__FILE__, __LINE__);
145147
return 0;
@@ -152,7 +154,11 @@ int wait_for_ignore_signals(cond_t *cond, lock_t *lock, struct timespec *timeout
152154
if((lock->pid == -1) && (lock->comm[0] == 0)) { // Something has gone wrong. -mke
153155
goto AGAIN; // Ugh. -mke
154156
}
155-
rc = pthread_cond_timedwait_relative_np(&cond->cond, &lock->m, &trigger_time);
157+
if(lock->pid != -1) {
158+
rc = pthread_cond_timedwait_relative_np(&cond->cond, &lock->m, &trigger_time);
159+
} else {
160+
return 0; // More Kludgery. -mke
161+
}
156162
if(rc == ETIMEDOUT) {
157163
attempts++;
158164
if(attempts <= 6) // We are likely deadlocked if more than ten attempts -mke
@@ -232,6 +238,14 @@ unsigned critical_region_count(struct task *task) {
232238
unsigned critical_region_count_wrapper() { // sync.h can't know about the definition of struct due to recursive include files. -mke
233239
return(critical_region_count(current));
234240
}
241+
242+
bool current_is_valid(void) {
243+
if(current != NULL)
244+
return true;
245+
246+
return false;
247+
}
248+
235249
unsigned locks_held_count(struct task *task) {
236250
// return 0; // Short circuit for now
237251
if(task->pid < 10) // Here be monsters. -mke

util/sync.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern void modify_critical_region_counter_wrapper(int, const char*, int);
2323
extern unsigned locks_held_count_wrapper(void);
2424
extern void modify_locks_held_count_wrapper(int);
2525
extern struct pid *pid_get(dword_t id);
26+
extern bool current_is_valid(void);
2627

2728
extern struct timespec lock_pause;
2829

0 commit comments

Comments
 (0)