Problem was in the struct I was passing. Guess it wasn't as simple and benign as I made it sound. Really stupid mistake just too involved with the code to notice it. Here's the original with the mistake, can you figure it out?
struct sigproc_info
{
#if defined(__KERNEL__)
int dirty;
#endif
int pid;
int signum;
int irq;
} __attribute__ ((__packed__));
...
...
...
The call to _IOW takes the last argument, struct sigproc_info, and calls sizeof on it then performs some bit-shifting based on this value. So the kernel-space version was 4 larger than the user-space version since it had an extra int, dirty