37 lines
1.0 KiB
C
37 lines
1.0 KiB
C
#ifndef _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
|
#define _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
|
|
|
#include <libkern/libkern.h>
|
|
#include <platform/generic/system.h>
|
|
#include <tasking/cpu.h>
|
|
|
|
/**
|
|
* By design the whole kernel is not interruptible, but some parts inside kernel
|
|
* could be interrupted without any bad consequences and at the same time these
|
|
* parts take a lot of cpu time, like copying data from/to user. We might want
|
|
* to mark them as interruptible.
|
|
*/
|
|
|
|
static ALWAYS_INLINE int interruptible_area_start()
|
|
{
|
|
int res = THIS_CPU->int_depth_counter;
|
|
THIS_CPU->int_depth_counter = 0;
|
|
system_enable_interrupts_no_counter();
|
|
return res;
|
|
}
|
|
|
|
static ALWAYS_INLINE int interruptible_area_end(int old)
|
|
{
|
|
system_disable_interrupts_no_counter();
|
|
THIS_CPU->int_depth_counter = old;
|
|
return 0;
|
|
}
|
|
|
|
#ifdef PREEMPT_KERNEL
|
|
#define INTERRUPTIBLE_AREA for (int __i = 0, __j = interruptible_area_start(); __i < 1; interruptible_area_end(__j), __i++)
|
|
#else
|
|
#define INTERRUPTIBLE_AREA if (true)
|
|
#endif
|
|
|
|
#endif // _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|