misc: Update several macros

This commit is contained in:
mintsuki 2022-08-26 23:30:00 +02:00
parent 16c5e98120
commit 65671d73c7
4 changed files with 29 additions and 26 deletions

View File

@ -74,7 +74,7 @@ struct volume *volume_get_by_bios_drive(int drive);
bool volume_read(struct volume *part, void *buffer, uint64_t loc, uint64_t count); bool volume_read(struct volume *part, void *buffer, uint64_t loc, uint64_t count);
#define volume_iterate_parts(_VOLUME_, _BODY_) ({ \ #define volume_iterate_parts(_VOLUME_, _BODY_) do { \
struct volume *_VOLUME = _VOLUME_; \ struct volume *_VOLUME = _VOLUME_; \
if (_VOLUME->pxe) { \ if (_VOLUME->pxe) { \
do { \ do { \
@ -101,6 +101,6 @@ bool volume_read(struct volume *part, void *buffer, uint64_t loc, uint64_t count
_BODY_ \ _BODY_ \
} \ } \
} \ } \
}) } while (0)
#endif #endif

View File

@ -9,6 +9,8 @@ extern bool verbose;
void print(const char *fmt, ...); void print(const char *fmt, ...);
void vprint(const char *fmt, va_list args); void vprint(const char *fmt, va_list args);
#define printv(FMT, ...) ({ if (verbose) print(FMT, ##__VA_ARGS__); }) #define printv(FMT, ...) do { \
if (verbose) print(FMT, ##__VA_ARGS__); \
} while (0)
#endif #endif

View File

@ -59,7 +59,9 @@ static size_t get_multiboot2_info_size(
ALIGN_UP(sizeof(struct multiboot_tag), MULTIBOOT_TAG_ALIGN); // end ALIGN_UP(sizeof(struct multiboot_tag), MULTIBOOT_TAG_ALIGN); // end
} }
#define append_tag(P, TAG) ({ (P) += ALIGN_UP((TAG)->size, MULTIBOOT_TAG_ALIGN); }) #define append_tag(P, TAG) do { \
(P) += ALIGN_UP((TAG)->size, MULTIBOOT_TAG_ALIGN); \
} while (0)
noreturn void multiboot2_load(char *config, char* cmdline) { noreturn void multiboot2_load(char *config, char* cmdline) {
struct file_handle *kernel_file; struct file_handle *kernel_file;

View File

@ -167,58 +167,57 @@ inline void delay(uint64_t cycles) {
} }
#define rdrand(type) ({ \ #define rdrand(type) ({ \
type ret; \ type rdrand__ret; \
asm volatile ( \ asm volatile ( \
"1: " \ "1: " \
"rdrand %0;" \ "rdrand %0;" \
"jnc 1b;" \ "jnc 1b;" \
: "=r" (ret) \ : "=r" (rdrand__ret) \
); \ ); \
ret; \ rdrand__ret; \
}) })
#define rdseed(type) ({ \ #define rdseed(type) ({ \
type ret; \ type rdseed__ret; \
asm volatile ( \ asm volatile ( \
"1: " \ "1: " \
"rdseed %0;" \ "rdseed %0;" \
"jnc 1b;" \ "jnc 1b;" \
: "=r" (ret) \ : "=r" (rdseed__ret) \
); \ ); \
ret; \ rdseed__ret; \
}) })
#define write_cr(reg, val) ({ \ #define write_cr(reg, val) do { \
asm volatile ("mov %0, %%cr" reg :: "r" (val) : "memory"); \ asm volatile ("mov %0, %%cr" reg :: "r" (val) : "memory"); \
}) } while (0)
#define read_cr(reg) ({ \ #define read_cr(reg) ({ \
size_t cr; \ size_t read_cr__cr; \
asm volatile ("mov %%cr" reg ", %0" : "=r" (cr) :: "memory"); \ asm volatile ("mov %%cr" reg ", %0" : "=r" (read_cr__cr) :: "memory"); \
cr; \ read_cr__cr; \
}) })
#define locked_read(var) ({ \ #define locked_read(var) ({ \
typeof(*var) ret = 0; \ typeof(*var) locked_read__ret = 0; \
asm volatile ( \ asm volatile ( \
"lock xadd %0, %1" \ "lock xadd %0, %1" \
: "+r" (ret) \ : "+r" (locked_read__ret) \
: "m" (*(var)) \ : "m" (*(var)) \
: "memory" \ : "memory" \
); \ ); \
ret; \ locked_read__ret; \
}) })
#define locked_write(var, val) ({ \ #define locked_write(var, val) do { \
typeof(*var) ret = val; \ __auto_type locked_write__ret = val; \
asm volatile ( \ asm volatile ( \
"lock xchg %0, %1" \ "lock xchg %0, %1" \
: "+r" ((ret)) \ : "+r" ((locked_write__ret)) \
: "m" (*(var)) \ : "m" (*(var)) \
: "memory" \ : "memory" \
); \ ); \
ret; \ } while (0)
})
#elif defined (__aarch64__) #elif defined (__aarch64__)
@ -229,14 +228,14 @@ inline uint64_t rdtsc(void) {
} }
#define locked_read(var) ({ \ #define locked_read(var) ({ \
typeof(*var) ret = 0; \ typeof(*var) locked_read__ret = 0; \
asm volatile ( \ asm volatile ( \
"ldar %0, %1" \ "ldar %0, %1" \
: "=r" (ret) \ : "=r" (locked_read__ret) \
: "m" (*(var)) \ : "m" (*(var)) \
: "memory" \ : "memory" \
); \ ); \
ret; \ locked_read__ret; \
}) })
inline size_t icache_line_size(void) { inline size_t icache_line_size(void) {