[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <200907301137.22035.lkml@morethan.org>
Date: Thu, 30 Jul 2009 11:37:18 -0500
From: "Michael S. Zick" <lkml@...ethan.org>
To: linux-kernel@...r.kernel.org
Subject: [RFC] Uni-processor interrupt state preservation.
In kernel/up.c - -
int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
int wait)
{
unsigned long flags;
WARN_ON(cpu != 0);
local_irq_save(flags);
(func)(info);
local_irq_restore(flags);
return 0;
}
It **looks** reasonable - -
but:
.L2:
#APP
# ul native_save_fl(void)
pushf ; pop %ebx
# native_irq_disable(void)
cli
#NO_APP
#(insn:TI 29 27 30 (set (reg:SI 0 ax [ info ])
# (reg/v/f:SI 4 si [orig:62 info ] [62])) 34 {*movsi_1} (insn_list:REG_DEP_TRUE 27 (nil))
# (expr_list:REG_DEAD (reg/v/f:SI 4 si [orig:62 info ] [62])
# (nil)))
movl %esi, %eax # 29 *movsi_1/1 [length = 2]
#(call_insn:TI 30 29 43 (call (mem:QI (reg/v/f:SI 5 di [orig:61 func ] [61]) [0 S1 A8])
# (const_int 0 [0x0])) 386 {*call_1} (insn_list:REG_DEP_TRUE 29 (insn_list:REG_DEP_TRUE 27 (nil)))
# (expr_list:REG_DEAD (reg:SI 0 ax [ info ])
# (expr_list:REG_DEAD (reg/v/f:SI 5 di [orig:61 func ] [61])
# (nil)))
# (expr_list:REG_DEP_TRUE (use (reg:SI 0 ax [ info ]))
# (nil)))
call *%edi # 30 *call_1 [length = 2]
#APP
# native_restore_fl(ul flags)
push %ebx ; popf
#NO_APP
Just how is the interrupt state (in ebx) supposed to be preserved across the function call?
(assembly comments where added in macros, just to clarify where this is coming from.)
Mike
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists