Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to divide two 64-bit numbers in Linux Kernel?
    text
    copied!<p>Some code that rounds up the division to demonstrate (C-syntax):</p> <pre><code>#define SINT64 long long int #define SINT32 long int SINT64 divRound(SINT64 dividend, SINT64 divisor) { SINT32 quotient1 = dividend / divisor; SINT32 modResult = dividend % divisor; SINT32 multResult = modResult * 2; SINT32 quotient2 = multResult / divisor; SINT64 result = quotient1 + quotient2; return ( result ); } </code></pre> <p>Now, if this were User-space we probably wouldn't even notice that our compiler is generating code for those operators (e.g. <em>divdi3()</em> for division). Chances are we link with 'libgcc' without even knowing it. The problem is that Kernel-space is different (e.g. no libgcc). What to do?</p> <p>Crawl Google for a while, notice that pretty much everyone addresses the unsigned variant:</p> <pre><code>#define UINT64 long long int #define UINT32 long int UINT64 divRound(UINT64 dividend, UINT64 divisor) { UINT32 quotient1 = dividend / divisor; UINT32 modResult = dividend % divisor; UINT32 multResult = modResult * 2; UINT32 quotient2 = multResult / divisor; UINT64 result = quotient1 + quotient2; return ( result ); } </code></pre> <p>I know how to fix this one: Override <em>udivdi3()</em> and <em>umoddi3()</em> with _do_div()_ from <em>asm/div64.h</em>. Done right? Wrong. Signed is not the same as unsigned, sdivdi3()_ does not simply call <em>udivdi3()</em> , they are separate functions for a reason.</p> <p>Have you solved this problem? Do you know of a library that will help me do this? I'm really stuck so whatever you might see here that I just don't right now would be really helpful.</p> <p>Thanks, Chad</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload