On 08.07.21 09:44, Bezdeka, Florian (T RDA IOT SES-DE) wrote:
> On Wed, 2021-07-07 at 22:16 +0200, Jan Kiszka via Xenomai wrote:
>> From: Jan Kiszka <[email protected]>
>>
>> Setting XNDBGCTRL for a thread will prevent its migration to secondary
>> if only the debugging signals SIGINT or SIGSTOP are pending. Such
>> threads will still be able to trigger migration on other signals, such
>> as SIGDEBUG (watchdog), SIGCANCEL (SIGRTMIN) or synchronous SIGTRAP.
>>
>> This is a building block for the debug helper feature.
>>
>> Signed-off-by: Jan Kiszka <[email protected]>
>> ---
>>  include/cobalt/uapi/kernel/thread.h |  1 +
>>  kernel/cobalt/posix/syscall.c       | 12 +++++++++++-
>>  2 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/cobalt/uapi/kernel/thread.h 
>> b/include/cobalt/uapi/kernel/thread.h
>> index 664def08ef..74007ac0d6 100644
>> --- a/include/cobalt/uapi/kernel/thread.h
>> +++ b/include/cobalt/uapi/kernel/thread.h
>> @@ -51,6 +51,7 @@
>>  #define XNTRAPLB  0x00100000 /**< Trap lock break (i.e. may not sleep with 
>> sched lock) */
>>  #define XNDEBUG   0x00200000 /**< User-level debugging enabled */
>>  #define XNDBGSTOP 0x00400000 /**< Stopped for synchronous debugging */
>> +#define XNDBGCTRL 0x00800000 /**< Thread is protected against 
>> SIGSTOP/SIGINT */
>>
>>
>>
>>
>>  /** @} */
>>
>>
>>
>>
>> diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
>> index cd72b22d14..618f965c2a 100644
>> --- a/kernel/cobalt/posix/syscall.c
>> +++ b/kernel/cobalt/posix/syscall.c
>> @@ -86,6 +86,8 @@ static void prepare_for_signal(struct task_struct *p,
>>                              struct pt_regs *regs,
>>                              int sysflags)
>>  {
>> +     sigset_t pending;
>> +     int ignore = 0;
> 
> Why not bool?

Good point, will change.

Jan

> 
>>       int notify = 0;
>>       spl_t s;
>>
>>
>>
>>
>> @@ -100,13 +102,21 @@ static void prepare_for_signal(struct task_struct *p,
>>                       xnthread_clear_info(thread, XNBREAK);
>>               }
>>               xnthread_clear_info(thread, XNKICKED);
>> +     } else if (xnthread_test_state(thread, XNDBGCTRL)) {
>> +             /* only ignore thread-specific SIGSTOP/SIGINT */
>> +             pending = p->pending.signal;
>> +             sigdelset(&pending, SIGSTOP);
>> +             sigdelset(&pending, SIGINT);
>> +             if (sigisemptyset(&pending))
>> +                     ignore = 1;
>>       }
>>
>>
>>
>>
>>       xnlock_put_irqrestore(&nklock, s);
>>
>>
>>
>>
>>       xnthread_test_cancel();
>>
>>
>>
>>
>> -     xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
>> +     if (!ignore)
>> +             xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
>>  }
>>
>>
>>
>>
>>  static COBALT_SYSCALL(migrate, current, (int domain))
> 


-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

Reply via email to