More work on x86_64 port of usermode
authorJohn Hodge <[email protected]>
Thu, 24 Mar 2011 13:49:39 +0000 (21:49 +0800)
committerJohn Hodge <[email protected]>
Thu, 24 Mar 2011 13:49:39 +0000 (21:49 +0800)
- Some slight changes to the build system too

Kernel/Makefile.BuildNum.x86_64
Kernel/arch/x86/proc.c
Usermode/Applications/Makefile.tpl
Usermode/Applications/axwin2_src/Makefile
Usermode/Libraries/Makefile.tpl
Usermode/Libraries/acess.ld_src/acess_x86_64.ld.h
Usermode/Libraries/crt0.o_src/Makefile
Usermode/Libraries/ld-acess.so_src/arch/x86.asm.h
Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h
Usermode/Libraries/libc.so_src/heap.c
Usermode/include/stdint.h

index 4ab4039..a204b49 100644 (file)
@@ -450,7 +450,7 @@ void Proc_Start(void)
                        for(;;) HALT(); // Just yeilds
                }
                gaCPUs[i].IdleThread = Threads_GetThread(tid);
-               gaCPUs[i].IdleThread->ThreadName = "Idle Thread";
+               gaCPUs[i].IdleThread->ThreadName = (char*)"Idle Thread";
                Threads_SetPriority( gaCPUs[i].IdleThread, -1 );        // Never called randomly
                gaCPUs[i].IdleThread->Quantum = 1;      // 1 slice quantum
                
index f16ae11..9d47931 100644 (file)
@@ -32,7 +32,7 @@ ifneq ($(_DBGMAKEFILE),)
 else
        @$(LD) -g $(LDFLAGS) -o $@ $(OBJ) -Map Map.txt
 endif
-       @objdump -d -S $(_BIN) > $(BIN).dsm
+       @$(DISASM) $(_BIN) > $(BIN).dsm
 
 $(OBJ): $(_OBJPREFIX)%.o: %.c
        @echo --- GCC -o $@
index e47c829..74a9d25 100644 (file)
@@ -1,4 +1,11 @@
 
-%:
-       $(MAKE) -C WM/ $@
-       $(MAKE) -C Shell_src/ $@
+NAME = AxWin2
+DIRS = WM Shell_src
+
+SUBMAKE = $(MAKE) --no-print-directory
+
+all install:
+       @$(foreach DIR,$(DIRS), echo --- $(NAME)/$(DIR); $(SUBMAKE) -C $(DIR) $@ ;)
+
+clean:
+       @$(foreach DIR,$(DIRS), $(SUBMAKE) -C $(DIR) $@ ;)
index e7dd73c..1bb96a2 100644 (file)
@@ -26,7 +26,7 @@ $(_BIN): $(OBJ)
        @mkdir -p $(dir $(_BIN))
        @echo [LD] -o $(BIN) $(OBJ)
        @$(LD) $(LDFLAGS) -o $(_BIN) $(OBJ)
-       @$(OBJDUMP) -d -S $(_BIN) > $(_BIN).dsm
+       @$(DISASM) $(_BIN) > $(_BIN).dsm
 
 $(_OBJPREFIX)%.o: %.c
        @echo [CC] -o $@
index 05302a3..469e4af 100644 (file)
@@ -1,5 +1,5 @@
-OUTPUT_FORMAT("elf64-x86_64")\r
-OUTPUT_ARCH(x86_64)\r
+OUTPUT_FORMAT("elf64-x86-64")\r
+/* OUTPUT_ARCH(x86_64) */\r
 ENTRY(start)\r
 SEARCH_DIR(__LIBDIR)\r
 INPUT(crt0.o)\r
index 36ce011..fc41f75 100644 (file)
@@ -4,7 +4,6 @@
 
 -include ../Makefile.cfg
 
-ASFLAGS = -felf
 BIN = $(OUTPUTDIR)Libs/crt0.o
 
 .PHONY: all clean install
index 282ff40..9e45273 100644 (file)
@@ -6,6 +6,7 @@
 
 [bits 32]
 [section .data]
+[global _errno:data 4]
 _errno:        dw      0
 
 [section .text]
index a21bf18..081e300 100644 (file)
@@ -25,7 +25,7 @@ _memcpy:
        pop rbp
        ret
 
-[global _errno]
+[global _errno:data 4]
 _errno:        dw      0       ; Placed in .text, to allow use of relative addressing
 
 #define SYSCALL0(_name,_num)   SYSCALL0 _name, _num
index 14066e9..7ce6bca 100644 (file)
@@ -17,12 +17,12 @@ typedef unsigned int Uint;
 \r
 // === TYPES ===\r
 typedef struct {\r
-       Uint    magic;\r
-       Uint    size;\r
+       uint32_t        magic;\r
+       size_t  size;\r
 }      heap_head;\r
 typedef struct {\r
        heap_head       *header;\r
-       Uint    magic;\r
+       uint32_t        magic;\r
 }      heap_foot;\r
 \r
 // === LOCAL VARIABLES ===\r
@@ -33,11 +33,11 @@ static void *_heap_end = NULL;
 EXPORT void    *malloc(size_t bytes);\r
 EXPORT void    *calloc(size_t bytes, size_t count);\r
 EXPORT void    free(void *mem);\r
-EXPORT void    *realloc(void *mem, Uint bytes);\r
+EXPORT void    *realloc(void *mem, size_t bytes);\r
 EXPORT void    *sbrk(int increment);\r
 LOCAL void     *extendHeap(int bytes);\r
-static void *FindHeapBase();\r
-LOCAL uint     brk(Uint newpos);\r
+static void    *FindHeapBase();\r
+LOCAL uint     brk(uintptr_t newpos);\r
 \r
 //Code\r
 \r
@@ -49,9 +49,9 @@ LOCAL uint    brk(Uint newpos);
 */\r
 EXPORT void *malloc(size_t bytes)\r
 {\r
-       Uint    bestSize;\r
-       Uint    closestMatch = 0;\r
-       Uint    bestMatchAddr = 0;\r
+       size_t  bestSize;\r
+       size_t  closestMatch = 0;\r
+       void    *bestMatchAddr = 0;\r
        heap_head       *curBlock;\r
        \r
        // Initialise Heap\r
@@ -67,7 +67,7 @@ EXPORT void *malloc(size_t bytes)
        bestSize = bytes + sizeof(heap_head) + sizeof(heap_foot) + BLOCK_SIZE - 1;\r
        bestSize = (bestSize/BLOCK_SIZE)*BLOCK_SIZE;    //Round up to block size\r
        \r
-       while((Uint)curBlock < (Uint)_heap_end)\r
+       while( (uintptr_t)curBlock < (uintptr_t)_heap_end)\r
        {\r
                //_SysDebug(" malloc: curBlock = 0x%x, curBlock->magic = 0x%x\n", curBlock, curBlock->magic);\r
                if(curBlock->magic == MAGIC_FREE)\r
@@ -76,7 +76,7 @@ EXPORT void *malloc(size_t bytes)
                                break;\r
                        if(bestSize < curBlock->size && (curBlock->size < closestMatch || closestMatch == 0)) {\r
                                closestMatch = curBlock->size;\r
-                               bestMatchAddr = (Uint)curBlock;\r
+                               bestMatchAddr = curBlock;\r
                        }\r
                }\r
                else if(curBlock->magic != MAGIC)\r
@@ -85,18 +85,18 @@ EXPORT void *malloc(size_t bytes)
                        _SysDebug("malloc: Corrupt Heap\n");\r
                        return NULL;\r
                }\r
-               curBlock = (heap_head*)((Uint)curBlock + curBlock->size);\r
+               curBlock = (heap_head*)((uintptr_t)curBlock + curBlock->size);\r
        }\r
        \r
-       if((Uint)curBlock < (Uint)_heap_start) {\r
+       if((uintptr_t)curBlock < (uintptr_t)_heap_start) {\r
                _SysDebug("malloc: Heap underrun for some reason\n");\r
                return NULL;\r
        }\r
        \r
        //Found a perfect match\r
-       if((Uint)curBlock < (Uint)_heap_end) {\r
+       if((uintptr_t)curBlock < (uintptr_t)_heap_end) {\r
                curBlock->magic = MAGIC;\r
-               return (void*)((Uint)curBlock + sizeof(heap_head));\r
+               return (void*)((uintptr_t)curBlock + sizeof(heap_head));\r
        }\r
        \r
        //Out of Heap Space\r
@@ -107,7 +107,7 @@ EXPORT void *malloc(size_t bytes)
                        return NULL;\r
                }\r
                curBlock->magic = MAGIC;\r
-               return (void*)((Uint)curBlock + sizeof(heap_head));\r
+               return (void*)((uintptr_t)curBlock + sizeof(heap_head));\r
        }\r
        \r
        //Split Block?\r
@@ -208,7 +208,7 @@ EXPORT void *realloc(void *oldPos, size_t bytes)
        }\r
        \r
        //Check for free space after block\r
-       head = (heap_head*)((Uint)oldPos-sizeof(heap_head));\r
+       head = (heap_head*)((uintptr_t)oldPos-sizeof(heap_head));\r
        \r
        //Hack to used free's amagamating algorithym and malloc's splitting\r
        free(oldPos);\r
@@ -219,7 +219,7 @@ EXPORT void *realloc(void *oldPos, size_t bytes)
                return NULL;\r
        \r
        //Copy Old Data\r
-       if((Uint)ret != (Uint)oldPos) {\r
+       if(ret != oldPos) {\r
                memcpy(ret, oldPos, head->size-sizeof(heap_head)-sizeof(heap_foot));\r
        }\r
        \r
@@ -254,8 +254,8 @@ LOCAL void *extendHeap(int bytes)
        foot->magic = MAGIC;\r
        \r
        //Combine with previous block if nessasary\r
-       if(_heap_end != _heap_start && ((heap_foot*)((Uint)_heap_end-sizeof(heap_foot)))->magic == MAGIC) {\r
-               heap_head       *tmpHead = ((heap_foot*)((Uint)_heap_end-sizeof(heap_foot)))->header;\r
+       if(_heap_end != _heap_start && ((heap_foot*)((uintptr_t)_heap_end-sizeof(heap_foot)))->magic == MAGIC) {\r
+               heap_head       *tmpHead = ((heap_foot*)((uintptr_t)_heap_end-sizeof(heap_foot)))->header;\r
                if(tmpHead->magic == MAGIC_FREE) {\r
                        tmpHead->size += bytes;\r
                        foot->header = tmpHead;\r
@@ -263,7 +263,7 @@ LOCAL void *extendHeap(int bytes)
                }\r
        }\r
        \r
-       _heap_end = (void*) ((Uint)foot+sizeof(heap_foot));\r
+       _heap_end = (void*) ((uintptr_t)foot+sizeof(heap_foot));\r
        return head;\r
 }\r
 \r
@@ -275,13 +275,13 @@ LOCAL void *extendHeap(int bytes)
 */\r
 EXPORT void *sbrk(int increment)\r
 {\r
-       static size_t oldEnd = 0;\r
-       static size_t curEnd = 0;\r
+       static uintptr_t oldEnd = 0;\r
+       static uintptr_t curEnd = 0;\r
 \r
        //_SysDebug("sbrk: (increment=%i)", increment);\r
 \r
        if (curEnd == 0) {\r
-               oldEnd = curEnd = (size_t)FindHeapBase();\r
+               oldEnd = curEnd = (uintptr_t)FindHeapBase();\r
                //_SysAllocate(curEnd); // Allocate the first page\r
        }\r
 \r
@@ -333,8 +333,8 @@ EXPORT int IsHeap(void *ptr)
        heap_head       *head;\r
        heap_foot       *foot;\r
        #endif\r
-       if( (Uint)ptr < (Uint)_heap_start )     return 0;\r
-       if( (Uint)ptr > (Uint)_heap_end )       return 0;\r
+       if( (uintptr_t)ptr < (uintptr_t)_heap_start )   return 0;\r
+       if( (uintptr_t)ptr > (uintptr_t)_heap_end )     return 0;\r
        \r
        #if 0\r
        head = (void*)((Uint)ptr - 4);\r
@@ -385,9 +385,9 @@ static void *FindHeapBase()
        #endif\r
 }\r
 \r
-LOCAL uint brk(Uint newpos)\r
+LOCAL uint brk(uintptr_t newpos)\r
 {\r
-       static uint     curpos;\r
+       static uintptr_t        curpos;\r
        uint    pages;\r
        uint    ret = curpos;\r
         int    delta;\r
@@ -395,7 +395,7 @@ LOCAL uint brk(Uint newpos)
        _SysDebug("brk: (newpos=0x%x)", newpos);\r
        \r
        // Find initial position\r
-       if(curpos == 0) curpos = (uint)FindHeapBase();\r
+       if(curpos == 0) curpos = (uintptr_t)FindHeapBase();\r
        \r
        // Get Current Position\r
        if(newpos == 0) return curpos;\r
index ea837ba..c7ff8fc 100644 (file)
@@ -14,6 +14,15 @@ typedef signed short int16_t;
 typedef signed long            int32_t;
 typedef signed long long       int64_t;
 
+#if __LP64__
+typedef uint64_t       intptr_t;
+typedef uint64_t       uintptr_t;
+#else
 typedef uint32_t       intptr_t;
+typedef uint32_t       uintptr_t;
+#endif
+#if 0
+# error "Unknown pointer size"
+#endif
 
 #endif

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