signals in redhat 6.2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi people!

I have a kernel module working on kernel 2.2.14(RedHat 6.2)...
When interrupt occurs, special signal sends to the user process in the bottom-half of the interrupt handler.
And i have a corruption of signal information when signal come to the user handler 

Signal sending:
...
struct XXX_cbd 
{
    unsigned long       signature;
    void                (*isr)(void);
    struct sigaction    sa;
    sigset_t            mask;
};
...
struct siginfo info;
 
info.si_signo = dev->callback[channel].signo;
info.si_errno = channel;
info.si_code = SI_MESGQ;        // must be < 0 for info.si_ptr
 
info.si_pid = 0;        /* sending from kernel */
info.si_uid = 0;
info.si_ptr = dev->callback[channel].context; /* XXX_cbd struct */
send_sig_info(info.si_signo, &info, dev->callback[channel].process);
...

In user process in signal handler this signal is catched:

...
static void XXX_signal_handler(int signo, siginfo_t * siginfo, void * arg)
{
if(signo == SIGUSR2 && siginfo->si_signo == SIGUSR2 && 
siginfo->si_code == SI_MESGQ && siginfo->si_pid == 0 && siginfo->si_uid == 0)
    {
    struct XXX_cbd * cptr = (struct DM6420HR_cbd *)siginfo->si_ptr;
    if(cptr->signature == magic_signature && cptr->isr != NULL)
        (*cptr->isr)();
    }
}
...
But there is strange things: 
siginfo->si_code is 0 instead of SI_MESGQ
siginfo->si_uid not equal 0
and siginfo->si_ptr is 0 instead of valid pointer.

What a problem here?
PS.
In RedHat 7.3 ( kernel 2.4.18) all works fine.

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux