Messages in this thread |  | | Date | Tue, 10 Oct 2000 00:09:13 +0100 | From | Kenn Humborg <> | Subject | Re: Calling current() from interrupt context |
| |
On Tue, Oct 10, 2000 at 12:55:33AM +0200, Andi Kleen wrote: > On Mon, Oct 09, 2000 at 11:45:18PM +0100, Kenn Humborg wrote: > > Simple. Each interrupt stack is, say, 8 pages. You have an array > > of N interrupt stacks. Then you calculate > > > > cpu_id = (sp & ~(INT_STACK_SIZE-1)) >> (PAGE_SHIFT + 3); > > > > Actually, I'd put the interrupt stack and any other per-cpu data > > structures together in this region. > > > So your smp_processor_id() looks like: > > #define smp_processor_id() \ > (in_interrupt() ? (sp & ~(INT_STACK_SIZE-1)) >> (PAGE_SHIFT + 3) : > (struct task_struct *)(sp & -8192)->current_cpu) > > > ?
Nope.
> There is just an ugly problem: in_interrupt already requires the CPU id > to look up the table of interrupt counters.
The PSL (processor status longword) has a bit that tells you whether you're currently on the interrupt stack or not. You can test this in two instructions:
movpsl r0 # get PSL bbs $0x25, r0, <dst> # branch if I bit set (bit 25)
Later, Kenn
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |