On Mon, 24 Sep 2001, Wilko Bulte wrote:

> I did notice that the default Alpha beep is of a much higher frequency
> than the x86 one. Any relation? (long shot... I suppose)

This bug is well known (including by your mailbox).  From mail sent to
your mailbox:

% From [EMAIL PROTECTED] Mon Jun 18 17:40:56 2001 +1000
% Date: Mon, 18 Jun 2001 17:40:51 +1000 (EST)
% From: Bruce Evans <[EMAIL PROTECTED]>
% X-Sender: [EMAIL PROTECTED]
% To: Bill Fumerola <[EMAIL PROTECTED]>
% cc: [EMAIL PROTECTED], [EMAIL PROTECTED]
% Subject: Re: alpha/17637: misconfigured syscons bell causes panic on alpha
% In-Reply-To: <[EMAIL PROTECTED]>
% Message-ID: <[EMAIL PROTECTED]>
% MIME-Version: 1.0
% Content-Type: TEXT/PLAIN; charset=X-UNKNOWN
% Status: O
% X-Status:
% X-Keywords:
% X-UID: 2948
%
% On Mon, 18 Jun 2001, Bill Fumerola wrote:
%
% > On Sun, Jun 17, 2001 at 01:14:59PM -0700, [EMAIL PROTECTED] wrote:
% >
% > > Problem was fixed long ago, so let us also close the PR..
% > >
% > > ----------------------------
% > > revision 1.15
% > > date: 2000/03/30 22:39:48;  author: billf;  state: Exp;  lines: +5 -3
% > > Avoid dividing by zero when beeping with a zero pitch. This was bad.
% > >
% > > PR:             alpha/17637
% > > Submitted by:   Bosko Milekic <[EMAIL PROTECTED]>
% > > Reported by:    Dennis Lindroos <[EMAIL PROTECTED]>
% >
% > As I recall, bde had issues with my fix. I don't remember them, though.
%
% From my saved mail (only the initial reply):
%
% | Patches in PRs are rarely suitable for committing verbatim, and this one
% | was no exception :-).  It has:
% |
% | 1) Style bugs on every line (2 "if (foo) bar;"'s and 2 gratuitous new
% |    empty lines).
% | 2) Internally inconsistent code.  The `pitch' arg is now loaded into the
% |    timer counter unchanged in the pitch == 0 case.
% | 3) Doesn't fix the real bug, which is that `pitch' isn't actually the
% |    pitch; it is a raw i8254 maximum count which must be loaded directly
% |    into the i8254 counter, as it is in the i386 version of sysbeep().
% |    Callers must convert from pitches in Hz to "pitch"es in i8254 counts,
% |    although this interface is Broken As Designed (AFAIK it is for bug
% |    for bug compatibility with a BAD SCO interface).  The conversion
% |    is impossible to do correctly for alphas, since the necessary
% |    conversion factor (timer_freq) is not exported from clock.c alphas.
% |    The necessary conversion factor is not exported from the kernel
% |    for any arch, so kbdcontrol(1) hard-codes it as 1193182.  Fortunately
% |    (?), this is almost correct for alphas.  Note that 1193182 is close
% |    to 10^6, so popular pitches near 1000 Hz have the magic property
% |    of not being changed much by the conversion.  This limits complaints
% |    about bizarre beep frequencies.  We use a default of BELL_PITCH =
% |    800; this becomes 1193182 / 800 = 1491 on alphas.
% |
% | Perhaps users shouldn't be allowed to program bizarre i8254 counts of 0
% | and >= 65536.  Counts >= 65536 are truncated modulo 65536.  At least the
% | KDMKTONE ioctl does the truncation silently.
% |
% | The sysbeep() interface also confuses:
% | dev/mlx/mlx.c: hard-coded i8254 count of 500.
% | i386/isa/pcvt/*: hard-coded timer_freq of 1193182 and strange differences
% |                  in default pitches 1493 and 1500.
% | i386/i386/trap.c: hard-coded timer_freq of TIMER_FREQ.
% | pccard/pccard_beep.c: hard-coded i8254 counts of 1600, 1200, 3200 are named
% |                       as pitches.
% <End of old mail>
%
% Even kbdcontrol.c is confused about this:
%
% | void
% | set_bell_values(char *opt)
% | {
% |     int bell, duration, pitch;
% |
% |     bell = 0;
% |     if (!strncmp(opt, "quiet.", 6)) {
% |             bell = 2;
% |             opt += 6;
% |     }
% |     if (!strcmp(opt, "visual"))
% |             bell |= 1;
% |     else if (!strcmp(opt, "normal"))
% |             duration = 5, pitch = 800;
% |     else if (!strcmp(opt, "off"))
% |             duration = 0, pitch = 0;
% |     else {
% |             char            *v1;
% |
% |             bell = 0;
% |             duration = strtol(opt, &v1, 0);
% |             if ((duration < 0) || (*v1 != '.'))
% |                     goto badopt;
% |             opt = ++v1;
% |             pitch = strtol(opt, &v1, 0);
% |             if ((pitch < 0) || (*opt == '\0') || (*v1 != '\0')) {
% | badopt:
% |                     warnx("argument to -b must be duration.pitch or 
[quiet.]visual|normal|off");
% |                     return;
% |             }
%
% `pitch' is now actually in Hz.
%
% |             if (pitch != 0)
% |                     pitch = 1193182 / pitch;        /* in Hz */
%
% Bogus comment.  `pitch' is NOT in Hz.  It is now a dimensionless number.
%
% |             duration /= 10; /* in 10 m sec */
% |     }
% |
% |     ioctl(0, CONS_BELLTYPE, &bell);
% |     if ((bell & ~2) == 0)
% |             fprintf(stderr, "[=%d;%dB", pitch, duration);
% | }
%
% Bruce
%
%
% From [EMAIL PROTECTED] Tue Jun 19 16:43:28 2001 +1000
% Date: Tue, 19 Jun 2001 16:43:24 +1000 (EST)
% From: Bruce Evans <[EMAIL PROTECTED]>
% X-Sender: [EMAIL PROTECTED]
% To: Wilko Bulte <[EMAIL PROTECTED]>
% cc: Bill Fumerola <[EMAIL PROTECTED]>, [EMAIL PROTECTED], [EMAIL PROTECTED]
% Subject: Re: alpha/17637: misconfigured syscons bell causes panic on alpha
% In-Reply-To: <[EMAIL PROTECTED]>
% Message-ID: <[EMAIL PROTECTED]>
% MIME-Version: 1.0
% Content-Type: TEXT/PLAIN; charset=US-ASCII
% Status: O
% X-Status:
% X-Keywords:
% X-UID: 2957
%
% On Mon, 18 Jun 2001, Wilko Bulte wrote:
%
% > On Mon, Jun 18, 2001 at 05:40:51PM +1000, Bruce Evans wrote:
% > > On Mon, 18 Jun 2001, Bill Fumerola wrote:
% > >
% > > > On Sun, Jun 17, 2001 at 01:14:59PM -0700, [EMAIL PROTECTED] wrote:
% > > >
% > > > > Problem was fixed long ago, so let us also close the PR..
% > > > >
% > > > > ----------------------------
% > > > > revision 1.15
% > > > > date: 2000/03/30 22:39:48;  author: billf;  state: Exp;  lines: +5 -3
% > > > > Avoid dividing by zero when beeping with a zero pitch. This was bad.
% > > > >
% > > > > PR:             alpha/17637
% > > > > Submitted by:   Bosko Milekic <[EMAIL PROTECTED]>
% > > > > Reported by:    Dennis Lindroos <[EMAIL PROTECTED]>
% > > >
% > > > As I recall, bde had issues with my fix. I don't remember them, though.
% > >
% > > >From my saved mail (only the initial reply):
% > >
% > > | Patches in PRs are rarely suitable for committing verbatim, and this one
% > > | was no exception :-).  It has:
% >
% > But it appears to be in the RELENG_4 source code more or less verbatim.
%
% Yes.  The bogus patch was MFC.  It was also MFa (to ia64) together with
% the broken alpha sysbeep() to give inverted pitches on ia64's too.
%
% > So closing the PR was still valid. Or?
%
% No.
%
% Bruce

Related (cosmetic) fixes for kbdcontrol(1):

diff -c2 kbdcontrol.c~ kbdcontrol.c
*** kbdcontrol.c~       Mon Jul 16 02:18:36 2001
--- kbdcontrol.c        Tue Aug 28 22:27:39 2001
***************
*** 882,886 ****
  set_bell_values(char *opt)
  {
!       int bell, duration, pitch;

        bell = 0;
--- 882,886 ----
  set_bell_values(char *opt)
  {
!       int bell, duration, period, pitch;

        bell = 0;
***************
*** 889,898 ****
                opt += 6;
        }
!       if (!strcmp(opt, "visual"))
                bell |= 1;
!       else if (!strcmp(opt, "normal"))
!               duration = 5, pitch = 800;
        else if (!strcmp(opt, "off"))
!               duration = 0, pitch = 0;
        else {
                char            *v1;
--- 889,903 ----
                opt += 6;
        }
!       if (!strcmp(opt, "visual")) {
                bell |= 1;
!               duration = 0, period = 0;       /* XXX */
!       } else if (!strcmp(opt, "normal"))
!               /*
!                * XXX the historical normal "pitch" of 800 Hz is actually
!                * a period of 800 IBM-PC-i8254 cycles or 670 usec.
!                */
!               duration = 5, period = 800;
        else if (!strcmp(opt, "off"))
!               duration = 0, period = 0;       /* XXX */
        else {
                char            *v1;
***************
*** 910,914 ****
                }
                if (pitch != 0)
!                       pitch = 1193182 / pitch;        /* in Hz */
                duration /= 10; /* in 10 m sec */
        }
--- 915,931 ----
                }
                if (pitch != 0)
!                       /*
!                        * XXX the boundary cases are broken.  The kernel
!                        * silently truncates large periods modulo 0x10000
!                        * (18.2 msec).  I'm not sure what a period of 0
!                        * does.
!                        */
!                       period = 1193182 / pitch;       /* in i8254 cycles */
!               else
!                       /*
!                        * A pitch of 0 should give a period of "infinity"
!                        * (actually 65535).  But be bug for bug compatible.
!                        */
!                       period = 0;
                duration /= 10; /* in 10 m sec */
        }
***************
*** 916,920 ****
        ioctl(0, CONS_BELLTYPE, &bell);
        if ((bell & ~2) == 0)
!               fprintf(stderr, "[=%d;%dB", pitch, duration);
  }

--- 933,937 ----
        ioctl(0, CONS_BELLTYPE, &bell);
        if ((bell & ~2) == 0)
!               fprintf(stderr, "[=%d;%dB", period, duration);
  }

Some of the my original mail seems to be inverted.  My current understanding
is:
- the default pitch for sysbeep() is 800 <somethings> on both alphas and
  i386's.  The alpha sysbeep() bogusly (not bug for bug compatibly)
  inverts 800 (in Hz) to get a period (in i8254 timer cycles), so the
  default pitch is actually a pitch on alphas; it's only on i386's that
  800 (cylces) becomes 1491 (Hz).
- non-default pitches (set by kbdcontrol(1)) are converted to backwards-
  compatible (broken as designed) units in kbdcontrol(1), so the breakage
  is reversed: explicitly requesting 800 Hz gives 800 Hz on i386's and
  1491 Hz on alphas.
- I don't quite understand why you say that the default beep pitch is
  higher on alphas.  It's the non-default beep pitch that is higher.
- places that have pre-inverted "pitches" of about 1491 (cycles) (pcvt,
  pccard, etc.) have too-high beep frequencies on alphas.

Bruce


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to