static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { struct tm tm; tm.tm_year = rtas_ld(args, 0) - 1900; tm.tm_mon = rtas_ld(args, 1) - 1; tm.tm_mday = rtas_ld(args, 2); tm.tm_hour = rtas_ld(args, 3); tm.tm_min = rtas_ld(args, 4); tm.tm_sec = rtas_ld(args, 5); /* Just generate a monitor event for the change */ rtc_change_mon_event(&tm); spapr->rtc_offset = qemu_timedate_diff(&tm); rtas_st(rets, 0, RTAS_OUT_SUCCESS); }
static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu, sPAPRMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { sPAPRPHBState *sphb; sPAPRTCETable *tcet = NULL; uint32_t addr, page_shift, window_shift, liobn; uint64_t buid, win_addr; int windows; if ((nargs != 5) || (nret != 4)) { goto param_error_exit; } buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); addr = rtas_ld(args, 0); sphb = spapr_pci_find_phb(spapr, buid); if (!sphb || !sphb->ddw_enabled) { goto param_error_exit; } page_shift = rtas_ld(args, 3); window_shift = rtas_ld(args, 4); liobn = spapr_phb_get_free_liobn(sphb); windows = spapr_phb_get_active_win_num(sphb); if (!(sphb->page_size_mask & (1ULL << page_shift)) || (window_shift < page_shift)) { goto param_error_exit; } if (!liobn || !sphb->ddw_enabled || windows == SPAPR_PCI_DMA_MAX_WINDOWS) { goto hw_error_exit; } tcet = spapr_tce_find_by_liobn(liobn); if (!tcet) { goto hw_error_exit; } win_addr = (windows == 0) ? sphb->dma_win_addr : sphb->dma64_win_addr; spapr_tce_table_enable(tcet, page_shift, win_addr, 1ULL << (window_shift - page_shift)); if (!tcet->nb_table) { goto hw_error_exit; } trace_spapr_iommu_ddw_create(buid, addr, 1ULL << page_shift, 1ULL << window_shift, tcet->bus_offset, liobn); rtas_st(rets, 0, RTAS_OUT_SUCCESS); rtas_st(rets, 1, liobn); rtas_st(rets, 2, tcet->bus_offset >> 32); rtas_st(rets, 3, tcet->bus_offset & ((uint32_t) -1)); return; hw_error_exit: rtas_st(rets, 0, RTAS_OUT_HW_ERROR); return; param_error_exit: rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); }