mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-20 01:46:31 +00:00
新增rust ffi (#77)
* 引入cargo * 取消对Cargo.lock的跟踪 * 解决vscode报错问题 * new: rust的代码能够调用c语言的printk_color * 1、将原本run.sh的工作拆解,变为几个不同的make命令 2、在docker镜像中编译rust * 更改workflow * update workflow * new: 解决workflow无法通过编译的问题
This commit is contained in:
99
kernel/src/common/atomic.h
Normal file
99
kernel/src/common/atomic.h
Normal file
@ -0,0 +1,99 @@
|
||||
/**
|
||||
* @file atomic.h
|
||||
* @author fslongjin (longjin@RinGoTek.cn)
|
||||
* @brief 原子变量
|
||||
* @version 0.1
|
||||
* @date 2022-04-12
|
||||
*
|
||||
* @copyright Copyright (c) 2022
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define atomic_read(atomic) ((atomic)->value) // 读取原子变量
|
||||
#define atomic_set(atomic,val) (((atomic)->value) = (val)) // 设置原子变量的初始值
|
||||
|
||||
typedef struct
|
||||
{
|
||||
volatile long value;
|
||||
} atomic_t;
|
||||
|
||||
/**
|
||||
* @brief 原子变量增加值
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
* @param val 要增加的值
|
||||
*/
|
||||
inline void atomic_add(atomic_t *ato, long val)
|
||||
{
|
||||
asm volatile("lock addq %1, %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "m"(val)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 原子变量减少值
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
* @param val 要减少的值
|
||||
*/
|
||||
inline void atomic_sub(atomic_t *ato, long val)
|
||||
{
|
||||
asm volatile("lock subq %1, %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "m"(val)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 原子变量自增
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
*/
|
||||
void atomic_inc(atomic_t *ato)
|
||||
{
|
||||
asm volatile("lock incq %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "m"(ato->value)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 原子变量自减
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
*/
|
||||
void atomic_dec(atomic_t *ato)
|
||||
{
|
||||
asm volatile("lock decq %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "m"(ato->value)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置原子变量的mask
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
*/
|
||||
inline void atomic_set_mask(atomic_t *ato, long mask)
|
||||
{
|
||||
__asm__ __volatile__("lock orq %1, %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "r"(mask)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 清除原子变量的mask
|
||||
*
|
||||
* @param ato 原子变量对象
|
||||
*/
|
||||
inline void atomic_clear_mask(atomic_t *ato, long mask)
|
||||
{
|
||||
__asm__ __volatile__("lock andq %1, %0 \n\t"
|
||||
: "=m"(ato->value)
|
||||
: "r"(mask)
|
||||
: "memory");
|
||||
}
|
Reference in New Issue
Block a user