@@
expression T;
@@
-msleep(T);
+kthread_usleep(1000 * T);

@@
expression TMIN;
expression TMAX;
@@
-usleep_range(TMIN, TMAX);
+kthread_usleep(TMIN);

// barriers
@@
@@
-barrier();
+cmb();

@@
@@
-smp_mb();
+mb();

@@
@@
-smp_rmb();
+rmb();

@@
@@
-smp_wmb();
+wmb();

@@
expression A0;
expression A1;
@@
-min(A0, A1)
+MIN(A0, A1)

@@
expression A0;
expression A1;
@@
-max(A0, A1)
+MAX(A0, A1)

@@
expression LO;
expression HI;
expression V;
@@
-clamp(V, LO, HI)
+CLAMP(V, LO, HI)

@@
expression A0;
expression A1;
type T;
@@
-min_t(T, A0, A1)
+MIN_T(T, A0, A1)

@@
expression A0;
expression A1;
type T;
@@
-max_t(T, A0, A1)
+MAX_T(T, A0, A1)

@@
expression LO;
expression HI;
expression V;
type T;
@@
-clamp_t(T, V, LO, HI)
+CLAMP_T(T, V, LO, HI)


// locking
// being conservative: they might not need irqsave
@@
expression E;
@@
-spin_lock_init(E)
+spinlock_init_irqsave(E)

@@
expression E;
@@
-spin_lock_bh(E)
+spin_lock_irqsave(E)

@@
expression E;
@@
-spin_unlock_bh(E)
+spin_unlock_irqsave(E)
@@

expression E;
@@
-spin_lock_irq(E)
+spin_lock_irqsave(E)

@@
expression E;
@@
-spin_unlock_irq(E)
+spin_unlock_irqsave(E)

@@
expression lock, flags;
@@
-spin_lock_irqsave(lock, flags)
+spin_lock_irqsave(lock)
...
-spin_unlock_irqrestore(lock, flags)
+spin_unlock_irqsave(lock)

@@
typedef raw_spinlock_t;
typedef spinlock_t;
@@
-raw_spinlock_t
+spinlock_t

@@
expression E;
@@
-raw_spin_lock_init(E)
+spinlock_init_irqsave(E)

@@
expression E;
@@
-raw_spin_lock(E)
+spin_lock_irqsave(E)

@@
expression E;
@@
-raw_spin_unlock(E)
+spin_unlock_irqsave(E)

@@
expression lock, flags;
@@
-raw_spin_lock_irqsave(lock, flags)
+spin_lock_irqsave(lock)
...
-raw_spin_unlock_irqrestore(lock, flags)
+spin_unlock_irqsave(lock)

@@
expression E;
@@
-ilog2(E)
+LOG2_UP(E)

@@
expression E;
@@
-roundup_pow_of_two(E)
+ROUNDUPPWR2(E)

@@
expression E;
@@
-rounddown_pow_of_two(E)
+ROUNDDOWNPWR2(E)

@@
expression E;
@@
-is_power_of_2(E)
+IS_PWR2(E)

@@
expression DST;
expression SRC;
expression LEN;
@@
-copy_from_user(DST, SRC, LEN)
+memcpy_from_user(current, DST, SRC, LEN)

@@
expression DST;
expression SRC;
expression LEN;
@@
-copy_to_user(DST, SRC, LEN)
+memcpy_to_user(current, DST, SRC, LEN)

@@
@@
-ktime_get_real()
+epoch_nsec()

@@
expression E;
@@
-ktime_to_ns(E)
+E

@@
expression E;
@@
-htonl(E)
+cpu_to_be32(E)

@@
expression E;
@@
-htons(E)
+cpu_to_be16(E)

@@
expression E;
@@
-ntohl(E)
+be32_to_cpu(E)

@@
expression E;
@@
-ntohs(E)
+be16_to_cpu(E)

@@
@@
-smp_processor_id()
+core_id()

// This is a little half-assed.  Any fix will need to be manually edited to
// provide a pointer to the pci device.  And you'll need to fix your handler to
// be the correct type.
@@
expression IRQ;
expression HANDLER;
expression FLAGS;
expression NAME;
expression ARG;
@@
-request_irq(IRQ, HANDLER, FLAGS, NAME, ARG)
+register_irq(IRQ, HANDLER, ARG, pci_to_tbdf(PCIDEV))

// There are 3 return types for the irq handlers, IRQ_NONE, IRQ_HANDLED, and
// IRQ_WAKE_THREAD.  We can change the first two to just return.  The latter
// will need manual attention, since they want a thread to handle the rest.
@@
identifier HANDLER;
typedef irqreturn_t;
@@
irqreturn_t HANDLER(...) {
<...
-return IRQ_NONE;
+return;
...>
}

// Need to comment out irqreturn_t, I guess because it's in a previous rule
@@
identifier HANDLER;
//typedef irqreturn_t;
@@
irqreturn_t HANDLER(...) {
<...
-return IRQ_HANDLED;
+return;
...>
}

// There should be a way to catch both decl and def at once...
// Changes the definition
@@
identifier HANDLER;
//typedef irqreturn_t;
identifier IRQ;
identifier ARG;
@@
-irqreturn_t HANDLER(int IRQ, void *ARG
+void HANDLER(struct hw_trapframe *hw_tf, void *ARG
 ) { ... }

// Changes the declaration
@@
identifier HANDLER;
//typedef irqreturn_t;
identifier IRQ;
identifier ARG;
@@
-irqreturn_t HANDLER(int IRQ, void *ARG
+void HANDLER(struct hw_trapframe *hw_tf, void *ARG
 );

@@
expression VAL;
expression UP;
@@
-roundup(VAL, UP)
+ROUNDUP(VAL, UP)

@@
expression VAL;
expression DOWN;
@@
-rounddown(VAL, DOWN)
+ROUNDDOWN(VAL, DOWN)

@@
expression STMT;
@@
-BUG_ON(STMT)
+assert(!(STMT))

@@
expression STMT;
@@
-BUILD_BUG_ON(STMT)
+static_assert(!(STMT))

@@
@@
-BUG()
+panic("BUG")

@@
@@
-WARN_ON
+warn_on

@@
@@
-WARN_ON_ONCE
+warn_on_once

@@
expression P;
@@
-pci_set_master(P)
+pci_set_bus_master(P)

@@
expression P;
@@
-pci_clear_master(P)
+pci_clr_bus_master(P)

@@
expression X;
@@
-upper_32_bits(X)
+high32(X)

@@
expression X;
@@
-lower_32_bits(X)
+low32(X)
