Halfway through deciding where to put the error handlers, I've settled on libc
authorJohn Hodge <[email protected]>
Fri, 23 Apr 2010 14:05:53 +0000 (22:05 +0800)
committerJohn Hodge <[email protected]>
Fri, 23 Apr 2010 14:05:53 +0000 (22:05 +0800)
- TODO: Make a clean way of getting access to ld-acess's functions/data at runtime
- Also drafting up the 2D accelerated video interface

Kernel/Makefile.BuildNum
Kernel/include/tpl_drv_video.h
Modules/Display/VESA/main.c
Usermode/Libraries/ld-acess.so_src/common.h
Usermode/Libraries/ld-acess.so_src/helpers.asm
Usermode/Libraries/ld-acess.so_src/loadlib.c
Usermode/Libraries/ld-acess.so_src/main.c
Usermode/Libraries/libc.so_src/stub.c
Usermode/include/sys/sys.h

index 6b06f1c..fa5303e 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 2035
+BUILD_NUM = 2036
index ebbe98f..ce575bb 100644 (file)
@@ -125,8 +125,37 @@ typedef struct sVideo_IOCtl_Mode
  */\r
 enum eTplVideo_BufFormats\r
 {\r
+       /**\r
+        * \brief Text Mode\r
+        * \r
+        * The device file presents itself as an array of ::tVT_Char\r
+        * each describing a character cell on the screen.\r
+        * These cells are each \a giVT_CharWidth pixels wide and\r
+        * \a giVT_CharHeight high.\r
+        */\r
        VIDEO_BUFFMT_TEXT,\r
+       /**\r
+        * \brief Framebuffer Mode\r
+        * \r
+        * The device file presents as an array of 32-bpp pixels describing\r
+        * the entire screen. The format of a single pixel is in xRGB format\r
+        * (top 8 bits ignored, next 8 bits red, next 8 bits green and\r
+        * the bottom 8 bits blue)\r
+        */\r
        VIDEO_BUFFMT_FRAMEBUFFER,\r
+       /**\r
+        * \brief 2D Accelerated Mode\r
+        * \r
+        * The device file acts as a character device, accepting a stream of\r
+        * commands described in eTplVideo_2DCommands when written to.\r
+        */\r
+       VIDEO_BUFFMT_2DSTREAM,\r
+       /**\r
+        * \brief 3D Accelerated Mode\r
+        * \r
+        * The device file acts as a character device, accepting a stream of\r
+        * commands described in eTplVideo_3DCommands when written to.\r
+        */\r
        VIDEO_BUFFMT_3DSTREAM\r
 };\r
 \r
index c2217e4..85bcb3b 100644 (file)
@@ -238,6 +238,8 @@ Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                }\r
                \r
                if( Offset + Length > heightInChars*widthInChars ) {\r
+                       Log_Debug("VESA", "%i + %i > %i*%i (%i)",\r
+                               (int)Offset, (int)Length, heightInChars, widthInChars, heightInChars*widthInChars);\r
                        Length = heightInChars*widthInChars - Offset;\r
                        Log_Notice("VESA", "Clipping write size to %i characters", (int)Length);\r
                }\r
index bc2efbd..81913d5 100644 (file)
 \r
 #include <stdarg.h>\r
 \r
+// === CONSTANTS ===\r
+#define        MAX_LOADED_LIBRARIES    64\r
+#define        MAX_STRINGS_BYTES       4096\r
+#define        SYSTEM_LIB_DIR  "/Acess/Libs/"\r
+\r
 // === Types ===\r
 typedef unsigned int   Uint;\r
 typedef unsigned char  Uint8;\r
@@ -19,6 +24,14 @@ typedef unsigned long        Uint32;
 typedef signed char            Sint8;\r
 typedef signed short   Sint16;\r
 typedef signed long            Sint32;\r
+\r
+typedef struct {\r
+       Uint    Base;\r
+       char    *Name;\r
+}      tLoadedLib;\r
+\r
+// === GLOBALS ===\r
+extern tLoadedLib      gLoadedLibraries[MAX_LOADED_LIBRARIES];\r
 
 // === Main ===
 extern int     DoRelocate( Uint base, char **envp, char *Filename );
@@ -42,6 +55,7 @@ extern void   SysDebug(char *fmt, ...);       //!< Now implemented in main.c
 extern void    SysDebugV(char *fmt, ...);\r
 extern Uint    SysLoadBin(char *path, Uint *entry);\r
 extern Uint    SysUnloadBin(Uint Base);\r
+extern void    SysSetFaultHandler(int (*Hanlder)(int));\r
 extern int     open(char *filename, int flags);\r
 extern void    close(int fd);\r
 
index 3797333..49b9bd8 100644 (file)
@@ -9,6 +9,7 @@
 [global _SysExit]\r
 [global _SysLoadBin]\r
 [global _SysUnloadBin]\r
+[global _SysSetFaultHandler]\r
 [global _open]\r
 [global _close]\r
 \r
@@ -77,3 +78,11 @@ _close:
        int 0xAC\r
        pop ebx\r
        ret\r
+\r
+_SysSetFaultHandler:\r
+       push ebx\r
+       mov eax, SYS_SETFAULTHANDLER\r
+       mov ebx, [esp+0x8]      ; File Descriptor\r
+       int 0xAC\r
+       pop ebx\r
+       ret\r
index 5cfa26e..e0b3b25 100644 (file)
 # define DEBUGS(v...)  \r
 #endif\r
 \r
-// === CONSTANTS ===\r
-#define        MAX_LOADED_LIBRARIES    64\r
-#define        MAX_STRINGS_BYTES       4096\r
-#define        SYSTEM_LIB_DIR  "/Acess/Libs/"\r
-\r
 // === PROTOTYPES ===\r
 Uint   IsFileLoaded(char *file);
  int   GetSymbolFromBase(Uint base, char *name, Uint *ret);\r
 \r
-// === GLOABLS ===\r
-struct {\r
-       Uint    Base;\r
+// === CONSTANTS ===\r
+const struct {\r
+       Uint    Value;\r
        char    *Name;\r
-}      gLoadedLibraries[MAX_LOADED_LIBRARIES];\r
+}      caLocalExports[] = {\r
+       {gLoadedLibraries, "gLoadedLibraries"}\r
+};\r
+\r
+// === GLOABLS ===\r
+tLoadedLib     gLoadedLibraries[MAX_LOADED_LIBRARIES];\r
 char   gsLoadedStrings[MAX_STRINGS_BYTES];\r
 char   *gsNextAvailString = gsLoadedStrings;\r
 //tLoadLib     *gpLoadedLibraries = NULL;\r
@@ -200,6 +200,12 @@ Uint GetSymbol(char *name)
 {\r
         int    i;
        Uint    ret;\r
+       for(i=0;i<sizeof(caLocalExports)/sizeof(caLocalExports[0]);i++)\r
+       {\r
+               if( strcmp(caLocalExports[i].Name, name) == 0 )\r
+                       return caLocalExports[i].Value;\r
+       }\r
+       \r
        for(i=0;i<sizeof(gLoadedLibraries)/sizeof(gLoadedLibraries[0]);i++)\r
        {\r
                if(gLoadedLibraries[i].Base == 0)       break;\r
index dc5d4d3..678dc9a 100644 (file)
@@ -22,9 +22,6 @@ extern void   gLinkedBase;
 int SoMain(Uint base, int arg1)\r
 {\r
         int    ret;\r
-       \r
-       //SysDebug("SoMain: base = 0x%x", base);\r
-       //SysDebug("SoMain: arg1 = 0x%x", arg1);\r
         \r
        // - Assume that the file pointer will be less than 4096\r
        if(base < 0x1000) {\r
index 55f4ca6..d1ee56e 100644 (file)
@@ -8,11 +8,20 @@
 \r
 #define USE_CPUID      0\r
 \r
+// === TYPES ===\r
+typedef struct {\r
+       intptr_t        Base;\r
+       char    *Name;\r
+}      tLoadedLib;\r
+\r
 // === PROTOTYPES ===\r
 #if USE_CPUID\r
 static void    cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
 #endif\r
-void   ErrorHandler(int Fault);\r
+ int   ErrorHandler(int Fault);\r
+\r
+// === IMPORTS ===\r
+extern tLoadedLib      gLoadedLibraries[64];\r
 \r
 // === GLOBALS ===\r
 extern char **_envp;\r
@@ -56,14 +65,24 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)
        }\r
        #endif\r
        \r
+       // Set Error handler\r
        _SysSetFaultHandler(ErrorHandler);\r
        \r
        return 1;\r
 }\r
 \r
-void ErrorHandler(int Fault)\r
+int ErrorHandler(int Fault)\r
 {\r
-       fprintf(stderr, "Fault = %i\n", Fault);\r
+        int    i;\r
+       fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault);\r
+       fprintf(stderr, "Loaded Libraries:\n");\r
+       for( i = 0; i < 64; i ++ )\r
+       {\r
+               //if(gLoadedLibraries[i].Base == 0)     continue;\r
+       //      fprintf(stderr, "%02i: %p  %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);\r
+       }\r
+       fprintf(stderr, "\n");\r
+       return -1;\r
 }\r
 \r
 #if USE_CPUID\r
index 105d573..e7858dd 100644 (file)
@@ -37,4 +37,4 @@ extern int    sendmsg(int dest, unsigned int *Data);
 extern int     pollmsg(int *src, unsigned int *Data);\r
 extern int     getmsg(int *src, unsigned int *Data);\r
 \r
-extern int     _SysSetFaultHandler(void (*Handler)(int));\r
+extern int     _SysSetFaultHandler(int (*Handler)(int));\r

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