void co_init() { int ret; void *base; block = sceKernelAllocMemBlockForVM("libco", MB_ALIGN(FOUR_KB_ALIGN(sizeof co_swap_function))); if (block < 0) return; /* get base address */ ret = sceKernelGetMemBlockBase(block, &base); if (ret < 0) return; /* set domain to be writable by user */ ret = sceKernelOpenVMDomain(); if (ret < 0) return; memcpy(base, co_swap_function, sizeof co_swap_function); /* set domain back to read-only */ ret = sceKernelCloseVMDomain(); if (ret < 0) return; /* flush icache */ ret = sceKernelSyncVMDomain(block, base, MB_ALIGN(FOUR_KB_ALIGN(sizeof co_swap_function))); if (ret < 0) return; co_swap = (void(*)(cothread_t, cothread_t))base; }
void VaapiDecoderH264::updateFrameInfo() { INFO("H264: update frame info "); bool sizeChanged = FALSE; H264SPS *sps = &m_lastSPS; uint32_t width = (sps->pic_width_in_mbs_minus1 + 1) * 16; uint32_t height = (sps->pic_height_in_map_units_minus1 + 1) * (sps->frame_mbs_only_flag ? 1 : 2) * 16; uint32_t widthAlign = MB_ALIGN(width); uint32_t heightAlign = MB_ALIGN(height); uint32_t formatInfoWidthAlign = MB_ALIGN(m_videoFormatInfo.width); uint32_t formatInfoHeightAlign = MB_ALIGN(m_videoFormatInfo.height); if (widthAlign != formatInfoWidthAlign || heightAlign != formatInfoHeightAlign) { sizeChanged = TRUE; m_videoFormatInfo.width = width; m_videoFormatInfo.height = height; m_configBuffer.width = width; m_configBuffer.height = height; } }
ER_UINT acre_mbf(const T_CMBF *pk_cmbf) { MBFCB *p_mbfcb; MBFINIB *p_mbfinib; ATR mbfatr; uint_t maxmsz; size_t mbfsz; void *mbfmb; ID domid; const DOMINIB *p_dominib; ACPTN acptn; ER ercd; LOG_ACRE_MBF_ENTER(pk_cmbf); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_cmbf, T_CMBF); mbfatr = pk_cmbf->mbfatr; maxmsz = pk_cmbf->maxmsz; mbfsz = pk_cmbf->mbfsz; mbfmb = pk_cmbf->mbfmb; CHECK_VALIDATR(mbfatr, TA_TPRI|TA_DOMMASK); if (mbfmb != NULL) { CHECK_PAR(MB_ALIGN(mbfmb)); CHECK_OBJ(valid_memobj_kernel(mbfmb, mbfsz)); } domid = get_atrdomid(mbfatr); if (domid == TDOM_SELF) { if (rundom == TACP_KERNEL) { domid = TDOM_KERNEL; } else { domid = p_runtsk->p_tinib->domid; } mbfatr = set_atrdomid(mbfatr, domid); } switch (domid) { case TDOM_KERNEL: p_dominib = &dominib_kernel; break; case TDOM_NONE: p_dominib = &dominib_none; break; default: CHECK_RSATR(VALID_DOMID(domid)); p_dominib = get_dominib(domid); break; } CHECK_ACPTN(p_dominib->acvct.acptn1); lock_cpu(); if (tnum_mbf == 0 || queue_empty(&(p_dominib->p_domcb->free_mbfcb))) { ercd = E_NOID; } else { if (mbfsz != 0 && mbfmb == NULL) { mbfmb = malloc_mpk(mbfsz, p_dominib); mbfatr |= TA_MBALLOC; } if (mbfsz != 0 && mbfmb == NULL) { ercd = E_NOMEM; } else { p_mbfcb = (MBFCB *) queue_delete_next(&(p_dominib->p_domcb->free_mbfcb)); p_mbfinib = (MBFINIB *)(p_mbfcb->p_mbfinib); p_mbfinib->mbfatr = mbfatr; p_mbfinib->maxmsz = maxmsz; p_mbfinib->mbfsz = mbfsz; p_mbfinib->mbfmb = mbfmb; acptn = default_acptn(domid); p_mbfinib->acvct.acptn1 = acptn; p_mbfinib->acvct.acptn2 = acptn; p_mbfinib->acvct.acptn3 = p_dominib->acvct.acptn1; p_mbfinib->acvct.acptn4 = acptn; queue_initialize(&(p_mbfcb->swait_queue)); queue_initialize(&(p_mbfcb->rwait_queue)); p_mbfcb->fmbfsz = mbfsz; p_mbfcb->head = 0U; p_mbfcb->tail = 0U; p_mbfcb->smbfcnt = 0U; ercd = MBFID(p_mbfcb); } } unlock_cpu(); error_exit: LOG_ACRE_MBF_LEAVE(ercd); return(ercd); }
ER_UINT acre_mpf(const T_CMPF *pk_cmpf) { MPFCB *p_mpfcb; MPFINIB *p_mpfinib; ATR mpfatr; void *mpf; MPFMB *p_mpfmb; ER ercd; LOG_ACRE_MPF_ENTER(pk_cmpf); CHECK_TSKCTX_UNL(); CHECK_RSATR(pk_cmpf->mpfatr, TA_TPRI); CHECK_PAR(pk_cmpf->blkcnt != 0); CHECK_PAR(pk_cmpf->blksz != 0); if (pk_cmpf->mpf != NULL) { CHECK_PAR(MPF_ALIGN(pk_cmpf->mpf)); } if (pk_cmpf->mpfmb != NULL) { CHECK_PAR(MB_ALIGN(pk_cmpf->mpfmb)); } mpfatr = pk_cmpf->mpfatr; mpf = pk_cmpf->mpf; p_mpfmb = pk_cmpf->mpfmb; lock_cpu(); if (tnum_mpf == 0 || queue_empty(&free_mpfcb)) { ercd = E_NOID; } else { if (mpf == NULL) { mpf = kernel_malloc(ROUND_MPF_T(pk_cmpf->blksz) * pk_cmpf->blkcnt); mpfatr |= TA_MEMALLOC; } if (mpf == NULL) { ercd = E_NOMEM; } else { if (p_mpfmb == NULL) { p_mpfmb = kernel_malloc(sizeof(MPFMB) * pk_cmpf->blkcnt); mpfatr |= TA_MBALLOC; } if (p_mpfmb == NULL) { if (pk_cmpf->mpf == NULL) { kernel_free(mpf); } ercd = E_NOMEM; } else { p_mpfcb = ((MPFCB *) queue_delete_next(&free_mpfcb)); p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib); p_mpfinib->mpfatr = mpfatr; p_mpfinib->blkcnt = pk_cmpf->blkcnt; p_mpfinib->blksz = ROUND_MPF_T(pk_cmpf->blksz); p_mpfinib->mpf = mpf; p_mpfinib->p_mpfmb = p_mpfmb; queue_initialize(&(p_mpfcb->wait_queue)); p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt; p_mpfcb->unused = 0U; p_mpfcb->freelist = INDEX_NULL; ercd = MPFID(p_mpfcb); } } } unlock_cpu(); error_exit: LOG_ACRE_MPF_LEAVE(ercd); return(ercd); }