All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ruinland ChuanTzu Tsai <ruinland@andestech.com>
To: opensbi@lists.infradead.org
Subject: The senario when SCOUNTEREN[TM] == 0 && MCOUNTEREN[TM]==1 ?
Date: Wed, 12 Aug 2020 11:22:03 +0800	[thread overview]
Message-ID: <20200812032203.GA24380@APC301.andestech.com> (raw)
In-Reply-To: <MN2PR04MB6207F44B363761051DDF25EE8D450@MN2PR04MB6207.namprd04.prod.outlook.com>

Hi Anup,

Thanks for your brilliant clarifying.

I have another question to be confirmed with you, please bear with me a little bit more.

In "RISC-V Privileged ISA Spec Version 20190608-Priv-MSU-Ratified" (and the latest draft),
it said that : "When the CY, TM, IR, or HPMn bit in the mcounteren register is clear, attempts
to read the cycle, time, instret, or hpmcountern register while executing in S-mode or
U-mode will cause an illegal instruction exception. When one of these bits is set, access to
the corresponding register is permitted in the next implemented privilege mode (S-mode if implemented,
otherwise U-mode)."

So if I'm on a platform with no real time CSR, SCOUNTEREN[TM] and MCOUNTEREN[TM] should both be set to
0 ? (So the hardware will trigger illegal instruction exception. )
I'm asking this because someone might translate "permitted to access" as in "I can let you 'touch'
CSR_TIME, but only through OpenSBI." Yet I think that triggering an illegal instr. exception is no way
a kind of "permitted to access."

Many thanks,
Ruinland

On Tue, Aug 11, 2020 at 12:09:32PM +0000, Anup Patel wrote:
> 
> 
> > -----Original Message-----
> > From: opensbi <opensbi-bounces@lists.infradead.org> On Behalf Of
> > Ruinland ChuanTzu Tsai
> > Sent: 11 August 2020 15:23
> > To: opensbi at lists.infradead.org
> > Subject: The senario when SCOUNTEREN[TM] == 0 &&
> > MCOUNTEREN[TM]==1 ?
> > 
> > Hi all,
> > I'm having some questions about the timing spec for RISC-V and OpenSBI.
> > 
> > If I understand the spec correctly, we allow implementation to use a real
> > timer CSR or triggers an illegal instruction exception and request OpenSBI to
> > do the routine e.g. read a memory-mapped register.
> 
> Trap-n-emulate of TIME CSR in OpenSBI is only required for platforms that
> do not implement TIME CSR in HW. This is because RISC-V does not mandate
> TIME CSR to be provided by all RISC-V platforms.
> 
> For platforms having TIME CSR implemented in HW, no illegal instruction
> trap is generated hence no trap-n-emulate by OpenSBI on such platforms.
> Example, QEMU virt machine.
>  
> > 
> > The problem is :
> > As the Privileged ISA Spec stated, once the SCOUNTEREN[TM] is set to 0,
> > then U-mode is not allowed to access timer; and thus the OpenSBI will refuse
> > to provide timer info - -
> > https://github.com/riscv/opensbi/blob/master/lib/sbi/sbi_emulate_csr.c#L3
> > 2
> > 
> > This was not a problem before, yet recently Linux Kernel 5.8 changed its
> > RISC-V vdso implementation to issue rdtime in the user space directly.
> > 
> > On some platform, this causes a backward-compat issue - - the hardware
> > implementation without a real timer CSR internally expects that only S-mode
> > could issue rdtime and hard-wires SCOUNTEREN[TM] to be 0 so the CPU will
> > issue an illegal instruction exception and let OpenSBI do the job.
> > 
> > So when OpenSBI checks SCOUNTEREN[TM], there will be no one to provide
> > timer info and the init on rootfs will crash.
> > 
> > Furthermore, this raises a question to me - - when will SCOUNTEREN[TM] be
> > set to 0 while MCOUNTEREN[TM] set to 1 ?
> > 
> > My gut-feeling is that the hypervisor might want this feature, so the guest U-
> > mode program won't be able to access time CSR directly and the OpenSBI will
> > return -1 so the S-mode program (e.g. Xvisor/KVM/Xen) could do the
> > corresponding emulation, such as faking a timer.
> > 
> > Yet I haven't seen any related code there.
> > Is there a reason that we're checking SCOUNTEREN[TM] while the previous
> > privileged mode is U-mode ?
> 
> We are checking SCOUNTEREN[TM] in TIME CSR read emulation to
> emulate correct behavior SCOUNTEREN CSR but we should this bit
> when TIME CSR is not implemented in HW.
> 
> This can be fixed in OpenSBI because we detect whether TIME CSR is
> present or not for each HART at boot time.
> 
> Maybe we can do something like below:
> 
> 	if (prev_mode == PRV_U) {
> 		cen = csr_read(CSR_SCOUNTEREN);
> 		if (csr_num == CSR_TIME &&
> 		    !sbi_hart_has_feature(sbi_scratch_thishart_ptr(),
> 					  SBI_HART_HAS_TIME))
> 			cen |= (1UL << 1);
> 	}
> 
> > 
> > Besides, I'm wondering whether we should read [M|S]COUNTEREN in the
> > first place.
> 
> Checking [M|S]COUNTEREN is right thing to do because a RISC-V platform
> may not have HPMCOUNTER CSRs (alias of MHPMCOUNTER CSRs) even if
> it has MHPMCOUNTER CSRs.
> 
> > Since it's an enablement bit and it's designed as WARL, should it be just
> > written by software and enables some hardware features, instead of being a
> > "global status holder" for software to bridging different privileged modes ?
> 
> The [M|H|S]COUNTEREN CSRs are like switches to enable/disable
> lower-privilege-mode access to various HPMCOUNTER CSRs. A hypervisor
> can certainly use this to explicitly emulate certain HPMCOUNTER CSRs.
> 
> Regards,
> Anup


  reply	other threads:[~2020-08-12  3:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-11  9:52 The senario when SCOUNTEREN[TM] == 0 && MCOUNTEREN[TM]==1 ? Ruinland ChuanTzu Tsai
2020-08-11 12:09 ` Anup Patel
2020-08-12  3:22   ` Ruinland ChuanTzu Tsai [this message]
     [not found]   ` <20200812075733.GA3589@andestech.com>
2020-08-12 13:22     ` Anup Patel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200812032203.GA24380@APC301.andestech.com \
    --to=ruinland@andestech.com \
    --cc=opensbi@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.