Esempio n. 1
0
/**
 * Intializes an ELF32-TASK
 * TODO: Check Length of image
 * TODO: US-Mode
 * @param image The image
 * @param pri Priority
 */
void* initELF(void* image, int pri, size_t size, char *args)
{
	/*
	* TODO Wir muessen eigentlich die Laenge vom Image pruefen, damit wir bei
	* korrupten ELF-Dateien nicht ueber das Dateiende hinauslesen.
	*/
	DEBUG_MSG("ELF:      Init ELF32-File...");
	struct elf_header* header = image;
	struct elf_program_header* ph;
	int i;

	/* Ist es ueberhaupt eine ELF-Datei? */
	if (header->magic != ELF_MAGIC) {
		dbg(false);
		kprintf("Keine gueltige ELF-Magic!\n");
		return 0;
	}

	/*
	* Alle Program Header durchgehen und den Speicher an die passende Stelle
	* kopieren.
	*
	* TODO Wir erlauben der ELF-Datei hier, jeden beliebigen Speicher zu
	* ueberschreiben, einschliesslich dem Kernel selbst.
	*/
	ph = (struct elf_program_header*) (((char*) image) + header->ph_offset);
	for (i = 0; i < 2/*header->ph_entry_count*/; i++, ph++) {
		void* dest = (void*) ph->virt_addr;
		void* src = ((char*) image) + ph->offset;

		/* Nur Program Header vom Typ LOAD laden */
		if (ph->type != 1)
			continue;

		kmemset(dest, 0, ph->mem_size);
		kmemcpy(dest, src, ph->file_size);
	}
	

	//size /= PAGE_SIZE;

	
	pageDir_t page = vmmCreateContext();
	void *paddr = pmm_malloc(PAGE_SIZE);
		
	kmemset((void*) page, 0, PAGE_SIZE);
	
	for(i=0; i<size;i +=PAGE_SIZE)
	{
		vmmMapPage( page, (void*) 0xfffff000+i, paddr+i, USER_PRV ); //0xfffff000
	}
	
	vmmActivateContext( page );

	
	
	initTask( (void *)header->entry, pri, page, args);
	dbg(true);
	return (void*) header->entry;
}
Esempio n. 2
0
static void
resumeTask(Task * task, int code)
{
   if (task->state == Task_zombie)
      return;

   if (!task->isInited)
      initTask(task);
   else
   {
      longjmp(task->taskEnv, code);
   }
}
Esempio n. 3
0
void HttpProtocolData::checkTasks()
{
    LOG(0, "check tasks\n");

    // check task status.
    CURLMsg *msg = NULL;
    int msgsInQueue;
    while ( (msg = curl_multi_info_read(handle, &msgsInQueue)) != NULL)
    {
        HttpSession *ses = NULL;
        CURLcode rete = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &ses);
        CHECK_CURLE(rete);

        long respCode = 0;
        rete = curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, &respCode);
        CHECK_CURLE(rete);
        int topRespCode = respCode / 100;
        LOG(0, "top response code = %d\n", topRespCode);

        switch (msg->msg)
        {
        case CURLMSG_DONE:
            switch (topRespCode)
            {
            case 2: // succeed download
                if (ses->t->state == HT_PREPARE)
                {
                    initTask(ses->t);
                }

                ses->length = 0; // make sure session will be removed.
                checkSession(ses);
                break;
            default:
                break;
            }
            break;
            // TODO: handle other return code.
        default:
            break;
        }
    }
}