Support XiZi_AIoT

This commit is contained in:
TXuian
2024-01-31 10:30:34 +08:00
parent f6cf46027d
commit 494312183b
351 changed files with 46408 additions and 450091 deletions
+1 -11
View File
@@ -1,14 +1,4 @@
SRC_DIR :=
MUSL_DIR :=
ifeq ($(CONFIG_LIB_NEWLIB),y)
SRC_DIR += newlib
endif
ifeq ($(CONFIG_LIB_MUSLLIB), y)
# SRC_DIR += musllib
# MUSL_DIR += musllib
endif
SRC_DIR := ipc
include $(KERNEL_ROOT)/compiler.mk
@@ -0,0 +1,17 @@
toolchain ?= arm-none-eabi-
cc = ${toolchain}gcc
ld = ${toolchain}g++
objdump = ${toolchain}objdump
user_ldflags = -N -Ttext 0
cflags = -std=c11 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie
c_useropts = -O0
INC_DIR = -I$(KERNEL_ROOT)/services/shell/letter-shell -I$(KERNEL_ROOT)/services/lib/ipc -I$(KERNEL_ROOT)/services/boards/imx6q-sabrelite
all: libipc.o session.o
@mv $^ ../../boards/imx6q-sabrelite
%.o: %.c
@echo "cc $^"
@${cc} ${cflags} ${c_useropts} ${INC_DIR} -o $@ -c $^
@@ -0,0 +1,541 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file ipcargs.c
* @brief macros to supprt libipc
* @version 3.0
* @author AIIT XUOS Lab
* @date 2023.08.25
*/
/*************************************************
File name: ipcargs.c
Description: macros to supprt libipc
Others:
History:
1. Date: 2023-08-28
Author: AIIT XUOS Lab
Modification:
1. first version
*************************************************/
#pragma once
#define ARG(x) (x)
#define DEAULT_VA_NUM 12
#define _VA_NUM(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, N, M, ...) ((N == M + 1) ? ((N == 1) ? ((#x0)[0] != 0) : N) : DEAULT_VA_NUM)
#define VA_NUM(...) ARG(_VA_NUM(__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1))
#define _VA_ARG0(x0, ...) (x0)
#define _VA_ARG1(x0, x1, ...) (x1)
#define _VA_ARG2(x0, x1, x2, ...) (x2)
#define _VA_ARG3(x0, x1, x2, x3, ...) (x3)
#define _VA_ARG4(x0, x1, x2, x3, x4, ...) (x4)
#define _VA_ARG5(x0, x1, x2, x3, x4, x5, ...) (x5)
#define _VA_ARG6(x0, x1, x2, x3, x4, x5, x6, ...) (x6)
#define _VA_ARG7(x0, x1, x2, x3, x4, x5, x6, x7, ...) (x7)
#define _VA_ARG8(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) (x8)
#define _VA_ARG9(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) (x9)
#define _VA_ARG10(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) (x10)
#define _VA_ARG11(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) (x11)
#define _VA_ARG0_WO(x0, ...) x0
#define _VA_ARG1_WO(x0, x1, ...) x1
#define _VA_ARG2_WO(x0, x1, x2, ...) x2
#define _VA_ARG3_WO(x0, x1, x2, x3, ...) x3
#define _VA_ARG4_WO(x0, x1, x2, x3, x4, ...) x4
#define _VA_ARG5_WO(x0, x1, x2, x3, x4, x5, ...) x5
#define _VA_ARG6_WO(x0, x1, x2, x3, x4, x5, x6, ...) x6
#define _VA_ARG7_WO(x0, x1, x2, x3, x4, x5, x6, x7, ...) x7
#define _VA_ARG8_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) x8
#define _VA_ARG9_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) x9
#define _VA_ARG10_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) x10
#define _VA_ARG11_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) x11
#define _VA_FRONT_ARG1(...) _VA_ARG0_WO(__VA_ARGS__)
#define _VA_FRONT_ARG2(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__)
#define _VA_FRONT_ARG3(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__)
#define _VA_FRONT_ARG4(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__)
#define _VA_FRONT_ARG5(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__)
#define _VA_FRONT_ARG6(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__)
#define _VA_FRONT_ARG7(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__)
#define _VA_FRONT_ARG8(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__)
#define _VA_FRONT_ARG9(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__)
#define _VA_FRONT_ARG10(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__), _VA_ARG9_WO(__VA_ARGS__)
#define _VA_FRONT_ARG11(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__), _VA_ARG9_WO(__VA_ARGS__), _VA_ARG10_WO(__VA_ARGS__)
#define _VA_ARG0_PTR(x0, ...) void* x0
#define _VA_ARG1_PTR(x0, x1, ...) void* x1
#define _VA_ARG2_PTR(x0, x1, x2, ...) void* x2
#define _VA_ARG3_PTR(x0, x1, x2, x3, ...) void* x3
#define _VA_ARG4_PTR(x0, x1, x2, x3, x4, ...) void* x4
#define _VA_ARG5_PTR(x0, x1, x2, x3, x4, x5, ...) void* x5
#define _VA_ARG6_PTR(x0, x1, x2, x3, x4, x5, x6, ...) void* x6
#define _VA_ARG7_PTR(x0, x1, x2, x3, x4, x5, x6, x7, ...) void* x7
#define _VA_ARG8_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) void* x8
#define _VA_ARG9_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) void* x9
#define _VA_ARG10_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) void* x10
#define _VA_ARG11_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) void* x11
#define _VA_FRONT_PTR_ARG1(...) _VA_ARG0_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG2(...) _VA_FRONT_PTR_ARG1(__VA_ARGS__), _VA_ARG1_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG3(...) _VA_FRONT_PTR_ARG2(__VA_ARGS__), _VA_ARG2_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG4(...) _VA_FRONT_PTR_ARG3(__VA_ARGS__), _VA_ARG3_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG5(...) _VA_FRONT_PTR_ARG4(__VA_ARGS__), _VA_ARG4_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG6(...) _VA_FRONT_PTR_ARG5(__VA_ARGS__), _VA_ARG5_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG7(...) _VA_FRONT_PTR_ARG6(__VA_ARGS__), _VA_ARG6_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG8(...) _VA_FRONT_PTR_ARG7(__VA_ARGS__), _VA_ARG7_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG9(...) _VA_FRONT_PTR_ARG8(__VA_ARGS__), _VA_ARG8_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG10(...) _VA_FRONT_PTR_ARG9(__VA_ARGS__), _VA_ARG9_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG11(...) _VA_FRONT_PTR_ARG10(__VA_ARGS__), _VA_ARG10_PTR(__VA_ARGS__)
#define _VA_FRONT_PTR_ARG12(...) _VA_FRONT_PTR_ARG11(__VA_ARGS__), _VA_ARG11_PTR(__VA_ARGS__)
#define _VA_ARGS_SECOND(x1, ...) __VA_ARGS__
#define _VA_WRAP_INNER(wrap, x, ...) wrap x
#define _VA_FRONT_WRAP_ARG1(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG2(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG1(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG3(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG2(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG4(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG3(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG5(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG4(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG6(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG5(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG7(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG6(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG8(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG7(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG9(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG8(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG10(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG9(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG11(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG10(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG12(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG11(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG13(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG12(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG14(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG13(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG15(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG14(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG16(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG15(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG17(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG16(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG18(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG17(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG19(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG18(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG20(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG19(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG21(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG20(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG22(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG21(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG23(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG22(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG24(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG23(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG25(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG24(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG26(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG25(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG27(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG26(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG28(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG27(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG29(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG28(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG30(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG29(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG31(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG30(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG32(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG31(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG33(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG32(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG34(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG33(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG35(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG34(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG36(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG35(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG37(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG36(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG38(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG37(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG39(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG38(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG40(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG39(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG41(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG40(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG42(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG41(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG43(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG42(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG44(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG43(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG45(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG44(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG46(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG45(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG47(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG46(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG48(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG47(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG49(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG48(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG50(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG49(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG51(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG50(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG52(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG51(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG53(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG52(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG54(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG53(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG55(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG54(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG56(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG55(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG57(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG56(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG58(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG57(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG59(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG58(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG60(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG59(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG61(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG60(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG62(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG61(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG63(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG62(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG64(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG63(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG65(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG64(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG66(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG65(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG67(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG66(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG68(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG67(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG69(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG68(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG70(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG69(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG71(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG70(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG72(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG71(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG73(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG72(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG74(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG73(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG75(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG74(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG76(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG75(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG77(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG76(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG78(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG77(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG79(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG78(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG80(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG79(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG81(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG80(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG82(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG81(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG83(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG82(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG84(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG83(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG85(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG84(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG86(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG85(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG87(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG86(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG88(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG87(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG89(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG88(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG90(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG89(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG91(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG90(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG92(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG91(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG93(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG92(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG94(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG93(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG95(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG94(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG96(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG95(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG97(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG96(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG98(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG97(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG99(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG98(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG100(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG99(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG101(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG100(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG102(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG101(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG103(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG102(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG104(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG103(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG105(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG104(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG106(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG105(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG107(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG106(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG108(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG107(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG109(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG108(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG110(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG109(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG111(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG110(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG112(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG111(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG113(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG112(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG114(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG113(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG115(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG114(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG116(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG115(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG117(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG116(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG118(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG117(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG119(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG118(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG120(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG119(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG121(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG120(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG122(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG121(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG123(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG122(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG124(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG123(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG125(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG124(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG126(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG125(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG127(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG126(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG128(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG127(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG129(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG128(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG130(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG129(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG131(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG130(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG132(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG131(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG133(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG132(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG134(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG133(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG135(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG134(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG136(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG135(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG137(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG136(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG138(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG137(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG139(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG138(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG140(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG139(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG141(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG140(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG142(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG141(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG143(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG142(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG144(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG143(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG145(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG144(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG146(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG145(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG147(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG146(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG148(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG147(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG149(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG148(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG150(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG149(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG151(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG150(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG152(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG151(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG153(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG152(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG154(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG153(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG155(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG154(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG156(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG155(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG157(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG156(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG158(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG157(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG159(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG158(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
#define _VA_FRONT_WRAP_ARG160(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG159(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
/// @todo support more, but currently supports up to 160
#define _VA_LAST_ARG1(x0, ...) __VA_ARGS__
#define _VA_LAST_ARG2(x0, x1, ...) __VA_ARGS__
#define _VA_LAST_ARG3(x0, x1, x2, ...) __VA_ARGS__
#define _VA_LAST_ARG4(x0, x1, x2, x3, ...) __VA_ARGS__
#define _VA_LAST_ARG5(x0, x1, x2, x3, x4, ...) __VA_ARGS__
#define _VA_LAST_ARG6(x0, x1, x2, x3, x4, x5, ...) __VA_ARGS__
#define _VA_LAST_ARG7(x0, x1, x2, x3, x4, x5, x6, ...) __VA_ARGS__
#define _VA_LAST_ARG8(x0, x1, x2, x3, x4, x5, x6, x7, ...) __VA_ARGS__
#define _VA_LAST_ARG9(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) __VA_ARGS__
#define _VA_LAST_ARG10(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) __VA_ARGS__
#define _VA_LAST_ARG11(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) __VA_ARGS__
#define _VA_LAST_ARG12(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) __VA_ARGS__
#define IPC_MSG_SET_ARG1(msg, v1, l1) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
} while (0)
#define IPC_MSG_SET_ARG2(msg, v1, v2, l1, l2) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
} while (0)
#define IPC_MSG_SET_ARG3(msg, v1, v2, v3, l1, l2, l3) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
} while (0)
#define IPC_MSG_SET_ARG4(msg, v1, v2, v3, v4, l1, l2, l3, l4) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
} while (0)
#define IPC_MSG_SET_ARG5(msg, v1, v2, v3, v4, v5, l1, l2, l3, l4, l5) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
} while (0)
#define IPC_MSG_SET_ARG6(msg, v1, v2, v3, v4, v5, v6, l1, l2, l3, l4, l5, l6) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
} while (0)
#define IPC_MSG_SET_ARG7(msg, v1, v2, v3, v4, v5, v6, v7, l1, l2, l3, l4, l5, l6, l7) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
} while (0)
#define IPC_MSG_SET_ARG8(msg, v1, v2, v3, v4, v5, v6, v7, v8, l1, l2, l3, l4, l5, l6, l7, l8) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
} while (0)
#define IPC_MSG_SET_ARG9(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, l1, l2, l3, l4, l5, l6, l7, l8, l9) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
} while (0)
#define IPC_MSG_SET_ARG10(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
} while (0)
#define IPC_MSG_SET_ARG11(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
ipc_msg_set_nth_arg(msg, 10, v11, l11); \
} while (0)
#define IPC_MSG_SET_ARG12(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) \
do { \
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
ipc_msg_set_nth_arg(msg, 10, v11, l11); \
ipc_msg_set_nth_arg(msg, 11, v12, l12); \
} while (0)
#define IPC_MSG_GET_ARG1(msg, v1, l1) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
} while (0)
#define IPC_MSG_GET_ARG2(msg, v1, v2, l1, l2) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
} while (0)
#define IPC_MSG_GET_ARG3(msg, v1, v2, v3, l1, l2, l3) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
} while (0)
#define IPC_MSG_GET_ARG4(msg, v1, v2, v3, v4, l1, l2, l3, l4) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
} while (0)
#define IPC_MSG_GET_ARG5(msg, v1, v2, v3, v4, v5, l1, l2, l3, l4, l5) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
} while (0)
#define IPC_MSG_GET_ARG6(msg, v1, v2, v3, v4, v5, v6, l1, l2, l3, l4, l5, l6) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
} while (0)
#define IPC_MSG_GET_ARG7(msg, v1, v2, v3, v4, v5, v6, v7, l1, l2, l3, l4, l5, l6, l7) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
} while (0)
#define IPC_MSG_GET_ARG8(msg, v1, v2, v3, v4, v5, v6, v7, v8, l1, l2, l3, l4, l5, l6, l7, l8) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
} while (0)
#define IPC_MSG_GET_ARG9(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, l1, l2, l3, l4, l5, l6, l7, l8, l9) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
} while (0)
#define IPC_MSG_GET_ARG10(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
} while (0)
#define IPC_MSG_GET_ARG11(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
ipc_msg_get_nth_arg(msg, 10, v11, l11); \
} while (0)
#define IPC_MSG_GET_ARG12(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) \
do { \
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
ipc_msg_get_nth_arg(msg, 10, v11, l11); \
ipc_msg_get_nth_arg(msg, 11, v12, l12); \
} while (0)
#define IPC_DO_SERVE1(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0])
#define IPC_DO_SERVE2(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1])
#define IPC_DO_SERVE3(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2])
#define IPC_DO_SERVE4(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3])
#define IPC_DO_SERVE5(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4])
#define IPC_DO_SERVE6(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5])
#define IPC_DO_SERVE7(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6])
#define IPC_DO_SERVE8(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7])
#define IPC_DO_SERVE9(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8])
#define IPC_DO_SERVE10(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9])
#define IPC_DO_SERVE11(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10])
#define IPC_DO_SERVE12(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11])
@@ -0,0 +1,206 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file libipc.c
* @brief package seesion for inter process call perpose
* @version 3.0
* @author AIIT XUOS Lab
* @date 2023.08.25
*/
/*************************************************
File name: libipc.c
Description: package seesion for inter process call perpose
Others:
History:
1. Date: 2023-08-28
Author: AIIT XUOS Lab
Modification:
1. first version
*************************************************/
#include <string.h>
#include "libipc.h"
#include "libserial.h"
#include "usyscall.h"
/// @warning this file doesnt support multi threads
/// ipc part
struct IpcMsg* new_ipc_msg(struct Session* session, const int argc, const int* arg_size)
{
int len = IPC_ARG_INFO_BASE_OFFSET;
int arg_info_offset = len; // start of arg info
len += argc * sizeof(struct IpcArgInfo);
int arg_buf_offset = len; // start of arg buffer
for (int i = 0; i < argc; i++) {
len += arg_size[i];
}
struct IpcMsg* buf = session_alloc_buf(session, len);
if (buf == NULL) {
return NULL;
}
buf->header.len = len;
buf->header.done = 0;
buf->header.valid = 0;
for (int i = 0; i < argc; i++) {
struct IpcArgInfo* arg_info = (struct IpcArgInfo*)((char*)buf + arg_info_offset);
arg_info->len = arg_size[i];
arg_info->offset = arg_buf_offset;
// update arg_info_offset and arg_buf_offset
arg_info_offset += sizeof(struct IpcArgInfo);
arg_buf_offset += arg_size[i];
}
buf->header.nr_args = argc;
buf->header.init = 1;
return buf;
}
/// @brief set nth arg in ipc_msg with data
/// @param msg
/// @param arg_num start with 0 for first arg
/// @param data
/// @param len data buffer len
/// @return
bool ipc_msg_set_nth_arg(struct IpcMsg* msg, const int arg_num, const void* const data, const int len)
{
if (arg_num >= msg->header.nr_args) {
printf("[%s] IPC: arg_num out of msg range, arg_num: %d, nr_args: %d\n", __func__, arg_num, msg->header.nr_args);
return false;
}
struct IpcArgInfo* nth_arg_info = IPCMSG_ARG_INFO(msg, arg_num);
if (len > nth_arg_info->len) {
printf("[%s] IPC: size of arg out of buffer range, given len: %d, len %d\n", __func__, len, nth_arg_info->len);
return false;
}
void* buf = ipc_msg_get_nth_arg_buf(msg, arg_num);
memmove(buf, data, len);
return true;
}
/// @brief get nth arg in ipc_msg and move value to data
/// @param msg
/// @param arg_num start with 0 for first arg
/// @param data
/// @param len data buffer len
/// @return
bool ipc_msg_get_nth_arg(struct IpcMsg* msg, const int arg_num, void* data, const int len)
{
if (arg_num >= msg->header.nr_args) {
printf("[%s] IPC: arg_num out of msg range", __func__);
return false;
}
struct IpcArgInfo* nth_arg_info = IPCMSG_ARG_INFO(msg, arg_num);
if (len > nth_arg_info->len) {
printf("[%s] IPC: size of arg out of buffer range", __func__);
return false;
}
void* buf = ipc_msg_get_nth_arg_buf(msg, arg_num);
memmove(data, buf, len);
return true;
}
void ipc_msg_send_wait(struct IpcMsg* msg)
{
msg->header.magic = IPC_MSG_MAGIC;
msg->header.valid = 1;
msg->header.done = 0;
while (msg->header.done == 0) {
/// @todo syscall yield with prio decrease
yield();
}
assert(msg->header.done == 1);
}
void ipc_msg_send_nowait(struct IpcMsg* msg)
{
msg->header.magic = IPC_MSG_MAGIC;
msg->header.valid = 1;
msg->header.done = 0;
}
int ipc_session_wait(struct Session* session)
{
struct IpcMsg* msg = IPCSESSION_MSG(session);
while (msg->header.done == 0) {
/// @todo syscall yield with prio decrease
yield();
}
assert(msg->header.done == 1);
return msg->header.ret_val;
}
static int cur_sess_id = -1;
int cur_session_id(void)
{
return cur_sess_id;
}
static bool session_delayed = false;
void delay_session(void)
{
session_delayed = true;
}
void ipc_server_loop(struct IpcNode* ipc_node)
{
struct Session session_list[NR_MAX_SESSION];
for (;;) {
/* if connect sessions are greater than NR_MAX_SESSION,
a full round will require multiple polls.
Eg.(3 polls to with 6 sessions and NR_MAX_SESSION = 4):
[0, 1, 2, 3], [4, 5, 0, 1], [2, 3, 4, 5]
*/
poll_session(session_list, NR_MAX_SESSION);
/* handle each session */
for (int i = 0; i < NR_MAX_SESSION; i++) {
if (session_list[i].buf == NULL) {
yield();
break;
}
cur_sess_id = session_list[i].id;
struct IpcMsg* msg = IPCSESSION_MSG(&session_list[i]);
/* handle every message in current session
a session could be delay in case one of its message(current message) needs to wait for an interrupt message's arrival
interfaces[opcode] should explicitly call delay_session() and return to delay this session
*/
while (msg->header.magic == IPC_MSG_MAGIC && msg->header.valid == 1 && msg->header.done != 1) {
// printf("session %d [%d, %d]\n", session_list[i].id, session_list[i].head, session_list[i].tail);
if (session_used_size(&session_list[i]) == 0 && session_forward_tail(&session_list[i], msg->header.len) < 0) {
break;
}
if (ipc_node->interfaces[msg->header.opcode]) {
ipc_node->interfaces[msg->header.opcode](msg);
// check if this session is delayed by op handler, all messages after the delayed message in current session is blocked.
if (session_delayed) {
session_delayed = false;
break;
}
} else {
printf("Unsupport opcode(%d) for server: %s\n", msg->header.opcode, ipc_node->name);
}
// finish this message in server's perspective
while (session_forward_head(&session_list[i], msg->header.len) < 0) {
yield();
}
msg = IPCSESSION_MSG(&session_list[i]);
}
// stop handle this session
cur_sess_id = -1;
}
}
}
@@ -0,0 +1,235 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file libipc.h
* @brief libipc header
* @version 3.0
* @author AIIT XUOS Lab
* @date 2023.08.25
*/
/*************************************************
File name: libipc.h
Description: libipc header
Others:
History:
1. Date: 2023-08-28
Author: AIIT XUOS Lab
Modification:
1. first version
*************************************************/
#pragma once
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "ipcargs.h"
#include "session.h"
#define NR_MAX_SESSION 16
#define IPC_MSG_MAGIC 0xABCDDCBA
typedef struct {
union {
uint64_t header;
struct {
uint64_t valid : 1; // for server to peek new msg
uint64_t done : 1; // for client to check request done
uint64_t init : 1; // for client to check request done
uint64_t reserved : 1;
uint64_t nr_args : 4;
uint64_t opcode : 8;
uint64_t len : 16;
uint64_t magic : 32;
};
};
int32_t ret_val;
} __attribute__((packed)) ipc_msg_header;
struct IpcArgInfo {
uint16_t offset;
uint16_t len;
};
/* [header, ipc_arg_buffer_len[], ipc_arg_buffer[]] */
struct IpcMsg {
ipc_msg_header header;
uintptr_t buf[];
};
enum {
IPC_ARG_INFO_BASE_OFFSET = sizeof(ipc_msg_header),
};
typedef int (*IpcInterface)(struct IpcMsg* msg);
struct IpcNode {
char* name;
IpcInterface interfaces[UINT8_MAX];
};
#define IPC_SERVER_LOOP(ipc_node_name) rpc_server_loop_##rpc_node_name
#define IPC_SERVICES(ipc_node_name, ...) \
typedef enum { \
ipc_node_name##_IPC_OP_CODE_DEFAULT = 0, \
__VA_ARGS__, \
ipc_node_name##_IPC_OP_CODE_END, \
} IpcOpCode_##ipc_node_name;
#define _IPC_INSERT_SERVE(interface) [interface] = IPC_SERVE(interface)
#define IPC_SERVER_REGISTER_INTERFACES(ipc_node_name, num_interfaces, ...) \
static struct IpcNode ipc_node_name = (struct IpcNode) \
{ \
.interfaces = { \
_VA_FRONT_WRAP_ARG##num_interfaces(_IPC_INSERT_SERVE, __VA_ARGS__), \
}, \
}
#define IPCSESSION_MSG(session) ((struct IpcMsg*)((char*)((session)->buf) + (session)->head))
#define IPCMSG_ARG_INFO_BASE(msg) ((struct IpcArgInfo*)((char*)msg + sizeof(ipc_msg_header)))
#define IPCMSG_ARG_INFO(msg, nth) ((struct IpcArgInfo*)((char*)IPCMSG_ARG_INFO_BASE(msg) + (nth * sizeof(struct IpcArgInfo))))
/// @brief get buffer of nth arg in ipc_msg
/// @param msg
/// @param arg_num start with 0 for first arg
/// @return
__attribute__((__always_inline__)) static inline void* ipc_msg_get_nth_arg_buf(struct IpcMsg* msg, int arg_num)
{
return (void*)((char*)msg + IPCMSG_ARG_INFO(msg, arg_num)->offset);
}
/// @brief get return val of ipc call after done, used by client
/// @param msg
/// @param ret_val
__attribute__((__always_inline__)) static inline void ipc_msg_get_return(struct IpcMsg* msg, int32_t* ret_val)
{
assert(msg->header.done == 1);
memcpy(ret_val, &msg->header.ret_val, sizeof(msg->header.ret_val));
return;
}
/// @brief set return val of ipc call after serve, used by server
/// @param msg
/// @param ret_val
__attribute__((__always_inline__)) static inline void ipc_msg_set_return(struct IpcMsg* msg, int32_t* ret_val)
{
assert(msg->header.valid == 1);
memcpy(&msg->header.ret_val, ret_val, sizeof(msg->header.ret_val));
return;
}
/// @brief set opcode to msg
/// @param msg
/// @param opcode
/// @return
__attribute__((__always_inline__)) static inline bool ipc_msg_set_opcode(struct IpcMsg* msg, int opcode)
{
if (opcode < 0 || opcode > UINT8_MAX) {
return false;
}
msg->header.opcode = opcode;
return true;
}
/// @brief get opcode from msg
/// @param msg
/// @return opcode, -1 if opcode is invalid
__attribute__((__always_inline__)) static inline int ipc_msg_get_opcode(struct IpcMsg* msg)
{
assert(msg->header.valid == 1);
int opcode = msg->header.opcode;
if (opcode < 0 || opcode > UINT8_MAX) {
return -1;
}
return opcode;
}
/// @brief delete first msg in session
/// @param session
/// @return
__attribute__((__always_inline__)) static inline bool ipc_session_forward(struct Session* session)
{
struct IpcMsg* msg = IPCSESSION_MSG(session);
if (msg->header.init != 1) {
return false;
}
return session_free_buf(session, msg->header.len);
}
struct IpcMsg* new_ipc_msg(struct Session* session, const int argc, const int* arg_size);
bool ipc_msg_set_nth_arg(struct IpcMsg* msg, const int arg_num, const void* const data, const int len);
bool ipc_msg_get_nth_arg(struct IpcMsg* msg, const int arg_num, void* data, const int len);
void ipc_msg_send_wait(struct IpcMsg* msg);
void ipc_msg_send_nowait(struct IpcMsg* msg);
int ipc_session_wait(struct Session* session);
void ipc_server_loop(struct IpcNode* ipc_node);
#define IPC_CREATE_MSG_FUNC(ipc_name) ipc_msg_##ipc_name
#define IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name) ipc_msg_args_copy_set_##ipc_name
#define IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name) ipc_msg_args_copy_get_##ipc_name
#define IPC_CALL(ipc_name) ipc_call_copy_args_##ipc_name
#define IPC_SERVE(ipc_name) ipc_serve_##ipc_name
#define IPC_DO_SERVE_FUNC(ipc_name) ipc_do_serve_##ipc_name
#define IPC_INTERFACE(ipc_name, argc, ...) \
__always_inline static inline struct IpcMsg* IPC_CREATE_MSG_FUNC(ipc_name)(struct Session * session, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
{ \
int argv[argc] = { _VA_LAST_ARG##argc(__VA_ARGS__) }; \
return new_ipc_msg(session, argc, argv); \
} \
\
__always_inline static inline bool IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name)(struct IpcMsg * msg, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
{ \
IPC_MSG_SET_ARG##argc(msg, __VA_ARGS__); \
return true; \
} \
\
__always_inline static inline bool IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name)(struct IpcMsg * msg, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
{ \
IPC_MSG_GET_ARG##argc(msg, __VA_ARGS__); \
return true; \
} \
\
static int IPC_CALL(ipc_name)(struct Session * session, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
{ \
if (session == NULL) { \
return -1; \
} \
struct IpcMsg* msg = IPC_CREATE_MSG_FUNC(ipc_name)(session, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
int ret = IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name)(msg, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
ret = ipc_msg_set_opcode(msg, ipc_name); \
ipc_msg_send_wait(msg); \
ret = IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name)(msg, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
int32_t res = 0; \
ipc_msg_get_return(msg, &res); \
ipc_session_forward(session); \
return res; \
}
#define IPC_SERVER_INTERFACE(ipc_name, argc) \
static int IPC_SERVE(ipc_name)(struct IpcMsg * msg) \
{ \
void* argv[argc]; \
for (int i = 0; i < argc; i++) { \
argv[i] = ipc_msg_get_nth_arg_buf(msg, i); \
} \
int32_t _ret = IPC_DO_SERVE##argc(ipc_name); \
ipc_msg_set_return(msg, &_ret); \
msg->header.done = 1; \
return 0; \
}
int cur_session_id(void);
void delay_session(void);
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file session.c
* @brief session
* @version 3.0
* @author AIIT XUOS Lab
* @date 2023.08.25
*/
/*************************************************
File name: session.c
Description: session
Others:
History:
1. Date: 2023-08-28
Author: AIIT XUOS Lab
Modification:
1. first version
*************************************************/
#include <assert.h>
#include "session.h"
#include "usyscall.h"
int connect_session(struct Session* _session, char* _path, int _capacity)
{
return session(_path, _capacity, _session);
}
int free_session(struct Session* session)
{
return close_session(session);
}
// ipc_msg alloc_buffer(ipc_session)
void* session_alloc_buf(struct Session* session, int len)
{
if (len > session_remain_capacity(session)) {
return NULL;
}
void* buf = session->buf + session->tail;
// we mapped double size of page, so it's ok to write buffer directly
memset(buf, 0, len);
session_forward_tail(session, len);
return buf;
}
bool session_free_buf(struct Session* session, int len)
{
if (len > session_used_size(session)) {
return false;
}
assert(session_forward_head(session, len) != 1);
return true;
}
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file session.h
* @brief session header
* @version 3.0
* @author AIIT XUOS Lab
* @date 2023.08.25
*/
/*************************************************
File name: session.h
Description: session header
Others:
History:
1. Date: 2023-08-28
Author: AIIT XUOS Lab
Modification:
1. first version
*************************************************/
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include "libserial.h"
struct Session {
int id;
int capacity;
int head;
int tail;
void* buf;
};
__attribute__((__always_inline__)) static inline int session_used_size(struct Session* session)
{
return ((session->tail + session->capacity) - session->head) % session->capacity;
}
__attribute__((__always_inline__)) static inline int session_remain_capacity(struct Session* session)
{
return session->capacity - session_used_size(session);
}
__attribute__((__always_inline__)) static inline int session_forward_head(struct Session* session, int len)
{
if (((session->head + len) % session->capacity) > session->tail) {
printf("forward head with too much size\n");
return -1;
}
session->head = (session->head + len) % session->capacity;
return session->head;
}
__attribute__((__always_inline__)) static inline int session_forward_tail(struct Session* session, int len)
{
if (len > session_remain_capacity(session)) {
printf("forward tail with too much size\n");
return -1;
}
session->tail = (session->tail + len) % session->capacity;
return session->tail;
}
int connect_session(struct Session* session, char* path, int capacity);
int free_session(struct Session* session);
void* session_alloc_buf(struct Session* session, int len);
bool session_free_buf(struct Session* session, int len);
@@ -0,0 +1,12 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#pragma once
@@ -1,6 +0,0 @@
menu LIB_NEWLIB
bool "Enable Newlib "
default y
endmenu
@@ -1,5 +0,0 @@
SRC_FILES := fs_syscalls.c time_syscalls.c mem_syscalls.c task_syscalls.c
include $(KERNEL_ROOT)/compiler.mk
@@ -1,156 +0,0 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
/**
* @file fs_syscalls.c
* @brief support newlib file system
* @version 1.0
* @author AIIT XUOS Lab
* @date 2020-09-23
*/
/*************************************************
File name: fs_syscalls.c
Description: support newlib file system
Others: take RT-Thread v4.0.2/components/libc/compilers/newlib/syscalls.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History:
1. Date: 2020-09-23
Author: AIIT XUOS Lab
Modification: Use file system functions
*************************************************/
#include <reent.h>
#include <stdio.h>
#include <errno.h>
/* wwg debug here */
// #include <xizi.h>
int _fstat_r(struct _reent *ptr, int fd, struct stat *pstat)
{
ptr->_errno = ENOTSUP;
return -1;
}
int _link_r(struct _reent *ptr, const char *old, const char *new)
{
ptr->_errno = ENOTSUP;
return -1;
}
void * _sbrk_r(struct _reent *ptr, ptrdiff_t incr)
{
return NULL;
}
int _wait_r(struct _reent *ptr, int *status)
{
ptr->_errno = ENOTSUP;
return -1;
}
#ifdef FS_VFS
#include <iot-vfs_posix.h>
int _close_r(struct _reent *ptr, int fd)
{
return close(fd);
}
int _isatty_r(struct _reent *ptr, int fd)
{
if (fd >=0 && fd < 3)
return 1;
ptr->_errno = ENOTSUP;
return -1;
}
_off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
{
return lseek(fd, pos, whence);
}
int _open_r(struct _reent *ptr, const char *file, int flags, int mode)
{
return open(file, flags, mode);
}
_ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
{
return read(fd, buf, nbytes);
}
int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
{
return stat(file, pstat);
}
int _unlink_r(struct _reent *ptr, const char *file)
{
return unlink(file);
}
_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
return write(fd, buf, nbytes);
}
#else /* FS_VFS */
int _close_r(struct _reent *ptr, int fd)
{
ptr->_errno = ENOTSUP;
return -1;
}
int _isatty_r(struct _reent *ptr, int fd)
{
ptr->_errno = ENOTSUP;
return -1;
}
_off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
{
ptr->_errno = ENOTSUP;
return -1;
}
int _open_r(struct _reent *ptr, const char *file, int flags, int mode)
{
ptr->_errno = ENOTSUP;
return -1;
}
_ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
{
ptr->_errno = ENOTSUP;
return -1;
}
int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
{
ptr->_errno = ENOTSUP;
return -1;
}
int _unlink_r(struct _reent *ptr, const char *file)
{
ptr->_errno = ENOTSUP;
return -1;
}
_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
ptr->_errno = ENOTSUP;
return -1;
}
#endif /* FS_VFS */
@@ -1,29 +0,0 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file libc.h
* @brief using newlib need include
* @version 1.0
* @author AIIT XUOS Lab
* @date 2020-09-23
*/
#ifndef _LIBC_H__
#define _LIBC_H__
#include <errno.h>
#include <stdarg.h>
#include <fcntl.h>
#endif
@@ -1,78 +0,0 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
/**
* @file mem_syscalls.c
* @brief support newlib memory
* @version 1.0
* @author AIIT XUOS Lab
* @date 2020-09-23
*/
/*************************************************
File name: mem_syscalls.c
Description: support newlib memory
Others: take RT-Thread v4.0.2/components/libc/compilers/newlib/syscalls.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History:
1. Date: 2020-09-23
Author: AIIT XUOS Lab
Modification: Use malloc, realloc, calloc and free functions
*************************************************/
/* wwg debug here */
// #include <xizi.h>
#include <errno.h>
void *_malloc_r (struct _reent *ptr, size_t size)
{
/* wwg debug here */
// void* result = (void*)x_malloc(size);
void* result = NULL;
if (result == NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *_realloc_r (struct _reent *ptr, void *old, size_t newlen)
{
/* wwg debug here */
// void* result = (void*)x_realloc(old, newlen);
void* result = NULL;
if (result == NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *_calloc_r (struct _reent *ptr, size_t size, size_t len)
{
/* wwg debug here */
// void* result = (void*)x_calloc(size, len);
void* result = NULL;
if (result == NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void _free_r (struct _reent *ptr, void *address)
{
/* wwg debug here */
// x_free (address);
}
@@ -1,156 +0,0 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2017/10/15 bernard the first version
*/
/**
* @file stdio.c
* @brief support newlib stdio
* @version 1.0
* @author AIIT XUOS Lab
* @date 2020-09-23
*/
/*************************************************
File name: stdio.c
Description: support newlib stdio
Others: take RT-Thread v4.0.2/components/libc/compilers/newlib/stdio.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History:
1. Date: 2020-09-23
Author: AIIT XUOS Lab
Modification: Use set and get console functions
*************************************************/
#include <xizi.h>
#include <device.h>
#include <stdio.h>
#include <stdlib.h>
#define STDIO_DEVICE_NAME_MAX 32
static FILE* std_console = NULL;
/**
* This function will set system console device.
*
* @param device_name the name of device
* @param mode the mode
*
* @return file number on success; or -1 on failure
*/
int LibcStdioSetConsole(const char* device_name, int mode)
{
FILE *fp;
char name[STDIO_DEVICE_NAME_MAX] = {0};
char *file_mode;
snprintf(name, strlen(device_name) + 6, "/dev/%s", device_name);
name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
switch (mode)
{
case O_RDWR:
file_mode = "r+";
break;
case O_WRONLY:
file_mode = "wb";
break;
default:
file_mode = "rb";
break;
}
/* try to open file */
fp = fopen(name, file_mode);
if (fp)
{
/* set the fp buffer */
setvbuf(fp, NULL, _IONBF, 0);
if (std_console)
/* try to close console device */
fclose(std_console);
std_console = fp;
if (mode == O_RDWR)
{
/* set _stdin as std_console */
_GLOBAL_REENT->_stdin = std_console;
}
else
{
/* set NULL */
_GLOBAL_REENT->_stdin = NULL;
}
if (mode == O_RDONLY)
{
/* set the _stdout as NULL */
_GLOBAL_REENT->_stdout = NULL;
/* set the _stderr as NULL */
_GLOBAL_REENT->_stderr = NULL;
}
else
{
/* set the _stdout as std_console */
_GLOBAL_REENT->_stdout = std_console;
/* set the _stderr as std_console */
_GLOBAL_REENT->_stderr = std_console;
}
/* set the __sdidinit as 1 */
_GLOBAL_REENT->__sdidinit = 1;
}
if (std_console)
/* return the file number */
return fileno(std_console);
/* failure and return -1 */
return -1;
}
/**
* This function will get system console device.
*
* @return file number on success; or -1 on failure
*/
int LibcStdioGetConsole(void) {
if (std_console)
/* return the file number */
return fileno(std_console);
else
/* failure and return -1 */
return -1;
}
/**
* This function will initialize the c library system.
*
* @return 0
*/
int LibcSystemInit(void)
{
#if defined(KERNEL_CONSOLE)
HardwareDevType console;
/* try to get console device */
console = ObtainConsole();
if (console)
{
#if defined(LIB_POSIX)
/* set console device mode */
LibcStdioSetConsole(console->dev_name, O_RDWR);
#else
/* set console device mode */
LibcStdioSetConsole(console->dev_name, O_WRONLY);
#endif
}
#endif
return 0;
}
@@ -1,44 +0,0 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
/**
* @file task_syscalls.c
* @brief support newlib abort
* @version 1.0
* @author AIIT XUOS Lab
* @date 2020-09-23
*/
/*************************************************
File name: task_syscalls.c
Description: support newlib abort
Others: take RT-Thread v4.0.2/components/libc/compilers/newlib/syscalls.c for references
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
History:
1. Date: 2020-09-23
Author: AIIT XUOS Lab
Modification: Use abort function
*************************************************/
/* wwg debug here */
// #include <xizi.h>
void abort(void)
{
// KTaskDescriptorType current = GetKTaskDescriptor();
// if (current)
// {
// KPrintf("Task:%-8.*s will be aborted!\n", NAME_NUM_MAX, current->task_base_info.name);
// /* pend current task */
// SuspendKTask(current->id.id);
// /* schedule */
// DO_KTASK_ASSIGN;
// }
while (1);
}
@@ -1,42 +0,0 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <sys/time.h>
// #include <xizi.h>
// #include <bus_rtc.h>
// time_t time(time_t *t)
// {
// NULL_PARAM_CHECK(t);
// time_t current = 0;
// #ifdef RESOURCES_RTC
// struct RtcSetParam rtc_set_param;
// rtc_set_param.rtc_set_cmd = OPER_RTC_GET_TIME;
// rtc_set_param.time = &current;
// RtcDrvSetFunction(RTC_DRV_NAME, &rtc_set_param);
// #endif
// *t = current;
// return current;
// }
time_t time(time_t *t)
{
time_t current = 0;
*t = current;
return current;
}