diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/arch/amd64/np/piir_conv.c | 113 | ||||
-rw-r--r-- | src/sys/include/arch/amd64/piir.h | 57 | ||||
-rw-r--r-- | src/sys/np/codegen/piir_engine.c | 70 |
3 files changed, 240 insertions, 0 deletions
diff --git a/src/sys/arch/amd64/np/piir_conv.c b/src/sys/arch/amd64/np/piir_conv.c new file mode 100644 index 0000000..bb94738 --- /dev/null +++ b/src/sys/arch/amd64/np/piir_conv.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Description: Subsystem to convert PIIR to instruction bytes + * Author: Ian Marco Moffett + */ + +#include <sys/types.h> +#include <sys/errno.h> +#include <sys/syslog.h> +#include <machine/piir.h> +#include <np/piir.h> +#include <os/np.h> + +#define pr_trace(fmt, ...) printf("piir.conv: " fmt, ##__VA_ARGS__) +#define pr_error(fmt, ...) printf("piir.conv: error: " fmt, ##__VA_ARGS__) + +typedef md_byte_t inst_t[8]; + +/* Declare an instruction array */ +#define INST_DECL(...) ((inst_t)__VA_ARGS__) + +/* Near return [C2] */ +#define OP_NRET INST_DECL({0xC2}) +#define OP_NRET_LEN 1 + +/* No-operation */ +#define OP_NOP INST_DECL({0x90}) +#define OP_NOP_LEN 1 + +/* MOV R32, IMM32 (B8 + rd) */ +#define OP_LOAD32_R32(IMM32) INST_DECL({0xB8, (IMM32)}) +#define OP_LOAD32_R32_LEN 5 + +/* + * Push an instruction byte into the virtual + * machine descriptor's code buffer + */ +static ssize_t +vm_push(struct piir_vm *vm, inst_t inst, size_t len) +{ + for (int i = 0; i < len; ++i) { + if (vm->code_i >= sizeof(vm->code) - 1) { + return -1; + } + + vm->code[vm->code_i++] = inst[i]; + } + return len; +} + +ssize_t +md_piir_decode(struct np_work *work, struct piir_vm *vm, ir_byte_t input) +{ + struct piir_stack *stack; + ssize_t len; + + if (vm == NULL) { + return -EINVAL; + } + + vm->last_ir = input; + stack = work->piir_stack; + + /* + * Convert the instruction from IR to machine + * code so that it actually may be executed + */ + switch (input) { + case PIIR_RET_NUM: + if ((input = piir_pop(stack)) < 0) { + pr_error("bad input on PIIR_RET_NUM\n"); + return input; + } + + return vm_push( + vm, OP_LOAD32_R32(input), + OP_LOAD32_R32_LEN + ); + case PIIR_NOP: + return vm_push(vm, OP_NOP, OP_NOP_LEN); + case PIIR_RET_NIL: + return vm_push(vm, OP_NRET, OP_NRET_LEN); + } + return 0; +} diff --git a/src/sys/include/arch/amd64/piir.h b/src/sys/include/arch/amd64/piir.h new file mode 100644 index 0000000..75236b9 --- /dev/null +++ b/src/sys/include/arch/amd64/piir.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Description: Pirho PIIR AMD64 backend + * Author: Ian Marco Moffett + */ + +#ifndef _MACHINE_PIIR_H_ +#define _MACHINE_PIIR_H_ 1 + +#include <os/np.h> +#include <np/piir.h> + +/* + * Convert an IR byte into one or more machine instruction + * bytes + * + * @work: Current work + * @vm: Virtual machine state + * @input: Input to convert + * + * Returns length written on success, otherwise a less than + * zero value on failure. + */ +ssize_t md_piir_decode( + struct np_work *work, struct piir_vm *vm, + ir_byte_t input +); + +#endif /* !_MACHINE_PIIR_H_ */ diff --git a/src/sys/np/codegen/piir_engine.c b/src/sys/np/codegen/piir_engine.c new file mode 100644 index 0000000..d756c44 --- /dev/null +++ b/src/sys/np/codegen/piir_engine.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/errno.h> +#include <sys/syslog.h> +#include <machine/piir.h> +#include <os/np.h> +#include <np/piir.h> +#include <string.h> + +#define pr_trace(fmt, ...) printf("pirho.piir: " fmt, ##__VA_ARGS__) +#define pr_error(fmt, ...) printf("pirho.piir: error: " fmt, ##__VA_ARGS__) + +int +piir_inject(struct np_work *work) +{ + struct piir_stack *stack; + struct piir_vm vm; + ir_byte_t byte; + + if (work == NULL) { + return -EINVAL; + } + + /* Need the stack */ + if ((stack = work->piir_stack) == NULL) { + return -EIO; + } + + /* Put the vm in a known state */ + memset(&vm, 0, sizeof(vm)); + + /* + * Go through each byte and decode the IR, new + * machine code should be in `vm.code' after + * this loop. + */ + while ((byte = piir_pop(stack)) >= 0) { + md_piir_decode(work, &vm, byte); + } + + return 0; +} |