The final cause of rescheduling, a CPU fault, is an exception, somewhere between a hardware interrupt and a kernel call.
It operates asynchronously to the kernel (like an interrupt) but operates synchronously with the user code that caused it (like a kernel call—for example, a divide-by-zero exception). The same discussion as above (for hardware interrupts and kernel calls) applies to faults.