Kernel/armv7 - Fixing/breaking things
authorJohn Hodge <[email protected]>
Sun, 16 Oct 2011 14:29:55 +0000 (22:29 +0800)
committerJohn Hodge <[email protected]>
Sun, 16 Oct 2011 14:29:55 +0000 (22:29 +0800)
- Fixed 32-bit signed division
- Added vterm config for PL110 to boot options

Kernel/arch/armv7/lib.c
Kernel/arch/armv7/main.c
Kernel/arch/armv7/mm_virt.c

index a44489a..a59c062 100644 (file)
@@ -180,18 +180,6 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den)
        return ret;
 }
 
-#define _divide_s_32(Num, Den, rem)    __asm__ __volatile__ ( \
-               "mov %0, #0\n" \
-       "       adds %1, %1, %1\n" \
-       "       .rept 32\n" \
-       "       adcs %0, %2, %0, lsl #1\n" \
-       "       subcc %0, %0, %3\n" \
-       "       adcs %1, %1, %1\n" \
-       "       .endr\n" \
-               : "=r" (rem), "=r" (Num) \
-               : "r" (Den) \
-               : "cc" \
-               )
 Uint32 __udivsi3(Uint32 Num, Uint32 Den)
 {
        return __divmod32(Num, Den, NULL);
@@ -204,26 +192,32 @@ Uint32 __umodsi3(Uint32 Num, Uint32 Den)
        return rem;
 }
 
-Sint32 __divsi3(Sint32 Num, Sint32 Den)
+static inline Sint32 DivMod32S(Sint32 Num, Sint32 Den, Sint32 *Rem)
 {
-       if( (Num < 0) && (Den < 0) )
-               return __udivsi3(-Num, -Den);
-       else if( Num < 0 )
-               return __udivsi3(-Num, Den);
-       else if( Den < 0 )
-               return __udivsi3(Den, -Den);
+       Sint32  ret = 1;
+       if( Num < 0 ) {
+               ret = -ret;
+               Num = -Num;
+       }
+       if( Den < 0 ) {
+               ret = -ret;
+               Den = -Den;
+       }
+       if(ret < 0)
+               ret = -__divmod32(Num, Den, (Uint32*)Rem);
        else
-               return __udivsi3(Den, Den);
+               ret = __divmod32(Num, Den, (Uint32*)Rem);
+       return ret;
+}
+
+Sint32 __divsi3(Sint32 Num, Sint32 Den)
+{
+       return DivMod32S(Num, Den, NULL);
 }
 
 Sint32 __modsi3(Sint32 Num, Sint32 Den)
 {
-       if( (Num < 0) && (Den < 0) )
-               return __umodsi3(-Num, -Den);
-       else if( Num < 0 )
-               return __umodsi3(-Num, Den);
-       else if( Den < 0 )
-               return __umodsi3(Den, -Den);
-       else
-               return __umodsi3(Den, Den);
+       Sint32  rem;
+       DivMod32S(Num, Den, &rem);
+       return rem;
 }
index 5f7e7aa..9e86482 100644 (file)
@@ -40,7 +40,8 @@ int kmain(void)
 
        //
        LogF("Moving to arch-independent init\n");
-       System_Init("/Acess=initrd:");
+       System_Init("/Acess=initrd: -VTerm:Video=PL110");
+//     System_Init("/Acess=initrd:");
        //TODO: 
        LogF("End of kmain(), for(;;) Threads_Sleep();\n");
        for(;;)
index 2555b8a..ea2c846 100644 (file)
@@ -694,8 +694,16 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages)
 
 tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr)
 {
-       Log_Error("MMVirt", "TODO: Implement MM_AllocDMA");
-       return 0;
+       tPAddr  phys;
+       tVAddr  ret;
+
+       phys = MM_AllocPhysRange(Pages, MaxBits);
+       if(!phys)       return 0;
+       
+       ret = MM_MapHWPages(phys, Pages);
+       *PAddr = phys;
+
+       return ret;
 }
 
 void MM_UnmapHWPages(tVAddr Vaddr, Uint Number)

UCC git Repository :: git.ucc.asn.au