This is fasl_pass2.c in view mode; [Download] [Up]
/* (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved. */ /* fasl_pass2.c DG-SPECIFIC fasl loader pass2 routines */ #include "../h/fasl.h" #include "../h/fasl_global.h" data_pass2() { FAS_HDR_P hdr_p; FAS_DATA_P data_p; FAS_DICT_P dict_p; int not_over; /* overwrite flag */ short *block_end; /* end of this block */ short *rdata_p; /* relocation data pointer */ short *p_addr; /* partition start addr */ short *rdata_addr; /* relocationed data addr */ short *base_p; /* base pointer */ short *dword_p; /* dictionaried data word pointer */ short data_len; /* copy of data_words */ short base, repeat_count; short reloc; /* relocation operation */ short reloc_ex; /* extended relocaton operation */ /* initialize */ hdr_p = (FAS_HDR_P)fas_buffp; if ((hdr_p->hdr_typ) && OVER_BIT) not_over = FALSE; else not_over = TRUE; block_end = (short *)fas_buffp + hdr_p->hdr_len; data_p = (FAS_DATA_P)(fas_buffp + FAS_HEADER_BLEN); if (datab_rev < 2) rdata_p = (short *)(data_p + 1) - 2; else rdata_p = (short *)(data_p + 1); data_len = data_p->data_words; if (data_len == 0) return; if (datab_rev < 2) repeat_count = 1; else repeat_count = data_p->data_repeat; base = data_p->data_base; /* part_table_p = fasl_get_table(base); p_addr = (short *)(part_table_p->part_addr); */ p_addr = fasl_get_addr(base); /* data relocation */ reloc = (data_p->data_reloc) & RELOC_OP; reloc_ex = ((data_p->data_reloc) & RELOC_OP_EX) >> RELOC_OP_S; if (reloc != EX_RELOC) unexpect_reloc(reloc); base_p = &(data_p->data_base); dword_p = &(data_p->data_disp); relocation(reloc_ex, base_p, dword_p); rdata_addr = *((int *)dword_p); while(repeat_count-- > 0) { /* if (not_over == TRUE) fasl_set_map(rdata_addr - fas_rstart, data_len, rdata_p, rdata_addr); */ /* block move data to alocated memory */ blockmove((char *)rdata_addr, (char *)rdata_p, data_len * 2); dict_p = (FAS_DICT_P)(rdata_p + data_len); /* set to first dictionary */ while (dict_p < block_end) { /* loop for each dictionary */ reloc = (dict_p->dict_reloc) & RELOC_OP; reloc_ex = ((dict_p->dict_reloc) & RELOC_OP_EX) >> RELOC_OP_S; /* if ((reloc != EX_RELOC) && (reloc != BIT_RELOC)) */ if (reloc != EX_RELOC) unexpect_reloc(reloc); /* set base pointer */ base_p = &(dict_p->dict_base); /* set dictionaried data word pointer */ if (datab_rev == 0) dword_p = p_addr + dict_p->dict_data; else /* offset from partition */ dword_p = rdata_addr + dict_p->dict_data; /* offset from data */ /* relocate this data word */ relocation(reloc_ex, base_p, dword_p); /* for next dictionary */ dict_p = dict_p + 1; } /* end of while for each dictionary */ /* advance rdata_addr to relocate once more */ rdata_addr += data_len; } /* end of while for repeat count */ } ent_pass2() { FAS_HDR_P hdr_p; FAS_ENT_P ent_p; FAS_ENTD_P entd_p; short name_len, base, reloc, reloc_ex; short *base_p, *dword_p; long disp; char *name_ptr; char namebuff[MAX_SYMBOL + 1]; int i, repeat; if (fas_routine_addr != 0) return; hdr_p = (FAS_HDR_P)fas_buffp; ent_p = (FAS_ENT_P)(hdr_p + 1); entd_p = (FAS_ENTD_P)(ent_p + 1); repeat = ent_p->ent_count; while (repeat-- > 0) { name_len = (entd_p->entd_len) & L_MASK; if (name_len < 4) goto NEXT; name_ptr = (char *)fas_buffp + (entd_p->entd_ptr); for (i=0; i < 4; i++) /* compare first 4 bytes */ namebuff[i] = *(name_ptr + i); namebuff[i] = '\0'; if (strcmp(fas_routine_name, namebuff) == 0) goto FOUND_SYM; /* init routine name ? */ NEXT: entd_p += 1; /* advance for next */ continue; FOUND_SYM: /* We found the init routine's symbol. Relocate it. */ reloc = entd_p->entd_reloc & RELOC_OP; reloc_ex = (entd_p->entd_reloc & RELOC_OP_EX) >> RELOC_OP_S; if (reloc != EX_RELOC) unexpect_reloc(reloc); base_p = &(entd_p->entd_base); dword_p = &(entd_p->entd_disp); relocation(reloc_ex, base_p, dword_p); /* save init routine address */ fas_routine_addr = *((int *)dword_p); break; } /* end of while */ } fasl_set_map(sb, len, sp, dp) int sb, len; short *sp, *dp; { int i, mask; /* while(len-- > 0) { i = sb / 32; mask = 1 << (31 - sb % 32); if ((fas_map[i] & mask) && (*(dp + sb) != *(sp + sb))) FEerror("Overwrite error", 0); fas_map[i] |= mask; sb++; } */ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.