]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - kernel/orb/invoke.cc
Regs struct, int98/99
[polintos/scott/priv.git] / kernel / orb / invoke.cc
index b2e5de80bb05d3a9304dd158e95529abe64ac915..ffcd8372318c4e8f581fc490602c73b750c4993b 100644 (file)
 #include <kern/orb.h>
 #include <kern/pagealloc.h>
 #include <kern/compiler.h>
+#include <kern/thread.h>
+
 #include <arch/usercopy.h>
+
 #include <orb.h>
 
 using System::RunTime::ParamInfoBlock;
@@ -41,24 +44,61 @@ namespace ORB {
                        return &hdr->frames[0];
                }
                
-               return &hdr->frames[thread->orbstack_top += 1];
+               return &hdr->frames[++thread->orbstack_top];
        }
-}
 
-extern "C" void invoke_method(ulong objid, ulong methid,
-                              ParamInfoBlock *user_pib, ulong ret_pc)
-{
-       ParamInfoBlock pib = Arch::copyin(user_pib);
-       CallFrame *frame = new_frame(curthread);
-       
-       frame->object = objid;
-       frame->method = methid;
-       frame->caller_user_pib = user_pib;
-       frame->ret_pc = ret_pc;
-       
-       printf("invoke_method: frame %p object %lx method %lx pib %p ret %lx\n",
-              frame, frame->object, frame->method, frame->caller_user_pib,
-              frame->ret_pc);
-       
+       ObjectHdr *IDSpace::get_local_hdr(Object *obj)
+       {
+               ObjectHdr *hdr = *rmap.lookup(obj->id);
+               if (hdr)
+                       return hdr;
+               
+               int id = alloc.alloc();
+               ObjectPtr *ptr = &table.lookup(id, true)->ptr;
+
+               ptr->id = id;
+               ptr->flags = 0;
+               ptr->Pointer = 1;
+               ptr->object = obj;
+
+               *rmap.lookup(id, true) = ptr;
+               return ptr;
+       }
+
+       Object *IDSpace::newobj(Mem::ProcAddrSpace *aspace, uintptr_t entry)
+       {
+               int id = alloc.alloc();
+               Object *obj = &table.lookup(id, true)->obj;
+
+               obj->id = id;
+               obj->flags = 0;
+               obj->aspace = aspace;
+               obj->entry = entry;
+               
+               return obj;
+       }
+
+       void invoke_method(ParamInfoBlock *user_pib, uintptr_t &stack)
+       {
+               ParamInfoBlock pib = Arch::copyin(user_pib);
+               CallFrame *frame = new_frame(curthread);
+               
+//             if (pib->objlist_len == 0)
+                       
+               
+//             frame->object = objid;
+               frame->caller_user_pib = user_pib;
+//             frame->ret_pc = ret_pc;
+               
+               printf("invoke_method: frame %p pib %p ret %lx\n",
+                      frame, frame->caller_user_pib,
+                      frame->ret_pc);
+               
+               
+       }
        
+       uintptr_t return_from_method(uintptr_t &exptr, size_t &exlen)
+       {
+               return 0;
+       }
 }