WPA support in kernel mode apps for 3.03oe

Discuss the development of new homebrew software, tools and libraries.

Moderators: cheriff, TyRaNiD

jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

WPA support in kernel mode apps for 3.03oe

Post by jockyw2001 »

I'm trying to build a version of PMP VLC for firmware 3.03oe with support for Wlan WPA connections.

I looked at psp vnc 1.2.2b sourcecode. The changes in itself are rather simple, but there is an issue: psp vnc defines DEVHOOK in the makefile and therefore builds a usermode app:

Code: Select all

#ifdef DEVHOOK
PSP_MODULE_INFO("PSPVNC", 0, 1, 1);
#else
PSP_MODULE_INFO("PSPVNC", 0x1000, 1, 1);
#endif
Since PMP VLC uses the ME it has to be a kernelmode app. Is there a way to build a kernelmode app with Wlan WPA support?
flatwhatson
Posts: 3
Joined: Fri Dec 29, 2006 1:19 pm
Location: Brisbane, Australia

Post by flatwhatson »

Kernel mode apps only run on <=1.5 at this point in time... and 1.5 has no kernel support for WPA. So, unless you fancy trying to implement some kind of software WPA libraries (which, if possible, would probably require a good deal of overhead), unfortunately, the answer is no.

You're not the first person to have wished for such a thing...
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

You can program in kernel mode for the 3.03 kernel inside OE.

Just make sure that your main executable is an user prx inside a pbp.
This user prx can load any decrypted kernel prx from the memory stick without any kind of patch.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

moonlight wrote:You can program in kernel mode for the 3.03 kernel inside OE.

Just make sure that your main executable is an user prx inside a pbp.
This user prx can load any decrypted kernel prx from the memory stick without any kind of patch.
That sounds cool moonlight!
Does it mean I need following additional lines in my Makefile?

Code: Select all

cp PARAM.SFO.271 PARAM.SFO pack-pbp EBOOT.PBP PARAM.SFO img/ICON_pmpvlc.png NULL NULL NULL NULL pmpvlc.prx NULL
...
BUILD_PRX = 1
...
#EXTRA_TARGETS=$&#40;BINS&#41;
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

jockyw2001 wrote:
moonlight wrote:You can program in kernel mode for the 3.03 kernel inside OE.

Just make sure that your main executable is an user prx inside a pbp.
This user prx can load any decrypted kernel prx from the memory stick without any kind of patch.
That sounds cool moonlight!
Does it mean I need following additional lines in my Makefile?

Code: Select all

cp PARAM.SFO.271 PARAM.SFO pack-pbp EBOOT.PBP PARAM.SFO img/ICON_pmpvlc.png NULL NULL NULL NULL pmpvlc.prx NULL
...
BUILD_PRX = 1
...
#EXTRA_TARGETS=$&#40;BINS&#41;
yes. and in kernel prx don't forget yo put "USE_KERNEL_LIBS = 1". 2.80+ doesn't like user functions in kernel prx.
Last edited by moonlight on Fri Jan 19, 2007 5:11 am, edited 1 time in total.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

I was just about to beg for sample code when I found your SDK :)
Thanks so much!!
ahman
Posts: 22
Joined: Wed May 31, 2006 10:57 am

Post by ahman »

jockyw2001, you shouldn't use networking calls within a kernel app. Doing so will cause a lot of unexpected side effects, like DHCP not working and message lost even for TCP connections. Network libraries should only be linked within a user app. If you really need to have kernel mode access for your other non-networking code, you can built 2 PRXes, one user mode & the other kernel mode. Then, have the kernel mode one export the functions to the user mode one.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

ahman: meanwhile I noticed PMP VLC can not be simply patched in the same way as you did for other apps (psp vnc, pmpmodavc, etc).

As you also suggest I was thinking to build a user mode app containing all the functionality, which imports functions from a kernel mode module which contains the ME functions.

Can I still use threads in the user mode main app?
ahman
Posts: 22
Joined: Wed May 31, 2006 10:57 am

Post by ahman »

Yes, you can have user mode threads in your user mode PRX. You can also have kernel mode threads in your kernel mode PRX if it's needed, but most likely you don't need this as it will be more complicated to handshake between the threads.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

One more question regarding the AVC functions in the user mode app. Do I need to make similar mods as you did in avc.c of pmpmodavc?

Code: Select all

char *avc_static_init&#40;&#41;
	&#123;
#ifdef DEVHOOK
#ifdef PSPFW302
	int result = sceUtilityLoadAvModule&#40;0&#41;;
#else
	int result = pspSdkLoadStartModule&#40;"flash0&#58;/kd/avcodec.prx", PSP_MEMORY_PARTITION_KERNEL&#41;;
#endif
	if &#40;result < 0&#41;
		&#123;
		return&#40;"avc_static_init&#58; pspSdkLoadStartModule failed on avcodec.prx"&#41;;
		&#125;
#else
	int result = pspSdkLoadStartModule&#40;"flash0&#58;/kd/audiocodec.prx", PSP_MEMORY_PARTITION_KERNEL&#41;;
And same applies to the networking functions?

Final question, if I build me.prx from me.c, do I need to do anything special in the user mode part to call functions from me.prx ?

Thx for your support!
ahman
Posts: 22
Joined: Wed May 31, 2006 10:57 am

Post by ahman »

Starting from firmware 3.0x, you can no longer load encrypted sigcheck modules using sceKernelLoadModule (which pspSdkLoadStartModules calls) in a user app. You can of course still load unencrypted modules in a user app (thanks to DA's patch). Since you're developing your own kernel module (me.prx), this will be an unencrypted module and can be easily loaded with sceKernelLoadModule.

For networking libraries, you'll need to load a bunch of encrypted sigcheck modules. You can either use the kubridge functions by DA (check kubridge.h from DA's SDK), or use the standard PSP one called sceUtilityLoadNetModule. Check my latest port on pspvnc for sample.

For your me.prx (kernel module), you only need to export the functions in a exports.exp file. Then, gerneate the exports.exp into a name.S to be linked with your user mode app. You should be able to find a lot of samples around. One thing you've to be careful is make sure your kernel mode app, me.prx doesn't make any user syscalls. User syscalls are kernel module exports which allows user mode apps to access the kernel module fuctions via syscalls. Starting from firmware 2.8x, calling user syscalls from a kernel app will crash your PSP.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

Ah that's a brilliant explanation. I think I've now got all the pieces to solve the puzzle.

I always found this module stuff too fuzzy to bother. Now that homebrewn usage is boosting, I think in particular because of the 3.0+ Dark Alex firmwares, I was 'forced' to deal with it. After this discussion I understand it quite a lot better. It would be great tho if someone could provide an easy to grasp architectural overview. I'm sure other homebrewn developers will benefit from that. Perhaps groepaz might want to add this to yapspd ... ?
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

I'm making quite some progress on porting PMP VLC to 3.03OE, wlan with wpa and avc already work. Creating a kernel mode ME module still causes some probs. I'm following as close as possible the sdk prx_loader example. There is the import stub file MyLib.S :

.set noreorder

Code: Select all

#include "pspstub.s"

	STUB_START "MyLib",0x00090000,0x00010005
	STUB_FUNC  0x563FF2B2,getModuleInfo
	STUB_END
How do I find these numbers (0x563FF2B2) before the function name?

And in the user mode main application do I have to do something like this before I can call the imported ME functions?

Code: Select all

	/* Start mymodule.prx */
	printf&#40;"\nStart my module\n"&#41;;
	modid = load_module&#40;"ms0&#58;/mymodule.prx", 0, 0&#41;;
	ret = sceKernelStartModule&#40;modid, 0, NULL, &fd, NULL&#41;;
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

Well, i don't know if it will helpful, but in next version of OE, static elf's in user mode will be supported.

Hopefully this can fix some memory problems that happen when using prx's as main module.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

Well it doesn't solve my problem at hand, but it will allow for source code debugging and that is something I look forward to :)

EDIT: For those who still wonder how to find the NIDs:

Code: Select all

prxtool.exe -f mymodule.prx

Export 1, Name MyLib, Functions 1, Variables 0, flags 00010000
Functions&#58;
0x563FF2B2 &#91;0x00000324&#93; - MyLib_563FF2B2
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

I have link errors when trying to build a kernel mode ME prx module.

Code: Select all

/usr/local/pspdev/lib/gcc/psp/4.0.2/../../../../psp/lib/crt0_prx.o&#58; In function
`_main'&#58;
/tmp/pspdev/pspsdk/src/startup/crt0_prx.c&#58;88&#58; undefined reference to `atexit'
/tmp/pspdev/pspsdk/src/startup/crt0_prx.c&#58;94&#58; undefined reference to `exit'
mem64.o&#58; In function `malloc_64'&#58;
mem64.c&#58;&#40;.text+0x18&#41;&#58; undefined reference to `memalign'
mem64.o&#58; In function `free_64'&#58;
mem64.c&#58;&#40;.text+0x20&#41;&#58; undefined reference to `free'
collect2&#58; ld returned 1 exit status
make&#58; *** &#91;memodule.elf&#93; Error 1
The Makefile is:

Code: Select all

TARGET = memodule
#OBJS = mestub.o me.o me_csc.o ../mem64.o ../csc.o
OBJS = mestub.o me.o me_csc.o mem64.o csc.o

# Define to build this as a prx &#40;instead of a static elf&#41;
BUILD_PRX=1
# Define the name of our custom exports &#40;minus the .exp extension&#41;
PRX_EXPORTS=exports.exp

USE_KERNEL_LIBC = 1
USE_KERNEL_LIBS = 1

INCDIR = ..
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $&#40;CFLAGS&#41; -fno-exceptions -fno-rtti
ASFLAGS = $&#40;CFLAGS&#41;

LIBDIR =

PSPSDK=$&#40;shell psp-config --pspsdk-path&#41;
include $&#40;PSPSDK&#41;/lib/build.mak
If I substitute the lines:
USE_KERNEL_LIBC = 1
USE_KERNEL_LIBS = 1
by:
USE_PSPSDK_LIBC = 1
then it builds memodule.prx, but afaik moonlight mentioned somewhere I must use kernel libs
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

Well thanks to last patch of tyranid that i incorporated in 3.03 oe-c (and that is also in 3.03 hen), kernel modules can have again user functions. Still one has to be carefully using certain user functions in kernel mode such as the ones from ModuleMgrForUser, which would return 0x80020149 if called in kmode.
So the USE_KERNEL_LIBS = 1 is not strictly necessary now ;)
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

Ah very cool, another limitation gone :)

I'm pretty close to get something working, but as usual there is another problem.

In my exports.exp i'm exporting 3 functions like this:

Code: Select all

# Export our function
PSP_EXPORT_START&#40;MyLib, 0, 0x0001&#41;
PSP_EXPORT_FUNC_HASH&#40;me_start&#41;
PSP_EXPORT_FUNC_HASH&#40;me_struct_init&#41;
PSP_EXPORT_FUNC_HASH&#40;me_sceKernelDcacheWritebackInvalidateAll&#41;
PSP_EXPORT_END
I can build the ME module memodule.prx, but when I look up the NIDs with prxtool I get:
Export 1, Name MyLib, Functions 3, Variables 0, flags 00010000
Functions:

Code: Select all

0x6C0D2848 &#91;0x000003DC&#93; - MyLib_6C0D2848
0x972E503B &#91;0x000008F0&#93; - MyLib_972E503B
0x6DB328C6 &#91;0x00000470&#93; - MyLib_6DB328C6
Which function belongs to which NID?
Is it in the same sequence as in exports.exp?
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

jockyw2001 wrote:Ah very cool, another limitation gone :)

I'm pretty close to get something working, but as usual there is another problem.

In my exports.exp i'm exporting 3 functions like this:

Code: Select all

# Export our function
PSP_EXPORT_START&#40;MyLib, 0, 0x0001&#41;
PSP_EXPORT_FUNC_HASH&#40;me_start&#41;
PSP_EXPORT_FUNC_HASH&#40;me_struct_init&#41;
PSP_EXPORT_FUNC_HASH&#40;me_sceKernelDcacheWritebackInvalidateAll&#41;
PSP_EXPORT_END
I can build the ME module memodule.prx, but when I look up the NIDs with prxtool I get:
Export 1, Name MyLib, Functions 3, Variables 0, flags 00010000
Functions:

Code: Select all

0x6C0D2848 &#91;0x000003DC&#93; - MyLib_6C0D2848
0x972E503B &#91;0x000008F0&#93; - MyLib_972E503B
0x6DB328C6 &#91;0x00000470&#93; - MyLib_6DB328C6
Which function belongs to which NID?
Is it in the same sequence as in exports.exp?
You can guess the nid by calculating the sha-1.
Sha-1 of me_start is: 48280D6C40780EDAEBC6A15370794323C5FF7CAE

Take those four bytes of the beginning, and consider they are in little endian, and you get 6C0D2848.

Btw, this library... is to be used from another kernel module or from an user one? BEcause if it is gonna be used by an user one, you should use:
PSP_EXPORT_START(MyLib, 0, 0x4001)

0x4001 -> for kernel to user import. (syscall)
0x0001 -> for user->user or kernel->kernel import. (direct jump)
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

Many thanks moonlight!
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

moonlight wrote:Btw, this library... is to be used from another kernel module or from an user one? BEcause if it is gonna be used by an user one, you should use:
PSP_EXPORT_START(MyLib, 0, 0x4001)
My test program is a user mode app which calls exported functions from a kernel mode library fails with:

Code: Select all

host0&#58;/> ./wifisimp03.prx
Failed to Load/Start module 'host0&#58;/wifisimp03.prx' Error&#58; 0x8002013C
The user app is linked with this MyLib.S

Code: Select all

	.set noreorder

#include "pspstub.s"

	STUB_START "MyLib",0x40010000,0x00060005
	STUB_FUNC  0x6C0D2848,me_start
	STUB_FUNC  0x972E503B,me_struct_init
	STUB_FUNC  0x6DB328C6,me_sceKernelDcacheWritebackInvalidateAll
	STUB_FUNC  0xE04FEB89,me_wait
	STUB_FUNC  0x5BAC29CF,me_unused
	STUB_FUNC  0x563FF2B2,getModuleInfo
	STUB_END
and this is exports.exp of the kernel mode me library:

Code: Select all

# Define the exports for the prx
PSP_BEGIN_EXPORTS

# These four lines are mandatory &#40;although you can add other functions like module_stop&#41;
# syslib is a psynonym for the single mandatory export.
PSP_EXPORT_START&#40;syslib, 0, 0x8000&#41;
PSP_EXPORT_FUNC_HASH&#40;module_start&#41;
PSP_EXPORT_VAR_HASH&#40;module_info&#41;
PSP_EXPORT_END

# Export our function
PSP_EXPORT_START&#40;MyLib, 0, 0x4001&#41;
PSP_EXPORT_FUNC_HASH&#40;me_start&#41;
PSP_EXPORT_FUNC_HASH&#40;me_struct_init&#41;
PSP_EXPORT_FUNC_HASH&#40;me_sceKernelDcacheWritebackInvalidateAll&#41;
PSP_EXPORT_FUNC_HASH&#40;me_wait&#41;
PSP_EXPORT_FUNC_HASH&#40;me_unused&#41;
PSP_EXPORT_FUNC_HASH&#40;getModuleInfo&#41;
PSP_EXPORT_END

PSP_END_EXPORTS
In the user app I start the kernel mode library with:
sceKernelLoadModule("host0:/memodule.prx", 0, NULL);

prxtool shows following modules in the kernel mode library:

Code: Select all

$ prxtool.exe -m memodule.prx
PRXTool v1.0 &#58; &#40;c&#41; TyRaNiD 2k6
Built&#58; Jan 21 2007 10&#58;55&#58;07
Loaded PRX memodule.prx successfully
Module information

Name&#58;    MEPRX
Attrib&#58;  1000
Version&#58; 1.1
GP&#58;      0000CF00

Exports&#58;
Export 0, Name syslib, Functions 1, Variables 1, flags 80000000
Export 1, Name MyLib, Functions 6, Variables 0, flags 40010000

Imports&#58;
Import 0, Name IoFileMgrForUser, Functions 1, Variables 0, flags 40010000
Import 1, Name ModuleMgrForUser, Functions 1, Variables 0, flags 40010000
Import 2, Name SysMemUserForUser, Functions 4, Variables 0, flags 40000000
Import 3, Name ThreadManForUser, Functions 4, Variables 0, flags 40010000
Import 4, Name UtilsForUser, Functions 2, Variables 0, flags 40010000
Import 5, Name sceSysreg_driver, Functions 3, Variables 0, flags 00010000
Done
prxtool shows following modules in the user mode app:

Code: Select all

$ prxtool.exe -m wifisimp03.prx
PRXTool v1.0 &#58; &#40;c&#41; TyRaNiD 2k6
Built&#58; Jan 21 2007 10&#58;55&#58;07
Loaded PRX wifisimp03.prx successfully
Module information

Name&#58;    WIFI_TEST_APP
Attrib&#58;  0000
Version&#58; 1.1
GP&#58;      000157C0

Exports&#58;
Export 0, Name syslib, Functions 1, Variables 1, flags 80000000

Imports&#58;
Import 0, Name sceMpegbase, Functions 1, Variables 0, flags 00090000
Import 1, Name sceUtility, Functions 2, Variables 0, flags 40010000
Import 2, Name MyLib, Functions 6, Variables 0, flags 40010000
Import 3, Name sceMpeg, Functions 10, Variables 0, flags 00090000
Import 4, Name sceDisplay, Functions 2, Variables 0, flags 40010000
Import 5, Name sceGe_user, Functions 1, Variables 0, flags 40010000
Import 6, Name sceNet, Functions 2, Variables 0, flags 00090000
Import 7, Name sceNetInet, Functions 12, Variables 0, flags 00090000
Import 8, Name sceNetApctl, Functions 6, Variables 0, flags 00090000
Import 9, Name sceNetResolver, Functions 2, Variables 0, flags 00090000
Import 10, Name sceUtility, Functions 2, Variables 0, flags 40010000
Import 11, Name IoFileMgrForUser, Functions 8, Variables 0, flags 40010000
Import 12, Name ModuleMgrForUser, Functions 3, Variables 0, flags 40010000
Import 13, Name StdioForUser, Functions 3, Variables 0, flags 40010000
Import 14, Name SysMemUserForUser, Functions 4, Variables 0, flags 40000000
Import 15, Name ThreadManForUser, Functions 12, Variables 0, flags 40010000
Import 16, Name UtilsForUser, Functions 1, Variables 0, flags 40010000
Import 17, Name LoadExecForUser, Functions 1, Variables 0, flags 40010000
Import 18, Name LoadCoreForKernel, Functions 1, Variables 0, flags 00010000
Import 19, Name UtilsForKernel, Functions 1, Variables 0, flags 00090000
Done

I'm on 3.03 oe-c

Any hints ?
User avatar
blondin
Posts: 18
Joined: Tue Mar 07, 2006 12:16 am
Location: France (Grenoble)

Post by blondin »

try this :

Code: Select all

SceUID mod = pspSdkLoadStartModule&#40;PRX_NAME, PSP_MEMORY_PARTITION_KERNEL&#41;; 

if &#40;mod < 0 &#41; 
&#123;  
printf&#40;"Loading module&#58; '%s' failed &#40;%x&#41;\n", PRX_NAME, mod&#41;;  
&#125; 
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

The problem is in MyLib.S in the flags:

Code: Select all

STUB_START "MyLib",0x40010000,0x00060005 
Just linking the main user app with MyLib.o already leads to the error: 0x8002013C (Library not found)

moonlight: you suggested the 0x4001 flags in exports.exp, do you know a solution?

EDIT: Hold on, by looking at psplink I think I know how to do it. I'll give it a shot.
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

jockyw2001 wrote:The problem is in MyLib.S in the flags:

Code: Select all

STUB_START "MyLib",0x40010000,0x00060005 
Just linking the main user app with MyLib.o already leads to the error: 0x8002013C (Library not found)

moonlight: you suggested the 0x4001 flags in exports.exp, do you know a solution?

EDIT: Hold on, by looking at psplink I think I know how to do it. I'll give it a shot.
I think you have to use 0x00090000 instead of 0x40010000 in the stub file for late binding , since your module is obviously not loaded before your application.
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

I eventually managed after I discovered how TyraniD does it in psplink :)

The trick was to rewrite the stub MyLib.S similar to:

Code: Select all

	.set noreorder

#include "pspimport.s"

#ifdef F_mymodule_0000
	IMPORT_START "mymodule",0x40090000
#endif
#ifdef F_mymodule_0001
	IMPORT_FUNC  "mymodule",0x563FF2B2,getModuleInfo
#endif
Then build the library libmymodule.a from MyLib.S and link the user mode app with it. The user app loads and starts the kernel mode module and happily makes function calls.

Thanks for all your help and your wonderful "oe" firmwares. I'm very curious about the .elf load feature in 3.10 oe-a. Would be cool if I can debug my apps on sourcecode level at last :)
TyRaNiD
Posts: 907
Joined: Sun Jan 18, 2004 12:23 am

Post by TyRaNiD »

Wait, you were actually manually writing your stubs ?
jockyw2001
Posts: 339
Joined: Thu Sep 29, 2005 4:19 pm

Post by jockyw2001 »

If that is what I did, then it didn't take much time :)

There are only 6 functions I'm exporting in exports.exp
I looked up the NIDs with prxtool and created the .S with a lot of copying and pasting.

Actually I was wondering how you did it when I saw there are 23 functions in psplink.S, most likely not by hand :)

PS: I did notice the -u option in prxtool, but that gives this:

Code: Select all

	STUB_START	"mymodule",0x40090000,0x00010005
	STUB_FUNC	0x563FF2B2,mymodule_563FF2B2
	STUB_END
but I need this:

Code: Select all

#ifdef F_mymodule_0000
	IMPORT_START "mymodule",0x40090000
#endif
#ifdef F_mymodule_0001
	IMPORT_FUNC  "mymodule",0x563FF2B2,getModuleInfo
#endif
TyRaNiD
Posts: 907
Joined: Sun Jan 18, 2004 12:23 am

Post by TyRaNiD »

psp-build-exports -k export.exp (or -s for the old style stubs)
moonlight
Posts: 567
Joined: Wed Oct 26, 2005 7:46 pm

Post by moonlight »

TyRaNiD wrote:psp-build-exports -k export.exp (or -s for the old style stubs)
Tyranid, is there a way of generating the new style stubs from a prx with prxtool?

I guessed that the command "prxtool -o myoutput -k emc_ddr.prx" would do it... but it didn't, instead it created an idc file.


Edit: ok, found the way (prxtool -o myoutput -u -k emc_ddr.prx".
I thought that putting the -u would be redundant, but it seems mandatory.
TyRaNiD
Posts: 907
Joined: Sun Jan 18, 2004 12:23 am

Post by TyRaNiD »

Yes it does seem redundant, not sure why I implemented it that way I just did and the reason is lost in the mists of time ;) I will probably fix it at some point ;)
Post Reply