metalsvm/arch/x86/include/asm/irqflags.h
Stefan Lankes 8868900e19 redesign of nested if flag handling
=> only clearing and setting of the IF flag
2011-04-08 16:02:28 +02:00

52 lines
1.2 KiB
C

/*
* Copyright 2010 Stefan Lankes, Chair for Operating Systems,
* RWTH Aachen University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is part of MetalSVM.
*/
#ifndef __ARCH_IRQFLAGS_H__
#define __ARCH_IRQFLAGS_H__
#ifdef __cplusplus
extern "C" {
#endif
inline static void irq_disable(void) {
asm volatile("cli" ::: "memory");
}
inline static uint32_t irq_nested_disable(void) {
uint32_t flags;
asm volatile("pushf; cli; popl %0": "=r"(flags) : : "memory");
if (flags & (1 << 9))
return 1;
return 0;
}
inline static void irq_enable(void) {
asm volatile("sti" ::: "memory");
}
inline static void irq_nested_enable(uint32_t flags) {
if (flags)
irq_enable();
}
#ifdef __cplusplus
}
#endif
#endif