856 lines
35 KiB
C
856 lines
35 KiB
C
/* @(#)73 1.6.2.5 src/bos/kernel/si/POWER/branch.h, syssi, bos41J, 9521A_all 5/23/95 13:55:52 */
|
|
/*
|
|
* COMPONENT_NAME: (SYSSI) System Initialization
|
|
*
|
|
* FUNCTIONS:
|
|
*
|
|
* ORIGINS: 27, 83
|
|
*
|
|
* IBM CONFIDENTIAL -- (IBM Confidential Restricted when
|
|
* combined with the aggregated modules for this product)
|
|
* SOURCE MATERIALS
|
|
* (C) COPYRIGHT International Business Machines Corp. 1993, 1995
|
|
* All Rights Reserved
|
|
*
|
|
* US Government Users Restricted Rights - Use, duplication or
|
|
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
|
|
*
|
|
* When adding functions to this table the file branch.m4 must also be
|
|
* changed.
|
|
*
|
|
* NOTE: This header file should only be included by hardinit.c.
|
|
* types.h and overlay.h must be included before this.
|
|
*/
|
|
|
|
/*
|
|
* LEVEL 1, 5 Years Bull Confidential Information
|
|
*/
|
|
|
|
extern int brkpoint();
|
|
extern int d_slave(), d_slave_rs1(), d_slave_rsc(), d_slave_ppc();
|
|
extern int d_kmove(), d_kmove_rs1();
|
|
extern int d_move(), d_move_pwr(), d_move_ppc();
|
|
extern int d_master(), d_master_pwr(), d_master_ppc();
|
|
extern int d_complete(), d_complete_pwr(), d_complete_ppc();
|
|
extern int d_init(), d_init_pwr(), d_init_ppc();
|
|
extern int d_clear(), d_clear_pwr(), d_clear_ppc();
|
|
extern int d_cflush(), d_cflush_pwr(), d_cflush_ppc();
|
|
extern int d_bflush(), d_bflush_pwr(), d_bflush_ppc();
|
|
extern int d_mask(), d_mask_pwr(), d_mask_ppc();
|
|
extern int d_unmask(), d_unmask_pwr(), d_unmask_ppc();
|
|
extern int xmemdma(), xmemdma_pwr(), xmemdma_ppc();
|
|
extern int state_save(), state_save_rs(), state_save_pc();
|
|
extern int resume(), resume_rs(), resume_pc();
|
|
extern int mfsri_pwr, mfsri_ppc, mfsr_pwr, mfsr_ppc;
|
|
extern int chgsr_pwr, chgsr_601, chgsr_ppc, mtsr_ppc, mtsr_pwr;
|
|
extern int vm_cflush(), vm_cflush_pwr(), vm_cflush_ppc_comb();
|
|
extern int v_copypage(), v_copypage_pwr(), v_copypage_ppc_comb();
|
|
extern int v_zpage(), v_zpage_ppc(), v_zpage_pwr();
|
|
extern int mfdec(), mfdec_pwr(), mfdec_ppc();
|
|
extern int al_prolog_pwr, al_prolog_ppc;
|
|
extern int ds_flih, pr_flih, pr_flih_ppc, mc_flih, sr_flih;
|
|
extern int is_flih, fp_flih;
|
|
extern int run_flih;
|
|
extern int isync_vmatt, isync_vmdet;
|
|
extern int noop_inst_pwr, noop_inst_ppc;
|
|
extern int isync_dsis;
|
|
extern int isync_vcs1, isync_vcs2, isync_vcs3, isync_vcs4,
|
|
isync_vcs5, isync_vcs6, isync_tlb;
|
|
extern int isync_disownfp_1, isync_disownfp_2, isync_disownfp_3,
|
|
isync_disownfp_4, isync_disownfp_5, isync_disownfp_6;
|
|
extern int isync_swtch_1;
|
|
#ifdef _POWER_MP
|
|
extern int isync_swtch_2;
|
|
#endif
|
|
extern int isync_i_dosoft;
|
|
|
|
extern int isync_copyinstr1, isync_copyinstr2;
|
|
extern int mulh_pwr, mull_pwr, divss_pwr, divus_pwr, quoss_pwr, quous_pwr;
|
|
extern int mulh_ppc, mull_ppc, divss_ppc, divus_ppc, quoss_ppc, quous_ppc;
|
|
extern int mc_prolog_pwr, dse_prolog_ppc;
|
|
extern int flih_prolog_pwr;
|
|
extern int fpi_flih;
|
|
extern int sc_front_pwr, sc_front_ppc, cs_svc_pwr, cs_pwr, cs_ppc;
|
|
extern int isync_sc1, isync_sc2, isync_sc3, isync_sc4;
|
|
extern int ds_prolog_pwr, ds_prolog_ppc, is_prolog_pwr, is_prolog_ppc;
|
|
extern int isync_kgetsig;
|
|
|
|
/*
|
|
* External interrupt
|
|
*/
|
|
extern int ex_flih_rs1, ex_flih_rs2, ex_flih_ppc;
|
|
extern int i_reset_int(), i_reset_pwr(), i_reset_ppc();
|
|
extern int i_unmask_pwr(), i_unmask_ppc();
|
|
extern int i_mask_pwr(), i_mask_ppc();
|
|
extern int i_genplvl(), i_genplvl_rs1(), i_genplvl_rs2(), i_genplvl_ppc();
|
|
extern int i_enableplvl(), i_enableplvl_rs1(), i_enableplvl_rs2(),
|
|
i_enableplvl_ppc();
|
|
extern int i_disableplvl(), i_disableplvl_rs1(), i_disableplvl_rs2(),
|
|
i_disableplvl_ppc();
|
|
extern int i_loginterr(), i_loginterr_pwr(), i_loginterr_ppc();
|
|
extern int i_soft(), i_eis_set(), i_peis_set(), i_mfrr_set();
|
|
extern int i_reset_soft(), i_eis_reset(), i_peis_reset(), i_mfrr_reset();
|
|
extern int i_issue_eoi(), i_issue_eoi_ppc(), i_issue_eoi_rspc();
|
|
|
|
/* Simple linked list manipulations */
|
|
extern void put_onto_list(), put_onto_list_ppc(), put_onto_list_pwr();
|
|
extern void get_from_list(), *get_from_list_ppc(), *get_from_list_pwr();
|
|
|
|
/* Atomic Op with limit check */
|
|
extern int fetch_and_limit(), fetch_and_limit_ppc(), fetch_and_limit_pwr();
|
|
|
|
/* Locks and Atomic Ops--branch table entries */
|
|
extern void slock(), slock_pwr(), slock_ppc();
|
|
extern void sunlock(), sunlock_pwr(), sunlock_ppc();
|
|
extern boolean_t lock_mine(), lock_mine_pwr(), lock_mine_ppc();
|
|
extern void lock_write(), lock_write_pwr(), lock_write_ppc();
|
|
extern void lock_read(), lock_read_pwr(), lock_read_ppc();
|
|
extern void lock_done(), lock_done_pwr(), lock_done_ppc();
|
|
extern boolean_t lock_read_to_write(), lock_read_to_write_pwr(),
|
|
lock_read_to_write_ppc();
|
|
extern void lock_write_to_read(), lock_write_to_read_pwr(),
|
|
lock_write_to_read_ppc();
|
|
extern boolean_t lock_try_write(), lock_try_write_pwr(), lock_try_write_ppc();
|
|
extern boolean_t lock_try_read(), lock_try_read_pwr(), lock_try_read_ppc();
|
|
extern boolean_t lock_try_read_to_write(), lock_try_read_to_write_pwr(),
|
|
lock_try_read_to_write_ppc();
|
|
|
|
/* Locks and Atomic Ops--overlay table entries */
|
|
#ifdef _POWER_MP
|
|
extern int rsimple_lock_pwr, rsimple_lock_ppc;
|
|
extern int rsimple_lock_try_pwr, rsimple_lock_try_ppc;
|
|
extern int rsimple_unlock_pwr, rsimple_unlock_ppc;
|
|
#endif /* _POWER_MP */
|
|
extern int simple_lock_pwr, simple_lock_ppc;
|
|
extern int simple_lock_try_pwr, simple_lock_try_ppc;
|
|
extern int simple_unlock_pwr, simple_unlock_ppc;
|
|
extern int fetch_and_add_pwr, fetch_and_add_ppc;
|
|
extern int fetch_and_add_h_pwr, fetch_and_add_h_ppc;
|
|
extern int fetch_and_and_pwr, fetch_and_and_ppc;
|
|
extern int fetch_and_or_pwr, fetch_and_or_ppc;
|
|
extern int fetch_and_nop_pwr, fetch_and_nop_ppc;
|
|
extern int compare_and_swap_pwr, compare_and_swap_ppc;
|
|
extern int test_and_set_pwr, test_and_set_ppc;
|
|
extern int disable_lock_rs1, disable_lock_rs2, disable_lock_sof;
|
|
extern int unlock_enable_rs1, unlock_enable_rs2, unlock_enable_sof;
|
|
extern int lockl_pwr, lockl_ppc;
|
|
extern int unlockl_pwr, unlockl_ppc;
|
|
extern int _check_lock_ppc, _check_lock_pwr, _clear_lock_pwr, _clear_lock_ppc;
|
|
|
|
#ifdef _POWER_MP
|
|
/* ppda/csa/curthread management -- overlay table entries */
|
|
extern int my_ppda_pwr, my_ppda_ppc;
|
|
extern int my_csa_pwr, my_csa_ppc;
|
|
extern int get_curthread_pwr, get_curthread_ppc;
|
|
extern int set_csa_pwr, set_csa_ppc;
|
|
extern int set_curthread_pwr, set_curthread_ppc;
|
|
#endif
|
|
|
|
extern void vmhwinit(), vmhwinit_pwr(), vmhwinit_ppc();
|
|
extern void p_enter(), p_enter_rs1(), p_enter_rs2(), p_enter_ppc();
|
|
extern void p_rename(), p_rename_rs1(), p_rename_rs2(), p_rename_ppc();
|
|
extern void p_remove(), p_remove_rs1(), p_remove_rs2(), p_remove_ppc();
|
|
extern void p_remove_all(), p_remove_all_rs1(), p_remove_all_rs2(),
|
|
p_remove_all_ppc();
|
|
extern int p_is_modified(), p_is_modified_rs1(), p_is_modified_rs2(),
|
|
p_is_modified_ppc();
|
|
extern int p_is_referenced(), p_is_referenced_rs1(), p_is_referenced_rs2(),
|
|
p_is_referenced_ppc();
|
|
extern int p_clear_modify(), p_clear_modify_rs1(), p_clear_modify_rs2(),
|
|
p_clear_modify_ppc();
|
|
extern void p_protect(), p_protect_rs1(), p_protect_rs2(), p_protect_ppc();
|
|
extern void p_page_protect(), p_page_protect_rs1(), p_page_protect_rs2(),
|
|
p_page_protect_ppc();
|
|
extern void p_lookup(), p_lookup_rs1(), p_lookup_rs2(), p_lookup_ppc();
|
|
extern void curtime(), curtime_pwr(), curtime_ppc();
|
|
extern void update_decrementer(), mtdec(), update_decrementer_ppc();
|
|
extern void update_system_time(), update_system_time_pwr(),
|
|
update_system_time_ppc();
|
|
extern int i_reset_rspc(), i_unmask_rspc(), i_mask_rspc(), i_genplvl_rspc();
|
|
extern int i_enableplvl_rspc(), i_disableplvl_rspc(), i_loginterr_soft();
|
|
extern int ex_flih_rspc, dec_flih;
|
|
extern int iomem_att_601(), iomem_att_ppc();
|
|
extern int iomem_det_601(), iomem_det_ppc();
|
|
extern int v_copypage_ppc_splt(), vm_cflush_ppc_splt();
|
|
extern int xmemccpy(), xmemccpy_pwr(), xmemccpy_ppc();
|
|
extern void invtlb(), invtlb_pwr(), invtlb_ppc();
|
|
extern int tlb_flih_ifm, tlb_flih_drm, tlb_flih_dwm;
|
|
extern void *copyin();
|
|
extern void *copyin_pwr();
|
|
extern void *copyin_ppc();
|
|
extern void *uiocopyin();
|
|
extern void *uiocopyin_pwr();
|
|
extern void *uiocopyin_ppc();
|
|
extern void *uiocopyin_chksum();
|
|
extern void *uiocopyin_chksum_pwr();
|
|
extern void *uiocopyin_chksum_ppc();
|
|
extern void *copyout();
|
|
extern void *copyout_pwr();
|
|
extern void *copyout_ppc();
|
|
extern void *uiocopyout();
|
|
extern void *uiocopyout_pwr();
|
|
extern void *uiocopyout_ppc();
|
|
extern void *uiocopyout_chksum();
|
|
extern void *uiocopyout_chksum_pwr();
|
|
extern void *uiocopyout_chksum_ppc();
|
|
extern void *exbcopy();
|
|
extern void *exbcopy_pwr();
|
|
extern void *exbcopy_ppc();
|
|
|
|
/*
|
|
* These macros are used to enlose model and processor specific functions.
|
|
* The macro generates NULL if the correct preprocessor directive is not
|
|
* set. Using the macros prevents external references from being
|
|
* genereated when the directive is not on. NULL allways means no action
|
|
* in the branch tables.
|
|
*
|
|
* PowerRS machines use the same macros for processor and model
|
|
* checks.
|
|
*/
|
|
|
|
/*
|
|
* Power RS1 processor and model architecture
|
|
*/
|
|
#ifdef _POWER_RS1
|
|
#define RS1(name) name
|
|
#else
|
|
#define RS1(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Power RS2 processor and model architecture
|
|
*/
|
|
#ifdef _POWER_RS2
|
|
#define RS2(name) name
|
|
#else
|
|
#define RS2(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Power RSC processor and model architecture
|
|
*/
|
|
#ifdef _POWER_RSC
|
|
#define RSC(name) name
|
|
#else
|
|
#define RSC(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Power PC 601 processor
|
|
*/
|
|
#ifdef _POWER_601
|
|
#define R601(name) name
|
|
#else
|
|
#define R601(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Power PC 603 processor
|
|
*/
|
|
#ifdef _POWER_603
|
|
#define R603(name) name
|
|
#else
|
|
#define R603(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Power PC 604 processor
|
|
*/
|
|
#ifdef _POWER_604
|
|
#define R604(name) name
|
|
#else
|
|
#define R604(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Pegasus and Rainbow models
|
|
*/
|
|
#if defined(_RS6K)
|
|
#define RRB(name) name
|
|
#else
|
|
#define RRB(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Sandalfoot models
|
|
*/
|
|
#ifdef _RSPC_UP_PCI
|
|
#define RSF(name) name
|
|
#else
|
|
#define RSF(name) NULL
|
|
#endif
|
|
|
|
/*
|
|
* Index defines for processor based branch tables. For each function
|
|
* an array of MAX_PROC_INDEX choices are available. Possition determines
|
|
* the appropriate value for each CPU
|
|
*/
|
|
#define MAX_PROC_INDEX 6
|
|
#define RS1_INDEX 0 /* Power RS RS1 */
|
|
#define RSC_INDEX 1 /* Power RS RSC */
|
|
#define RS2_INDEX 2 /* Power RS RS2 */
|
|
#define R601_INDEX 3 /* Power PC 601 */
|
|
#define R603_INDEX 4 /* Power PC 603 */
|
|
#define R604_INDEX 5 /* Power PC 604 */
|
|
|
|
/*
|
|
* Index defines for model based branch tables. For each function
|
|
* an array of MAX_MODEL_INDEX choices are available. Possition determines
|
|
* the appropriate value for each model
|
|
*/
|
|
#define MAX_MODEL_INDEX 5
|
|
#define MOD_RS1_INDEX 0 /* Power RS1 based model */
|
|
#define MOD_RSC_INDEX 1 /* Power RSC based model */
|
|
#define MOD_RS2_INDEX 2 /* Power RS2 based model */
|
|
#define MOD_RB_INDEX 3 /* Rainbow and Pagasus */
|
|
#define MOD_SF_INDEX 4 /* Sandal foot */
|
|
|
|
|
|
/* The following tables describes machine dependent functions.
|
|
* This table is used to hide hardware differences in low level routines
|
|
* from the caller. This table is carefully coded so that it does not
|
|
* reference any function unless its preprocessor directive is defined.
|
|
*
|
|
* There are three types of tables. Branch, overlay, and flih vectors.
|
|
* For each type of table a model and processor table is defined.
|
|
*
|
|
* For each entry in the tables, position is important. Two functions --
|
|
* proc_index() and model_index() are used to return one of the above
|
|
* indexes. These functions are used for all tables
|
|
*/
|
|
|
|
|
|
/*
|
|
* This is the processor specific branch table
|
|
*/
|
|
static struct {
|
|
int (*ext_name)(); /* real function name */
|
|
int (*proc_name[MAX_PROC_INDEX])(); /* processor specific choices */
|
|
}branch_data[] = {
|
|
|
|
{xmemdma, RS1(xmemdma_pwr), RSC(xmemdma_pwr), RS2(xmemdma_pwr),
|
|
R601(xmemdma_ppc), R603(xmemdma_ppc), R604(xmemdma_ppc)},
|
|
{resume, {RS1(resume_rs), RSC(resume_rs), RS2(resume_rs),
|
|
R601(resume_pc), R603(resume_pc), R604(resume_pc)}},
|
|
{state_save, RS1(state_save_rs), RSC(state_save_rs), RS2(state_save_rs),
|
|
R601(state_save_pc), R603(state_save_pc), R604(state_save_pc)},
|
|
{vm_cflush, RS1(vm_cflush_pwr), RSC(vm_cflush_pwr), RS2(vm_cflush_pwr),
|
|
R601(vm_cflush_ppc_comb), R603(vm_cflush_ppc_splt),
|
|
R604(vm_cflush_ppc_splt)},
|
|
{v_copypage, RS1(v_copypage_pwr), RSC(v_copypage_pwr),
|
|
RS2(v_copypage_pwr), R601(v_copypage_ppc_comb),
|
|
R603(v_copypage_ppc_splt), R604(v_copypage_ppc_splt)},
|
|
{v_zpage, RS1(v_zpage_pwr), RSC(v_zpage_pwr),
|
|
RS2(v_zpage_pwr), R601(v_zpage_ppc), R603(v_zpage_ppc),
|
|
R604(v_zpage_ppc)},
|
|
{mfdec, RS1(mfdec_pwr), RSC(mfdec_pwr), RS2(mfdec_pwr),
|
|
R601(mfdec_ppc), R603(mfdec_ppc), R604(mfdec_ppc)},
|
|
{iomem_att, RS1(brkpoint), RSC(brkpoint), RS2(brkpoint),
|
|
R601(iomem_att_601), R603(iomem_att_ppc), R604(iomem_att_ppc)},
|
|
{iomem_det, RS1(brkpoint), RSC(brkpoint), RS2(brkpoint),
|
|
R601(iomem_det_601), R603(iomem_det_ppc), R604(iomem_det_ppc)},
|
|
{io_att, RS1(vm_att), RSC(vm_att), RS2(vm_att),
|
|
R601(vm_att), R603(vm_att), R604(vm_att)},
|
|
{io_det, RS1(vm_det), RSC(vm_det), RS2(vm_det),
|
|
R601(vm_det), R603(vm_det), R604(vm_det)},
|
|
{xmemccpy, RS1(xmemccpy_pwr), RSC(xmemccpy_pwr), RS2(xmemccpy_pwr),
|
|
R601(xmemccpy_pwr), R603(xmemccpy_ppc), R604(xmemccpy_ppc) },
|
|
{invtlb, RS1(invtlb_pwr), RSC(invtlb_pwr), RS2(invtlb_pwr),
|
|
R601(invtlb_ppc), R603(invtlb_ppc), R604(invtlb_ppc) },
|
|
|
|
/* Simple list manipulations */
|
|
{get_from_list, RS1(get_from_list_pwr), RSC(get_from_list_pwr),
|
|
RS2(get_from_list_pwr), R601(get_from_list_ppc),
|
|
R603(get_from_list_ppc), R604(get_from_list_ppc)},
|
|
|
|
{put_onto_list, RS1(put_onto_list_pwr), RSC(put_onto_list_pwr),
|
|
RS2(put_onto_list_pwr), R601(put_onto_list_ppc),
|
|
R603(put_onto_list_ppc), R604(put_onto_list_ppc)},
|
|
|
|
/* Atomic Op with limit check */
|
|
{fetch_and_limit, RS1(fetch_and_limit_pwr), RSC(fetch_and_limit_pwr),
|
|
RS2(fetch_and_limit_pwr), R601(fetch_and_limit_ppc),
|
|
R603(fetch_and_limit_ppc), R604(fetch_and_limit_ppc)},
|
|
|
|
/* Locks and Atomic Ops--branch table entries */
|
|
{slock, RS1(slock_pwr), RSC(slock_pwr),
|
|
RS2(slock_pwr), R601(slock_ppc), R603(slock_ppc),
|
|
R604(slock_ppc)},
|
|
{sunlock, RS1(sunlock_pwr), RSC(sunlock_pwr),
|
|
RS2(sunlock_pwr), R601(sunlock_ppc), R603(sunlock_ppc),
|
|
R604(sunlock_ppc)},
|
|
{lock_mine, RS1(lock_mine_pwr), RSC(lock_mine_pwr),
|
|
RS2(lock_mine_pwr), R601(lock_mine_ppc), R603(lock_mine_ppc),
|
|
R604(lock_mine_ppc)},
|
|
{lock_write, RS1(lock_write_pwr), RSC(lock_write_pwr),
|
|
RS2(lock_write_pwr), R601(lock_write_ppc), R603(lock_write_ppc),
|
|
R604(lock_write_ppc)},
|
|
{lock_read, RS1(lock_read_pwr), RSC(lock_read_pwr),
|
|
RS2(lock_read_pwr), R601(lock_read_ppc), R603(lock_read_ppc),
|
|
R604(lock_read_ppc)},
|
|
{lock_done, RS1(lock_done_pwr), RSC(lock_done_pwr),
|
|
RS2(lock_done_pwr), R601(lock_done_ppc), R603(lock_done_ppc),
|
|
R604(lock_done_ppc)},
|
|
{lock_read_to_write, RS1(lock_read_to_write_pwr),
|
|
RSC(lock_read_to_write_pwr),RS2(lock_read_to_write_pwr),
|
|
R601(lock_read_to_write_ppc), R603(lock_read_to_write_ppc),
|
|
R604(lock_read_to_write_ppc)},
|
|
{lock_write_to_read, RS1(lock_write_to_read_pwr),
|
|
RSC(lock_write_to_read_pwr), RS2(lock_write_to_read_pwr),
|
|
R601(lock_write_to_read_ppc), R603(lock_write_to_read_ppc),
|
|
R604(lock_write_to_read_ppc)},
|
|
{lock_try_write, RS1(lock_try_write_pwr), RSC(lock_try_write_pwr),
|
|
RS2(lock_try_write_pwr), R601(lock_try_write_ppc),
|
|
R603(lock_try_write_ppc), R604(lock_try_write_ppc)},
|
|
{lock_try_read, RS1(lock_try_read_pwr), RSC(lock_try_read_pwr),
|
|
RS2(lock_try_read_pwr), R601(lock_try_read_ppc),
|
|
R603(lock_try_read_ppc), R604(lock_try_read_ppc)},
|
|
{lock_try_read_to_write, RS1(lock_try_read_to_write_pwr),
|
|
RSC(lock_try_read_to_write_pwr),
|
|
RS2(lock_try_read_to_write_pwr),
|
|
R601(lock_try_read_to_write_ppc),
|
|
R603(lock_try_read_to_write_ppc),
|
|
R604(lock_try_read_to_write_ppc)},
|
|
{vmhwinit, RS1(vmhwinit_pwr), RSC(vmhwinit_pwr), RS2(vmhwinit_pwr),
|
|
R601(vmhwinit_ppc), R603(vmhwinit_ppc), R604(vmhwinit_ppc)},
|
|
{p_enter, RS1(p_enter_rs1), RSC(p_enter_rs1),
|
|
RS2(p_enter_rs2), R601(p_enter_ppc), R603(p_enter_ppc),
|
|
R604(p_enter_ppc)},
|
|
{p_rename, RS1(p_rename_rs1), RSC(p_rename_rs1),
|
|
RS2(p_rename_rs2), R601(p_rename_ppc), R603(p_rename_ppc),
|
|
R604(p_rename_ppc)},
|
|
{p_remove, RS1(p_remove_rs1), RSC(p_remove_rs1),
|
|
RS2(p_remove_rs2), R601(p_remove_ppc), R603(p_remove_ppc),
|
|
R604(p_remove_ppc)},
|
|
{p_remove_all, RS1(p_remove_all_rs1), RSC(p_remove_all_rs1),
|
|
RS2(p_remove_all_rs2), R601(p_remove_all_ppc),
|
|
R603(p_remove_all_ppc), R604(p_remove_all_ppc)},
|
|
{p_is_modified, RS1(p_is_modified_rs1), RSC(p_is_modified_rs1),
|
|
RS2(p_is_modified_rs2), R601(p_is_modified_ppc),
|
|
R603(p_is_modified_ppc), R604(p_is_modified_ppc)},
|
|
{p_is_referenced, RS1(p_is_referenced_rs1), RSC(p_is_referenced_rs1),
|
|
RS2(p_is_referenced_rs2), R601(p_is_referenced_ppc),
|
|
R603(p_is_referenced_ppc), R604(p_is_referenced_ppc)},
|
|
{p_clear_modify, RS1(p_clear_modify_rs1), RSC(p_clear_modify_rs1),
|
|
RS2(p_clear_modify_rs2), R601(p_clear_modify_ppc),
|
|
R603(p_clear_modify_ppc), R604(p_clear_modify_ppc)},
|
|
{p_protect, RS1(p_protect_rs1), RSC(p_protect_rs1),
|
|
RS2(p_protect_rs2), R601(p_protect_ppc), R603(p_protect_ppc),
|
|
R604(p_protect_ppc)},
|
|
{p_page_protect, RS1(p_page_protect_rs1), RSC(p_page_protect_rs1),
|
|
RS2(p_page_protect_rs2), R601(p_page_protect_ppc),
|
|
R603(p_page_protect_ppc), R604(p_page_protect_ppc)},
|
|
{p_lookup, RS1(p_lookup_rs1), RSC(p_lookup_rs1),
|
|
RS2(p_lookup_rs2), R601(p_lookup_ppc), R603(p_lookup_ppc),
|
|
R604(p_lookup_ppc)},
|
|
{curtime, RS1(curtime_pwr), RSC(curtime_pwr),
|
|
RS2(curtime_pwr), R601(curtime_pwr), R603(curtime_ppc),
|
|
R604(curtime_ppc)},
|
|
{update_decrementer, RS1(mtdec), RSC(mtdec),
|
|
RS2(mtdec), R601(mtdec), R603(update_decrementer_ppc),
|
|
R604(update_decrementer_ppc)},
|
|
{update_system_time, RS1(update_system_time_pwr),
|
|
RSC(update_system_time_pwr), RS2(update_system_time_pwr),
|
|
R601(update_system_time_pwr), R603(update_system_time_ppc),
|
|
R604(update_system_time_ppc)},
|
|
{copyin, RS1(copyin_pwr), RSC(copyin_pwr),
|
|
RS2(copyin_pwr), R601(copyin_pwr),
|
|
R603(copyin_ppc), R604(copyin_ppc)},
|
|
{copyout, RS1(copyout_pwr), RSC(copyout_pwr),
|
|
RS2(copyout_pwr), R601(copyout_pwr),
|
|
R603(copyout_ppc), R604(copyout_ppc)},
|
|
{uiocopyin, RS1(uiocopyin_pwr), RSC(uiocopyin_pwr),
|
|
RS2(uiocopyin_pwr), R601(uiocopyin_pwr),
|
|
R603(uiocopyin_ppc), R604(uiocopyin_ppc)},
|
|
{uiocopyout, RS1(uiocopyout_pwr), RSC(uiocopyout_pwr),
|
|
RS2(uiocopyout_pwr), R601(uiocopyout_pwr),
|
|
R603(uiocopyout_ppc), R604(uiocopyout_ppc)},
|
|
{uiocopyin_chksum, RS1(uiocopyin_chksum_pwr), RSC(uiocopyin_chksum_pwr),
|
|
RS2(uiocopyin_chksum_pwr), R601(uiocopyin_chksum_pwr),
|
|
R603(uiocopyin_chksum_ppc), R604(uiocopyin_chksum_ppc)},
|
|
{uiocopyout_chksum, RS1(uiocopyout_chksum_pwr), RSC(uiocopyout_chksum_pwr),
|
|
RS2(uiocopyout_chksum_pwr), R601(uiocopyout_chksum_pwr),
|
|
R603(uiocopyout_chksum_ppc), R604(uiocopyout_chksum_ppc)},
|
|
{exbcopy, RS1(exbcopy_pwr), RSC(exbcopy_pwr),
|
|
RS2(exbcopy_pwr), R601(exbcopy_pwr),
|
|
R603(exbcopy_ppc), R604(exbcopy_ppc)}
|
|
};
|
|
|
|
/*
|
|
* This is the model specific branch table
|
|
*/
|
|
static struct {
|
|
int (*ext_name)(); /* function name */
|
|
int (*model_name[MAX_MODEL_INDEX])(); /* model specific choices */
|
|
}model_branch_data[] = {
|
|
|
|
{d_slave, RS1(d_slave_rs1), RSC(d_slave_rsc), RS2(d_slave_rs1),
|
|
RRB(d_slave_ppc), RSF(brkpoint)},
|
|
{d_kmove, RS1(d_kmove_rs1), RSC(d_kmove_rs1), RS2(d_kmove_rs1),
|
|
RRB(d_move_ppc), RSF(brkpoint)},
|
|
{d_move, RS1(d_move_pwr), RSC(d_move_pwr), RS2(d_move_pwr),
|
|
RRB(d_move_ppc), RSF(brkpoint)},
|
|
{d_master, RS1(d_master_pwr), RSC(d_master_pwr), RS2(d_master_pwr),
|
|
RRB(d_master_ppc), RSF(brkpoint)},
|
|
{d_complete, RS1(d_complete_pwr), RSC(d_complete_pwr),
|
|
RS2(d_complete_pwr), RRB(d_complete_ppc), RSF(brkpoint)},
|
|
{d_init, RS1(d_init_pwr), RSC(d_init_pwr), RS2(d_init_pwr),
|
|
RRB(d_init_ppc), RSF(brkpoint)},
|
|
{d_clear, RS1(d_clear_pwr), RSC(d_clear_pwr), RS2(d_clear_pwr),
|
|
RRB(d_clear_ppc), RSF(brkpoint)},
|
|
{d_cflush, RS1(d_cflush_pwr), RSC(d_cflush_pwr), RS2(d_cflush_pwr),
|
|
RRB(d_cflush_ppc), RSF(brkpoint)},
|
|
{d_bflush, RS1(d_bflush_pwr), RSC(d_bflush_pwr), RS2(d_bflush_pwr),
|
|
RRB(d_bflush_ppc), RSF(brkpoint)},
|
|
{d_mask, RS1(d_mask_pwr), RSC(d_mask_pwr), RS2(d_mask_pwr),
|
|
RRB(d_mask_ppc), RSF(brkpoint)},
|
|
{d_unmask, RS1(d_unmask_pwr), RSC(d_unmask_pwr), RS2(d_unmask_pwr),
|
|
RRB(d_unmask_ppc), RSF(brkpoint)},
|
|
|
|
/*
|
|
* External interrupts
|
|
*/
|
|
{i_reset_int, RS1(i_reset_pwr), RSC(i_reset_pwr), RS2(i_reset_pwr),
|
|
RRB(i_reset_ppc), RSF(i_reset_rspc)},
|
|
{i_unmask, RS1(i_unmask_pwr), RSC(i_unmask_pwr), RS2(i_unmask_pwr),
|
|
RRB(i_unmask_ppc), RSF(i_unmask_rspc)},
|
|
{i_mask, RS1(i_mask_pwr), RSC(i_mask_pwr), RS2(i_mask_pwr),
|
|
RRB(i_mask_ppc), RSF(i_mask_rspc)},
|
|
{i_genplvl, RS1(i_genplvl_rs1), RSC(i_genplvl_rs1), RS2(i_genplvl_rs2),
|
|
RRB(i_genplvl_ppc), RSF(i_genplvl_rspc)},
|
|
{i_enableplvl, RS1(i_enableplvl_rs1), RSC(i_enableplvl_rs1),
|
|
RS2(i_enableplvl_rs2), RRB(i_enableplvl_ppc),
|
|
RSF(i_enableplvl_rspc)},
|
|
{i_disableplvl, RS1(i_disableplvl_rs1), RSC(i_disableplvl_rs1),
|
|
RS2(i_disableplvl_rs2), RRB(i_disableplvl_ppc),
|
|
RSF(i_disableplvl_rspc)},
|
|
{i_loginterr, RS1(i_loginterr_pwr), RSC(i_loginterr_pwr),
|
|
RS2(i_loginterr_pwr), RRB(i_loginterr_ppc),
|
|
RSF(i_loginterr_soft)},
|
|
{i_soft, RS1(i_eis_set), RSC(i_eis_set),
|
|
RS2(i_peis_set), RRB(i_mfrr_set), RSF(brkpoint)},
|
|
{i_reset_soft, RS1(i_eis_reset), RSC(i_eis_reset),
|
|
RS2(i_peis_reset), RRB(i_mfrr_reset), RSF(brkpoint)},
|
|
{i_issue_eoi, RS1(brkpoint), RSC(brkpoint),
|
|
RS2(brkpoint), RRB(i_issue_eoi_ppc), RSF(i_issue_eoi_rspc)}
|
|
};
|
|
|
|
/* These tables defines functions that are overlays. Only functions
|
|
* that are performance critical are reached with this mechanism.
|
|
* The files overlay.h and overlay.m4 must be carefully
|
|
* updated when adding functions to this table. A value of NULL indicates
|
|
* that the overlay is in place or not required for the the particular
|
|
* implementation.
|
|
*
|
|
* This is the processor overlay table
|
|
*/
|
|
static struct {
|
|
int *ov_addr; /* target address of overlay */
|
|
int size; /* maximum size of overlay */
|
|
int *proc_addr[MAX_PROC_INDEX]; /* processor address */
|
|
}overlay_data[] = {
|
|
/* overlays for no-op'ing isyncs on Power machines
|
|
*/
|
|
{&isync_vmatt, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vmdet, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_dsis, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs1, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs2, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs3, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs4, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs5, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_vcs6, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_sc1, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_sc2, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_sc3, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_sc4, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_kgetsig, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_1, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_2, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_3, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_4, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_5, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_disownfp_6, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_copyinstr1, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_copyinstr2, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{&isync_swtch_1, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
#ifdef _POWER_MP
|
|
{&isync_swtch_2, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
#endif
|
|
{&isync_i_dosoft, sizeof(int), RS1(&noop_inst_pwr),
|
|
RSC(&noop_inst_pwr), RS2(&noop_inst_pwr), R601(&noop_inst_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
|
|
/* PPC prolog is in flih table
|
|
*/
|
|
{(int *)MC_FLIH_ADDR, MC_FLIH_SIZE, RS1(&mc_prolog_pwr),
|
|
RSC(&mc_prolog_pwr), RS2(&mc_prolog_pwr), R601(NULL),
|
|
R603(NULL), R604(NULL)},
|
|
{(int *)DS_FLIH_ADDR, DS_FLIH_SIZE, RS1(&ds_prolog_pwr),
|
|
RSC(&ds_prolog_pwr), RS2(&ds_prolog_pwr), R601(&ds_prolog_ppc),
|
|
R603(&ds_prolog_ppc), R604(&ds_prolog_ppc)},
|
|
{(int *)IS_FLIH_ADDR, IS_FLIH_SIZE, RS1(&is_prolog_pwr),
|
|
RSC(&is_prolog_pwr), RS2(&is_prolog_pwr), R601(&is_prolog_ppc),
|
|
R603(&is_prolog_ppc), R604(&is_prolog_ppc)},
|
|
{(int *)AL_FLIH_ADDR, AL_FLIH_SIZE, RS1(&al_prolog_pwr),
|
|
RSC(&al_prolog_pwr), RS2(&al_prolog_pwr), R601(&al_prolog_ppc),
|
|
R603(&al_prolog_ppc), R604(&al_prolog_ppc)},
|
|
{(int *)DSE_FLIH_ADDR, DSE_FLIH_SIZE, RS1(NULL),
|
|
RSC(NULL), RS2(NULL), R601(&dse_prolog_ppc),
|
|
R603(NULL), R604(NULL)},
|
|
{(int *)SC_PPC_ADDR, SC_PPC_SIZE, RS1(NULL),
|
|
RSC(NULL), RS2(NULL), R601(&sc_front_ppc),
|
|
R603(&sc_front_ppc), R604(&sc_front_ppc)},
|
|
{(int *)TLB_FLIH_IFM_ADDR, TLB_FLIH_SIZE, RS1(NULL),
|
|
RSC(NULL), RS2(NULL), R601(NULL),
|
|
R603(&tlb_flih_ifm), R604(NULL)},
|
|
{(int *)TLB_FLIH_DRM_ADDR, TLB_FLIH_SIZE, RS1(NULL),
|
|
RSC(NULL), RS2(NULL), R601(NULL),
|
|
R603(&tlb_flih_drm), R604(NULL)},
|
|
{(int *)TLB_FLIH_DWM_ADDR, TLB_FLIH_SIZE, RS1(NULL),
|
|
RSC(NULL), RS2(NULL), R601(NULL),
|
|
R603(&tlb_flih_dwm), R604(NULL)},
|
|
{(int *)CS_PWR_ADDR, CS_PWR_SIZE, RS1(&cs_svc_pwr),
|
|
RSC(&cs_svc_pwr), RS2(&cs_svc_pwr), R601(NULL),
|
|
R603(NULL), R604(NULL)},
|
|
{(int *)SC_PWR_ADDR, SC_PWR_SIZE, RS1(&sc_front_pwr),
|
|
RSC(&sc_front_pwr), RS2(&sc_front_pwr), R601(NULL),
|
|
R603(NULL), R604(NULL)},
|
|
|
|
{(int *)MULH_ADDR, MULH_SIZE, RS1(&mulh_pwr),
|
|
RSC(&mulh_pwr), RS2(&mulh_pwr), R601(&mulh_ppc),
|
|
R603(&mulh_ppc), R604(&mulh_ppc)},
|
|
{(int *)MULL_ADDR, MULL_SIZE, RS1(&mull_pwr),
|
|
RSC(&mull_pwr), RS2(&mull_pwr), R601(&mull_pwr),
|
|
R603(&mull_ppc), R604(&mull_ppc)},
|
|
{(int *)DIVSS_ADDR, DIVSS_SIZE, RS1(&divss_pwr),
|
|
RSC(&divss_pwr), RS2(&divss_pwr), R601(&divss_pwr),
|
|
R603(&divss_ppc), R604(&divss_ppc)},
|
|
{(int *)DIVUS_ADDR, DIVUS_SIZE, RS1(&divus_pwr),
|
|
RSC(&divus_pwr), RS2(&divus_pwr), R601(&divus_ppc),
|
|
R603(&divus_ppc), R604(&divus_ppc)},
|
|
{(int *)QUOSS_ADDR, QUOSS_SIZE, RS1(&quoss_pwr),
|
|
RSC(&quoss_pwr), RS2(&quoss_pwr), R601(&quoss_ppc),
|
|
R603(&quoss_ppc), R604(&quoss_ppc)},
|
|
{(int *)QUOUS_ADDR, QUOUS_SIZE, RS1(&quous_pwr),
|
|
RSC(&quous_pwr), RS2(&quous_pwr), R601(&quous_ppc),
|
|
R603(&quous_ppc), R604(&quous_ppc)},
|
|
|
|
{(int *)_CHECK_LOCK_ADDR, _CHECK_LOCK_SIZE, RS1(&cs_pwr),
|
|
RSC(&cs_pwr), RS2(&cs_pwr), R601(&_check_lock_ppc),
|
|
R603(&_check_lock_ppc), R604(&_check_lock_ppc)},
|
|
{(int *)_CLEAR_LOCK_ADDR, _CLEAR_LOCK_SIZE, RS1(&_clear_lock_pwr),
|
|
RSC(&_clear_lock_pwr), RS2(&_clear_lock_pwr), R601(&_clear_lock_ppc),
|
|
R603(&_clear_lock_ppc), R604(&_clear_lock_ppc)},
|
|
|
|
{(int *)CS_ADDR, CS_SIZE, RS1(&cs_pwr),
|
|
RSC(&cs_pwr), RS2(&cs_pwr), R601(&cs_ppc),
|
|
R603(&cs_ppc), R604(&cs_ppc)},
|
|
|
|
{(int *)CHGSR_ADDR, CHGSR_SIZE, RS1(&chgsr_pwr),
|
|
RSC(&chgsr_pwr), RS2(&chgsr_pwr), R601(&chgsr_601),
|
|
R603(&chgsr_ppc), R604(&chgsr_ppc)},
|
|
/* Use PowerRS version -- no isyncs -- for 601
|
|
*/
|
|
{(int *)MTSR_ADDR, MTSR_SIZE, RS1(&mtsr_pwr),
|
|
RSC(&mtsr_pwr), RS2(&mtsr_pwr), R601(&mtsr_pwr),
|
|
R603(&mtsr_ppc), R604(&mtsr_ppc)},
|
|
{(int *)MFSR_ADDR, MFSR_SIZE, RS1(&mfsr_pwr),
|
|
RSC(&mfsr_pwr), RS2(&mfsr_pwr), R601(&mfsr_ppc),
|
|
R603(&mfsr_ppc), R604(&mfsr_ppc)},
|
|
{(int *)MFSRI_ADDR, MFSRI_SIZE, RS1(&mfsri_pwr),
|
|
RSC(&mfsri_pwr), RS2(&mfsri_pwr), R601(&mfsri_ppc),
|
|
R603(&mfsri_ppc), R604(&mfsri_ppc)},
|
|
|
|
/* Locks and Atomic Ops-overlay table entries */
|
|
{(int *)LOCKL_ADDR, LOCKL_SIZE, RS1(&lockl_pwr),
|
|
RSC(&lockl_pwr), RS2(&lockl_pwr), R601(&lockl_ppc),
|
|
/* replaced R603(&lockl_ppc) with R603(&lockl_pwr)
|
|
for 603e errata 15 workaround */
|
|
R603(&lockl_pwr), R604(&lockl_ppc)},
|
|
{(int *)UNLOCKL_ADDR, UNLOCKL_SIZE, RS1(&unlockl_pwr),
|
|
RSC(&unlockl_pwr), RS2(&unlockl_pwr), R601(&unlockl_ppc),
|
|
R603(&unlockl_ppc), R604(&unlockl_ppc)},
|
|
#ifdef _POWER_MP
|
|
{(int *)RSIMPLE_LOCK_ADDR, RSIMPLE_LOCK_SIZE, RS1(&rsimple_lock_pwr),
|
|
RSC(&rsimple_lock_pwr), RS2(&rsimple_lock_pwr),
|
|
R601(&rsimple_lock_ppc), R603(&rsimple_lock_ppc),
|
|
R604(&rsimple_lock_ppc)},
|
|
{(int *)RSIMPLE_LOCK_TRY_ADDR, RSIMPLE_LOCK_TRY_SIZE,
|
|
RS1(&rsimple_lock_try_pwr), RSC(&rsimple_lock_try_pwr),
|
|
RS2(&rsimple_lock_try_pwr), R601(&rsimple_lock_try_ppc),
|
|
R603(&rsimple_lock_try_ppc), R604(&rsimple_lock_try_ppc)},
|
|
{(int *)RSIMPLE_UNLOCK_ADDR, RSIMPLE_UNLOCK_SIZE,
|
|
RS1(&rsimple_unlock_pwr), RSC(&rsimple_unlock_pwr),
|
|
RS2(&rsimple_unlock_pwr), R601(&rsimple_unlock_ppc),
|
|
R603(&rsimple_unlock_ppc), R604(&rsimple_unlock_ppc)},
|
|
#endif /* _POWER_MP */
|
|
{(int *)SIMPLE_LOCK_ADDR, SIMPLE_LOCK_SIZE, RS1(&simple_lock_pwr),
|
|
RSC(&simple_lock_pwr), RS2(&simple_lock_pwr),
|
|
R601(&simple_lock_ppc), R603(&simple_lock_ppc),
|
|
R604(&simple_lock_ppc)},
|
|
{(int *)SIMPLE_UNLOCK_ADDR, SIMPLE_UNLOCK_SIZE, RS1(&simple_unlock_pwr),
|
|
RSC(&simple_unlock_pwr), RS2(&simple_unlock_pwr),
|
|
R601(&simple_unlock_ppc), R603(&simple_unlock_ppc),
|
|
R604(&simple_unlock_ppc)},
|
|
{(int *)SIMPLE_LOCK_TRY_ADDR, SIMPLE_LOCK_TRY_SIZE,
|
|
RS1(&simple_lock_try_pwr), RSC(&simple_lock_try_pwr),
|
|
RS2(&simple_lock_try_pwr), R601(&simple_lock_try_ppc),
|
|
R603(&simple_lock_try_ppc), R604(&simple_lock_try_ppc)},
|
|
{(int *)FETCH_AND_ADD_ADDR, FETCH_AND_ADD_SIZE, RS1(&fetch_and_add_pwr),
|
|
RSC(&fetch_and_add_pwr), RS2(&fetch_and_add_pwr),
|
|
R601(&fetch_and_add_ppc), R603(&fetch_and_add_ppc),
|
|
R604(&fetch_and_add_ppc)},
|
|
{(int *)FETCH_AND_ADD_H_ADDR, FETCH_AND_ADD_H_SIZE,
|
|
RS1(&fetch_and_add_h_pwr), RSC(&fetch_and_add_h_pwr),
|
|
RS2(&fetch_and_add_h_pwr), R601(&fetch_and_add_h_ppc),
|
|
R603(&fetch_and_add_h_ppc), R604(&fetch_and_add_h_ppc)},
|
|
{(int *)FETCH_AND_AND_ADDR, FETCH_AND_AND_SIZE, RS1(&fetch_and_and_pwr),
|
|
RSC(&fetch_and_and_pwr), RS2(&fetch_and_and_pwr),
|
|
R601(&fetch_and_and_ppc), R603(&fetch_and_and_ppc),
|
|
R604(&fetch_and_and_ppc)},
|
|
{(int *)FETCH_AND_OR_ADDR, FETCH_AND_OR_SIZE, RS1(&fetch_and_or_pwr),
|
|
RSC(&fetch_and_or_pwr), RS2(&fetch_and_or_pwr),
|
|
R601(&fetch_and_or_ppc), R603(&fetch_and_or_ppc),
|
|
R604(&fetch_and_or_ppc)},
|
|
{(int *)FETCH_AND_NOP_ADDR, FETCH_AND_NOP_SIZE, RS1(&fetch_and_nop_pwr),
|
|
RSC(&fetch_and_nop_pwr), RS2(&fetch_and_nop_pwr),
|
|
R601(&fetch_and_nop_ppc), R603(&fetch_and_nop_ppc),
|
|
R604(&fetch_and_nop_ppc)},
|
|
{(int *)COMPARE_AND_SWAP_ADDR, COMPARE_AND_SWAP_SIZE,
|
|
RS1(&compare_and_swap_pwr), RSC(&compare_and_swap_pwr),
|
|
RS2(&compare_and_swap_pwr), R601(&compare_and_swap_ppc),
|
|
R603(&compare_and_swap_ppc), R604(&compare_and_swap_ppc)},
|
|
{(int *)TEST_AND_SET_ADDR, TEST_AND_SET_SIZE, RS1(&test_and_set_pwr),
|
|
RSC(&test_and_set_pwr), RS2(&test_and_set_pwr),
|
|
R601(&test_and_set_ppc), R603(&test_and_set_ppc),
|
|
R604(&test_and_set_ppc)},
|
|
#ifdef _POWER_MP
|
|
{(int *)MY_PPDA_ADDR, MY_PPDA_SIZE, RS1(&my_ppda_pwr),
|
|
RSC(&my_ppda_pwr), RS2(&my_ppda_pwr), R601(&my_ppda_ppc),
|
|
R603(&my_ppda_ppc), R604(&my_ppda_ppc)},
|
|
{(int *)MY_CSA_ADDR, MY_CSA_SIZE, RS1(&my_csa_pwr), RSC(&my_csa_pwr),
|
|
RS2(&my_csa_pwr), R601(&my_csa_ppc), R603(&my_csa_ppc),
|
|
R604(&my_csa_ppc)},
|
|
{(int *)GET_CURTHREAD_ADDR, GET_CURTHREAD_SIZE, RS1(&get_curthread_pwr),
|
|
RSC(&get_curthread_pwr), RS2(&get_curthread_pwr),
|
|
R601(&get_curthread_ppc), R603(&get_curthread_ppc),
|
|
R604(&get_curthread_ppc)},
|
|
{(int *)SET_CSA_ADDR, SET_CSA_SIZE, RS1(&set_csa_pwr),
|
|
RSC(&set_csa_pwr), RS2(&set_csa_pwr), R601(&set_csa_ppc),
|
|
R603(&set_csa_ppc), R604(&set_csa_ppc)},
|
|
{(int *)SET_CURTHREAD_ADDR, SET_CURTHREAD_SIZE, RS1(&set_curthread_pwr),
|
|
RSC(&set_curthread_pwr), RS2(&set_curthread_pwr),
|
|
R601(&set_curthread_ppc), R603(&set_curthread_ppc),
|
|
R604(&set_curthread_ppc)},
|
|
#endif
|
|
};
|
|
|
|
/*
|
|
* This is the model specific overlay table
|
|
*/
|
|
|
|
static struct {
|
|
int *ov_addr; /* target address of overlay */
|
|
int size; /* maximum size of overlay */
|
|
int *model_addr[MAX_MODEL_INDEX]; /* processor address */
|
|
}model_overlay_data[] = {
|
|
|
|
{(int *)I_DISABLE_ADDR, I_DISABLE_SIZE+DISABLE_LOCK_SIZE,
|
|
RS1(&disable_lock_rs1), RSC(&disable_lock_rs1),
|
|
RS2(&disable_lock_rs2), RRB(&disable_lock_sof),
|
|
RSF(&disable_lock_sof)},
|
|
|
|
{(int *)I_ENABLE_ADDR, I_ENABLE_SIZE+UNLOCK_ENABLE_SIZE,
|
|
RS1(&unlock_enable_rs1), RSC(&unlock_enable_rs1),
|
|
RS2(&unlock_enable_rs2), RRB(&unlock_enable_sof),
|
|
RSF(&unlock_enable_sof)}
|
|
};
|
|
|
|
/* This table defines interrupt vectors to be initialized at system
|
|
* initialization. A value of NULL indicates that this vector is not
|
|
* initialized on the particular implementation. Only the address
|
|
* of the flih is in the table. The si code determines the appropriate
|
|
* flih prolog to copy into place with a run time check.
|
|
*/
|
|
static struct {
|
|
int *vector; /* address of interrupt vector */
|
|
int *proc_addr[MAX_PROC_INDEX];
|
|
}flih_data[] = {
|
|
|
|
{(int *)0x100, RS1(&sr_flih), RSC(&sr_flih),
|
|
RS2(&sr_flih), R601(&sr_flih), R603(&sr_flih), R604(&sr_flih)},
|
|
{(int *)0x200, RS1(NULL), RSC(NULL), /* Power Prolog is Overlay */
|
|
RS2(NULL), R601(&mc_flih), R603(&mc_flih), R604(&mc_flih)},
|
|
#ifndef DBI_FLIH
|
|
{(int *)0x700, RS1(&pr_flih), RSC(&pr_flih),
|
|
RS2(&pr_flih), R601(&pr_flih_ppc),
|
|
R603(&pr_flih_ppc), R604(&pr_flih_ppc)},
|
|
#endif
|
|
{(int *)0x800, RS1(&fp_flih), RSC(&fp_flih),
|
|
RS2(&fp_flih), R601(&fp_flih), R603(&fp_flih), R604(&fp_flih)},
|
|
{(int *)0xa00, RS1(NULL), RSC(NULL),
|
|
RS2(&fpi_flih), R601(NULL), R603(NULL), R604(NULL)},
|
|
{(int *)0x2000, RS1(NULL), RSC(NULL),
|
|
RS2(NULL), R601(&run_flih), R603(NULL), R604(NULL)}
|
|
|
|
};
|
|
|
|
static struct {
|
|
int *vector; /* address of interrupt vector */
|
|
int *model_addr[MAX_MODEL_INDEX];
|
|
}model_flih_data[] = {
|
|
{(int *)0x500, RS1(&ex_flih_rs1), RSC(&ex_flih_rs1),
|
|
RS2(&ex_flih_rs2), RRB(&ex_flih_ppc), RSF(&ex_flih_rspc)},
|
|
{(int *)0x900, RS1(NULL), RSC(NULL),
|
|
RS2(NULL), RRB(&dec_flih), RSF(&dec_flih)}
|
|
};
|