asm: add asm inline for system set/clear/test bit
This commit adds asm implementation for the methods: sys_io_set_bit sys_io_clear_bit sys_io_test_bit sys_io_test_and_set_bit sys_io_test_and_clear_bit Change-Id: I144568e113316fa43d943cdc5457cb17e66839c3 Signed-off-by: Juan Manuel Cruz <juan.m.cruz.alcaraz@linux.intel.com> Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
parent
5563290d36
commit
71c289dfbc
3 changed files with 201 additions and 2 deletions
|
@ -286,6 +286,79 @@ static inline __attribute__((always_inline))
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
void sys_io_set_bit(io_port_t port, int bit)
|
||||
{
|
||||
uint32_t reg = 0;
|
||||
|
||||
__asm__ volatile("inl %%dx, %%eax\n"
|
||||
"mov %1, 1\n"
|
||||
"shl %%cl, %1\n"
|
||||
"or %%eax, %1\n"
|
||||
"outl %%eax, %%dx;\n\t"
|
||||
:
|
||||
: "d" (port),
|
||||
"r" (reg), "d" (bit)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
void sys_io_clear_bit(io_port_t port, int bit)
|
||||
{
|
||||
uint32_t reg = 0;
|
||||
|
||||
__asm__ volatile("inl %%dx, %%eax\n"
|
||||
"mov %1, 1\n"
|
||||
"shl %%cl, %1\n"
|
||||
"and %%eax, %1\n"
|
||||
"outl %%eax, %%dx;\n\t"
|
||||
:
|
||||
: "d" (port),
|
||||
"r" (reg), "d" (bit)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
int sys_io_test_bit(io_port_t port, int bit)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
__asm__ volatile("inl %%dx, %%eax\n"
|
||||
"bt %2, %%eax\n"
|
||||
"lahf\n"
|
||||
"mov %1, %%eax\n"
|
||||
"clc;\n\t"
|
||||
: "=r" (ret)
|
||||
: "d" (port),
|
||||
"Mr" (bit)
|
||||
: "memory", "cc");
|
||||
|
||||
return (ret & 1);
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
int sys_io_test_and_set_bit(io_port_t port, int bit)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sys_io_test_bit(port, bit);
|
||||
sys_io_set_bit(port, bit);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
int sys_io_test_and_clear_bit(io_port_t port, int bit)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sys_io_test_bit(port, bit);
|
||||
sys_io_clear_bit(port, bit);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline __attribute__((always_inline))
|
||||
void sys_write8(uint8_t data, mm_reg_t addr)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue