commit
3b133b4fe7
|
@ -0,0 +1 @@
|
||||||
|
build
|
|
@ -140,3 +140,12 @@ distclean:
|
||||||
@rm -f .config*
|
@rm -f .config*
|
||||||
@rm -f $(KERNEL_ROOT)/lib/musllib/libmusl.a
|
@rm -f $(KERNEL_ROOT)/lib/musllib/libmusl.a
|
||||||
@rm -f $(KERNEL_ROOT)/board/*/.config
|
@rm -f $(KERNEL_ROOT)/board/*/.config
|
||||||
|
|
||||||
|
|
||||||
|
# Run qemu with config discribed in README.md.
|
||||||
|
.PHONY: qemu-default
|
||||||
|
qemu-default:
|
||||||
|
qemu-system-arm -M sabrelite -m 1G -smp 4 -cpu cortex-a9 \
|
||||||
|
-display none -serial null -serial stdio \
|
||||||
|
-kernel ./build/XiZi-imx6q-sabrelite.elf
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
bin
|
||||||
|
fs.img
|
||||||
|
user.map
|
|
@ -41,15 +41,28 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_create)(sem_t* sem, int* count)
|
||||||
return SEMAPHORE_SUC;
|
return SEMAPHORE_SUC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CHECK_SEM_RANGE(sem) \
|
||||||
|
do { \
|
||||||
|
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) { \
|
||||||
|
return SEMAPHORE_ERR; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define CHECK_SEM_RANGE_AND_VALID(sem) \
|
||||||
|
do { \
|
||||||
|
CHECK_SEM_RANGE(sem); \
|
||||||
|
\
|
||||||
|
if (!sem_pool[*sem].valid) { \
|
||||||
|
return SEMAPHORE_ERR; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
|
int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
|
||||||
{
|
{
|
||||||
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) {
|
CHECK_SEM_RANGE_AND_VALID(sem);
|
||||||
return SEMAPHORE_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sem_pool[*sem].valid) {
|
|
||||||
return SEMAPHORE_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
sem_pool[*sem].valid = false;
|
sem_pool[*sem].valid = false;
|
||||||
return SEMAPHORE_SUC;
|
return SEMAPHORE_SUC;
|
||||||
|
@ -57,9 +70,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
|
||||||
|
|
||||||
int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
|
int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
|
||||||
{
|
{
|
||||||
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) {
|
CHECK_SEM_RANGE(sem);
|
||||||
return SEMAPHORE_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @todo support timeout
|
/// @todo support timeout
|
||||||
// return if sem is freed(no valid) or sem count is sufficient
|
// return if sem is freed(no valid) or sem count is sufficient
|
||||||
|
@ -72,13 +83,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
|
||||||
|
|
||||||
int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem)
|
int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem)
|
||||||
{
|
{
|
||||||
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) {
|
CHECK_SEM_RANGE_AND_VALID(sem);
|
||||||
return SEMAPHORE_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sem_pool[*sem].valid) {
|
|
||||||
return SEMAPHORE_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
sem_pool[*sem].count++;
|
sem_pool[*sem].count++;
|
||||||
return SEMAPHORE_SUC;
|
return SEMAPHORE_SUC;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
mkfs
|
|
@ -77,8 +77,13 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages)
|
||||||
int i = 0, order = 0;
|
int i = 0, order = 0;
|
||||||
|
|
||||||
// find order
|
// find order
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
// see: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
|
||||||
|
order = nPages ? (sizeof(int) * 8 - __builtin_clz(nPages) - 1) + !!(__builtin_popcount(nPages) != 1) : 0;
|
||||||
|
#else
|
||||||
for (order = 0; (FREE_LIST_INDEX(order)) < nPages; order++)
|
for (order = 0; (FREE_LIST_INDEX(order)) < nPages; order++)
|
||||||
;
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
// find the free page list
|
// find the free page list
|
||||||
for (i = order; i < MAX_BUDDY_ORDER; i++) {
|
for (i = order; i < MAX_BUDDY_ORDER; i++) {
|
||||||
|
|
Loading…
Reference in New Issue