static unsigned long trusty_std_call_inner(struct trusty_dev *dev, unsigned long smcnr, unsigned long a0, unsigned long a1, unsigned long a2) { unsigned long ret; int retry = 5; UNUSED(dev); trusty_debug("%a(0x%lx 0x%lx 0x%lx 0x%lx)\n", __func__, smcnr, a0, a1, a2); while (true) { ret = smc(smcnr, a0, a1, a2); while ((int32_t)ret == SM_ERR_FIQ_INTERRUPTED) ret = smc(SMC_SC_RESTART_FIQ, 0, 0, 0); if ((int)ret != SM_ERR_BUSY || !retry) break; trusty_debug("%a(0x%lx 0x%lx 0x%lx 0x%lx) returned busy, retry\n", __func__, smcnr, a0, a1, a2); retry--; } return ret; }
/******************************************************************************* * The only thing to do in BL2 is to load further images and pass control to * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2 * runs entirely in S-EL1. ******************************************************************************/ void bl2_main(void) { entry_point_info_t *next_bl_ep_info; NOTICE("BL2: %s\n", version_string); NOTICE("BL2: %s\n", build_message); /* Perform remaining generic architectural setup in S-EL1 */ bl2_arch_setup(); #if TRUSTED_BOARD_BOOT /* Initialize authentication module */ auth_mod_init(); #endif /* TRUSTED_BOARD_BOOT */ /* Load the subsequent bootloader images. */ next_bl_ep_info = bl2_load_images(); #ifdef AARCH32 /* * For AArch32 state BL1 and BL2 share the MMU setup. * Given that BL2 does not map BL1 regions, MMU needs * to be disabled in order to go back to BL1. */ disable_mmu_icache_secure(); #endif /* AARCH32 */ /* * Run next BL image via an SMC to BL1. Information on how to pass * control to the BL32 (if present) and BL33 software images will * be passed to next BL image as an argument. */ smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); }
static int32_t trusty_fast_call32(struct trusty_dev *dev, uint32_t smcnr, uint32_t a0, uint32_t a1, uint32_t a2) { UNUSED(dev); trusty_assert(dev); trusty_assert(SMC_IS_FASTCALL(smcnr)); return smc(smcnr, a0, a1, a2); }
void __dead2 raise_el(aapcs64_params *args) { smc(args->arg0, args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7); }
long raise_el(aapcs64_params *args) { return smc(args->arg0, args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7); }
int main(int argc, char *argv[]) { double ne0, ne, ne1, ne2, ne3, ne4, ne5, ne6, ne7, ne8, ne9, ne10; double gl, gb, dordm, dist, xx, yy, zz, r, sl, cl, sb, cb, ll, hh; double nstep, dstep, dmstep; static double dd, dtest, dmpsr, rr; double dmm=0; double dm=0; double DM_MC=0; double DM_Gal=0; double DM_Host=0; double DDM; double tau_sc=0; double tau_Gal=0; double tau_MC=0; double tau_MC_sc=0; double R_g=0; double gd=0; //The localtion of Sun relative to GP and Warp double z_warp, zz_w, R_warp, theta_warp, theta_max; R_warp=8400;//pc theta_max=0.0; //In +x direction int WGN=0; int WLB=0; int WLI=0; int WFB=0; int np, ndir,vbs, nk, uu, nn; char str[5]; char dirname[64]="NULL",text[64]=""; char *p; static int i, ncount; int w_lmc=0; int w_smc=0; int umc=1; char *s; struct Warp_Sun t0; struct Thick t1; struct Thin t2; struct Spiral t3; struct GC t4; struct Gum t5; struct LB t6; struct LI t7; struct FB t8; struct LMC t9; struct Dora t10; struct SMC t11; vbs=0; argc--; argv++; if(argc < 5)usage(1); while(argc > 5){ /* Get command line inputs */ if((*argv)[0] == '-'){ s=argv[0]+1; argc--; argv++; switch(*s){ case 'h': case '?': usage(0); case 't': if(sscanf(*argv,"%s",text) != 1)usage(1); argc--; argv++; break; case 'd': if(sscanf(*argv,"%s",dirname) != 1)usage(1); argc--; argv++; break; case 'v': vbs=1; break; case 'V': vbs=2; break; default: usage(1); } } else{ if(argc>6){ printf("Extra parameters exist in input\n"); usage(1); } else break; } } if(argc==5){ if(sscanf(*argv,"%s",str) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&gl) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&gb) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&dordm) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%d",&ndir) != 1){ printf("Incorrect arguments\n"); usage(1); } DM_Host=100;//default } if(argc==6){ if(sscanf(*argv,"%s",str) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&gl) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&gb) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&dordm) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%lf",&DM_Host) != 1){ printf("Incorrect arguments\n"); usage(1); } argc--; argv++; if(sscanf(*argv,"%d",&ndir) != 1){ printf("Incorrect arguments\n"); usage(1); } } //convert to upper case p=strupr(str); if(strcmp(p,"IGM") == 0) np=-1; // IGM else if(strcmp(p,"MC") == 0) np=0; // Mag Clouds else if(strcmp(p,"GAL") == 0){ // Galaxy np=1; p="Gal"; } else{ printf("please input correct model\n"); usage(1); exit(1); } if(ndir!=1&&ndir!=2){ printf("please input correct ndir\n"); usage(1); } if(!strcmp(dirname,"NULL")){ if(getenv("YMW16_DIR")==NULL){ printf("Warning: YMW16_DIR set to local directory\n"); strcpy(dirname,"./"); }else{ strcpy(dirname,getenv("YMW16_DIR")); } } if(vbs>=1)printf("File directory: %s\n",dirname); ymw16par(&t0, &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8, &t9, &t10, &t11, dirname); if(ndir==1)printf("%s: gl=%8.3f gb=%8.3f DM=%8.2f", p, gl, gb, dordm); else printf("%s: gl=%8.3f gb=%8.3f Dist=%9.1f", p, gl, gb, dordm); ll=gl; gl=gl/RAD; gb=gb/RAD; sl=sin(gl); sb=sin(gb); cl=cos(gl); cb=cos(gb); dstep=5.0; if(np==-1){ // FRBs if(ndir==1)uu=0;//dm---dist else uu=1;//dist---dm ndir=2; DDM=dordm; dordm=100000; nk=20000; } if(np==0){ // Magellanic Cloud nk=20000; } if(np==1){ //Galactic pulsars nk=5000; } if(ndir==1){ dm=dordm; if(np==1)tau_sc=tsc(dm); dtest=dm/N0; nstep=dtest/dstep; if(nstep<200) dstep=dtest/200; if(vbs>=1){ printf("\ndtest=%lf, nstep=%lf, dstep=%lf\n", dtest, nstep, dstep); } } if(ndir==2){ dist=dordm; dtest=dist; nstep=dtest/dstep; if(nstep<200) dstep=dtest/200; if(vbs>=1){ printf("\ndtest=%lf, nstep=%lf, dstep=%lf\n", dtest, nstep, dstep); } } dd=-0.5*dstep; ncount=0; for(i=1;i<=nk;i++){ ncount++; if(vbs>=2){ printf("ncount=%d, dstep=%lf\n", ncount,dstep); } dd+=dstep; r=dd*cb; /* r is different from rr */ xx=r*sl; yy=R0*1000-r*cl; zz=dd*sb+t0.z_Sun; rr=sqrt(xx*xx+yy*yy); /* Definition of warp */ if(rr<R_warp){ zz_w=zz; }else{ theta_warp=atan2(yy,xx); z_warp=t0.Gamma_w*(rr-R_warp)*cos(theta_warp-theta_max); zz_w=zz-z_warp; } if(vbs>=2) { printf("dd=%lf, xx=%lf, yy=%lf, zz=%lf, rr=%lf\n", dd, xx, yy, zz, rr); printf("theta_warp=%lf, z_warp=%lf, zz_w=%lf\n",theta_warp,z_warp,zz_w); } R_g=sqrt(xx*xx+yy*yy+zz_w*zz_w); /* DM to Distance */ if(ndir==1){ if(dmm<=dm){ if(R_g<=35000){ thick(xx, yy, zz_w, &gd, &ne1, rr, t1); thin(xx, yy, zz_w, gd, &ne2, rr, t2); spiral(xx, yy, zz_w, gd, &ne3, rr, t3, dirname); galcen(xx, yy, zz, &ne4, t4); gum(xx, yy, zz, &ll, &ne5, t5); localbubble(xx, yy, zz, &ll, &ne6, &hh, t6); nps(xx, yy, zz, &ne7, &WLI, t7); fermibubble(xx, yy, zz, &WFB); }else{ if(np==1){ dstep=5; }else{ dstep=200; if(w_lmc>=1||w_smc>=1) dstep=5; lmc(gl,gb,dd,&w_lmc,&ne8,t9); dora(gl,gb,dd,&ne9,t10); smc(xx, yy, zz,&w_smc, &ne10, t11); } } if(WFB==1){ ne1=t8.J_FB*ne1; } ne0=ne1+max(ne2,ne3); if(hh>110){ /* Outside LB */ if(ne6>ne0 && ne6>ne5){ WLB=1; }else{ WLB=0; } }else{ /* Inside LB */ if(ne6>ne0){ WLB=1; }else{ ne1=t6.J_LB*ne1; ne0=ne1+max(ne2,ne3); WLB=0; } } if(ne7>ne0){ /* Loop I */ WLI=1; }else{ WLI=0; } if(ne5>ne0){ /* Gum Nebula */ WGN=1; }else{ WGN=0; } /* Galactic ne */ ne=(1-WLB)*((1-WGN)*((1-WLI)*(ne0+ne4+ne8+ne9+ne10)+WLI*ne7)+WGN*ne5)+WLB*ne6; if(vbs>=2){ printf("ne=%lf, ne1=%lf, ne2=%lf, ne3=%lf, ne4=%lf, ne5=%lf, ne6=%lf, ne7=%lf, ne8=%lf, ne9=%lf, ne10=%lf\n", ne, ne1, ne2, ne3, ne4, ne5, ne6, ne7, ne8, ne9, ne10); } dmstep=ne*dstep; if(dmstep<=0.000001)dmstep=0; if(vbs>=2){ printf("dmstep=%lf, dstep=%lf\n", dmstep, dstep); } dmm+=dmstep; dist=dd; if(np==0&&umc==1){ if(R_g>35000){ DM_Gal=dmm; tau_Gal=0.5*tsc(dmm); printf(" DM_Gal:%8.2f",DM_Gal); umc++; } } if(i==nk){ dist+=0.5*dstep; if(dist>100000)dist=100000; if(np==0){ DM_MC=dmm-DM_Gal; tau_MC=0.5*tsc(DM_MC); tau_MC_sc=max(tau_Gal, tau_MC); printf(" DM_MC:%8.2f",DM_MC); } if(np==0)printf(" Dist:%9.1f log(tau_sc):%7.3f %s\n",dist, log10(tau_MC_sc),text); if(np==1)printf(" DM_Gal:%8.2f Dist:%9.1f log(tau_sc):%7.3f %s\n", dmm, dist,log10(tau_sc),text); } if(vbs>=2){ printf("dmm=%lf\n", dmm); } } else{ dist=dd-0.5*dstep-(dstep*(dmm-dm))/dmstep; if(np==0){ DM_MC=dm-DM_Gal; if(DM_Gal==0){ DM_MC=0; DM_Gal=dm; tau_MC_sc=tsc(dm); printf(" DM_Gal:%8.2f ", DM_Gal); } else{ tau_MC=0.5*tsc(DM_MC); tau_MC_sc=max(tau_MC, tau_Gal); } printf(" DM_MC:%8.2f", DM_MC); } if(np==0)printf(" Dist:%9.1f log(tau_sc):%7.3f %s\n",dist,log10(tau_MC_sc),text); if(np==1)printf(" DM_Gal:%8.2f Dist:%9.1f log(tau_sc):%7.3f %s\n", dm, dist,log10(tau_sc),text); break; } } /* Distance to DM */ if(ndir==2){ if(dd<=dtest){ if(R_g<=35000){ thick(xx, yy, zz_w, &gd, &ne1, rr, t1); thin(xx, yy, zz_w, gd, &ne2, rr, t2); spiral(xx, yy, zz_w, gd, &ne3, rr, t3, dirname); galcen(xx, yy, zz, &ne4, t4); gum(xx, yy, zz, &ll, &ne5, t5); localbubble(xx, yy, zz, &ll, &ne6, &hh, t6); nps(xx, yy, zz, &ne7, &WLI, t7); fermibubble(xx, yy, zz, &WFB); }else{ if(np==1)dstep=5; else{ dstep=200; if(np==-1)dstep=5; if(w_lmc>=1||w_smc>=1) dstep=5; lmc(gl,gb,dd,&w_lmc,&ne8,t9); dora(gl,gb,dd,&ne9,t10); smc(xx, yy, zz,&w_smc, &ne10, t11); } } if(WFB==1){ ne1=t8.J_FB*ne1; } ne0=ne1+max(ne2,ne3); if(hh>110){ /* Outside LB */ if(ne6>ne0 && ne6>ne5){ WLB=1; }else{ WLB=0; } }else{ /* Inside LB */ if(ne6>ne0){ WLB=1; }else{ ne1=t6.J_LB*ne1; ne0=ne1+max(ne2,ne3); WLB=0; } } if(ne7>ne0){ /* Loop I */ WLI=1; }else{ WLI=0; } if(ne5>ne0){ /* Gum Nebula */ WGN=1; }else{ WGN=0; } /* Galactic ne */ ne=(1-WLB)*((1-WGN)*((1-WLI)*(ne0+ne4+ne8+ne9+ne10)+WLI*ne7)+WGN*ne5)+WLB*ne6; if(vbs>=2){ printf("ne=%lf, ne1=%lf, ne2=%lf, ne3=%lf, ne4=%lf, ne5=%lf, ne6=%lf, ne7=%lf, ne8=%lf, ne9=%lf, ne10=%lf\n", ne, ne1, ne2, ne3, ne4, ne5, ne6, ne7, ne8, ne9, ne10); } dmstep=ne*dstep; if(dmstep<=0.000001)dmstep=0; dm+=dmstep; if(np!=1&&umc==1){ if(R_g>35000){ DM_Gal=dm; tau_Gal=0.5*tsc(dm); printf(" DM_Gal:%8.2f",dm); umc++; } } if(i==nk&&np!=-1){ dmpsr=dm; if(np==0){ DM_MC=dm-DM_Gal; tau_MC=0.5*tsc(DM_MC); printf(" DM_MC:%8.2f", DM_MC); } tau_sc=tsc(dmpsr); tau_MC_sc=max(tau_Gal, tau_MC); if(np==0)printf(" DM:%8.2f log(tau_sc):%7.3f %s\n", dmpsr,log10(tau_MC_sc),text); if(np==1)printf(" DM:%8.2f log(tau_sc):%7.3f %s\n", dmpsr, log10(tau_sc),text); } if(i==nk&&np==-1){ if(dordm==100000){ DM_MC=dm-DM_Gal; printf(" DM_MC:%8.2f",DM_MC); } frb_d(DDM, DM_Gal, DM_MC, DM_Host, uu, vbs, text); break; } } else{ dmpsr=dm+(dmstep*(dtest-(dd-0.5*dstep)))/dstep; if(np==0){ DM_MC=dmpsr-DM_Gal; if(DM_Gal==0){ DM_MC=0; DM_Gal=dmpsr; tau_MC_sc=tsc(dmpsr); printf(" DM_Gal:%8.2f", DM_Gal); } else{ tau_MC=0.5*tsc(DM_MC); tau_MC_sc=max(tau_Gal, tau_MC); } printf(" DM_MC:%8.2f", DM_MC); } tau_sc=tsc(dmpsr); if(np==0)printf(" DM:%8.2f log(tau_sc):%7.3f %s\n", dmpsr,log10(tau_MC_sc),text); if(np==1)printf(" DM:%8.2f log(tau_sc):%7.3f %s\n", dmpsr, log10(tau_sc),text); break; } } } }
/******************************************************************************* * The only thing to do in BL2 is to load further images and pass control to * BL3-1. The memory occupied by BL2 will be reclaimed by BL3-x stages. BL2 runs * entirely in S-EL1. ******************************************************************************/ void bl2_main(void) { bl31_params_t *bl2_to_bl31_params; entry_point_info_t *bl31_ep_info; int e; NOTICE("BL2: %s\n", version_string); NOTICE("BL2: %s\n", build_message); /* Perform remaining generic architectural setup in S-EL1 */ bl2_arch_setup(); #if TRUSTED_BOARD_BOOT /* Initialize authentication module */ auth_mod_init(); #endif /* TRUSTED_BOARD_BOOT */ /* * Load the subsequent bootloader images */ e = load_bl30(); if (e) { ERROR("Failed to load BL3-0 (%i)\n", e); plat_error_handler(e); } /* Perform platform setup in BL2 after loading BL3-0 */ bl2_platform_setup(); /* * Get a pointer to the memory the platform has set aside to pass * information to BL3-1. */ bl2_to_bl31_params = bl2_plat_get_bl31_params(); bl31_ep_info = bl2_plat_get_bl31_ep_info(); e = load_bl31(bl2_to_bl31_params, bl31_ep_info); if (e) { ERROR("Failed to load BL3-1 (%i)\n", e); plat_error_handler(e); } e = load_bl32(bl2_to_bl31_params); if (e) { if (e == -EAUTH) { ERROR("Failed to authenticate BL3-2\n"); plat_error_handler(e); } else { WARN("Failed to load BL3-2 (%i)\n", e); } } e = load_bl33(bl2_to_bl31_params); if (e) { ERROR("Failed to load BL3-3 (%i)\n", e); plat_error_handler(e); } /* Flush the params to be passed to memory */ bl2_plat_flush_bl31_params(); /* * Run BL3-1 via an SMC to BL1. Information on how to pass control to * the BL3-2 (if present) and BL3-3 software images will be passed to * BL3-1 as an argument. */ smc(RUN_IMAGE, (unsigned long)bl31_ep_info, 0, 0, 0, 0, 0, 0); }
/******************************************************************************* * The only thing to do in BL2 is to load further images and pass control to * BL31. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2 runs * entirely in S-EL1. ******************************************************************************/ void bl2_main(void) { bl31_params_t *bl2_to_bl31_params; entry_point_info_t *bl31_ep_info; int e; NOTICE("BL2: %s\n", version_string); NOTICE("BL2: %s\n", build_message); /* Perform remaining generic architectural setup in S-EL1 */ bl2_arch_setup(); #if TRUSTED_BOARD_BOOT /* Initialize authentication module */ auth_mod_init(); #endif /* TRUSTED_BOARD_BOOT */ /* * Load the subsequent bootloader images */ e = load_scp_bl2(); if (e) { ERROR("Failed to load SCP_BL2 (%i)\n", e); plat_error_handler(e); } /* Perform platform setup in BL2 after loading SCP_BL2 */ bl2_platform_setup(); /* * Get a pointer to the memory the platform has set aside to pass * information to BL31. */ bl2_to_bl31_params = bl2_plat_get_bl31_params(); bl31_ep_info = bl2_plat_get_bl31_ep_info(); #ifdef EL3_PAYLOAD_BASE /* * In the case of an EL3 payload, we don't need to load any further * images. Just update the BL31 entrypoint info structure to make BL1 * jump to the EL3 payload. * The pointer to the memory the platform has set aside to pass * information to BL31 in the normal boot flow is reused here, even * though only a fraction of the information contained in the * bl31_params_t structure makes sense in the context of EL3 payloads. * This will be refined in the future. */ INFO("BL2: Populating the entrypoint info for the EL3 payload\n"); bl31_ep_info->pc = EL3_PAYLOAD_BASE; bl31_ep_info->args.arg0 = (unsigned long) bl2_to_bl31_params; bl2_plat_set_bl31_ep_info(NULL, bl31_ep_info); #else e = load_bl31(bl2_to_bl31_params, bl31_ep_info); if (e) { ERROR("Failed to load BL31 (%i)\n", e); plat_error_handler(e); } e = load_bl32(bl2_to_bl31_params); if (e) { if (e == -EAUTH) { ERROR("Failed to authenticate BL32\n"); plat_error_handler(e); } else { WARN("Failed to load BL32 (%i)\n", e); } } #ifdef PRELOADED_BL33_BASE /* * In this case, don't load the BL33 image as it's already loaded in * memory. Update BL33 entrypoint information. */ INFO("BL2: Populating the entrypoint info for the preloaded BL33\n"); bl2_to_bl31_params->bl33_ep_info->pc = PRELOADED_BL33_BASE; bl2_plat_set_bl33_ep_info(NULL, bl2_to_bl31_params->bl33_ep_info); #else e = load_bl33(bl2_to_bl31_params); if (e) { ERROR("Failed to load BL33 (%i)\n", e); plat_error_handler(e); } #endif /* PRELOADED_BL33_BASE */ #endif /* EL3_PAYLOAD_BASE */ /* Flush the params to be passed to memory */ bl2_plat_flush_bl31_params(); /* * Run BL31 via an SMC to BL1. Information on how to pass control to * the BL32 (if present) and BL33 software images will be passed to * BL31 as an argument. */ smc(BL1_SMC_RUN_IMAGE, (unsigned long)bl31_ep_info, 0, 0, 0, 0, 0, 0); }