--- /n/fossil/riscv64/include/ape/inttypes.h Thu Jan 1 00:00:00 1970 +++ /riscv64/include/ape/inttypes.h Fri Nov 13 15:10:45 2020 @@ -0,0 +1,23 @@ +#ifndef _SUSV2_SOURCE +#error "inttypes.h is SUSV2" +#endif + +#ifndef _INTTYPES_H_ +#define _INTTYPES_H_ 1 + +typedef long long _intptr_t; +typedef unsigned long long _uintptr_t; + + +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +typedef _intptr_t intptr_t; +typedef _uintptr_t uintptr_t; + +#endif --- /n/fossil/sys/src/cmd/ic/reg.c Thu Dec 22 16:14:36 2022 +++ /sys/src/cmd/ic/reg.c Sun Aug 22 12:02:46 2021 @@ -613,7 +613,7 @@ if(n == D_PARAM) for(z=0; zetype != et || !typechlpfd[et]) /* funny punning */ + if(v->etype != et || !(typechlpfd[et] || typev[et])) /* funny punning */ for(z=0; zto, rn); + switch(p->as){ + case AMOVW: + case AMOVWU: + p->as = AMOV; + } if(debug['R']) print("\t.c%P\n", p); } --- /n/fossil/sys/src/cmd/il/asm.c Thu Dec 22 16:14:36 2022 +++ /sys/src/cmd/il/asm.c Sat Jul 31 14:11:10 2021 @@ -685,6 +685,8 @@ case 1: /* slli $I,[R,]D */ v = p->from.offset & 0x3F; + if(thechar != 'j') + v &= 0x1F; v |= (o->param<<5); o1 = OP_I(r, p->to.reg, v); break; --- /n/fossil/sys/src/cmd/il/optab.c Thu Dec 22 16:14:36 2022 +++ /sys/src/cmd/il/optab.c Sat Jul 31 14:13:03 2021 @@ -45,9 +45,9 @@ /* andi */ AAND, C_SCON, C_REG, 2,13, 4, OOP_IMM, 7, 0, /* addiw */ AADDW, C_SCON, C_REG, 2,23, 4, OOP_IMM_32, 0, 0, - /* slliw */ ASLLW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 1, 0, - /* srliw */ ASRLW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 5, 0, - /* sraiw */ ASRAW, C_SCON, C_REG, 2,0, 4, OOP_IMM_32, 5, 0x20, + /* slliw */ ASLLW, C_SCON, C_REG, 1,0, 4, OOP_IMM_32, 1, 0, + /* srliw */ ASRLW, C_SCON, C_REG, 1,0, 4, OOP_IMM_32, 5, 0, + /* sraiw */ ASRAW, C_SCON, C_REG, 1,0, 4, OOP_IMM_32, 5, 0x20, /* beq */ ABEQ, C_REG, C_SBRA, 3,14, 4, OBRANCH, 0, 0, /* bne */ ABNE, C_REG, C_SBRA, 3,15, 4, OBRANCH, 1, 0, --- /n/fossil/sys/src/libc/riscv64/memset.s Thu Jan 1 00:00:00 1970 +++ /sys/src/libc/riscv64/memset.s Sun Jun 20 13:19:43 2021 @@ -0,0 +1,85 @@ + TEXT memset(SB),$12 + + MOV R8, s1+0(FP) + MOV R8, R11 /* R11 is pointer */ + MOVWU c+8(FP), R12 /* R12 is char */ + MOVWU n+12(FP), R10 /* R10 is count */ + ADD R10,R11, R13 /* R13 is end pointer */ + +/* + * if not at least 8 chars, + * dont even mess around. + * 7 chars to guarantee any + * rounding up to a doubleword + * boundary and 8 characters + * to get at least maybe one + * full doubleword store. + */ + SLT $8,R10, R8 + BNE R8, out + +/* + * turn R12 into a doubleword of characters + */ + AND $0xff, R12 + SLL $8,R12, R8 + OR R8, R12 + SLL $16,R12, R8 + OR R8, R12 + SLL $32,R12, R8 + OR R8, R12 + +/* + * store one byte at a time until pointer + * is aligned on a doubleword boundary + */ +l1: + AND $7,R11, R8 + BEQ R8, l2 + MOVB R12, 0(R11) + ADD $1, R11 + JMP l1 + +/* + * turn R10 into end pointer-31 + * store 32 at a time while theres room + */ +l2: + ADD $-31,R13, R10 +l3: + SLTU R10,R11, R8 + BEQ R8, l4 + MOV R12, 0(R11) + MOV R12, 8(R11) + ADD $32, R11 + MOV R12, -16(R11) + MOV R12, -8(R11) + JMP l3 + +/* + * turn R10 into end pointer-7 + * store 8 at a time while theres room + */ +l4: + ADD $-7,R13, R10 +l5: + SLTU R10,R11, R8 + BEQ R8, out + MOV R12, 0(R11) + ADD $8, R11 + JMP l5 + +/* + * last loop, store byte at a time + */ +out: + SLTU R13,R11 ,R8 + BEQ R8, ret + MOVB R12, 0(R11) + ADD $1, R11 + JMP out + +ret: + MOV s1+0(FP), R8 + RET + END --- /n/fossil/sys/src/libc/riscv64/mkfile Thu Dec 22 16:14:36 2022 +++ /sys/src/libc/riscv64/mkfile Mon Jun 21 10:19:42 2021 @@ -14,7 +14,7 @@ # memchr.s\ # memcmp.s\ # memmove.s\ -# memset.s\ + memset.s\ # setsb.s\ setjmp.s\ # strchr.s\ --- /n/fossil/sys/src/libmach/idb.c Thu Dec 22 16:14:36 2022 +++ /sys/src/libmach/idb.c Sat Aug 14 21:59:11 2021 @@ -244,7 +244,7 @@ * Print value v as name[+offset] */ static int -gsymoff(char *buf, int n, ulong v, int space) +gsymoff(char *buf, int n, uvlong v, int space) { Symbol s; int r; @@ -259,15 +259,12 @@ delta = -delta; } if (v == 0 || r == 0 || delta >= 4096) - return snprint(buf, n, "#%lux", v); + return snprint(buf, n, "#%llux", v); if (strcmp(s.name, ".string") == 0) - return snprint(buf, n, "#%lux", v); + return snprint(buf, n, "#%llux", v); if (!delta) return snprint(buf, n, "%s", s.name); - if (s.type != 't' && s.type != 'T') - return snprint(buf, n, "%s+%llux", s.name, v-s.value); - else - return snprint(buf, n, "#%lux", v); + return snprint(buf, n, "%s+%llux", s.name, v-s.value); } #pragma varargck argpos bprint 2 @@ -334,8 +331,7 @@ bprint(i, "%lux", imm); break; case 'p': - imm = i->addr + i->imm; - i->curr += gsymoff(i->curr, i->end-i->curr, imm, CANY); + i->curr += gsymoff(i->curr, i->end-i->curr, i->addr + i->imm, CANY); break; case 'a': if(i->rs1 == REGSB && mach->sb){ --- /n/fossil/sys/src/libmach/j.c Thu Dec 22 16:14:36 2022 +++ /sys/src/libmach/j.c Sat Aug 14 14:11:02 2021 @@ -104,7 +104,7 @@ 0x1000, /* page size */ /* these are Sv39 values */ 0xffffffc080000000ULL, /* kernel base */ - 0x8000000000000000ULL, /* kernel text mask for all Sv* */ + 0xffffffc080000000ULL, /* kernel text mask */ 0x0000003fffffffffULL, /* user stack top */ 2, /* quantization of pc */ 8, /* szaddr */ --- /n/fossil/sys/src/libmach/executable.c Fri May 28 19:44:02 2021 +++ /sys/src/libmach/executable.c Wed Dec 21 11:51:00 2022 @@ -440,8 +440,14 @@ break; case FRISCV: fp->type = FRISCVB; - fp->txtaddr = (u32int)fp->entry; + fp->txtaddr = mach->kbase; fp->name = "riscv plan 9 boot image"; + fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize); + break; + case FRISCV64: + fp->type = FRISCV64B; + fp->txtaddr = mach->kbase | (u32int)fp->entry; + fp->name = "riscv64 plan 9 boot image"; fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize); break; default: