@@ -171,7 +171,7 @@ void bnInitParamsByFirmware() {
171
171
{
172
172
u8 tmp ;
173
173
174
- Result ret = APT_CheckNew3DS (0 , & tmp );;
174
+ Result ret = APT_CheckNew3DS (& tmp );;
175
175
if (ret == 0 )
176
176
{
177
177
if (tmp ) {
@@ -276,6 +276,36 @@ void bnInitParamsByFirmware() {
276
276
bnConfig -> FSPatchAddr = 0x0010ED64 ;
277
277
bnConfig -> SMPatchAddr = 0x00101838 ;
278
278
}
279
+
280
+ if (kernelVersion == SYSTEM_VERSION (2 , 50 , 1 )) {
281
+ //new3ds 9.6
282
+ ntrConfig -> firmVersion = SYSTEM_VERSION (9 , 6 , 0 );
283
+ ntrConfig -> PMSvcRunAddr = 0x001030D8 ;
284
+ ntrConfig -> ControlMemoryPatchAddr1 = 0xdff8850C ;
285
+ ntrConfig -> ControlMemoryPatchAddr2 = 0xdff88510 ;
286
+
287
+ bnConfig -> SvcPatchAddr = 0xDFF82268 ;
288
+ bnConfig -> FSPatchAddr = 0x0010EFAC ;
289
+ bnConfig -> SMPatchAddr = 0x0010189C ;
290
+ }
291
+
292
+ if (kernelVersion == SYSTEM_VERSION (2 , 50 , 7 )) {
293
+ // new3ds 10.0
294
+ //TODO: add new3ds 10.0 firmware support
295
+ ntrConfig -> firmVersion = SYSTEM_VERSION (10 , 0 , 0 );
296
+ }
297
+
298
+ if (kernelVersion == SYSTEM_VERSION (2 , 50 , 9 )) {
299
+ // new3ds 10.2
300
+ ntrConfig -> firmVersion = SYSTEM_VERSION (10 , 2 , 0 );
301
+ ntrConfig -> PMSvcRunAddr = 0x001031E4 ;
302
+ ntrConfig -> ControlMemoryPatchAddr1 = 0xdff884E4 ;
303
+ ntrConfig -> ControlMemoryPatchAddr2 = 0xdff884E8 ;
304
+
305
+ bnConfig -> SvcPatchAddr = 0xDFF82270 ;
306
+ bnConfig -> FSPatchAddr = 0x0010EED4 ;
307
+ bnConfig -> SMPatchAddr = 0x0010189C ;
308
+ }
279
309
}
280
310
bnConfig -> requireKernelHax = 0 ;
281
311
}
@@ -562,6 +592,22 @@ dbgKernelCacheInterface cacheInterface_NEW95 = {
562
592
(void * )0xFFF1FCE8
563
593
};
564
594
595
+ dbgKernelCacheInterface cacheInterface_NEW96 = {
596
+ //for new3ds 9.6
597
+ (void * )0xFFF25C24 ,
598
+ (void * )0xFFF1D9D4 ,
599
+ (void * )0xFFF1D67C ,
600
+ (void * )0xFFF1FD10
601
+ };
602
+
603
+ dbgKernelCacheInterface cacheInterface_NEW102 = {
604
+ //for new3ds 10.2
605
+ (void * )0xFFF25BFC ,
606
+ (void * )0xFFF1D9AC ,
607
+ (void * )0xFFF1D654 ,
608
+ (void * )0xFFF1FCE8
609
+ };
610
+
565
611
dbgKernelCacheInterface cacheInterface_Old96 = {
566
612
//for old 3ds 9.6
567
613
(void * )0xFFF24FF0 ,
@@ -594,6 +640,10 @@ void kernelCallback() {
594
640
cache = & cacheInterface_NEW92 ;
595
641
else if (firmVersion == SYSTEM_VERSION (9 , 5 , 0 ))
596
642
cache = & cacheInterface_NEW95 ;
643
+ else if (firmVersion == SYSTEM_VERSION (9 , 6 , 0 ))
644
+ cache = & cacheInterface_NEW96 ;
645
+ else if (firmVersion == SYSTEM_VERSION (10 , 2 , 0 ))
646
+ cache = & cacheInterface_NEW102 ;
597
647
}
598
648
else
599
649
{
@@ -664,8 +714,8 @@ Result bnLoadAndExecuteNTR() {
664
714
u32 ret ;
665
715
666
716
667
- fsInit ();
668
- FILE * file = fopen ("ntr.bin" ,"rb" );
717
+ // fsInit();
718
+ FILE * file = fopen ("sdmc:/ ntr.bin" ,"rb" );
669
719
if (file == 0 ) {
670
720
printf ("open ntr.bin failed\n" );
671
721
return RESULT_ERROR ;
@@ -681,22 +731,24 @@ Result bnLoadAndExecuteNTR() {
681
731
ntrConfig -> arm11BinSize = rtAlignToPageSize (size );
682
732
u32 outAddr ;
683
733
u32 totalSize = (ntrConfig -> arm11BinSize ) * 2 ;
684
- ret = svc_controlMemory ((u32 * )& outAddr , 0 , 0 , totalSize , 0x10003 , 3 );
685
- if (ret != 0 ) {
686
- printf ("svc_controlMemory failed: %08x\n" , ret );
734
+ // use linearMemAlign instead of svc_controlMemory
735
+ outAddr = (u32 )linearMemAlign (totalSize , 0x1000 );
736
+ if (outAddr == 0 ) {
737
+ printf ("linearMemAlign failed\n" );
687
738
return RESULT_ERROR ;
688
739
}
740
+
689
741
ntrConfig -> arm11BinStart = (outAddr + ntrConfig -> arm11BinSize );
690
742
rtCheckRemoteMemoryRegionSafeForWrite (getCurrentProcessHandle (), outAddr , totalSize );
691
743
printf ("outAddr: %08x\n" , outAddr );
692
744
memset ((void * ) outAddr , 0 , totalSize );
693
745
fread ((void * ) outAddr , size , 1 , file );
694
746
memcpy ((void * ) (outAddr + (ntrConfig -> arm11BinSize )), (void * ) outAddr , size );
695
- fsExit ();
747
+ // fsExit();
696
748
697
- Handle fsUserHandle ;
749
+ Handle fsUserHandle = 0 ;
698
750
ret = srvGetServiceHandle (& fsUserHandle , "fs:USER" );
699
- FSUSER_Initialize (& fsUserHandle );
751
+ FSUSER_Initialize (fsUserHandle );
700
752
ntrConfig -> fsUserHandle = fsUserHandle ;
701
753
702
754
u32 * bootArgs = outAddr + 4 ;
@@ -743,11 +795,13 @@ Result bnBootNTR() {
743
795
744
796
745
797
// allocate the tmpBuffer
746
- ret = svc_controlMemory ((u32 * )& tmpBuffer , 0 , 0 , TMPBUFFER_SIZE , 0x10003 , 3 );
747
- if (ret != 0 ) {
748
- printf ("svc_controlMemory failed: %08x\n" , ret );
798
+ // use linearMemAlign instead of svc_controlMemory
799
+ tmpBuffer = (u32 )linearMemAlign (TMPBUFFER_SIZE , 0x1000 );
800
+ if (tmpBuffer == 0 ) {
801
+ printf ("linearMemAlign failed\n" );
749
802
return RESULT_ERROR ;
750
803
}
804
+
751
805
printf ("tmpBuffer: %08x\n" , tmpBuffer );
752
806
753
807
bnInitParamsByFirmware ();
0 commit comments