Overview
Comment: | add first iteration of knum header |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
5560c2725bf4b48a5735168c0300604d |
User & Date: | lexi on 2019-08-22 01:37:08 |
Other Links: | manifest | tags |
Context
2019-08-22
| ||
02:52 | removed sneaky segfault in x86-64 syscall fn where %r8 (the register that contains the pointer to the syscall arguments from the C syscall wrapper, which need to be copied into the correct registers before the kernel is invoked) gets overwritten if the syscall valency > 5, because of overlapping ccall and syscall ABI argument registers - r8 is clobbered by argument 5 and any further attempts to use it as a ptr segfault at best. also modified the report function so that it immediate cancels compilation if a sub-process reports failure. changed allocator function signatures so they can return a condition code if the kernel reports an error; updated example code so it compiles and runs without fault. check-in: e50a476efe user: lexi tags: trunk | |
01:37 | add first iteration of knum header check-in: 5560c2725b user: lexi tags: trunk | |
00:03 | insert explicit cast to hopefully silence compiler warnings on some systems check-in: 7c202a8b17 user: lexi tags: trunk | |
Changes
Modified build.sh from [b43f4693b2] to [d7b4907031].
1 2 3 4 5 6 7 8 |
#!/usr/bin/env bash export to=${to:-out} source global/common.sh if test "$os$arch$bits" = ""; then say "set the following environment variables to the appropriate atoms describing your system. for help determining the appropriate atoms, see libk.md" say ' - $os={lin|fbsd|hai|osx…}' say ' - $arch={x86|arm|ia64|mips…}' |
> > > > > > > > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/usr/bin/env bash # build.sh - libk build script # TODO when compiling C code, first check # if an assembly override exists for # the target platform and if there's # one, ignore the C and assemble the # override file instead. export to=${to:-out} source global/common.sh if test "$os$arch$bits" = ""; then say "set the following environment variables to the appropriate atoms describing your system. for help determining the appropriate atoms, see libk.md" say ' - $os={lin|fbsd|hai|osx…}' say ' - $arch={x86|arm|ia64|mips…}' |
Added mod/knum/num.h version [982620d249].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#ifndef KInum #define KInum #ifdef __cplusplus extern "C" { #endif #include <k/type.h> typedef enum kncond { kncond_ok = kncond_id, kncond_saturate, kncond_wrap, /* error states */ kncond_fail, kncond_fail_io, kncond_overflow, kncond_underflow, kncond_bad_domain, } kncond; /* this "hard" random number generator * returns a block of random data that * can be used safely in cryptographic * pseudorandom number algorithms such * as e.g. knrands() */ enum kncond knrandh(u8* mem, sz count); /* we define the largest available native * type as `knword` for convenience; this * is the type that the pseudorandom func * will use for state and return; */ typedef unsigned long long knword; /* to encapsulate the state of the pseudo * random number generator, we define an * array as an opaque seed reference type */ typedef knword knseed [8]; /* this function implements a "soft" RNG * that can be safely used as a cryptographic * primitive, keeping its state in a value of * type of knseed (which needs to be seeded * initially by knrandh() or another reliable * source of entropy. */ knword knrands(knseed state); /* addition and subtraction in C can be * complex due to the need to check for * underflow and overflow, so we offer * a suite of functions which implement * reliable arithmetic over integers of * arbitrary bit lengths. functions for * fixed point & floating point numbers * should also be added eventually. * note that these functions use either * two's complement or one's complement * for signed */ typedef enum knmode { knmode_saturate = 0x0001, /* 0b001 */ knmode_wrap = 0x0002, /* 0b010 */ knmode_fail = 0x0003, /* 0b011 */ knmode_signed = 1 << 2, /* 0b100*/ knmode_unsigned = 0 /* default */ } knmode; /* it is legal for src and dest to be the * same location in memory. this will not * produce incorrect output. although the * functions formally take pointers to u8, * they are converted appropriately with * regard to sign and size within the fn */ kncond kniadd(knmode, sz, u8* dest, u8* src, u8* delta); kncond knisub(knmode, sz, u8* dest, u8* src, u8* delta); kncond knimul(knmode, sz, u8* dest, u8* src, u8* delta); kncond knidiv(knmode, sz, /* output */ u8* ratio, u8* remainder, /* input */ u8* src, u8* delta); /* we should probably also offer a bignum * type eventually, tho this will need to * be integrated with kmem for allocation. */ #ifdef __cplusplus } #endif #endif |