Ejemplo n.º 1
0
Archivo: exi.c Proyecto: comex/libogc
static __inline__ void __exi_setinterrupts(s32 nChn,exibus_priv *exi)
{
	exibus_priv *pexi = &eximap[EXI_CHANNEL_2];
#ifdef _EXI_DEBUG
	printf("__exi_setinterrupts(%d,%p)\n",nChn,exi);
#endif
	if(nChn==EXI_CHANNEL_0) {
		__MaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI)));
		if(!(exi->flags&EXI_FLAG_LOCKED) && (exi->CallbackEXI || pexi->CallbackEXI))
			__UnmaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI)));
	} else if(nChn==EXI_CHANNEL_1) {
		__MaskIrq(IRQMASK(IRQ_EXI1_EXI));
		if(!(exi->flags&EXI_FLAG_LOCKED) && exi->CallbackEXI) __UnmaskIrq(IRQMASK(IRQ_EXI1_EXI));
	} else if(nChn==EXI_CHANNEL_2) {				//explicitly use of channel 2 only if debugger is attached.
		__MaskIrq(IRQMASK(IRQ_EXI0_EXI));
		if(!(exi->flags&EXI_FLAG_LOCKED) && IRQ_GetHandler(IRQ_PI_DEBUG)) __UnmaskIrq(IRQMASK(IRQ_EXI2_EXI));
	}
}
Ejemplo n.º 2
0
s32 __IOS_LaunchNewIOS(int version)
{
	u32 numviews;
	s32 res;
	u64 titleID = 0x100000000LL;
	raw_irq_handler_t irq_handler;
	u32 counter;

	STACK_ALIGN(tikview,views,4,32);
#ifdef DEBUG_IOS
	s32 oldversion;
#endif
	s32 newversion;

	if(version < 3 || version > 0xFF) {
		return IOS_EBADVERSION;
	}

#ifdef DEBUG_IOS
	oldversion = IOS_GetVersion();
	if(oldversion>0) printf("Current IOS Version: IOS%d\n",oldversion);
#endif

	titleID |= version;
#ifdef DEBUG_IOS
	printf("Launching IOS TitleID: %016llx\n",titleID);
#endif

	res = ES_GetNumTicketViews(titleID, &numviews);
	if(res < 0) {
#ifdef DEBUG_IOS
		printf(" GetNumTicketViews failed: %d\n",res);
#endif
		return res;
	}
	if(numviews > 4) {
		printf(" GetNumTicketViews too many views: %lu\n",numviews);
		return IOS_ETOOMANYVIEWS;
	}
	res = ES_GetTicketViews(titleID, views, numviews);
	if(res < 0) {
#ifdef DEBUG_IOS
		printf(" GetTicketViews failed: %d\n",res);
#endif
		return res;
	}

	write32(0x80003140, 0);

	res = ES_LaunchTitleBackground(titleID, &views[0]);
	if(res < 0) {
#ifdef DEBUG_IOS
		printf(" LaunchTitleBackground failed: %d\n",res);
#endif
		return res;
	}

	__ES_Reset();

	// Mask IPC IRQ while we're busy reloading
	__MaskIrq(IRQ_PI_ACR);
	irq_handler = IRQ_Free(IRQ_PI_ACR);

#ifdef DEBUG_IOS
	printf("Waiting for IOS ...\n");
#endif
	while ((read32(0x80003140) >> 16) == 0)
		udelay(1000);

#ifdef DEBUG_IOS
	u32 v = read32(0x80003140);
	printf("IOS loaded: IOS%d v%d.%d\n", v >> 16, (v >> 8) & 0xff, v & 0xff);
#endif

#ifdef DEBUG_IOS
	printf("Waiting for IPC ...\n");
#endif
	for (counter = 0; !(read32(0x0d000004) & 2); counter++) {
		udelay(1000);
		
		if (counter >= MAX_IPC_RETRIES)
			break;
	}

#ifdef DEBUG_IOS
	printf("IPC started (%u)\n", counter);
#endif

	IRQ_Request(IRQ_PI_ACR, irq_handler, NULL);
    __UnmaskIrq(IRQ_PI_ACR);

	__IPC_Reinitialize();

	newversion = IOS_GetVersion();

	if(newversion != version) {
#ifdef DEBUG_IOS
		printf(" Version mismatch!\n");
#endif
		return IOS_EMISMATCH;
	}

	return version;
}