A new port of uClinux on PSP (with accessibility to ms0)

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

Moderators: cheriff, TyRaNiD

Post Reply
hlide
Posts: 739
Joined: Sun Sep 10, 2006 2:31 am

Post by hlide »

M.Jackson wrote:man, this looks like a dead end. I have tried all the methods i can think of(including J.F.'s one though I knew it standed little chance to succeed) but no good result was yielded.

But I did find out more info about this. the BAD relocation entries are actually of the type of R_MIPS_GPREL32, instead of R_MIPS_32 for those normal entries. And according to the mips abi, the formula used for its reloc calculation should be:
A + S + GP0 – GP

in which:
A: Represents the addend used to compute the value of the relocatable
field.
S: Represents the value of the symbol whose index resides in the relocation entry, unless the the symbol is STB_LOCAL and is of type
STT_SECTION in which case S represents the original sh_addr minus
the final sh_addr.
GP0: Represents the gp value used to create the relocatable object.
GP: Represents the final gp value to be used for the relocatable, executable, or shared object file being produced.

it doesn't make much sense to me either, 'cos I just can't imagine what kind of formula can translate a value from 0xfffxxxxx to a reasonable address that looks like 0x891xxxxx.

One thing interests me, though, is that all the programs i wrote, either as simple as hello-world or more complex ones, do not contain relocation entries of the type of R_MIPS_GPREL32, making me wonder what kind of code could have generated the demand for such type of relocation. If I can understand the nature of this relocation type and the scenario in which it is used, maybe I can work around the problem by revising those code accountable for this type of relocation a little bit in busybox. And i think the best way to do this is to write a short program that can also result in this special type of reloc. I had tried ".gpword" which is said to be capable of leading to a GPREL32 entry, but turned out it was not supported by GAS. Could anyone give me an example demonstrating what kind of coding would produce this type of relocation?
even with -G0 ?
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

no, not even -G0 would make any difference. And i also noticed that R_MIPS_GPREL32 entries can always be found in section .rodata (presumably the ReadOnly Data I guess). They also exist in .o files even before linking, which means it was gcc not the linker that creates those entries in the first place. And the values of those in .o files are already odd (like 0xfffxxxxx) though they will be converted into equally odd but different values in the final image.

Exactly what kind of code could have made gcc generate such type of relocation?
cheriff
Regular
Posts: 258
Joined: Wed Jun 23, 2004 5:35 pm
Location: Sydney.au

Post by cheriff »

From what I've learned working with other archs, GPREL are usually used for accessing global vars, and literal pools.
if you'll excuse my rusty mips and pseudo-asm, doing stuff GP relative allows you to turn a code seuqence such as:

Code: Select all

loadhigh r0, 0x0010 // set top 16 bits of address
load r0, 0x1230       // set lower 16 bits, we now have a pointer to the var
ld r0, 0(r0)             // we can dereference it
into:

Code: Select all

ld r0 0x122(gp)     // linker knows our var is 0x122 bytes from gp base
This also applies to literals, which explains the relocations in read-only sections. Say you have a printf("foo") the string gets placed somewhere, and a pointer to the string ends up in the sdata section and gcc compiles a "ld r0, 0(gp)" into the .o which is how it gets the pointer to the string into the correct place before the call to printf. At link time the linker changes the 0 offset from gp to whereever the particular global or literal ended up once the gp-relatives from all .o's have been pooled together.

You say these relo's appear even with -G0 .. are you passing this to the compiler when generating the .o's ?

Whilst all very nice when it works, there are a couple of ways this can go wrong, and from my experience with another gnu-based toolchain the error messages from ld can be far from helpful.. if you're lucky that it barfs - else you might just get a mangled ELF.

One major way that I've managed to consistently break this is:
have in a .s file:

Code: Select all

 .global somevar
somevar:
.word 42
and then in some other c file:

Code: Select all

extern int somevar;
int get_somehting(){
   return somevar;
}
The compiler assumes that since somevar is small, that it will be placed in the smalldata section so it emits a gp relative load. However, we actually defined it ourselves, and it really is in the .text section.
Depending on luck and the linker script 1 or 3 things will happen:
  • * it is still reachable by an offset from gp base, so things will work,
    * it is too far away and maybe linker will complain about trying to fit an offset of 423648673 bytes into 11 bits (or whatever), or
    * if it is actually *before* the gp base, ld may well put (or try to) a negative offset in there which may explain the 0xffff you are seeing.
I don't know about MIPS, but one arch at least simply ORs the offset against the value in the gp register so negative offsets will not work.

fixes might be re-ordering sdata section by tweaking linker scripts, or finding offending variables somehow and adding .section "sdata" before declaring them in asm files, so that the gcc's assumption about where they end up is correct.

so just some background infos on the kinds of struggles i've been having with GP-relative offsets, hopefully shedding some light to the issues you are facing :)

Cheers.
Damn, I need a decent signature!
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

Thanks cheriff! The info you shared was very insightful. On the other hand, I also made some progress today after plunging myself into the ocean of disassembly code for days. I actually discovered that the majority number of R_MIPS_GPREL32 entries was attributed to a gcc optimization for the "switch" statement. When the number of case branches exceeds certain level (say 6+), a particular optimization will kick in by introducing a "jump" table in the .rodata* section, which consists of an array of words measuring the negative distance between gp and the entrance of the target code (it is negative because .text always precedes .data). Therefore, these entries in the jump table require additional steps of calcuation to restore the correct address that the code desires (additional adjustments basing on the gp value at runtime), and the normal relocation procedure applied to R_MIPS_32 will just mess the address up and make the cpu go wild.

I have revised the code of the flat loader accordingly so that it now seems the kernel can get over those "switch" statements in busybox. But the bad news is busybox still crashes, at different location with a different problem I am gonna face...this is just agonizingly interesting. I just can't get my hands off it.
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

aha, this is convenient. it turns out just applying the -fno-jump-tables option when compiling will do away all the troubles I had. Now busybox is up and running again!!! :D
MythosGR
Posts: 4
Joined: Sun Dec 23, 2007 9:53 pm

uClinux on PSP Slim

Post by MythosGR »

There is a previous post, not replied though.

Will this port run on psp slim which has not FW 1.5 (running for example 3.71M33-4)?

I have tried with eLoader but I still cannot run it...

Could someone please help?
hyper_sonic
Posts: 6
Joined: Fri Dec 28, 2007 11:35 pm

Re: uClinux on PSP Slim

Post by hyper_sonic »

MythosGR wrote:There is a previous post, not replied though.

Will this port run on psp slim which has not FW 1.5 (running for example 3.71M33-4)?

I have tried with eLoader but I still cannot run it...

Could someone please help?
Also I don't know what is problem, but I have tried with 3.71M33-4 and retrieve negotiation result.
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Re: uClinux on PSP Slim

Post by M.Jackson »

MythosGR wrote:There is a previous post, not replied though.

Will this port run on psp slim which has not FW 1.5 (running for example 3.71M33-4)?

I have tried with eLoader but I still cannot run it...

Could someone please help?
I haven't had my PSP upgraded to 3.71 yet. but to my knowledge, there is a 1.5 kernel patch for 3.71 m33-x and I knew a few people who had successfully run this port on their 3.71 system after applying the patch. Have you tried that?
hyper_sonic
Posts: 6
Joined: Fri Dec 28, 2007 11:35 pm

Re: uClinux on PSP Slim

Post by hyper_sonic »

MythosGR wrote:There is a previous post, not replied though.

Will this port run on psp slim which has not FW 1.5 (running for example 3.71M33-4)?

I have tried with eLoader but I still cannot run it...

Could someone please help?
Yes, i can tell you, what you need do. Enter into recovery menu (POWER+R), switch kernel to 1.50 in configuration menu. Also of course you need apply 1.5 kernel-addon patch.
I tried and it worked. This great step to new future.
shadash
Posts: 24
Joined: Wed Dec 19, 2007 3:18 am
Location: San Diego

Kernel 2.6.22

Post by shadash »

In Kernel 2.6.22 support for a Marvell Libertas 8388 802.11b/g USB driver was added.

The PSP has a Marvell Libertas 88W8380. The 8380 seems very close in version number to 8388.

Does networking work?
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Re: Kernel 2.6.22

Post by M.Jackson »

shadash wrote:In Kernel 2.6.22 support for a Marvell Libertas 8388 802.11b/g USB driver was added.

The PSP has a Marvell Libertas 88W8380. The 8380 seems very close in version number to 8388.

Does networking work?
That sounds interesting! But if I can choose, I would rather have the usb work first :)
lainlives
Posts: 3
Joined: Sat Dec 29, 2007 3:30 pm

Post by lainlives »

can you give the source for the bootloader because i wanna port that to 3.xx firmware, since slims cannot run the 1.0/1.5 kernel that it requires
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

lainlives wrote:can you give the source for the bootloader because i wanna port that to 3.xx firmware, since slims cannot run the 1.0/1.5 kernel that it requires

Code: Select all

/*---------------------------------------------------------------------------*/
/* PSPBoot 0.2 Created by Jackson Mo */
/*---------------------------------------------------------------------------*/

#include <pspkernel.h>
#include <pspdebug.h>
#include <stdio.h>
#include <string.h>
#include "/usr/src/psp-zlib/zlib.h"


/*---------------------------------------------------------------------------*/
/* Module info                                                               */
/*---------------------------------------------------------------------------*/
/* Define the module info section, note the 0x1000 flag to enable start in
 * kernel mode
 */
PSP_MODULE_INFO&#40; "PSPBoot", 0x1000, 1, 1 &#41;;

/* Define the thread attribute as 0 so that the main thread does not get
 * converted to user mode
 */
PSP_MAIN_THREAD_ATTR&#40; 0 &#41;;


/*---------------------------------------------------------------------------*/
/* Macros                                                                    */
/*---------------------------------------------------------------------------*/
#if 1
#define CONFIG_UART3
#endif

#define BOOL                int
#define TRUE                1
#define FALSE               0

#define KERNEL_ENTRY        0x88000000
#define KERNEL_PARAM_OFFSET 0x00000008
#define KERNEL_MAX_SIZE     &#40; 4 * 1024 * 1024 &#41;   /* 4M */

#ifdef CONFIG_UART3
#define UART3_RXBUF         &#40; *&#40;volatile char *&#41;0xbe500000 &#41;
#define UART3_TXBUF         &#40; *&#40;volatile char *&#41;0xbe500000 &#41;
#define UART3_STATUS        &#40; *&#40;volatile unsigned int *&#41;0xbe500018 &#41;
#define UART3_DIV1          &#40; *&#40;volatile unsigned int *&#41;0xbe500024 &#41;
#define UART3_DIV2          &#40; *&#40;volatile unsigned int *&#41;0xbe500028 &#41;
#define UART3_CTRL          &#40; *&#40;volatile unsigned int *&#41;0xbe50002c &#41;
#define UART3_MASK_RXEMPTY  &#40; &#40;unsigned int&#41;0x00000010 &#41;
#define UART3_MASK_TXFULL   &#40; &#40;unsigned int&#41;0x00000020 &#41;
#define UART3_MASK_SETBAUD  &#40; &#40;unsigned int&#41;0x00000060 &#41;
#endif

#define BANNER              "=====================================\n" \
                            " PSP Boot v0.2 Created by Jackson Mo\n"  \
                            "=====================================\n\n"
#define BLUE                0x00ff0000
#define GREEN               0x0000ff00
#define RED                 0x000000ff
#define CONFIG_FILE         "pspboot.conf"
#define CONFIG_MAX_PARAM    256
#define CONFIG_PARAM_CMD    "cmdline"
#define CONFIG_PARAM_KERNEL "kernel"
#define CONFIG_PARAM_BAUD   "baud"

#define printf              pspDebugScreenPrintf
#define sleep&#40;t&#41;            sceKernelDelayThread&#40; &#40;t&#41; &#41;
#define exit&#40;&#41;              transferControl&#40; NULL, 0 &#41;
#define END_OF_LINE&#40;p&#41;      &#40; *&#40;p&#41; == '\r' || *&#40;p&#41; == '\n' || *&#40;p&#41; == 0 &#41;


/*---------------------------------------------------------------------------*/
/* Type definitions                                                          */
/*---------------------------------------------------------------------------*/
typedef void &#40; *KernelEntryFunc &#41;&#40;int zero_, int arch_, void * params_&#41;;


/*---------------------------------------------------------------------------*/
/* Static Data                                                               */
/*---------------------------------------------------------------------------*/
static char s_paramCmd&#91; CONFIG_MAX_PARAM &#93;;
static char s_paramKernel&#91; CONFIG_MAX_PARAM &#93;;
#ifdef CONFIG_UART3
static int  s_paramBaud = 1;
#endif


/*---------------------------------------------------------------------------*/
/* Prototypes                                                                */
/*---------------------------------------------------------------------------*/
BOOL loadConfig&#40;&#41;;
BOOL parseParam&#40;const char * name_, const char * value_&#41;;
BOOL loadKernel&#40;void ** buf_, int * size_&#41;;
void transferControl&#40;void * buf_, int size_&#41;;
void disableIrq&#40;&#41;;
void memCopy&#40;void * dest_, const void * sour_, int size_&#41;;
void pspClearIcache&#40;void&#41;;
void pspClearDcache&#40;void&#41;;

#ifdef CONFIG_UART3
BOOL uart3_setbaud&#40;int baud_&#41;;
int uart3_write&#40;const char * buf_, int size_&#41;;
int uart3_puts&#40;const char * str_&#41;;
#endif


/*---------------------------------------------------------------------------*/
/* Implementations                                                           */
/*---------------------------------------------------------------------------*/
int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
  void * kernelBuf;
  int kernelSize;

  pspDebugScreenInit&#40;&#41;;
  
  /* Print the banner */
  pspDebugScreenSetTextColor&#40; RED &#41;;
  printf&#40; BANNER &#41;;
  pspDebugScreenSetTextColor&#40; GREEN &#41;;

  /* Load the config file first */
  if &#40; !loadConfig&#40;&#41; &#41;
  &#123;
    sleep&#40; 3000 &#41;;
    exit&#40;&#41;;
  &#125;

  /* Load the kernel image */
  if &#40; !loadKernel&#40; &kernelBuf, &kernelSize &#41; &#41;
  &#123;
    sleep&#40; 3000 &#41;;
    exit&#40;&#41;;
  &#125;

  transferControl&#40; kernelBuf, kernelSize &#41;;   /* no return from here */
  return 0;
&#125;
/*---------------------------------------------------------------------------*/
BOOL loadConfig&#40;&#41;
&#123;
  FILE * fconf;
  const int bufLen = 1024;
  char buf&#91; bufLen &#93;;
  char * p;
  char * end;
  char * paramName;
  char * paramValue;
  int line;

  printf&#40; "Loading config file\n" &#41;;

  fconf = fopen&#40; CONFIG_FILE, "r" &#41;;
  if &#40; fconf == NULL &#41;
  &#123;
    printf&#40; "Failed to open config file %s\n", CONFIG_FILE &#41;;
    return FALSE;
  &#125;

  for &#40; line = 1; fgets&#40; buf, bufLen, fconf &#41; != NULL; line++ &#41;
  &#123;
    buf&#91; bufLen - 1 &#93; = 0;
    p = buf;
    end = buf + bufLen;

    /* skip all leading white space of tab */
    while &#40; &#40; *p == ' ' || *p == '\t' &#41; && *p != 0 && p < end &#41;
    &#123;
      p++;
    &#125;

    /* skip empty line and comment */
    if &#40; END_OF_LINE&#40; p &#41; || p >= end || *p == '#' &#41;
    &#123;
      continue;
    &#125;

    paramName = p;    /* get the parameter name */

    while &#40; *p != '=' && !END_OF_LINE&#40; p &#41; && p < end &#41; p++;
    if &#40; END_OF_LINE&#40; p &#41; || p >= end &#41;
    &#123;
      printf&#40; "Syntax error at line %d\n", line &#41;;
      fclose&#40; fconf &#41;;
      return FALSE;
    &#125;

    *p++ = 0;           /* set the end of the param name */
    paramValue = p;     /* get the parameter value */

    /* set the end of the param value */
    while &#40; !END_OF_LINE&#40; p &#41; && p < end &#41; p++;
    *p = 0;

    /* Parse the parameter */
    if &#40; !parseParam&#40; paramName, paramValue &#41; &#41;
    &#123;
      fclose&#40; fconf &#41;;
      return FALSE;
    &#125;
  
    line++;
  &#125;

  fclose&#40; fconf &#41;;
  return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
BOOL parseParam&#40;const char * name_, const char * value_&#41;
&#123;
  /* cmdline=... */
  if &#40; stricmp&#40; name_, CONFIG_PARAM_CMD &#41; == 0 &#41;
  &#123;
    strncpy&#40; s_paramCmd, value_, CONFIG_MAX_PARAM &#41;;
    s_paramCmd&#91; CONFIG_MAX_PARAM - 1 &#93; = 0;
    printf&#40; "  %s&#58; %s\n", CONFIG_PARAM_CMD, s_paramCmd &#41;;
  &#125;

  /* kernel=... */
  else if &#40; stricmp&#40; name_, CONFIG_PARAM_KERNEL &#41; == 0 &#41;
  &#123;
    strncpy&#40; s_paramKernel, value_, CONFIG_MAX_PARAM &#41;;
    s_paramKernel&#91; CONFIG_MAX_PARAM - 1 &#93; = 0;
    printf&#40; "  %s&#58; %s\n", CONFIG_PARAM_KERNEL, s_paramKernel &#41;;
  &#125;

#ifdef CONFIG_UART3
  /* baud=9600|115200 */
  else if &#40; stricmp&#40; name_, CONFIG_PARAM_BAUD &#41; == 0 &#41;
  &#123;
    sscanf&#40; value_, "%d", &s_paramBaud &#41;;
    printf&#40; "  %s&#58; %d\n", CONFIG_PARAM_BAUD, s_paramBaud &#41;;
  &#125;
#endif

  else
  &#123;
    printf&#40; "  Unsupported param %s\n", name_ &#41;;
  &#125;

  return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
BOOL loadKernel&#40;void ** buf_, int * size_&#41;
&#123;
  gzFile zf;
  void * buf;
  int size;

  printf&#40; "Decompressing linux kernel..." &#41;;

  if &#40; buf_ == NULL || size_ == NULL &#41;
  &#123;
    printf&#40; "Internal error\n" &#41;;
    return FALSE;
  &#125;

  *buf_ = NULL;
  *size_ = 0;

  if &#40; *s_paramKernel == 0 &#41;
  &#123;
    printf&#40; "Invalid kernel file\n" &#41;;
    return FALSE;
  &#125;

  zf = gzopen&#40; s_paramKernel, "r" &#41;;
  if &#40; zf == NULL &#41;
  &#123;
    printf&#40; "Failed to open file %s\n", s_paramKernel &#41;;
    return FALSE;
  &#125;

  buf = malloc&#40; KERNEL_MAX_SIZE &#41;;
  if &#40; buf == NULL &#41;
  &#123;
    printf&#40; "Failed to allocate buffer\n" &#41;;
    gzclose&#40; zf &#41;;
    return FALSE;
  &#125;

  size = gzread&#40; zf, buf, KERNEL_MAX_SIZE &#41;;
  if &#40; size < 0 &#41;
  &#123;
    printf&#40; "Failed to read file\n" &#41;;
    free&#40; buf &#41;;
    gzclose&#40; zf &#41;;
    return FALSE;
  &#125; 

  gzclose&#40; zf &#41;;
  printf&#40; "%d bytes loaded\n", size &#41;;
  
  *buf_ = buf;
  *size_ = size;

  return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
void transferControl&#40;void * buf_, int size_&#41;
&#123;
  if &#40; buf_ != NULL && size_ > 0 &#41;
  &#123;
    KernelEntryFunc kernelEntry = &#40;KernelEntryFunc&#41;&#40; KERNEL_ENTRY &#41;;
    void * kernelParam = NULL;

    printf&#40; "Transfering control to 0x%08x...\n", kernelEntry &#41;;

    /* disable IRQ */
    disableIrq&#40;&#41;;

    /* prepare kernel image */
    memCopy&#40; &#40;void *&#41;&#40; KERNEL_ENTRY &#41;, buf_, size_ &#41;;

    /* prepare boot command line */
    if &#40; *s_paramCmd != 0 &#41;
    &#123;
      kernelParam = &#40;void *&#41;&#40; KERNEL_ENTRY + KERNEL_PARAM_OFFSET &#41;;
      memCopy&#40; kernelParam, s_paramCmd, CONFIG_MAX_PARAM &#41;;
    &#125;

#ifdef CONFIG_UART3
    if &#40; s_paramBaud > 1 &#41;
    &#123;
      uart3_setbaud&#40; s_paramBaud &#41;;
      uart3_puts&#40; "Booting Linux kernel...\n" &#41;;
    &#125;
#endif
    
    /* flush all caches */
    pspClearIcache&#40;&#41;;
    pspClearDcache&#40;&#41;;

    kernelEntry&#40; 0, 0, kernelParam &#41;;
    /* never returns */
  &#125;

  sceKernelExitGame&#40;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
void disableIrq&#40;&#41;
&#123;
  __asm__ __volatile__ &#40;
    "mfc0   $8, $12\n"
    "li     $9, 0xfffe\n"
    "and    $8, $8, $9\n"
    "mtc0   $8, $12\n"
  &#41;;
&#125;
/*---------------------------------------------------------------------------*/
void memCopy&#40;void * dest_, const void * sour_, int size_&#41;
&#123;
  const char * from = &#40;const char *&#41;sour_;
  char * to = &#40;char *&#41;dest_;

  while &#40; size_-- > 0 &#41;
  &#123;
    *to++ = *from++;
  &#125;
&#125;
/*---------------------------------------------------------------------------*/
void pspClearIcache&#40;void&#41;
&#123;
        asm&#40;"\
        .word 0x40088000;\
        .word 0x24091000;\
        .word 0x7D081240;\
        .word 0x01094804;\
        .word 0x4080E000;\
        .word 0x4080E800;\
        .word 0x00004021;\
        .word 0xBD010000;\
        .word 0xBD030000;\
        .word 0x25080040;\
        .word 0x1509FFFC;\
        .word 0x00000000;\
        "&#58;&#58;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
void pspClearDcache&#40;void&#41;
&#123;
        asm&#40;"\
        .word 0x40088000;\
        .word 0x24090800;\
        .word 0x7D081180;\
        .word 0x01094804;\
        .word 0x00004021;\
        .word 0xBD140000;\
        .word 0xBD140000;\
        .word 0x25080040;\
        .word 0x1509FFFC;\
        .word 0x00000000;\
        .word 0x0000000F;\
        .word 0x00000000;\
        "&#58;&#58;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
#ifdef CONFIG_UART3
BOOL uart3_setbaud&#40;int baud_&#41;
&#123;
  int div1, div2;

  div1 = 96000000 / baud_;
  div2 = div1 & 0x3F;
  div1 >>= 6;

  UART3_DIV1 = div1;
  UART3_DIV2 = div2;
  UART3_CTRL = UART3_MASK_SETBAUD;

  return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
int uart3_write&#40;const char * buf_, int size_&#41;
&#123;
  int bytesWritten = 0;
  while &#40; bytesWritten < size_ &#41;
  &#123;
    if &#40; *buf_ == '\n' &#41;
    &#123;
      while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
      UART3_TXBUF = '\n';
      while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
      UART3_TXBUF = '\r';
    &#125;
    else
    &#123;
      while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
      UART3_TXBUF = *buf_;
    &#125;

    ++buf_;
    ++bytesWritten;
  &#125;
  
  return bytesWritten;
&#125;
/*---------------------------------------------------------------------------*/
int uart3_puts&#40;const char * str_&#41;
&#123;
  int len = 0;
  while &#40; str_&#91; len &#93; != 0 &#41; ++len;

  return uart3_write&#40; str_, len &#41;;
&#125;
#endif


/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

Last edited by M.Jackson on Wed Jan 02, 2008 6:36 pm, edited 1 time in total.
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

Here comes a question again. If I wanna have an additional compiling option applied when building libraries that come with gcc (like libstdc++.a), where should I add that option to? Can I modify gcc's "configure" script or some Makefile to concatenate that option to CFLAGS or CFLAGS_FOR_TARGET or CFLAGS_FOR_BUILD? Which one will actually take effect when building those libraries (not building the cross-compiler itself)? This whole scripting and automation thing is just like designed to make your head ache like hell...
lainlives
Posts: 3
Joined: Sat Dec 29, 2007 3:30 pm

Post by lainlives »

M.Jackson wrote:
lainlives wrote:can you give the source for the bootloader because i wanna port that to 3.xx firmware, since slims cannot run the 1.0/1.5 kernel that it requires
/*---------------------------------------------------------------------------*/
/* PSPBoot 0.2 Created by Jackson Mo */
/*---------------------------------------------------------------------------*/

...
thank you
ale152
Posts: 2
Joined: Sun Dec 30, 2007 10:00 pm

Post by ale152 »

lainlives wrote:can you give the source for the bootloader because i wanna port that to 3.xx firmware, since slims cannot run the 1.0/1.5 kernel that it requires
Have you managed to port it on 3.xx firmware?
I've got a psp slim and i NEED to run linux on it :D
riverful
Posts: 6
Joined: Tue Dec 25, 2007 2:55 am

Thanks for Jackson Mo.

Post by riverful »

First of all, i appreciate Jackson's works. I succeeded compiling kernel version 2.6.22-uc0( not uc1 ), and saw booting meesage on my PSP. I worked document for my works, and post it for any other lazy man. :)

http://riverful.tistory.com/entry/Docum ... on-psp-v01

But, here is the problem. Actuallay, I'm korean master course student, and will be engineer soon in IT company. So, my eng is poor. :) Anyway... This document is korean, not eng. In a few days, i will translate this doc to eng. wait a few days.

my next works is following:

i) one compiler unification. ( not psp-, not mipsel-linux- )
ii) being alive wlan.
iii) using usb gadget.

Thx to Jackson mo. :)
MythosGR
Posts: 4
Joined: Sun Dec 23, 2007 9:53 pm

Re: uClinux on PSP Slim

Post by MythosGR »

Yes, i can tell you, what you need do. Enter into recovery menu (POWER+R), switch kernel to 1.50 in configuration menu. Also of course you need apply 1.5 kernel-addon patch.
I tried and it worked. This great step to new future.
Are you sure you are running FW 3.71M33-4 on slim? I have tried all this and still doesn't work. Furthermore, 1.5 patch cannot be installed on slim.

Anyway, lainlives efforts seem more promising... Any news???
mystic33
Posts: 1
Joined: Tue Jan 01, 2008 2:56 am

Post by mystic33 »

has anyone tried to get miniGUI working under uClinux yet?

http://www.minigui.org

http://www.minigui.com/index.php?id=min ... ce-version

it would be the next big leap, getting a GUI onto this linux platform
hyper_sonic
Posts: 6
Joined: Fri Dec 28, 2007 11:35 pm

Re: uClinux on PSP Slim

Post by hyper_sonic »

MythosGR wrote:
Yes, i can tell you, what you need do. Enter into recovery menu (POWER+R), switch kernel to 1.50 in configuration menu. Also of course you need apply 1.5 kernel-addon patch.
I tried and it worked. This great step to new future.
Are you sure you are running FW 3.71M33-4 on slim? I have tried all this and still doesn't work. Furthermore, 1.5 patch cannot be installed on slim.

Anyway, lainlives efforts seem more promising... Any news???
Oh, i sorry, it is my mistake. You are right! This instruction don't apply to slim PSP. We have one way: port loader to 3.71 kernel.
But i don't know what we are need to change in source.
lainlives
Posts: 3
Joined: Sat Dec 29, 2007 3:30 pm

Re: uClinux on PSP Slim

Post by lainlives »

MythosGR wrote:
Yes, i can tell you, what you need do. Enter into recovery menu (POWER+R), switch kernel to 1.50 in configuration menu. Also of course you need apply 1.5 kernel-addon patch.
I tried and it worked. This great step to new future.
Are you sure you are running FW 3.71M33-4 on slim? I have tried all this and still doesn't work. Furthermore, 1.5 patch cannot be installed on slim.

Anyway, lainlives efforts seem more promising... Any news???

Well, lately i have not been at home, but i did look/modify the source, a little, which should work, i dont have a compiler on my current machine, im not at home for a few weeks
but here someone should beable to compile it.

Code: Select all

/*---------------------------------------------------------------------------*/
/* PSPBoot 0.2 Created by Jackson Mo */
/*---------------------------------------------------------------------------*/

BUILD_PRX = 1
PSP_FW_VERSION = 371

#include <pspkernel.h>
#include <pspdebug.h>
#include <stdio.h>
#include <string.h>
#include "/usr/src/psp-zlib/zlib.h"


/*---------------------------------------------------------------------------*/
/* Module info */
/*---------------------------------------------------------------------------*/
/* Define the module info section, note the 0x1000 flag to enable start in
* kernel mode
*/
PSP_MODULE_INFO&#40; "PSPBoot", 0x1000, 1, 1 &#41;;
PSP_HEAP_SIZE_KB&#40;20480&#41;;

/* Define the thread attribute as 0 so that the main thread does not get
* converted to user mode
*/
PSP_MAIN_THREAD_ATTR&#40; 0 &#41;;


/*---------------------------------------------------------------------------*/
/* Macros */
/*---------------------------------------------------------------------------*/
#if 1
#define CONFIG_UART3
#endif

#define BOOL int
#define TRUE 1
#define FALSE 0

#define KERNEL_ENTRY 0x88000000
#define KERNEL_PARAM_OFFSET 0x00000008
#define KERNEL_MAX_SIZE &#40; 4 * 1024 * 1024 &#41; /* 4M */

#ifdef CONFIG_UART3
#define UART3_RXBUF &#40; *&#40;volatile char *&#41;0xbe500000 &#41;
#define UART3_TXBUF &#40; *&#40;volatile char *&#41;0xbe500000 &#41;
#define UART3_STATUS &#40; *&#40;volatile unsigned int *&#41;0xbe500018 &#41;
#define UART3_DIV1 &#40; *&#40;volatile unsigned int *&#41;0xbe500024 &#41;
#define UART3_DIV2 &#40; *&#40;volatile unsigned int *&#41;0xbe500028 &#41;
#define UART3_CTRL &#40; *&#40;volatile unsigned int *&#41;0xbe50002c &#41;
#define UART3_MASK_RXEMPTY &#40; &#40;unsigned int&#41;0x00000010 &#41;
#define UART3_MASK_TXFULL &#40; &#40;unsigned int&#41;0x00000020 &#41;
#define UART3_MASK_SETBAUD &#40; &#40;unsigned int&#41;0x00000060 &#41;
#endif

#define BANNER "=====================================\n" \
" PSP Boot v0.2   3.xx Port by lainlives\n" \
"=====================================\n\n"
#define BLUE 0x00ff0000
#define GREEN 0x0000ff00
#define RED 0x000000ff
#define CONFIG_FILE "pspboot.conf"
#define CONFIG_MAX_PARAM 256
#define CONFIG_PARAM_CMD "cmdline"
#define CONFIG_PARAM_KERNEL "kernel"
#define CONFIG_PARAM_BAUD "baud"

#define printf pspDebugScreenPrintf
#define sleep&#40;t&#41; sceKernelDelayThread&#40; &#40;t&#41; &#41;
#define exit&#40;&#41; transferControl&#40; NULL, 0 &#41;
#define END_OF_LINE&#40;p&#41; &#40; *&#40;p&#41; == '\r' || *&#40;p&#41; == '\n' || *&#40;p&#41; == 0 &#41;


/*---------------------------------------------------------------------------*/
/* Type definitions */
/*---------------------------------------------------------------------------*/
typedef void &#40; *KernelEntryFunc &#41;&#40;int zero_, int arch_, void * params_&#41;;


/*---------------------------------------------------------------------------*/
/* Static Data */
/*---------------------------------------------------------------------------*/
static char s_paramCmd&#91; CONFIG_MAX_PARAM &#93;;
static char s_paramKernel&#91; CONFIG_MAX_PARAM &#93;;
#ifdef CONFIG_UART3
static int s_paramBaud = 1;
#endif


/*---------------------------------------------------------------------------*/
/* Prototypes */
/*---------------------------------------------------------------------------*/
BOOL loadConfig&#40;&#41;;
BOOL parseParam&#40;const char * name_, const char * value_&#41;;
BOOL loadKernel&#40;void ** buf_, int * size_&#41;;
void transferControl&#40;void * buf_, int size_&#41;;
void disableIrq&#40;&#41;;
void memCopy&#40;void * dest_, const void * sour_, int size_&#41;;
void pspClearIcache&#40;void&#41;;
void pspClearDcache&#40;void&#41;;

#ifdef CONFIG_UART3
BOOL uart3_setbaud&#40;int baud_&#41;;
int uart3_write&#40;const char * buf_, int size_&#41;;
int uart3_puts&#40;const char * str_&#41;;
#endif


/*---------------------------------------------------------------------------*/
/* Implementations */
/*---------------------------------------------------------------------------*/
int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
void * kernelBuf;
int kernelSize;

pspDebugScreenInit&#40;&#41;;

/* Print the banner */
pspDebugScreenSetTextColor&#40; RED &#41;;
printf&#40; BANNER &#41;;
pspDebugScreenSetTextColor&#40; GREEN &#41;;

/* Load the config file first */
if &#40; !loadConfig&#40;&#41; &#41;
&#123;
sleep&#40; 3000 &#41;;
exit&#40;&#41;;
&#125;

/* Load the kernel image */
if &#40; !loadKernel&#40; &kernelBuf, &kernelSize &#41; &#41;
&#123;
sleep&#40; 3000 &#41;;
exit&#40;&#41;;
&#125;

transferControl&#40; kernelBuf, kernelSize &#41;; /* no return from here */
return 0;
&#125;
/*---------------------------------------------------------------------------*/
BOOL loadConfig&#40;&#41;
&#123;
FILE * fconf;
const int bufLen = 1024;
char buf&#91; bufLen &#93;;
char * p;
char * end;
char * paramName;
char * paramValue;
int line;

printf&#40; "Loading config file\n" &#41;;

fconf = fopen&#40; CONFIG_FILE, "r" &#41;;
if &#40; fconf == NULL &#41;
&#123;
printf&#40; "Failed to open config file %s\n", CONFIG_FILE &#41;;
return FALSE;
&#125;

for &#40; line = 1; fgets&#40; buf, bufLen, fconf &#41; != NULL; line++ &#41;
&#123;
buf&#91; bufLen - 1 &#93; = 0;
p = buf;
end = buf + bufLen;

/* skip all leading white space of tab */
while &#40; &#40; *p == ' ' || *p == '\t' &#41; && *p != 0 && p < end &#41;
&#123;
p++;
&#125;

/* skip empty line and comment */
if &#40; END_OF_LINE&#40; p &#41; || p >= end || *p == '#' &#41;
&#123;
continue;
&#125;

paramName = p; /* get the parameter name */

while &#40; *p != '=' && !END_OF_LINE&#40; p &#41; && p < end &#41; p++;
if &#40; END_OF_LINE&#40; p &#41; || p >= end &#41;
&#123;
printf&#40; "Syntax error at line %d\n", line &#41;;
fclose&#40; fconf &#41;;
return FALSE;
&#125;

*p++ = 0; /* set the end of the param name */
paramValue = p; /* get the parameter value */

/* set the end of the param value */
while &#40; !END_OF_LINE&#40; p &#41; && p < end &#41; p++;
*p = 0;

/* Parse the parameter */
if &#40; !parseParam&#40; paramName, paramValue &#41; &#41;
&#123;
fclose&#40; fconf &#41;;
return FALSE;
&#125;

line++;
&#125;

fclose&#40; fconf &#41;;
return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
BOOL parseParam&#40;const char * name_, const char * value_&#41;
&#123;
/* cmdline=... */
if &#40; stricmp&#40; name_, CONFIG_PARAM_CMD &#41; == 0 &#41;
&#123;
strncpy&#40; s_paramCmd, value_, CONFIG_MAX_PARAM &#41;;
s_paramCmd&#91; CONFIG_MAX_PARAM - 1 &#93; = 0;
printf&#40; " %s&#58; %s\n", CONFIG_PARAM_CMD, s_paramCmd &#41;;
&#125;

/* kernel=... */
else if &#40; stricmp&#40; name_, CONFIG_PARAM_KERNEL &#41; == 0 &#41;
&#123;
strncpy&#40; s_paramKernel, value_, CONFIG_MAX_PARAM &#41;;
s_paramKernel&#91; CONFIG_MAX_PARAM - 1 &#93; = 0;
printf&#40; " %s&#58; %s\n", CONFIG_PARAM_KERNEL, s_paramKernel &#41;;
&#125;

#ifdef CONFIG_UART3
/* baud=9600|115200 */
else if &#40; stricmp&#40; name_, CONFIG_PARAM_BAUD &#41; == 0 &#41;
&#123;
sscanf&#40; value_, "%d", &s_paramBaud &#41;;
printf&#40; " %s&#58; %d\n", CONFIG_PARAM_BAUD, s_paramBaud &#41;;
&#125;
#endif

else
&#123;
printf&#40; " Unsupported param %s\n", name_ &#41;;
&#125;

return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
BOOL loadKernel&#40;void ** buf_, int * size_&#41;
&#123;
gzFile zf;
void * buf;
int size;

printf&#40; "Decompressing linux kernel..." &#41;;

if &#40; buf_ == NULL || size_ == NULL &#41;
&#123;
printf&#40; "Internal error\n" &#41;;
return FALSE;
&#125;

*buf_ = NULL;
*size_ = 0;

if &#40; *s_paramKernel == 0 &#41;
&#123;
printf&#40; "Invalid kernel file\n" &#41;;
return FALSE;
&#125;

zf = gzopen&#40; s_paramKernel, "r" &#41;;
if &#40; zf == NULL &#41;
&#123;
printf&#40; "Failed to open file %s\n", s_paramKernel &#41;;
return FALSE;
&#125;

buf = malloc&#40; KERNEL_MAX_SIZE &#41;;
if &#40; buf == NULL &#41;
&#123;
printf&#40; "Failed to allocate buffer\n" &#41;;
gzclose&#40; zf &#41;;
return FALSE;
&#125;

size = gzread&#40; zf, buf, KERNEL_MAX_SIZE &#41;;
if &#40; size < 0 &#41;
&#123;
printf&#40; "Failed to read file\n" &#41;;
free&#40; buf &#41;;
gzclose&#40; zf &#41;;
return FALSE;
&#125;

gzclose&#40; zf &#41;;
printf&#40; "%d bytes loaded\n", size &#41;;

*buf_ = buf;
*size_ = size;

return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
void transferControl&#40;void * buf_, int size_&#41;
&#123;
if &#40; buf_ != NULL && size_ > 0 &#41;
&#123;
KernelEntryFunc kernelEntry = &#40;KernelEntryFunc&#41;&#40; KERNEL_ENTRY &#41;;
void * kernelParam = NULL;

printf&#40; "Transfering control to 0x%08x...\n", kernelEntry &#41;;

/* disable IRQ */
disableIrq&#40;&#41;;

/* prepare kernel image */
memCopy&#40; &#40;void *&#41;&#40; KERNEL_ENTRY &#41;, buf_, size_ &#41;;

/* prepare boot command line */
if &#40; *s_paramCmd != 0 &#41;
&#123;
kernelParam = &#40;void *&#41;&#40; KERNEL_ENTRY + KERNEL_PARAM_OFFSET &#41;;
memCopy&#40; kernelParam, s_paramCmd, CONFIG_MAX_PARAM &#41;;
&#125;

#ifdef CONFIG_UART3
if &#40; s_paramBaud > 1 &#41;
&#123;
uart3_setbaud&#40; s_paramBaud &#41;;
uart3_puts&#40; "Booting Linux kernel...\n" &#41;;
&#125;
#endif

/* flush all caches */
pspClearIcache&#40;&#41;;
pspClearDcache&#40;&#41;;

kernelEntry&#40; 0, 0, kernelParam &#41;;
/* never returns */
&#125;

sceKernelExitGame&#40;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
void disableIrq&#40;&#41;
&#123;
__asm__ __volatile__ &#40;
"mfc0 $8, $12\n"
"li $9, 0xfffe\n"
"and $8, $8, $9\n"
"mtc0 $8, $12\n"
&#41;;
&#125;
/*---------------------------------------------------------------------------*/
void memCopy&#40;void * dest_, const void * sour_, int size_&#41;
&#123;
const char * from = &#40;const char *&#41;sour_;
char * to = &#40;char *&#41;dest_;

while &#40; size_-- > 0 &#41;
&#123;
*to++ = *from++;
&#125;
&#125;
/*---------------------------------------------------------------------------*/
void pspClearIcache&#40;void&#41;
&#123;
asm&#40;"\
.word 0x40088000;\
.word 0x24091000;\
.word 0x7D081240;\
.word 0x01094804;\
.word 0x4080E000;\
.word 0x4080E800;\
.word 0x00004021;\
.word 0xBD010000;\
.word 0xBD030000;\
.word 0x25080040;\
.word 0x1509FFFC;\
.word 0x00000000;\
"&#58;&#58;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
void pspClearDcache&#40;void&#41;
&#123;
asm&#40;"\
.word 0x40088000;\
.word 0x24090800;\
.word 0x7D081180;\
.word 0x01094804;\
.word 0x00004021;\
.word 0xBD140000;\
.word 0xBD140000;\
.word 0x25080040;\
.word 0x1509FFFC;\
.word 0x00000000;\
.word 0x0000000F;\
.word 0x00000000;\
"&#58;&#58;&#41;;
&#125;
/*---------------------------------------------------------------------------*/
#ifdef CONFIG_UART3
BOOL uart3_setbaud&#40;int baud_&#41;
&#123;
int div1, div2;

div1 = 96000000 / baud_;
div2 = div1 & 0x3F;
div1 >>= 6;

UART3_DIV1 = div1;
UART3_DIV2 = div2;
UART3_CTRL = UART3_MASK_SETBAUD;

return TRUE;
&#125;
/*---------------------------------------------------------------------------*/
int uart3_write&#40;const char * buf_, int size_&#41;
&#123;
int bytesWritten = 0;
while &#40; bytesWritten < size_ &#41;
&#123;
if &#40; *buf_ == '\n' &#41;
&#123;
while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
UART3_TXBUF = '\n';
while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
UART3_TXBUF = '\r';
&#125;
else
&#123;
while &#40; UART3_STATUS & UART3_MASK_TXFULL &#41;;
UART3_TXBUF = *buf_;
&#125;

++buf_;
++bytesWritten;
&#125;

return bytesWritten;
&#125;
/*---------------------------------------------------------------------------*/
int uart3_puts&#40;const char * str_&#41;
&#123;
int len = 0;
while &#40; str_&#91; len &#93; != 0 &#41; ++len;

return uart3_write&#40; str_, len &#41;;
&#125;
#endif


/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
fixed with code tags ;-)
Last edited by lainlives on Thu Jan 03, 2008 12:15 pm, edited 1 time in total.
J.F.
Posts: 2906
Joined: Sun Feb 22, 2004 11:41 am

Post by J.F. »

Please put all code into code BBCODE tags.
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

Aha, after days of troubleshooting, the unified toolchain (gcc 4.2.1+uclibc 0.9.29) is now ready! Both the kernel and apps (both in C and C++) can now neatly be built via one toolchain, which will definitely ease lives for those who wanted to develop on this project. I will put it on my website in the coming few days after making a few more final touches to it.
J.F.
Posts: 2906
Joined: Sun Feb 22, 2004 11:41 am

Post by J.F. »

M.Jackson wrote:Aha, after days of troubleshooting, the unified toolchain (gcc 4.2.1+uclibc 0.9.29) is now ready! Both the kernel and apps (both in C and C++) can now neatly be built via one toolchain, which will definitely ease lives for those who wanted to develop on this project. I will put it on my website in the coming few days after making a few more final touches to it.
Good news! That'll make it much easier on those wanting to roll it themselves. :)
roge
Posts: 11
Joined: Thu Dec 13, 2007 11:44 pm

Post by roge »

very good m.jackson
vijay
Posts: 25
Joined: Thu Jan 03, 2008 10:07 pm

help needed

Post by vijay »

hi guys i have a psp slim running 3.71-m33
and i love to have linux on it

i was trying to get it somehow but couldn't this is what i have done

i downloaded the source from the site and ported the pspboot to kernel3 .........
i then downloaded the precompiled package available in the jacson's site
and and copied the vmlinux.bin in pspboot directory

when i run the app it starts ............

shows that its booting
--------------
decompressing linux --- 0 bytes loading
-----------------

then it returns to XMB i dont now why its not loading the vmlinux.bin file
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Re: help needed

Post by M.Jackson »

vijay wrote:hi guys i have a psp slim running 3.71-m33
and i love to have linux on it

i was trying to get it somehow but couldn't this is what i have done

i downloaded the source from the site and ported the pspboot to kernel3 .........
i then downloaded the precompiled package available in the jacson's site
and and copied the vmlinux.bin in pspboot directory

when i run the app it starts ............

shows that its booting
--------------
decompressing linux --- 0 bytes loading
-----------------

then it returns to XMB i dont now why its not loading the vmlinux.bin file
Did you use my original bootloader or the one that modified by others? If it is the latter, I am afraid you might need to do some debugging first, and that's part of the fun, isn't it? :)
M.Jackson
Posts: 85
Joined: Mon Sep 10, 2007 6:37 pm
Contact:

Post by M.Jackson »

ok, I took a quick look at the diff between my version of the bootloader and the one midified by lainlives, finding that they really do not differ much except a few lines added probably just to satisfy compilation for slim psp homebrews. Actually I expected more might need to be done in order to get the bootloader work on slim, but off course I could be wrong. The fundamental reason why the original version needs to run under the 1.5 core is because it needs to be in the kernel mode (against the user mode) to gain privilege for manipulating many system elements (like wiping off the firmware from RAM, presetting some of the registers, locking interrupt, flushing CPU caches, etc...), and the 1.5 core offers a pretty simple way of doing so by just specifying an attribute at the beginning of the program. And I am not sure whether this trick still works in 3.71 'cos there is no guy around happen to have a slim for me to run tests on it. If it does not, we may have to figure out a more sophisticated approach to smuggle our code into the kernel mode. Writing a prx could be an option. Again I don't know this for sure, but as some of the drivers are also implemented as prx modules, it may have proven its ability to run in the kernel mode. Am I getting this right or just that I had thought too much?
vijay
Posts: 25
Joined: Thu Jan 03, 2008 10:07 pm

Post by vijay »

hi jackson ...............
its my mistake i didnt know that it has to be in kernel mode for it to run

i just saw this forum
http://forums.ps2dev.org/viewtopic.php? ... 96f9268c1e
and followed the instructions ...............

one more thing , is it true that in fw above 2 homebrew kernel mode is disabled , and u can run only in user mode????????
i found this while googling
vijay
Posts: 25
Joined: Thu Jan 03, 2008 10:07 pm

Post by vijay »

ok i tried to run the muclinux precompiled binary using eloader which can run a few 1.5 homebrews

the application started and then crashed
here is wht i got

-----------------------------------------------------------
Exception - Coprocessor unusable

EPC - 08900338

Cause - 0000002C

Status - 20008613

BadVAddr - 08025934

zr 00000000 at 08920000 v0 09FA1B24 v1 00008613

a0 00000000 a1 44027F70 a2 00000000 a3 0892618C

t0 00000008 t1 44027F54 t2 00000000 t3 44027F54

t4 00000006 t5 00000000 t6 00000000 t7 00008600

s0 089431B0 s1 00192073 s2 00000001 s3 09FFEEE0

s4 0000001F s5 00000013 s6 DEADBEEF s7 DEADBEEF

t8 0000001C t9 88300000 k0 09FFEF00 k1 00000000

gp 0892ED80 sp 09FFEE10 fp 09FFEEA0 ra 0890054C


-----------------------------------------------------------------------
Post Reply