diff --git a/build.zig b/build.zig index 2ac88948c0..1408769c25 100644 --- a/build.zig +++ b/build.zig @@ -701,6 +701,7 @@ fn build_single( "vortex_v2.c", "hashtable_v3.c", "manage_v3.c", + "manage_v4.c", "vortex.c", "xtract.c", "zave.c", diff --git a/pkg/noun/manage.c b/pkg/noun/manage.c index e5dbcab223..7456a2e382 100644 --- a/pkg/noun/manage.c +++ b/pkg/noun/manage.c @@ -3,6 +3,7 @@ #include "manage.h" #include "manage_v2.h" #include "manage_v3.h" +#include "manage_v4.h" #include #include @@ -613,7 +614,8 @@ _find_home(void) switch ( ver_w ) { case U3V_VER1: u3m_v2_migrate(); case U3V_VER2: u3m_v3_migrate(); - case U3V_VER3: { + case U3V_VER3: u3m_v4_migrate(); + case U3V_VER4: { mig_o = c3n; break; } diff --git a/pkg/noun/manage_v4.c b/pkg/noun/manage_v4.c new file mode 100644 index 0000000000..14bfb52b62 --- /dev/null +++ b/pkg/noun/manage_v4.c @@ -0,0 +1,30 @@ +/// @file + +#include "manage_v4.h" +#include "stdio.h" +#include "manage.h" +#include "allocate.h" +#include "vortex.h" +#include "options.h" + +/* u3m_v4_migrate: perform loom migration if necessary. +*/ +void +u3m_v4_migrate(void) +{ + fprintf(stderr, "loom: bytecode alignment migration running...\r\n"); + + c3_w* mem_w = u3_Loom + u3a_walign; + c3_w siz_w = c3_wiseof(u3v_home); + c3_w len_w = u3C.wor_i - u3a_walign; + c3_w* mat_w = c3_align(mem_w + len_w - siz_w, u3a_balign, C3_ALGLO); + + u3H = (void *)mat_w; + u3R = &u3H->rod_u; + + u3m_reclaim(); + + u3H->ver_w = U3V_VER4; + + fprintf(stderr, "loom: bytecode alignment migration done\r\n"); +} diff --git a/pkg/noun/manage_v4.h b/pkg/noun/manage_v4.h new file mode 100644 index 0000000000..1059f12626 --- /dev/null +++ b/pkg/noun/manage_v4.h @@ -0,0 +1,13 @@ +/// @file + +#ifndef U3_MANAGE_V4_H +#define U3_MANAGE_V4_H + + /** System management. + **/ + /* u3m_v3_migrate: perform memoization loom migration if necessary. + */ + void + u3m_v4_migrate(void); + +#endif /* ifndef U3_MANAGE_V3_H */ diff --git a/pkg/noun/nock.c b/pkg/noun/nock.c index eb459d17f7..f9814a395f 100644 --- a/pkg/noun/nock.c +++ b/pkg/noun/nock.c @@ -706,7 +706,11 @@ _n_prog_new(c3_w byc_w, c3_w cal_w, reb_w = (sizeof(u3j_rite) * reg_w), lib_w = (sizeof(u3_noun) * lit_w), meb_w = (sizeof(u3n_memo) * mem_w), - dat_w = byc_w + cab_w + reb_w + lib_w + meb_w; + pad_w = (8 - byc_w % 8) % 8, + pod_w = lit_w % 2, + ped_w = mem_w % 2, + dat_w = byc_w + cab_w + reb_w + lib_w + meb_w + pad_w + + (pod_w * sizeof(u3_noun)) + (ped_w * sizeof(u3n_memo)); u3n_prog* pog_u = u3a_malloc(sizeof(u3n_prog) + dat_w); pog_u->byc_u.own_o = c3y; @@ -714,13 +718,13 @@ _n_prog_new(c3_w byc_w, c3_w cal_w, pog_u->byc_u.ops_y = (c3_y*) _n_prog_dat(pog_u); pog_u->lit_u.len_w = lit_w; - pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w); + pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w + pad_w); pog_u->mem_u.len_w = mem_w; - pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w); + pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w); pog_u->cal_u.len_w = cal_w; - pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w); + pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w); pog_u->reg_u.len_w = reg_w; pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w); @@ -738,7 +742,10 @@ _n_prog_old(u3n_prog* sep_u) reb_w = sizeof(u3j_rite) * sep_u->reg_u.len_w, lib_w = sizeof(u3_noun) * sep_u->lit_u.len_w, meb_w = sizeof(u3n_memo) * sep_u->mem_u.len_w, - dat_w = cab_w + reb_w + lib_w + meb_w; + pod_w = sep_u->lit_u.len_w % 2, + ped_w = sep_u->mem_u.len_w % 2, + dat_w = cab_w + reb_w + lib_w + meb_w + + (pod_w * sizeof(u3_noun)) + (ped_w * sizeof(u3n_memo)); u3n_prog* pog_u = u3a_malloc(sizeof(u3n_prog) + dat_w); pog_u->byc_u.own_o = c3n; @@ -749,10 +756,10 @@ _n_prog_old(u3n_prog* sep_u) pog_u->lit_u.non = (u3_noun*) _n_prog_dat(pog_u); pog_u->mem_u.len_w = sep_u->mem_u.len_w; - pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w); + pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w); pog_u->cal_u.len_w = sep_u->cal_u.len_w; - pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w); + pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w); pog_u->reg_u.len_w = sep_u->reg_u.len_w; pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w); @@ -2036,7 +2043,7 @@ _n_kale(u3_noun a) return a; } -typedef struct { +typedef struct __attribute__((__packed__)) { u3n_prog* pog_u; c3_w ip_w; } burnframe; @@ -2888,12 +2895,13 @@ _cn_take_prog_cb(u3p(u3n_prog) pog_p) u3n_prog* gop_u; if ( c3y == pog_u->byc_u.own_o ) { + c3_w pad_w = (8 - pog_u->byc_u.len_w % 8) % 8; gop_u = _n_prog_new(pog_u->byc_u.len_w, pog_u->cal_u.len_w, pog_u->reg_u.len_w, pog_u->lit_u.len_w, pog_u->mem_u.len_w); - memcpy(gop_u->byc_u.ops_y, pog_u->byc_u.ops_y, pog_u->byc_u.len_w); + memcpy(gop_u->byc_u.ops_y, pog_u->byc_u.ops_y, pog_u->byc_u.len_w + pad_w); } else { gop_u = _n_prog_old(pog_u); @@ -2988,11 +2996,14 @@ _n_ream(u3_noun kev) c3_w i_w; u3n_prog* pog_u = u3to(u3n_prog, u3t(kev)); + c3_w pad_w = (8 - pog_u->byc_u.len_w % 8) % 8; + c3_w pod_w = pog_u->lit_u.len_w % 2; + c3_w ped_w = pog_u->mem_u.len_w % 2; // fix up pointers for loom portability pog_u->byc_u.ops_y = (c3_y*) _n_prog_dat(pog_u); - pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w); - pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w); - pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w); + pog_u->lit_u.non = (u3_noun*) (pog_u->byc_u.ops_y + pog_u->byc_u.len_w + pad_w); + pog_u->mem_u.sot_u = (u3n_memo*) (pog_u->lit_u.non + pog_u->lit_u.len_w + pod_w); + pog_u->cal_u.sit_u = (u3j_site*) (pog_u->mem_u.sot_u + pog_u->mem_u.len_w + ped_w); pog_u->reg_u.rit_u = (u3j_rite*) (pog_u->cal_u.sit_u + pog_u->cal_u.len_w); for ( i_w = 0; i_w < pog_u->cal_u.len_w; ++i_w ) { diff --git a/pkg/noun/version.h b/pkg/noun/version.h index 47e43ee336..9130d5f94e 100644 --- a/pkg/noun/version.h +++ b/pkg/noun/version.h @@ -9,7 +9,8 @@ typedef c3_w u3v_version; #define U3V_VER1 1 #define U3V_VER2 2 #define U3V_VER3 3 -#define U3V_VERLAT U3V_VER3 +#define U3V_VER4 4 +#define U3V_VERLAT U3V_VER4 /* PATCHES */