kmod.c
ubixos/types.h
ubixos/kmod.h
ubixos/sched.h
ubixos/elf.h
ubixos/kpanic.h
ubixos/lists.h
ubixos/spinlock.h
lib/kprintf.h
lib/kmalloc.h
vfs/vfs.h
vmm/vmm.h
string.h
assert.h
sys/thread.h
ubixos/kpanic.h
ubixos/sched.h
ubixos/spinlock.h
src/sys/kmods/kmod.c
ubixos/lists.h
ubixos/types.h
sys/_types.h
vmm/paging.h
string.h
vfs/file.h
sys/tss.h
lib/kmalloc.h
vmm/vmm.h
vfs/vfs.h
vfs/mount.h
lib/kprintf.h
ubixos/kmod.h
assert.h
ubixfs/dirCache.h
sys/sysproto.h
ubixos/elf.h
sys/signal.h
ubixos/tty.h
uInt32 uInt32 kmod_add (const char *kmod_file, const char *name) kmod_add const char * kmod_file const char * name CreateItem _item_t::data InitializeList InsertItemAtFront kmalloc kmod_load kprintf List NULL
uInt32 uInt32 kmod_load (const char *kmod_file) kmod_load const char * kmod_file _current assert elfHeader::eEntry ELF32_R_SYM ELF32_R_TYPE elfGetRelType elfHeader::ePhnum elfHeader::ePhoff elfHeader::eShnum elfHeader::eShoff elfHeader::eShstrndx fclose fopen fread fseek taskStruct::id kfree kmalloc kpanic kprintf LD_START memset PAGE_DEFAULT elfProgramHeader::phMemsz elfProgramHeader::phVaddr PT_DYNAMIC PT_GNU_STACK PT_LOAD PT_PAX_FLAGS R_386_32 R_386_PC32 R_386_RELATIVE elfSectionHeader::shSize strcmp vmm_remapPage vmmFindFreePage x1000 kmod_add
List_t * List_t* List List 0x0 kmod_add

    /*****************************************************************************************
    Copyright(c)2002-2005TheUbixOSProject
    Allrightsreserved.

    Redistributionanduseinsourceandbinaryforms,withorwithoutmodification,are
    permittedprovidedthatthefollowingconditionsaremet:

    Redistributionsofsourcecodemustretaintheabovecopyrightnotice,thislistof
    conditions,thefollowingdisclaimerandthelistofauthors.Redistributionsinbinary
    formmustreproducetheabovecopyrightnotice,thislistofconditions,thefollowing
    disclaimerandthelistofauthorsinthedocumentationand/orothermaterialsprovided
    withthedistribution.NeitherthenameoftheUbixOSProjectnorthenamesofits
    contributorsmaybeusedtoendorseorpromoteproductsderivedfromthissoftware
    withoutspecificpriorwrittenpermission.

    THISSOFTWAREISPROVIDEDBYTHECOPYRIGHTHOLDERSANDCONTRIBUTORS"ASIS"ANDANY
    EXPRESSORIMPLIEDWARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIESOF
    MERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEAREDISCLAIMED.INNOEVENTSHALL
    THECOPYRIGHTOWNERORCONTRIBUTORSBELIABLEFORANYDIRECT,INDIRECT,INCIDENTAL,
    SPECIAL,EXEMPLARY,ORCONSEQUENTIALDAMAGES(INCLUDING,BUTNOTLIMITEDTO,PROCUREMENT
    OFSUBSTITUTEGOODSORSERVICES;LOSSOFUSE,DATA,ORPROFITS;ORBUSINESSINTERRUPTION)
    HOWEVERCAUSEDANDONANYTHEORYOFLIABILITY,WHETHERINCONTRACT,STRICTLIABILITY,OR
    TORT(INCLUDINGNEGLIGENCEOROTHERWISE)ARISINGINANYWAYOUTOFTHEUSEOFTHIS
    SOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGE.

    $Id: kmod_8c.xml 88 2016-01-12 00:11:29Z reddawg $

    *****************************************************************************************/

    #include<ubixos/types.h>
    #include<ubixos/kmod.h>
    #include<ubixos/sched.h>
    #include<ubixos/elf.h>
    #include<ubixos/kpanic.h>
    #include<ubixos/lists.h>
    #include<ubixos/spinlock.h>
    #include<lib/kprintf.h>
    #include<lib/kmalloc.h>
    #include<vfs/vfs.h>
    #include<vmm/vmm.h>
    #include<string.h>
    #include<assert.h>

    List_t*List=0x0;

    uInt32kmod_add(constchar*kmod_file,constchar*name)
    {
    uInt32addr=0x0;
    Item_t*tmp;
    kmod_t*kmods;

    addr=kmod_load(kmod_file);
    if(addr==0x0)
    return0x0;

    if(List==0x0)
    {
    List=InitializeList();
    }

    tmp=CreateItem();
    InsertItemAtFront(List,tmp);
    kmods=kmalloc(sizeof*kmods);
    tmp->data=kmods;
    if(kmods==NULL)
    {
    kprintf("kmod_add:unabletoallocatememory!\n");
    return0x0;
    }

    return0x0;
    }

    uInt32kmod_load(constchar*kmod_file){
    inti=0x0;
    intx=0x0;
    intrel=0x0;
    intsym=0x0;
    char*newLoc=0x0;
    char*shStr=0x0;
    char*dynStr=0x0;
    uInt32*reMap=0x0;
    fileDescriptor*kmod_fd=0x0;
    elfHeader*binaryHeader=0x0;
    elfProgramHeader*programHeader=0x0;
    elfSectionHeader*sectionHeader=0x0;
    elfDynSym*relSymTab=0x0;
    elfPltInfo*elfRel=0x0;

    /*Openkernelmodule*/
    kmod_fd=fopen(kmod_file,"rb");
    if(kmod_fd==0x0){
    kprintf("Cannotopen%s\n",kmod_file);
    return0x0;
    }

    /*loadmoduleheader*/
    fseek(kmod_fd,0x0,0x0);
    binaryHeader=(elfHeader*)kmalloc(sizeof(elfHeader));
    if(binaryHeader==0x0)
    {
    kprintf("kmod:outofmemory\n");
    return0x0;
    }

    assert(binaryHeader);
    fread(binaryHeader,sizeof(elfHeader),1,kmod_fd);

    programHeader=(elfProgramHeader*)kmalloc(sizeof(elfProgramHeader)*binaryHeader->ePhnum);
    assert(programHeader);
    fseek(kmod_fd,binaryHeader->ePhoff,0);
    fread(programHeader,sizeof(elfSectionHeader),binaryHeader->ePhnum,kmod_fd);

    sectionHeader=(elfSectionHeader*)kmalloc(sizeof(elfSectionHeader)*binaryHeader->eShnum);
    assert(sectionHeader);
    fseek(kmod_fd,binaryHeader->eShoff,0);
    fread(sectionHeader,sizeof(elfSectionHeader),binaryHeader->eShnum,kmod_fd);

    shStr=(char*)kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize);
    fseek(kmod_fd,sectionHeader[binaryHeader->eShstrndx].shOffset,0);
    fread(shStr,sectionHeader[binaryHeader->eShstrndx].shSize,1,kmod_fd);

    for(i=0;i<binaryHeader->ePhnum;i++){
    switch(programHeader[i].phType){
    casePT_LOAD:
    casePT_DYNAMIC:
    newLoc=(char*)programHeader[i].phVaddr+LD_START;
    /*
    AllocateMemoryImGoingToHaveToMakeThisLoadMemoryWithCorrect
    Settingssoithelpsusinthefuture
    */
    for(x=0;x<((programHeader[i].phMemsz)+4095);x+=0x1000){
    /*maker/worro*/
    if((vmm_remapPage(vmmFindFreePage(_current->id),((programHeader[i].phVaddr&0xFFFFF000)+x+LD_START),PAGE_DEFAULT))==0x0)
    kpanic("vmmRemapPage:ld\n");
    memset((void*)((programHeader[i].phVaddr&0xFFFFF000)+x+LD_START),0x0,0x1000);
    }
    /*NowLoadSectionToMemory*/
    fseek(kmod_fd,programHeader[i].phOffset,0x0);
    fread(newLoc,programHeader[i].phFilesz,1,kmod_fd);
    break;
    casePT_GNU_STACK:
    /*Tellsusifthestackshouldbeexecutable.Failsafetoexecutable
    untilweaddchecking*/
    break;
    casePT_PAX_FLAGS:
    /*Notsure...*/
    break;
    default:
    kprintf("UnhandledHeader:%08x\n",programHeader[i].phType);
    break;
    }
    }

    for(i=0x0;i<binaryHeader->eShnum;i++){
    switch(sectionHeader[i].shType){
    case3:
    if(!strcmp((shStr+sectionHeader[i].shName),".dynstr")){
    dynStr=(char*)kmalloc(sectionHeader[i].shSize);
    fseek(kmod_fd,sectionHeader[i].shOffset,0x0);
    fread(dynStr,sectionHeader[i].shSize,1,kmod_fd);
    }
    break;
    case9:
    elfRel=(elfPltInfo*)kmalloc(sectionHeader[i].shSize);
    fseek(kmod_fd,sectionHeader[i].shOffset,0x0);
    fread(elfRel,sectionHeader[i].shSize,1,kmod_fd);

    for(x=0x0;x<sectionHeader[i].shSize/sizeof(elfPltInfo);x++){
    rel=ELF32_R_SYM(elfRel[x].pltInfo);
    reMap=(uInt32*)((uInt32)LD_START+elfRel[x].pltOffset);
    switch(ELF32_R_TYPE(elfRel[x].pltInfo)){
    caseR_386_32:
    *reMap+=((uInt32)LD_START+relSymTab[rel].dynValue);
    break;
    caseR_386_PC32:
    *reMap+=((uInt32)LD_START+relSymTab[rel].dynValue)-(uInt32)reMap;
    break;
    caseR_386_RELATIVE:
    *reMap+=(uInt32)LD_START;
    break;
    default:
    kprintf("[0x%X][0x%X](%i)[%s]\n",elfRel[x].pltOffset,elfRel[x].pltInfo,rel,elfGetRelType(ELF32_R_TYPE(elfRel[x].pltInfo)));
    kprintf("relTab[%s][0x%X][0x%X]\n",dynStr+relSymTab[rel].dynName,relSymTab[rel].dynValue,relSymTab[rel].dynName);
    break;
    }
    }
    kfree(elfRel);
    break;
    case11:
    relSymTab=(elfDynSym*)kmalloc(sectionHeader[i].shSize);
    fseek(kmod_fd,sectionHeader[i].shOffset,0x0);
    fread(relSymTab,sectionHeader[i].shSize,1,kmod_fd);
    sym=i;
    break;
    }
    }

    i=binaryHeader->eEntry+LD_START;

    kfree(dynStr);
    kfree(shStr);
    kfree(relSymTab);
    kfree(sectionHeader);
    kfree(programHeader);
    kfree(binaryHeader);
    fclose(kmod_fd);

    return((uInt32)i);
    }

    /***
    END
    ***/