Date: Thu, 15 May 2003 00:55:36 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 31224 for review Message-ID: <200305150755.h4F7tamV011418@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=31224 Change 31224 by marcel@marcel_nfs on 2003/05/15 00:55:00 Glue the contributed unwinder into the build and fix the kernel debugger. Enable the debugger by default for SKI. Affected files ... .. //depot/projects/ia64_epc/sys/conf/Makefile.ia64#4 edit .. //depot/projects/ia64_epc/sys/conf/files.ia64#13 edit .. //depot/projects/ia64_epc/sys/ia64/conf/SKI#7 edit .. //depot/projects/ia64_epc/sys/ia64/ia64/db_trace.c#4 edit .. //depot/projects/ia64_epc/sys/ia64/ia64/unwind.c#4 edit .. //depot/projects/ia64_epc/sys/ia64/include/unwind.h#4 edit Differences ... ==== //depot/projects/ia64_epc/sys/conf/Makefile.ia64#4 (text+ko) ==== @@ -32,6 +32,8 @@ .endif .include "$S/conf/kern.pre.mk" +INCLUDES+= -I$S/contrib/ia64/libuwx/src + CFLAGS+= -mconstant-gp ASM_CFLAGS= -x assembler-with-cpp -Wa,-x -DLOCORE ${CFLAGS} ==== //depot/projects/ia64_epc/sys/conf/files.ia64#13 (text+ko) ==== @@ -18,6 +18,19 @@ no-obj no-implicit-rule before-depend \ clean "atkbdmap.h" # +contrib/ia64/libuwx/src/uwx_bstream.c standard +contrib/ia64/libuwx/src/uwx_context.c standard +contrib/ia64/libuwx/src/uwx_env.c standard +contrib/ia64/libuwx/src/uwx_scoreboard.c standard +#contrib/ia64/libuwx/src/uwx_self.c standard +#contrib/ia64/libuwx/src/uwx_self_context.s standard +contrib/ia64/libuwx/src/uwx_step.c standard +contrib/ia64/libuwx/src/uwx_str.c standard +contrib/ia64/libuwx/src/uwx_swap.c standard +contrib/ia64/libuwx/src/uwx_trace.c standard +#contrib/ia64/libuwx/src/uwx_ttrace.c standard +contrib/ia64/libuwx/src/uwx_uinfo.c standard +contrib/ia64/libuwx/src/uwx_utable.c standard crypto/blowfish/bf_enc.c optional crypto crypto/blowfish/bf_enc.c optional ipsec ipsec_esp crypto/des/des_enc.c optional crypto ==== //depot/projects/ia64_epc/sys/ia64/conf/SKI#7 (text+ko) ==== @@ -30,6 +30,7 @@ makeoptions NO_MODULES=yes #Ignore any x86 CPUTYPE options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!] +options DDB options FFS #Berkeley Fast Filesystem options INET #InterNETworking options INET6 #IPv6 communications protocols ==== //depot/projects/ia64_epc/sys/ia64/ia64/db_trace.c#4 (text+ko) ==== @@ -44,76 +44,61 @@ int db_md_clr_watchpoint(db_expr_t addr, db_expr_t size); void db_md_list_watchpoints(void); -extern char ia64_vector_table[], do_syscall[], do_syscall_end[]; - void -db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *modif) +db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, + char *modif) { -#if 0 - struct ia64_unwind_state *us; + struct unw_regstate rs; + const char *name; + db_expr_t offset; + uint64_t bsp, cfm, ip, pfs, reg; + c_db_sym_t sym; + int args, error, i; - if (count == -1) - count = 65535; + error = unw_create(&rs, &ddb_regs); + while (!error && count--) { + error = unw_get_cfm(&rs, &cfm); + if (!error) + error = unw_get_bsp(&rs, &bsp); + if (!error) + error = unw_get_ip(&rs, &ip); + if (error) + break; - if (!have_addr) { - us = ia64_create_unwind_state(&ddb_regs); - } else { - return; /* XXX */ - } + args = (cfm >> 7) & 0x7f; + if (args > 8) + args = 8; - if (!us) { - db_printf("db_stack_trace_cmd: can't create unwind state\n"); - return; - } + error = unw_step(&rs); + if (!error) { + error = unw_get_cfm(&rs, &pfs); + if (!error) { + i = (pfs & 0x7f) - ((pfs >> 7) & 0x7f); + if (args > i) + args = i; + } + } - while (count--) { - const char * name; - db_expr_t ip; - db_expr_t offset; - c_db_sym_t sym; - int cfm, sof, sol, nargs, i; - u_int64_t *bsp; - u_int64_t *p, reg; - - ip = ia64_unwind_state_get_ip(us); - cfm = ia64_unwind_state_get_cfm(us); - bsp = ia64_unwind_state_get_bsp(us); - sof = cfm & 0x7f; - sol = (cfm >> 7) & 0x7f; - sym = db_search_symbol(ip, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); - db_printf("%s(", name); - - nargs = sof - sol; - if (nargs > 8) - nargs = 8; - if (bsp >= (u_int64_t *)IA64_RR_BASE(5)) { - for (i = 0; i < nargs; i++) { - p = ia64_rse_register_address(bsp, 32 + i); - db_read_bytes((vm_offset_t) p, sizeof(reg), - (caddr_t) ®); + if (bsp >= IA64_RR_BASE(5)) { + for (i = 0; i < args; i++) { + if ((bsp & 0x1ff) == 0x1f8) + bsp += 8; + db_read_bytes(bsp, sizeof(reg), (void*)®); if (i > 0) db_printf(", "); db_printf("0x%lx", reg); + bsp += 8; } - } + } else + db_printf("..."); db_printf(") at "); db_printsym(ip, DB_STGY_PROC); db_printf("\n"); - - if (ia64_unwind_state_previous_frame(us)) - break; - - ip = ia64_unwind_state_get_ip(us); - if (!ip) - break; } - - ia64_free_unwind_state(us); -#endif } void @@ -144,4 +129,3 @@ { return; } - ==== //depot/projects/ia64_epc/sys/ia64/ia64/unwind.c#4 (text+ko) ==== @@ -32,16 +32,12 @@ #include <sys/malloc.h> #include <sys/queue.h> -#include <machine/pcb.h> +#include <machine/frame.h> #include <machine/unwind.h> -#ifdef UNWIND_DEBUG -#define DPF(x) printf x -#else -#define DPF(x) -#endif +#include <uwx.h> -MALLOC_DEFINE(M_UNWIND, "Unwind table", "Unwind table information"); +MALLOC_DEFINE(M_UNWIND, "Unwind", "Unwind information"); struct unw_entry { uint64_t ue_start; /* procedure start */ @@ -61,15 +57,21 @@ static struct unw_table_list unw_tables; +static void * +unw_alloc(size_t sz) +{ + + return (malloc(sz, M_UNWIND, M_WAITOK)); +} + static void -unw_initialize(void *dummy __unused) +unw_free(void *p) { - LIST_INIT(&unw_tables); + free(p, M_UNWIND); } -SYSINIT(unwind, SI_SUB_KMEM, SI_ORDER_ANY, unw_initialize, 0); -#if NOTYET +#if 0 static struct unw_entry * unw_entry_lookup(struct unw_table *ut, uint64_t ip) { @@ -103,1284 +105,203 @@ return (NULL); } -static __inline void -unw_set_loc(void *rs, void *pcb, int sz) +static int +unw_cb_copyin(int req, char *to, uint64_t from, int len, intptr_t tok) { - while (sz > 0) { - *((uint64_t*)rs) = (uint64_t)pcb; - ((uint64_t*)pcb)++, ((uint64_t*)rs)++; - sz -= sizeof(uint64_t); - } -} + struct unw_regstate *rs = (void*)tok; + int reg; -int -unw_state_create(struct unw_regstate *rs, struct pcb *pcb) -{ - uint64_t *fp; + switch (req) { + case UWX_COPYIN_UINFO: + break; + case UWX_COPYIN_MSTACK: + *((uint64_t*)to) = *((uint64_t*)from); + return (8); + case UWX_COPYIN_RSTACK: + *((uint64_t*)to) = *((uint64_t*)from); + return (8); + case UWX_COPYIN_REG: + if (from == UWX_REG_PFS) + from = rs->frame->tf_special.pfs; + else if (from == UWX_REG_PREDS) + from = rs->frame->tf_special.pr; + else if (from == UWX_REG_RNAT) + from = rs->frame->tf_special.rnat; + else if (from == UWX_REG_UNAT) + from = rs->frame->tf_special.unat; + else if (from >= UWX_REG_GR(0) && from <= UWX_REG_GR(127)) { + reg = from - UWX_REG_GR(0); + if (reg == 1) + from = rs->frame->tf_special.gp; + else if (reg == 12) + from = rs->frame->tf_special.sp; + else if (reg == 13) + from = rs->frame->tf_special.tp; + else if (reg >= 2 && reg <= 3) + from = (&rs->frame->tf_scratch.gr2)[reg - 2]; + else if (reg >= 8 && reg <= 11) + from = (&rs->frame->tf_scratch.gr8)[reg - 8]; + else if (reg >= 14 && reg <= 31) + from = (&rs->frame->tf_scratch.gr14)[reg - 14]; + else + goto oops; + } else if (from >= UWX_REG_BR(0) && from <= UWX_REG_BR(7)) { + reg = from - UWX_REG_BR(0); + if (reg == 0) + from = rs->frame->tf_special.rp; + else if (reg >= 6 && reg <= 7) + from = (&rs->frame->tf_scratch.br6)[reg - 6]; + else + goto oops; + } else + goto oops; - /* Set the current IP to the code address of savectx. */ - fp = (void*)savectx; - rs->rs_val.special.iip = *fp; - /* Cache the values. */ - rs->rs_val.special = pcb->pcb_special; - rs->rs_val.preserved = pcb->pcb_preserved; - rs->rs_val.preserved_fp = pcb->pcb_preserved_fp; - /* Set the location to the memory address in the PCB. */ - unw_set_loc(&rs->rs_loc.special, &pcb->pcb_special, - sizeof(rs->rs_loc.special)); - unw_set_loc(&rs->rs_loc.preserved, &pcb->pcb_preserved, - sizeof(rs->rs_loc.preserved)); - unw_set_loc(&rs->rs_loc.preserved_fp, &pcb->pcb_preserved_fp, - sizeof(rs->rs_loc.preserved_fp)); - return (0); -} + *((uint64_t*)to) = from; + return (len); + } -int -unw_table_add(uint64_t base, uint64_t start, uint64_t end) -{ - struct unw_table *ut; + oops: + printf("UNW: %s(%d, %p, %lx, %d, %lx)\n", __func__, req, to, from, + len, tok); - ut = malloc(sizeof(struct unw_table), M_UNWIND, M_NOWAIT); - if (ut == NULL) - return (ENOMEM); - - ut->ut_base = base; - ut->ut_start = (struct unw_entry*)start; - ut->ut_end = (struct unw_entry*)end; - ut->ut_limit = base + ut->ut_end[-1].ue_end; - LIST_INSERT_HEAD(&unw_tables, ut, ut_link); - - if (bootverbose) - printf("UNWIND: table added: base=%lx, start=%lx, end=%lx\n", - base, start, end); - return (0); } -void -unw_table_remove(uint64_t base) +static int +unw_cb_lookup(int req, uint64_t ip, intptr_t tok, uint64_t **vec) { + struct unw_regstate *rs = (void*)tok; struct unw_table *ut; - ut = unw_table_lookup(base); - if (ut != NULL) { - LIST_REMOVE(ut, ut_link); - free(ut, M_UNWIND); - if (bootverbose) - printf("UNWIND: table removed: base=%lx\n", base); + switch (req) { + case UWX_LKUP_LOOKUP: + ut = unw_table_lookup(ip); + if (ut == NULL) + return (UWX_LKUP_NOTFOUND); + rs->keyval[0] = UWX_KEY_TBASE; + rs->keyval[1] = ut->ut_base; + rs->keyval[2] = UWX_KEY_USTART; + rs->keyval[3] = (intptr_t)ut->ut_start; + rs->keyval[4] = UWX_KEY_UEND; + rs->keyval[5] = (intptr_t)ut->ut_end; + rs->keyval[6] = 0; + rs->keyval[7] = 0; + *vec = rs->keyval; + return (UWX_LKUP_UTABLE); + case UWX_LKUP_FREE: + return (0); } -} -#if 0 -static u_int64_t -read_uleb128(u_int8_t **pp) -{ - u_int8_t *p = *pp; - u_int8_t b; - u_int64_t res; - - res = 0; - do { - b = *p++; - res = (res << 7) | (b & 0x7f); - } while (b & (1 << 7)); - - *pp = p; - return res; + return (UWX_LKUP_ERR); } -#define PROCESS_WHEN(us, reg, t) \ -do { \ - DPF(("register %s was saved at offset %d\n", \ - #reg, t)); \ - us->us_regs.rs_##reg.ur_when = t; \ -} while (0) - -#define PROCESS_GR(us, reg, gr) \ -do { \ - DPF(("save location for %s at r%d\n", #reg, gr)); \ - us->us_regs.rs_##reg.ur_save = find_gr(us, gr); \ -} while (0) \ - -#define PROCESS_BR(us, reg, br) \ -do { \ - DPF(("save location for %s at b%d\n", #reg, br)); \ - us->us_regs.rs_##reg.ur_save = \ - &us->us_regs.rs_br[br].ur_value; \ -} while (0) - -#define PROCESS_GRMEM(us, reg) \ -do { \ - DPF(("save location for %s at spill+%d\n", \ - #reg, us->us_spilloff)); \ - us->us_regs.rs_##reg.ur_save = \ - &us->us_spill[us->us_spilloff]; \ - us->us_spilloff += 8; \ -} while (0) - -#define PROCESS_FRMEM(us, reg) \ -do { \ - DPF(("save location for %s at spill+%d\n", \ - #reg, us->us_spilloff)); \ - us->us_regs.rs_##reg.ur_save = \ - (struct ia64_fpreg *) \ - &us->us_spill[us->us_spilloff]; \ - us->us_spilloff += 16; \ -} while (0) - -#define PROCESS_SPREL(us, reg, spoff) \ -do { \ - DPF(("save location for %s at sp+%d\n", \ - #reg, 4*spoff)); \ - us->us_regs.rs_##reg.ur_save = (u_int64_t *) \ - (us->us_regs.rs_gr[12].ur_value + 4*spoff); \ -} while (0) - -#define PROCESS_SPREL_WHEN(us, reg, spoff, t) \ -do { \ - PROCESS_SPREL(us, reg, spoff); \ - PROCESS_WHEN(us, reg, t); \ -} while (0) - -#define PROCESS_PSPREL(us, reg, pspoff) \ -do { \ - DPF(("save location for %s at psp+%d\n", \ - #reg, 16-4*pspoff)); \ - us->us_regs.rs_##reg.ur_save = (u_int64_t *) \ - (us->us_regs.rs_psp.ur_value + 16-4*pspoff); \ -} while (0) - -#define PROCESS_PSPREL_WHEN(us, reg, pspoff, t) \ -do { \ - PROCESS_PSPREL(us, reg, pspoff); \ - PROCESS_WHEN(us, reg, t); \ -} while (0) - -static u_int64_t * -find_gr(struct ia64_unwind_state *us, int gr) +int +unw_create(struct unw_regstate *rs, struct trapframe *tf) { - if (gr < 32) - return &us->us_regs.rs_gr[gr].ur_value; - else - return ia64_rse_register_address(us->us_bsp, gr); -} + struct unw_table *ut; + uint64_t bsp; + int nats, sof, uwxerr; -static void -parse_prologue(struct ia64_unwind_state *us, int rlen) -{ -} + ut = unw_table_lookup(tf->tf_special.iip); + if (ut == NULL) + return (ENOENT); -static void -parse_prologue_gr(struct ia64_unwind_state *us, int rlen, - int mask, int grsave) -{ - if (mask & 8) { - PROCESS_GR(us, br[0], grsave); - grsave++; - } - if (mask & 4) { - PROCESS_GR(us, pfs, grsave); - grsave++; - } - if (mask & 2) { - PROCESS_GR(us, psp, grsave); - grsave++; - } - if (mask & 1) { - PROCESS_GR(us, preds, grsave); - grsave++; - } -} + rs->frame = tf; + rs->env = uwx_init(); + if (rs->env == NULL) + return (ENOMEM); -static void -parse_mem_stack_f(struct ia64_unwind_state *us, int t, int size) -{ - DPF(("restore value for psp is sp+%d at offset %d\n", - 16*size, t)); - us->us_regs.rs_psp.ur_when = t; - us->us_regs.rs_stack_size = 16*size; -} + uwxerr = uwx_register_callbacks(rs->env, (intptr_t)rs, + unw_cb_copyin, unw_cb_lookup); + if (uwxerr) + return (EINVAL); /* XXX */ -static void -parse_mem_stack_v(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, psp, t); -} + bsp = tf->tf_special.bspstore + tf->tf_special.ndirty; + sof = (int)(tf->tf_special.cfm & 0x7f); + nats = (sof + 63 - ((int)(bsp >> 3) & 0x3f)) / 63; + uwxerr = uwx_init_context(rs->env, tf->tf_special.iip, + tf->tf_special.sp, bsp - ((sof + nats) << 3), tf->tf_special.cfm); -static void -parse_psp_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, psp, gr); + return ((uwxerr) ? EINVAL : 0); /* XXX */ } -static void -parse_psp_sprel(struct ia64_unwind_state *us, int spoff) +int +unw_step(struct unw_regstate *rs) { - PROCESS_SPREL(us, psp, spoff); -} + int uwxerr; -static void -parse_rp_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, br[0], t); + uwxerr = uwx_step(rs->env); + return ((uwxerr) ? EINVAL : 0); /* XXX */ } -static void -parse_rp_gr(struct ia64_unwind_state *us, int gr) +int +unw_get_bsp(struct unw_regstate *s, uint64_t *r) { - PROCESS_GR(us, br[0], gr); -} + int uwxerr; -static void -parse_rp_br(struct ia64_unwind_state *us, int br) -{ - PROCESS_BR(us, br[0], br); + uwxerr = uwx_get_reg(s->env, UWX_REG_BSP, r); + return ((uwxerr) ? EINVAL : 0); /* XXX */ } -static void -parse_rp_psprel(struct ia64_unwind_state *us, int pspoff) +int +unw_get_cfm(struct unw_regstate *s, uint64_t *r) { - PROCESS_PSPREL(us, br[0], pspoff); -} + int uwxerr; -static void -parse_rp_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, br[0], spoff); + uwxerr = uwx_get_reg(s->env, UWX_REG_CFM, r); + return ((uwxerr) ? EINVAL : 0); /* XXX */ } -static void -parse_pfs_when(struct ia64_unwind_state *us, int t) +int +unw_get_ip(struct unw_regstate *s, uint64_t *r) { - PROCESS_WHEN(us, pfs, t); -} + int uwxerr; -static void -parse_pfs_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, pfs, gr); + uwxerr = uwx_get_reg(s->env, UWX_REG_IP, r); + return ((uwxerr) ? EINVAL : 0); /* XXX */ } -static void -parse_pfs_psprel(struct ia64_unwind_state *us, int pspoff) +int +unw_table_add(uint64_t base, uint64_t start, uint64_t end) { - PROCESS_PSPREL(us, pfs, pspoff); -} + struct unw_table *ut; -static void -parse_pfs_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, pfs, spoff); -} + ut = malloc(sizeof(struct unw_table), M_UNWIND, M_NOWAIT); + if (ut == NULL) + return (ENOMEM); -static void -parse_preds_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, preds, t); -} + ut->ut_base = base; + ut->ut_start = (struct unw_entry*)start; + ut->ut_end = (struct unw_entry*)end; + ut->ut_limit = base + ut->ut_end[-1].ue_end; + LIST_INSERT_HEAD(&unw_tables, ut, ut_link); -static void -parse_preds_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, preds, gr); -} + if (bootverbose) + printf("UNWIND: table added: base=%lx, start=%lx, end=%lx\n", + base, start, end); -static void -parse_preds_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, preds, pspoff); + return (0); } -static void -parse_preds_sprel(struct ia64_unwind_state *us, int spoff) +void +unw_table_remove(uint64_t base) { - PROCESS_SPREL(us, preds, spoff); -} + struct unw_table *ut; -static void -parse_fr_mem(struct ia64_unwind_state *us, int frmask) -{ - us->us_frmask = frmask; -} - -static void -parse_frgr_mem(struct ia64_unwind_state *us, int grmask, int frmask) -{ - us->us_grmask = grmask; - if (grmask & 1) - PROCESS_GRMEM(us, gr[4]); - if (grmask & 2) - PROCESS_GRMEM(us, gr[5]); - if (grmask & 4) - PROCESS_GRMEM(us, gr[6]); - if (grmask & 8) - PROCESS_GRMEM(us, gr[7]); - - us->us_frmask = frmask; - if (frmask & 1) - PROCESS_FRMEM(us, fr[2]); - if (frmask & 2) - PROCESS_FRMEM(us, fr[3]); - if (frmask & 4) - PROCESS_FRMEM(us, fr[4]); - if (frmask & 8) - PROCESS_FRMEM(us, fr[5]); - if (frmask & 16) - PROCESS_FRMEM(us, fr[16]); - if (frmask & 32) - PROCESS_FRMEM(us, fr[17]); - if (frmask & 64) - PROCESS_FRMEM(us, fr[18]); - if (frmask & 128) - PROCESS_FRMEM(us, fr[19]); - if (frmask & 256) - PROCESS_FRMEM(us, fr[20]); - if (frmask & 512) - PROCESS_FRMEM(us, fr[21]); - if (frmask & 1024) - PROCESS_FRMEM(us, fr[22]); - if (frmask & 2048) - PROCESS_FRMEM(us, fr[24]); - if (frmask & 4096) - PROCESS_FRMEM(us, fr[25]); - if (frmask & 8192) - PROCESS_FRMEM(us, fr[26]); - if (frmask & 16384) - PROCESS_FRMEM(us, fr[27]); - if (frmask & 32768) - PROCESS_FRMEM(us, fr[28]); - if (frmask & 65536) - PROCESS_FRMEM(us, fr[29]); - if (frmask & 131072) - PROCESS_FRMEM(us, fr[30]); - if (frmask & 262144) - PROCESS_FRMEM(us, fr[31]); -} - -static void -parse_gr_gr(struct ia64_unwind_state *us, int grmask, int gr) -{ - us->us_grmask = grmask; - if (grmask & 1) { - PROCESS_GR(us, gr[4], gr); - gr++; + ut = unw_table_lookup(base); + if (ut != NULL) { + LIST_REMOVE(ut, ut_link); + free(ut, M_UNWIND); + if (bootverbose) + printf("UNWIND: table removed: base=%lx\n", base); } - if (grmask & 2) { - PROCESS_GR(us, gr[5], gr); - gr++; - } - if (grmask & 4) { - PROCESS_GR(us, gr[6], gr); - gr++; - } - if (grmask & 8) { - PROCESS_GR(us, gr[7], gr); - gr++; - } } static void -parse_gr_mem(struct ia64_unwind_state *us, int grmask) +unw_initialize(void *dummy __unused) { - us->us_grmask = grmask; - if (grmask & 1) - PROCESS_GRMEM(us, gr[4]); - if (grmask & 2) - PROCESS_GRMEM(us, gr[5]); - if (grmask & 4) - PROCESS_GRMEM(us, gr[6]); - if (grmask & 8) - PROCESS_GRMEM(us, gr[7]); -} -static void -parse_br_mem(struct ia64_unwind_state *us, int brmask) -{ - us->us_brmask = brmask; - if (brmask & 1) - PROCESS_GRMEM(us, br[1]); - if (brmask & 2) - PROCESS_GRMEM(us, br[2]); - if (brmask & 4) - PROCESS_GRMEM(us, br[3]); - if (brmask & 8) - PROCESS_GRMEM(us, br[4]); - if (brmask & 16) - PROCESS_GRMEM(us, br[5]); + LIST_INIT(&unw_tables); + uwx_register_alloc_cb(unw_alloc, unw_free); } - -static void -parse_br_gr(struct ia64_unwind_state *us, int brmask, int gr) -{ - us->us_brmask = brmask; - if (brmask & 1) { - PROCESS_GR(us, br[1], gr); - gr++; - } - if (brmask & 2) { - PROCESS_GR(us, br[2], gr); - gr++; - } - if (brmask & 4) { - PROCESS_GR(us, br[3], gr); - gr++; - } - if (brmask & 8) { - PROCESS_GR(us, br[4], gr); - gr++; - } - if (brmask & 16) { - PROCESS_GR(us, br[5], gr); - gr++; - } -} - -static void -parse_spill_base(struct ia64_unwind_state *us, int pspoff) -{ - DPF(("base of spill area at psp+%d\n", 16 - 4*pspoff)); - us->us_spill = (u_int64_t *) - (us->us_regs.rs_psp.ur_value + 16 - 4*pspoff); -} - -static void -parse_spill_mask(struct ia64_unwind_state *us, int rlen, u_int8_t *imask) -{ - int i, reg; - u_int8_t b; - static int frno[] = { - 2, 3, 4, 5, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31 - }; - - for (i = 0; i < rlen; i++) { - b = imask[i / 4]; - b = (b >> (2 * (3-(i & 3)))) & 3; - switch (b) { - case 0: - break; - case 1: - reg = frno[ffs(us->us_frmask) - 1]; - DPF(("restoring fr[%d] at offset %d\n", reg, i)); - us->us_regs.rs_fr[reg].ur_when = i; - break; - case 2: - reg = ffs(us->us_grmask) - 1 + 4; - DPF(("restoring gr[%d] at offset %d\n", reg, i)); - us->us_regs.rs_gr[reg].ur_when = i; - break; - case 3: - reg = ffs(us->us_brmask) - 1 + 1; - DPF(("restoring br[%d] at offset %d\n", reg, i)); - us->us_regs.rs_gr[reg].ur_when = i; - break; - } - } -} - -static void -parse_unat_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, unat, t); -} - -static void -parse_unat_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, unat, gr); -} - -static void -parse_unat_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, unat, pspoff); -} - -static void -parse_unat_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, unat, spoff); -} - -static void -parse_lc_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, lc, t); -} - -static void -parse_lc_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, lc, gr); -} - -static void -parse_lc_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, lc, pspoff); -} - -static void -parse_lc_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, lc, spoff); -} - -static void -parse_fpsr_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, fpsr, t); -} - -static void -parse_fpsr_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, fpsr, gr); -} - -static void -parse_fpsr_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, fpsr, pspoff); -} - -static void -parse_fpsr_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, fpsr, spoff); -} - -static void -parse_priunat_when_gr(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, priunat, t); -} - -static void -parse_priunat_when_mem(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, priunat, t); -} - -static void -parse_priunat_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, priunat, gr); -} - -static void -parse_priunat_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, priunat, pspoff); -} - -static void -parse_priunat_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, priunat, spoff); -} - -static void -parse_bsp_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, bsp, t); -} - -static void -parse_bsp_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, bsp, gr); -} - -static void -parse_bsp_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, bsp, pspoff); -} - -static void -parse_bsp_sprel(struct ia64_unwind_state *us, int spoff) -{ - PROCESS_SPREL(us, bsp, spoff); -} - -static void -parse_bspstore_when(struct ia64_unwind_state *us, int t) -{ - PROCESS_WHEN(us, bspstore, t); -} - -static void -parse_bspstore_gr(struct ia64_unwind_state *us, int gr) -{ - PROCESS_GR(us, bspstore, gr); -} - -static void -parse_bspstore_psprel(struct ia64_unwind_state *us, int pspoff) -{ - PROCESS_PSPREL(us, bspstore, pspoff); -} - -static void >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305150755.h4F7tamV011418>